diff options
author | Dave Martin <dave.martin@linaro.org> | 2011-03-03 05:41:12 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-03-10 11:49:06 -0500 |
commit | 6f685c5cdd29649cf8cc8f57c72791159f936e07 (patch) | |
tree | 892575c8f378609771752e12e88d4f2699084c70 | |
parent | 23bfdacf4eb525ff3404161429cedaa281c23e47 (diff) |
ARM: 6781/1: Thumb-2: Work around buggy Thumb-2 short branch relocations in gas
Various binutils versions can resolve Thumb-2 branches to
locally-defined, preemptible global symbols as short-range "b.n"
branch instructions.
This is a problem, because there's no guarantee the final
destination of the symbol, or any candidate locations for a
trampoline, are within range of the branch. For this reason, the
kernel does not support fixing up the R_ARM_THM_JUMP11 (102)
relocation in modules at all, and it makes little sense to add
support.
The symptom is that the kernel fails with an "unsupported
relocation" error when loading some modules.
Until fixed tools are available, passing
-fno-optimize-sibling-calls to gcc should prevent gcc generating
code which hits this problem, at the cost of a bit of extra runtime
stack usage in some cases.
The problem is described in more detail at:
https://bugs.launchpad.net/binutils-linaro/+bug/725126
Only Thumb-2 kernels are affected.
This patch adds a new CONFIG_THUMB2_AVOID_R_ARM_THM_JUMP11 config
option which adds -fno-optimize-sibling-calls to CFLAGS_MODULE
when building a Thumb-2 kernel.
Signed-off-by: Dave Martin <dave.martin@linaro.org>
Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r-- | arch/arm/Kconfig | 31 | ||||
-rw-r--r-- | arch/arm/Makefile | 4 |
2 files changed, 35 insertions, 0 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 2fec7073f687..f871f2e1dd7c 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -1379,6 +1379,37 @@ config THUMB2_KERNEL | |||
1379 | 1379 | ||
1380 | If unsure, say N. | 1380 | If unsure, say N. |
1381 | 1381 | ||
1382 | config THUMB2_AVOID_R_ARM_THM_JUMP11 | ||
1383 | bool "Work around buggy Thumb-2 short branch relocations in gas" | ||
1384 | depends on THUMB2_KERNEL && MODULES | ||
1385 | default y | ||
1386 | help | ||
1387 | Various binutils versions can resolve Thumb-2 branches to | ||
1388 | locally-defined, preemptible global symbols as short-range "b.n" | ||
1389 | branch instructions. | ||
1390 | |||
1391 | This is a problem, because there's no guarantee the final | ||
1392 | destination of the symbol, or any candidate locations for a | ||
1393 | trampoline, are within range of the branch. For this reason, the | ||
1394 | kernel does not support fixing up the R_ARM_THM_JUMP11 (102) | ||
1395 | relocation in modules at all, and it makes little sense to add | ||
1396 | support. | ||
1397 | |||
1398 | The symptom is that the kernel fails with an "unsupported | ||
1399 | relocation" error when loading some modules. | ||
1400 | |||
1401 | Until fixed tools are available, passing | ||
1402 | -fno-optimize-sibling-calls to gcc should prevent gcc generating | ||
1403 | code which hits this problem, at the cost of a bit of extra runtime | ||
1404 | stack usage in some cases. | ||
1405 | |||
1406 | The problem is described in more detail at: | ||
1407 | https://bugs.launchpad.net/binutils-linaro/+bug/725126 | ||
1408 | |||
1409 | Only Thumb-2 kernels are affected. | ||
1410 | |||
1411 | Unless you are sure your tools don't have this problem, say Y. | ||
1412 | |||
1382 | config ARM_ASM_UNIFIED | 1413 | config ARM_ASM_UNIFIED |
1383 | bool | 1414 | bool |
1384 | 1415 | ||
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index da525bc96145..6d611f407ce6 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
@@ -105,6 +105,10 @@ AFLAGS_AUTOIT :=$(call as-option,-Wa$(comma)-mimplicit-it=always,-Wa$(comma)-mau | |||
105 | AFLAGS_NOWARN :=$(call as-option,-Wa$(comma)-mno-warn-deprecated,-Wa$(comma)-W) | 105 | AFLAGS_NOWARN :=$(call as-option,-Wa$(comma)-mno-warn-deprecated,-Wa$(comma)-W) |
106 | CFLAGS_THUMB2 :=-mthumb $(AFLAGS_AUTOIT) $(AFLAGS_NOWARN) | 106 | CFLAGS_THUMB2 :=-mthumb $(AFLAGS_AUTOIT) $(AFLAGS_NOWARN) |
107 | AFLAGS_THUMB2 :=$(CFLAGS_THUMB2) -Wa$(comma)-mthumb | 107 | AFLAGS_THUMB2 :=$(CFLAGS_THUMB2) -Wa$(comma)-mthumb |
108 | # Work around buggy relocation from gas if requested: | ||
109 | ifeq ($(CONFIG_THUMB2_AVOID_R_ARM_THM_JUMP11),y) | ||
110 | CFLAGS_MODULE +=-fno-optimize-sibling-calls | ||
111 | endif | ||
108 | endif | 112 | endif |
109 | 113 | ||
110 | # Need -Uarm for gcc < 3.x | 114 | # Need -Uarm for gcc < 3.x |