diff options
| author | Dave Martin <dave.martin@linaro.org> | 2010-11-29 13:43:27 -0500 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-11-30 08:44:26 -0500 |
| commit | 26e5ca93dda9425f8ff78ccb2f9b193328087e45 (patch) | |
| tree | fae95715e23c176c804766612b5d2702c236fcf0 | |
| parent | bfa64c4ab1235b732542f11f4e0005e1774f779a (diff) | |
ARM: 6503/1: Thumb-2: Restore sensible zImage header layout for CONFIG_THUMB2_KERNEL
The code which makes up the zImage header intends to leave a
32-byte gap followed by a branch to the real entry point, a magic
number, and a word containing the absolute entry point address.
This gets messed up with with CONFIG_THUMB2_KERNEL, because the
size of the initial padding NOPs changes.
Instead, the header can be made fully compatible by restoring it to
ARM.
In the Thumb-2 case, we can replace the initial NOPs with a
sequence which switches to Thumb and jumps to the real entry point.
As a consequence, the zImage entry point is now always ARM, so no
special magic is needed any more for the uImage rules in the
Thumb-2 case.
Signed-off-by: Dave Martin <dave.martin@linaro.org>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
| -rw-r--r-- | arch/arm/boot/Makefile | 5 | ||||
| -rw-r--r-- | arch/arm/boot/compressed/head.S | 7 |
2 files changed, 6 insertions, 6 deletions
diff --git a/arch/arm/boot/Makefile b/arch/arm/boot/Makefile index 4a590f4113e2..4d26f2c52a75 100644 --- a/arch/arm/boot/Makefile +++ b/arch/arm/boot/Makefile | |||
| @@ -70,12 +70,7 @@ else | |||
| 70 | $(obj)/uImage: LOADADDR=$(ZRELADDR) | 70 | $(obj)/uImage: LOADADDR=$(ZRELADDR) |
| 71 | endif | 71 | endif |
| 72 | 72 | ||
| 73 | ifeq ($(CONFIG_THUMB2_KERNEL),y) | ||
| 74 | # Set bit 0 to 1 so that "mov pc, rx" switches to Thumb-2 mode | ||
| 75 | $(obj)/uImage: STARTADDR=$(shell echo $(LOADADDR) | sed -e "s/.$$/1/") | ||
| 76 | else | ||
| 77 | $(obj)/uImage: STARTADDR=$(LOADADDR) | 73 | $(obj)/uImage: STARTADDR=$(LOADADDR) |
| 78 | endif | ||
| 79 | 74 | ||
| 80 | $(obj)/uImage: $(obj)/zImage FORCE | 75 | $(obj)/uImage: $(obj)/zImage FORCE |
| 81 | $(call if_changed,uimage) | 76 | $(call if_changed,uimage) |
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index be97e0832d73..7193884ed8b0 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S | |||
| @@ -125,9 +125,13 @@ wait: mrc p14, 0, pc, c0, c1, 0 | |||
| 125 | * sort out different calling conventions | 125 | * sort out different calling conventions |
| 126 | */ | 126 | */ |
| 127 | .align | 127 | .align |
| 128 | .arm @ Always enter in ARM state | ||
| 128 | start: | 129 | start: |
| 129 | .type start,#function | 130 | .type start,#function |
| 130 | .rept 8 | 131 | THUMB( adr r12, BSYM(1f) ) |
| 132 | THUMB( bx r12 ) | ||
| 133 | THUMB( .rept 6 ) | ||
| 134 | ARM( .rept 8 ) | ||
| 131 | mov r0, r0 | 135 | mov r0, r0 |
| 132 | .endr | 136 | .endr |
| 133 | 137 | ||
| @@ -135,6 +139,7 @@ start: | |||
| 135 | .word 0x016f2818 @ Magic numbers to help the loader | 139 | .word 0x016f2818 @ Magic numbers to help the loader |
| 136 | .word start @ absolute load/run zImage address | 140 | .word start @ absolute load/run zImage address |
| 137 | .word _edata @ zImage end address | 141 | .word _edata @ zImage end address |
| 142 | THUMB( .thumb ) | ||
| 138 | 1: mov r7, r1 @ save architecture ID | 143 | 1: mov r7, r1 @ save architecture ID |
| 139 | mov r8, r2 @ save atags pointer | 144 | mov r8, r2 @ save atags pointer |
| 140 | 145 | ||
