• Nicholas Piggin's avatar
    powerpc/64: vmlinux support building with PCREL addresing · 7e3a68be
    Nicholas Piggin authored
    PC-Relative or PCREL addressing is an extension to the ELF ABI which
    uses Power ISA v3.1 PC-relative instructions to calculate addresses,
    rather than the traditional TOC scheme.
    
    Add an option to build vmlinux using pcrel addressing. Modules continue
    to use TOC addressing.
    
    - TOC address helpers and r2 are poisoned with -1 when running vmlinux.
      r2 could be used for something useful once things are ironed out.
    
    - Assembly must call C functions with @notoc annotation, or the linker
      complains aobut a missing nop after the call. This is done with the
      CFUNC macro introduced earlier.
    
    - Boot: with the exception of prom_init, the execution branches to the
      kernel virtual address early in boot, before any addresses are
      generated, which ensures 34-bit pcrel addressing does not miss the
      high PAGE_OFFSET bits. TOC relative addressing has a similar
      requirement. prom_init does not go to the virtual address and its
      addresses should not carry over to the post-prom kernel.
    
    - Ftrace trampolines are converted from TOC addressing to pcrel
      addressing, including module ftrace trampolines that currently use the
      kernel TOC to find ftrace target functions.
    
    - BPF function prologue and function calling generation are converted
      from TOC to pcrel.
    
    - copypage_64.S has an interesting problem, prefixed instructions have
      alignment restrictions so the linker can add padding, which makes the
      assembler treat the difference between two local labels as
      non-constant even if alignment is arranged so padding is not required.
      This may need toolchain help to solve nicely, for now move the prefix
      instruction out of the alternate patch section to work around it.
    
    This reduces kernel text size by about 6%.
    Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://msgid.link/20230408021752.862660-6-npiggin@gmail.com
    7e3a68be
module_64.c 22.7 KB