diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2014-03-18 19:59:27 +1030 |
---|---|---|
committer | Anton Blanchard <anton@samba.org> | 2014-04-23 10:05:29 +1000 |
commit | 0906584a0a4b689f6e80307f699247621321670a (patch) | |
tree | c9ec428bd8f41c604160d937e294cfd4c287cb38 /arch/powerpc/kernel/module_64.c | |
parent | 4edebbeae3085e71f75584b6582495459e2e6cb2 (diff) | |
download | op-kernel-dev-0906584a0a4b689f6e80307f699247621321670a.zip op-kernel-dev-0906584a0a4b689f6e80307f699247621321670a.tar.gz |
powerpc: Handle new ELFv2 module relocations
The new ELF ABI tends to use R_PPC64_REL16_LO and R_PPC64_REL16_HA
relocations (PC-relative), so implement them.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'arch/powerpc/kernel/module_64.c')
-rw-r--r-- | arch/powerpc/kernel/module_64.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c index f6544d7..34ba326 100644 --- a/arch/powerpc/kernel/module_64.c +++ b/arch/powerpc/kernel/module_64.c @@ -491,6 +491,23 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, */ break; + case R_PPC64_REL16_HA: + /* Subtract location pointer */ + value -= (unsigned long)location; + value = ((value + 0x8000) >> 16); + *((uint16_t *) location) + = (*((uint16_t *) location) & ~0xffff) + | (value & 0xffff); + break; + + case R_PPC64_REL16_LO: + /* Subtract location pointer */ + value -= (unsigned long)location; + *((uint16_t *) location) + = (*((uint16_t *) location) & ~0xffff) + | (value & 0xffff); + break; + default: printk("%s: Unknown ADD relocation: %lu\n", me->name, |