From 373b8c03e20941a9186f4ecbfca2a8f96314f1e8 Mon Sep 17 00:00:00 2001 From: Paul Gortmaker Date: Thu, 7 May 2009 16:18:40 +0100 Subject: [PATCH] --- yaml --- r: 144678 b: refs/heads/master c: ae51e609843f7d0aaeb1c2ad9f89d252a4899885 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/arm/include/asm/elf.h | 16 +++++++++------- trunk/arch/arm/kernel/module.c | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index 3c58560d7d27..89309c9aa4a7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a029b706d3b2d3a139bdeae84131d9a0f35f6478 +refs/heads/master: ae51e609843f7d0aaeb1c2ad9f89d252a4899885 diff --git a/trunk/arch/arm/include/asm/elf.h b/trunk/arch/arm/include/asm/elf.h index d7da19bcf928..c207504de84d 100644 --- a/trunk/arch/arm/include/asm/elf.h +++ b/trunk/arch/arm/include/asm/elf.h @@ -45,13 +45,15 @@ typedef struct user_fp elf_fpregset_t; #define EF_ARM_HASENTRY 0x00000002 /* All */ #define EF_ARM_RELEXEC 0x00000001 /* All */ -#define R_ARM_NONE 0 -#define R_ARM_PC24 1 -#define R_ARM_ABS32 2 -#define R_ARM_CALL 28 -#define R_ARM_JUMP24 29 -#define R_ARM_V4BX 40 -#define R_ARM_PREL31 42 +#define R_ARM_NONE 0 +#define R_ARM_PC24 1 +#define R_ARM_ABS32 2 +#define R_ARM_CALL 28 +#define R_ARM_JUMP24 29 +#define R_ARM_V4BX 40 +#define R_ARM_PREL31 42 +#define R_ARM_MOVW_ABS_NC 43 +#define R_ARM_MOVT_ABS 44 /* * These are used to set parameters in the core dumps. diff --git a/trunk/arch/arm/kernel/module.c b/trunk/arch/arm/kernel/module.c index d1731e39b496..bac03c81489d 100644 --- a/trunk/arch/arm/kernel/module.c +++ b/trunk/arch/arm/kernel/module.c @@ -169,6 +169,21 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, *(u32 *)loc = offset & 0x7fffffff; break; + case R_ARM_MOVW_ABS_NC: + case R_ARM_MOVT_ABS: + offset = *(u32 *)loc; + offset = ((offset & 0xf0000) >> 4) | (offset & 0xfff); + offset = (offset ^ 0x8000) - 0x8000; + + offset += sym->st_value; + if (ELF32_R_TYPE(rel->r_info) == R_ARM_MOVT_ABS) + offset >>= 16; + + *(u32 *)loc &= 0xfff0f000; + *(u32 *)loc |= ((offset & 0xf000) << 4) | + (offset & 0x0fff); + break; + default: printk(KERN_ERR "%s: unknown relocation: %u\n", module->name, ELF32_R_TYPE(rel->r_info));