• David Woodhouse's avatar
    x86, build: Dynamically find entry points in compressed startup code · 99f857db
    David Woodhouse authored
    We have historically hard-coded entry points in head.S just so it's easy
    to build the executable/bzImage headers with references to them.
    
    Unfortunately, this leads to boot loaders abusing these "known" addresses
    even when they are *explicitly* told that they "should look at the ELF
    header to find this address, as it may change in the future". And even
    when the address in question *has* actually been changed in the past,
    without fanfare or thought to compatibility.
    
    Thus we have bootloaders doing stunningly broken things like jumping
    to offset 0x200 in the kernel startup code in 64-bit mode, *hoping*
    that startup_64 is still there (it has moved at least once
    before). And hoping that it's actually a 64-bit kernel despite the
    fact that we don't give them any indication of that fact.
    
    This patch should hopefully remove the temptation to abuse internal
    addresses in future, where sternly worded comments have not sufficed.
    Instead of having hard-coded addresses and saying "please don't abuse
    these", we actually pull the addresses out of the ELF payload into
    zoffset.h, and make build.c shove them back into the right places in
    the bzImage header.
    
    Rather than including zoffset.h into build.c and thus having to rebuild
    the tool for every kernel build, we parse it instead. The parsing code
    is small and simple.
    
    This patch doesn't actually move any of the interesting entry points, so
    any offending bootloader will still continue to "work" after this patch
    is applied. For some version of "work" which includes jumping into the
    compressed payload and crashing, if the bzImage it's given is a 32-bit
    kernel. No change there then.
    
    [ hpa: some of the issues in the description are addressed or
      retconned by the 2.12 boot protocol.  This patch has been edited to
      only remove fixed addresses that were *not* thus retconned. ]
    Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
    Link: http://lkml.kernel.org/r/1358513837.2397.247.camel@shinybook.infradead.orgSigned-off-by: default avatarH. Peter Anvin <hpa@linux.intel.com>
    Cc: Matt Fleming <matt.fleming@intel.com>
    99f857db
head_32.S 4.56 KB