add the R_ARM_V4BX relocation to the ARM kernel module loader
authormirko <mirko@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Fri, 10 Apr 2009 18:47:05 +0000 (18:47 +0000)
committermirko <mirko@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Fri, 10 Apr 2009 18:47:05 +0000 (18:47 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@15208 3c298f89-4303-0410-b956-a3cf2f4a3e73

target/linux/generic-2.6/patches-2.6.28/230-add-r_arm_v4bx-relocation-for-arm-module-loader.patch [new file with mode: 0644]

diff --git a/target/linux/generic-2.6/patches-2.6.28/230-add-r_arm_v4bx-relocation-for-arm-module-loader.patch b/target/linux/generic-2.6/patches-2.6.28/230-add-r_arm_v4bx-relocation-for-arm-module-loader.patch
new file mode 100644 (file)
index 0000000..3fac7ab
--- /dev/null
@@ -0,0 +1,33 @@
+diff --git a/arch/arm/include/asm/elf.h b/arch/arm/include/asm/elf.h
+index a58378c..ce3b36e 100644
+--- a/arch/arm/include/asm/elf.h
++++ b/arch/arm/include/asm/elf.h
+@@ -50,6 +50,7 @@  typedef struct user_fp elf_fpregset_t;
+ #define R_ARM_ABS32   2
+ #define R_ARM_CALL    28
+ #define R_ARM_JUMP24  29
++#define R_ARM_V4BX    40
+ /*
+  * These are used to set parameters in the core dumps.
+diff --git a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c
+index dab48f2..9f509fd 100644
+--- a/arch/arm/kernel/module.c
++++ b/arch/arm/kernel/module.c
+@@ -132,6 +132,15 @@  apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
+                       *(u32 *)loc |= offset & 0x00ffffff;
+                       break;
++             case R_ARM_V4BX:
++                     /* Preserve Rm and the condition code. Alter
++                      * other bits to re-code instruction as
++                      * MOV PC,Rm.
++                      */
++                     *(u32 *)loc &= 0xf000000f;
++                     *(u32 *)loc |= 0x01a0f000;
++                     break;
++
+               default:
+                       printk(KERN_ERR "%s: unknown relocation: %u\n",
+                              module->name, ELF32_R_TYPE(rel->r_info));
+