Skip to content
  • Anton Blanchard's avatar
    powerpc: Relocate prom_init.c on 64bit · 5ac47f7a
    Anton Blanchard authored
    
    
    The ppc64 kernel can get loaded at any address which means
    our very early init code in prom_init.c must be relocatable. We do
    this with a pretty nasty RELOC() macro that we wrap accesses of
    variables with. It is very fragile and sometimes we forget to add a
    RELOC() to an uncommon path or sometimes a compiler change breaks it.
    
    32bit has a much more elegant solution where we build prom_init.c
    with -mrelocatable and then process the relocations manually.
    Unfortunately we can't do the equivalent on 64bit and we would
    have to build the entire kernel relocatable (-pie), resulting in a
    large increase in kernel footprint (megabytes of relocation data).
    The relocation data will be marked __initdata but it still creates
    more pressure on our already tight memory layout at boot.
    
    Alan Modra pointed out that the 64bit ABI is relocatable even
    if we don't build with -pie, we just need to relocate the TOC.
    This patch implements that idea and relocates the TOC entries of
    prom_init.c. An added bonus is there are very few relocations to
    process which helps keep boot times on simulators down.
    
    gcc does not put 64bit integer constants into the TOC but to be
    safe we may want a build time script which passes through the
    prom_init.c TOC entries to make sure everything looks reasonable.
    
    Signed-off-by: default avatarAnton Blanchard <anton@samba.org>
    Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
    5ac47f7a