diff options
| -rw-r--r-- | Documentation/arm/Booting | 5 | ||||
| -rw-r--r-- | arch/arm/boot/compressed/head.S | 3 | ||||
| -rw-r--r-- | arch/arm/kernel/head-nommu.S | 8 | ||||
| -rw-r--r-- | arch/arm/kernel/head.S | 8 |
4 files changed, 23 insertions, 1 deletions
diff --git a/Documentation/arm/Booting b/Documentation/arm/Booting index 4e686a2ed91e..a341d87d276e 100644 --- a/Documentation/arm/Booting +++ b/Documentation/arm/Booting | |||
| @@ -164,3 +164,8 @@ In either case, the following conditions must be met: | |||
| 164 | - The boot loader is expected to call the kernel image by jumping | 164 | - The boot loader is expected to call the kernel image by jumping |
| 165 | directly to the first instruction of the kernel image. | 165 | directly to the first instruction of the kernel image. |
| 166 | 166 | ||
| 167 | On CPUs supporting the ARM instruction set, the entry must be | ||
| 168 | made in ARM state, even for a Thumb-2 kernel. | ||
| 169 | |||
| 170 | On CPUs supporting only the Thumb instruction set such as | ||
| 171 | Cortex-M class CPUs, the entry must be made in Thumb state. | ||
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index f9da41921c52..51af7091d84d 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S | |||
| @@ -353,7 +353,8 @@ not_relocated: mov r0, #0 | |||
| 353 | mov r0, #0 @ must be zero | 353 | mov r0, #0 @ must be zero |
| 354 | mov r1, r7 @ restore architecture number | 354 | mov r1, r7 @ restore architecture number |
| 355 | mov r2, r8 @ restore atags pointer | 355 | mov r2, r8 @ restore atags pointer |
| 356 | mov pc, r4 @ call kernel | 356 | ARM( mov pc, r4 ) @ call kernel |
| 357 | THUMB( bx r4 ) @ entry point is always ARM | ||
| 357 | 358 | ||
| 358 | .align 2 | 359 | .align 2 |
| 359 | .type LC0, #object | 360 | .type LC0, #object |
diff --git a/arch/arm/kernel/head-nommu.S b/arch/arm/kernel/head-nommu.S index 6b1e0ad9ec3b..d46f25968bec 100644 --- a/arch/arm/kernel/head-nommu.S +++ b/arch/arm/kernel/head-nommu.S | |||
| @@ -32,8 +32,16 @@ | |||
| 32 | * numbers for r1. | 32 | * numbers for r1. |
| 33 | * | 33 | * |
| 34 | */ | 34 | */ |
| 35 | .arm | ||
| 36 | |||
| 35 | __HEAD | 37 | __HEAD |
| 36 | ENTRY(stext) | 38 | ENTRY(stext) |
| 39 | |||
| 40 | THUMB( adr r9, BSYM(1f) ) @ Kernel is always entered in ARM. | ||
| 41 | THUMB( bx r9 ) @ If this is a Thumb-2 kernel, | ||
| 42 | THUMB( .thumb ) @ switch to Thumb now. | ||
| 43 | THUMB(1: ) | ||
| 44 | |||
| 37 | setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode | 45 | setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode |
| 38 | @ and irqs disabled | 46 | @ and irqs disabled |
| 39 | #ifndef CONFIG_CPU_CP15 | 47 | #ifndef CONFIG_CPU_CP15 |
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index 278c1b0ebb2e..742b6108a001 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S | |||
| @@ -71,8 +71,16 @@ | |||
| 71 | * crap here - that's what the boot loader (or in extreme, well justified | 71 | * crap here - that's what the boot loader (or in extreme, well justified |
| 72 | * circumstances, zImage) is for. | 72 | * circumstances, zImage) is for. |
| 73 | */ | 73 | */ |
| 74 | .arm | ||
| 75 | |||
| 74 | __HEAD | 76 | __HEAD |
| 75 | ENTRY(stext) | 77 | ENTRY(stext) |
| 78 | |||
| 79 | THUMB( adr r9, BSYM(1f) ) @ Kernel is always entered in ARM. | ||
| 80 | THUMB( bx r9 ) @ If this is a Thumb-2 kernel, | ||
| 81 | THUMB( .thumb ) @ switch to Thumb now. | ||
| 82 | THUMB(1: ) | ||
| 83 | |||
| 76 | setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode | 84 | setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode |
| 77 | @ and irqs disabled | 85 | @ and irqs disabled |
| 78 | mrc p15, 0, r9, c0, c0 @ get processor id | 86 | mrc p15, 0, r9, c0, c0 @ get processor id |
