thumb2 user binaries with v6/v7 combined kernel
Arnd Bergmann
arnd at arndb.de
Thu Aug 5 10:42:04 EDT 2010
I've been trying to run a multi-CPU kernel for armv6 and armv7
and noticed that thumb2 binaries sometimes crash with SIGILL.
The only problem appears to be that when __LINUX_ARM_ARCH__
is set to 6, the kernel does not correctly decode some instructions.
The patch below illustrates the problem, if I apply that, I'm
able to run all my thumb2 user space code. Unfortunately,
I can't use the ldrht instruction there, because the kernel
is built with -march=armv6. The patch breaks the exception
handling, and I couldn't figure out how to fix that.
The code in question was originally introduced by Paul Brook,
in order to support thumb2 user space on armv7-only kernels.
Any suggestions?
Arnd
--- a/arch/arm/kernel/entry-armv.S
+++ b/arch/arm/kernel/entry-armv.S
@@ -499,15 +499,15 @@ __und_usr:
#endif
beq call_fpe
@ Thumb instruction
-#if __LINUX_ARM_ARCH__ >= 7
+#ifdef CONFIG_CPU_V7
2:
- ARM( ldrht r5, [r4], #2 )
- THUMB( ldrht r5, [r4] )
+ ARM( ldrh r5, [r4], #2 )
+ THUMB( ldrh r5, [r4] )
THUMB( add r4, r4, #2 )
and r0, r5, #0xf800 @ mask bits 111x x... .... ....
cmp r0, #0xe800 @ 32bit instruction if xx != 0
blo __und_usr_unknown
-3: ldrht r0, [r4]
+3: ldrh r0, [r4]
add r2, r2, #2 @ r2 is PC + 2, make it PC + 4
orr r0, r0, r5, lsl #16
#else
@@ -528,7 +528,7 @@ ENDPROC(__und_usr)
.popsection
.pushsection __ex_table,"a"
.long 1b, 4b
-#if __LINUX_ARM_ARCH__ >= 7
+#ifdef CONFIG_CPU_V7
.long 2b, 4b
.long 3b, 4b
#endif
More information about the linux-arm-kernel
mailing list