diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-25 10:18:27 +0200 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-25 10:18:27 +0200 |
commit | 1bc67188c3843b8e16caaa8624beeb0e2823c1f8 (patch) | |
tree | 76299c9a161e2f179bf8bbd6c2b6c60191a9c76d /arch/arm/kernel/entry-armv.S | |
parent | 36b8d186e6cc8e32cb5227f5645a58e1bc0af190 (diff) | |
parent | bdf4e9482360a3ddc1619efbd5d1c928ede8c3fa (diff) |
Merge branch 'for-linus' of http://ftp.arm.linux.org.uk/pub/linux/arm/kernel/git-cur/linux-2.6-arm
* 'for-linus' of http://ftp.arm.linux.org.uk/pub/linux/arm/kernel/git-cur/linux-2.6-arm: (81 commits)
ARM: 7133/1: SMP: fix per cpu timer setup before the cpu is marked online
ARM: 7129/1: Add __arm_ioremap_exec for mapping external memory as MT_MEMORY
ARM: 7136/1: pl330: Fix a race condition
ARM: smp: fix clipping of number of CPUs
ARM: 7137/1: Fix error upon adding LL debug
ARM: Add a few machine types to mach-types
ARM: 7130/1: dev_archdata: add private iommu extension
ARM: 7125/1: Add unwinding annotations for 64bit division functions
ARM: 7120/1: remove bashism in check for multiple zreladdrs
ARM: 7118/1: rename temp variable in read*_relaxed()
ARM: 6217/4: mach-realview: expose PB1176 ROM using physmap and map_rom
ARM: 7098/1: kdump: copy kernel relocation code at the kexec prepare stage
ARM: 7062/1: cache: detect PIPT I-cache using CTR
ARM: platform fixups: remove mdesc argument to fixup function
ARM: 7017/1: Use generic BUG() handler
ARM: 7102/1: mach-integrator: update defconfig
ARM: 7087/2: mach-integrator: get timer frequency from clock
ARM: 7086/2: mach-integrator: modernize clock event registration
ARM: 7085/2: mach-integrator: clockevent supports oneshot mode
ARM: 7084/1: mach-integrator: retire some timer macros
...
Diffstat (limited to 'arch/arm/kernel/entry-armv.S')
-rw-r--r-- | arch/arm/kernel/entry-armv.S | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index a87cbf889ff..9ad50c4208a 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -24,6 +24,7 @@ #include <asm/unwind.h> #include <asm/unistd.h> #include <asm/tls.h> +#include <asm/system.h> #include "entry-header.S" #include <asm/entry-macro-multi.S> @@ -262,8 +263,7 @@ __und_svc: ldr r0, [r4, #-4] #else ldrh r0, [r4, #-2] @ Thumb instruction at LR - 2 - and r9, r0, #0xf800 - cmp r9, #0xe800 @ 32-bit instruction if xx >= 0 + cmp r0, #0xe800 @ 32-bit instruction if xx >= 0 ldrhhs r9, [r4] @ bottom 16 bits orrhs r0, r9, r0, lsl #16 #endif @@ -440,18 +440,46 @@ __und_usr: #endif beq call_fpe @ Thumb instruction -#if __LINUX_ARM_ARCH__ >= 7 +#if CONFIG_ARM_THUMB && __LINUX_ARM_ARCH__ >= 6 && CONFIG_CPU_V7 +/* + * Thumb-2 instruction handling. Note that because pre-v6 and >= v6 platforms + * can never be supported in a single kernel, this code is not applicable at + * all when __LINUX_ARM_ARCH__ < 6. This allows simplifying assumptions to be + * made about .arch directives. + */ +#if __LINUX_ARM_ARCH__ < 7 +/* If the target CPU may not be Thumb-2-capable, a run-time check is needed: */ +#define NEED_CPU_ARCHITECTURE + ldr r5, .LCcpu_architecture + ldr r5, [r5] + cmp r5, #CPU_ARCH_ARMv7 + blo __und_usr_unknown +/* + * The following code won't get run unless the running CPU really is v7, so + * coding round the lack of ldrht on older arches is pointless. Temporarily + * override the assembler target arch with the minimum required instead: + */ + .arch armv6t2 +#endif 2: ARM( ldrht r5, [r4], #2 ) THUMB( ldrht r5, [r4] ) THUMB( add r4, r4, #2 ) - and r0, r5, #0xf800 @ mask bits 111x x... .... .... - cmp r0, #0xe800 @ 32bit instruction if xx != 0 + cmp r5, #0xe800 @ 32bit instruction if xx != 0 blo __und_usr_unknown 3: ldrht r0, [r4] add r2, r2, #2 @ r2 is PC + 2, make it PC + 4 orr r0, r0, r5, lsl #16 + +#if __LINUX_ARM_ARCH__ < 7 +/* If the target arch was overridden, change it back: */ +#ifdef CONFIG_CPU_32v6K + .arch armv6k #else + .arch armv6 +#endif +#endif /* __LINUX_ARM_ARCH__ < 7 */ +#else /* !(CONFIG_ARM_THUMB && __LINUX_ARM_ARCH__ >= 6 && CONFIG_CPU_V7) */ b __und_usr_unknown #endif UNWIND(.fnend ) @@ -578,6 +606,12 @@ call_fpe: movw_pc lr @ CP#14 (Debug) movw_pc lr @ CP#15 (Control) +#ifdef NEED_CPU_ARCHITECTURE + .align 2 +.LCcpu_architecture: + .word __cpu_architecture +#endif + #ifdef CONFIG_NEON .align 6 |