Thumb-2: Correctly handle undefined instructions in the kernel
authorCatalin Marinas <catalin.marinas@arm.com>
Fri, 18 Sep 2009 22:27:07 +0000 (23:27 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 18 Sep 2009 22:30:11 +0000 (23:30 +0100)
VFP instructions in the kernel may trigger undefined exceptions if VFP
hardware is not present. This patch corrects the loading of such Thumb-2
instructions. It also marks the "no_fp" label as a function so that the
linker generate a Thumb address.

Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm/kernel/entry-armv.S

index a332bc7225bfab148af4a508233b109f8bf645a7..0a2ba51cf35df1602db7d5a692c7c712a4bcf0d3 100644 (file)
@@ -272,7 +272,15 @@ __und_svc:
        @
        @  r0 - instruction
        @
+#ifndef        CONFIG_THUMB2_KERNEL
        ldr     r0, [r2, #-4]
+#else
+       ldrh    r0, [r2, #-2]                   @ Thumb instruction at LR - 2
+       and     r9, r0, #0xf800
+       cmp     r9, #0xe800                     @ 32-bit instruction if xx >= 0
+       ldrhhs  r9, [r2]                        @ bottom 16 bits
+       orrhs   r0, r9, r0, lsl #16
+#endif
        adr     r9, BSYM(1f)
        bl      call_fpe
 
@@ -678,7 +686,9 @@ ENTRY(fp_enter)
        .word   no_fp
        .previous
 
-no_fp: mov     pc, lr
+ENTRY(no_fp)
+       mov     pc, lr
+ENDPROC(no_fp)
 
 __und_usr_unknown:
        enable_irq