diff options
author | Uwe Kleine-König <u.kleine-koenig@pengutronix.de> | 2011-12-09 14:52:10 -0500 |
---|---|---|
committer | Uwe Kleine-König <u.kleine-koenig@pengutronix.de> | 2013-01-31 15:44:46 -0500 |
commit | bc7dea00a9a0ea385bbc4aed67dfdcf7d8879953 (patch) | |
tree | 242257c7c0a016595b672b3151abdf71ec5745a2 | |
parent | b849a60e0903b1c5430c3859864554662e127a8d (diff) |
ARM: let CPUs not being able to run in ARM mode enter in THUMB mode
Some ARM cores are not capable to run in ARM mode (e.g. Cortex-M3). So
obviously these cannot enter the kernel in ARM mode. Make an exception
for them and let them enter in THUMB mode.
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Message-Id: 1358162123-30113-1-git-send-email-u.kleine-koenig@pengutronix.de
Acked-by: Nicolas Pitre <nico@linaro.org>
-rw-r--r-- | arch/arm/Kconfig | 3 | ||||
-rw-r--r-- | arch/arm/kernel/head-nommu.S | 8 | ||||
-rw-r--r-- | arch/arm/mm/Kconfig | 9 |
3 files changed, 17 insertions, 3 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 67874b82a4ed..e04c7793f47e 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -1656,8 +1656,9 @@ config HZ | |||
1656 | default 100 | 1656 | default 100 |
1657 | 1657 | ||
1658 | config THUMB2_KERNEL | 1658 | config THUMB2_KERNEL |
1659 | bool "Compile the kernel in Thumb-2 mode" | 1659 | bool "Compile the kernel in Thumb-2 mode" if !CPU_THUMBONLY |
1660 | depends on CPU_V7 && !CPU_V6 && !CPU_V6K | 1660 | depends on CPU_V7 && !CPU_V6 && !CPU_V6K |
1661 | default y if CPU_THUMBONLY | ||
1661 | select AEABI | 1662 | select AEABI |
1662 | select ARM_ASM_UNIFIED | 1663 | select ARM_ASM_UNIFIED |
1663 | select ARM_UNWIND | 1664 | select ARM_UNWIND |
diff --git a/arch/arm/kernel/head-nommu.S b/arch/arm/kernel/head-nommu.S index 2c228a07e58c..6a2e09c952c7 100644 --- a/arch/arm/kernel/head-nommu.S +++ b/arch/arm/kernel/head-nommu.S | |||
@@ -32,15 +32,21 @@ | |||
32 | * numbers for r1. | 32 | * numbers for r1. |
33 | * | 33 | * |
34 | */ | 34 | */ |
35 | .arm | ||
36 | 35 | ||
37 | __HEAD | 36 | __HEAD |
37 | |||
38 | #ifdef CONFIG_CPU_THUMBONLY | ||
39 | .thumb | ||
40 | ENTRY(stext) | ||
41 | #else | ||
42 | .arm | ||
38 | ENTRY(stext) | 43 | ENTRY(stext) |
39 | 44 | ||
40 | THUMB( adr r9, BSYM(1f) ) @ Kernel is always entered in ARM. | 45 | THUMB( adr r9, BSYM(1f) ) @ Kernel is always entered in ARM. |
41 | THUMB( bx r9 ) @ If this is a Thumb-2 kernel, | 46 | THUMB( bx r9 ) @ If this is a Thumb-2 kernel, |
42 | THUMB( .thumb ) @ switch to Thumb now. | 47 | THUMB( .thumb ) @ switch to Thumb now. |
43 | THUMB(1: ) | 48 | THUMB(1: ) |
49 | #endif | ||
44 | 50 | ||
45 | setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode | 51 | setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode |
46 | @ and irqs disabled | 52 | @ and irqs disabled |
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 3fd629d5a513..8defd638c79e 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
@@ -397,6 +397,13 @@ config CPU_V7 | |||
397 | select CPU_PABRT_V7 | 397 | select CPU_PABRT_V7 |
398 | select CPU_TLB_V7 if MMU | 398 | select CPU_TLB_V7 if MMU |
399 | 399 | ||
400 | config CPU_THUMBONLY | ||
401 | bool | ||
402 | # There are no CPUs available with MMU that don't implement an ARM ISA: | ||
403 | depends on !MMU | ||
404 | help | ||
405 | Select this if your CPU doesn't support the 32 bit ARM instructions. | ||
406 | |||
400 | # Figure out what processor architecture version we should be using. | 407 | # Figure out what processor architecture version we should be using. |
401 | # This defines the compiler instruction set which depends on the machine type. | 408 | # This defines the compiler instruction set which depends on the machine type. |
402 | config CPU_32v3 | 409 | config CPU_32v3 |
@@ -608,7 +615,7 @@ config ARCH_DMA_ADDR_T_64BIT | |||
608 | bool | 615 | bool |
609 | 616 | ||
610 | config ARM_THUMB | 617 | config ARM_THUMB |
611 | bool "Support Thumb user binaries" | 618 | bool "Support Thumb user binaries" if !CPU_THUMBONLY |
612 | depends on CPU_ARM720T || CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020 || CPU_ARM1020E || CPU_ARM1022 || CPU_ARM1026 || CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_V6 || CPU_V6K || CPU_V7 || CPU_FEROCEON | 619 | depends on CPU_ARM720T || CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020 || CPU_ARM1020E || CPU_ARM1022 || CPU_ARM1026 || CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_V6 || CPU_V6K || CPU_V7 || CPU_FEROCEON |
613 | default y | 620 | default y |
614 | help | 621 | help |