aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/arch/arm/kernel/module.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2011-07-13 08:30:11 +0100
committerDave Airlie <airlied@redhat.com>2011-07-13 08:30:22 +0100
commitcf056edbbe70393faa6edd2b7859a14467910946 (patch)
treeca30ef021f12d1f06e18856a60f815ba63e78f60 /arch/arm/kernel/module.c
parentDRM: remove drm_pci_device_is_pcie (diff)
parentLinux 3.0-rc7 (diff)
downloadwireguard-linux-cf056edbbe70393faa6edd2b7859a14467910946.tar.xz
wireguard-linux-cf056edbbe70393faa6edd2b7859a14467910946.zip
Merge 3.0-rc7 into drm-core-next
This pulls in all the drm fixes up to this point which are needed for some -next patches to work.
Diffstat (limited to 'arch/arm/kernel/module.c')
-rw-r--r--arch/arm/kernel/module.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c
index fee7c36349eb..016d6a0830a3 100644
--- a/arch/arm/kernel/module.c
+++ b/arch/arm/kernel/module.c
@@ -193,8 +193,17 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
offset -= 0x02000000;
offset += sym->st_value - loc;
- /* only Thumb addresses allowed (no interworking) */
- if (!(offset & 1) ||
+ /*
+ * For function symbols, only Thumb addresses are
+ * allowed (no interworking).
+ *
+ * For non-function symbols, the destination
+ * has no specific ARM/Thumb disposition, so
+ * the branch is resolved under the assumption
+ * that interworking is not required.
+ */
+ if ((ELF32_ST_TYPE(sym->st_info) == STT_FUNC &&
+ !(offset & 1)) ||
offset <= (s32)0xff000000 ||
offset >= (s32)0x01000000) {
pr_err("%s: section %u reloc %u sym '%s': relocation %u out of range (%#lx -> %#x)\n",