aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Miao <eric.miao@canonical.com>2010-07-05 09:56:50 -0400
committerUwe Kleine-König <u.kleine-koenig@pengutronix.de>2010-07-12 04:11:50 -0400
commite69edc7939abda1f696c482faa8168d80420f75c (patch)
tree55209745a63b2c3fd4f85827dc1969fdd2a16b7a
parentdb7b2b4b0e0513627420940d3d62be44a37f0524 (diff)
ARM: Auto calculate ZRELADDR and provide option for exceptions
As long as the zImage is placed within the 128MB range from the start of memory, ZRELADDR (Address where the decompressed kernel will be placed, usually == PHYS_OFFSET + TEXT_OFFSET) can be determined at run-time by masking PC with 0xf80000000. Running through all the Makefile.boot, all those zreladdr-y addresses == 0x[0-f][08]00_0000 + TEXT_OFFSET can be determined at run-time. Option CONFIG_AUTO_ZRELADDR and CONFIG_ZRELADDR are introduced, CONFIG_ZRELADDR _must_ be explicitly specified if: - ((zreladdr-y - TEXT_OFFSET) & ~0xf8000000) != 0, which means masking PC with 0xf8000000 will result in an incorrect address. Currently this is only a problem on u300. - or the assumption of the zImage being loaded by the bootloader within the first 128MB of RAM is incorrect - or when ZBOOT_ROM is used, where the above assumption is usually wrong. [ukleinek: changed mask from 0xf0000000 to 0xf8000000 for mx1 and shark + some review fixes from the mailing list] Original-Idea-and-Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org> Signed-off-by: Eric Miao <eric.miao@canonical.com> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
-rw-r--r--arch/arm/Kconfig99
-rw-r--r--arch/arm/boot/Makefile8
-rw-r--r--arch/arm/boot/compressed/Makefile3
-rw-r--r--arch/arm/boot/compressed/head.S12
4 files changed, 112 insertions, 10 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index a53ac6570b66..0b0cf0d2872f 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1490,6 +1490,105 @@ config ATAGS_PROC
1490 Should the atags used to boot the kernel be exported in an "atags" 1490 Should the atags used to boot the kernel be exported in an "atags"
1491 file in procfs. Useful with kexec. 1491 file in procfs. Useful with kexec.
1492 1492
1493config AUTO_ZRELADDR
1494 bool "Auto calculation of the decompressed kernel image address"
1495 depends on !ZBOOT_ROM && !ARCH_U300
1496 help
1497 ZRELADDR is the physical address where the decompressed kernel
1498 image will be placed. If AUTO_ZRELADDR is selected, the address
1499 will be determined at run-time by masking the current IP with
1500 0xf8000000. This assumes the zImage being placed in the first 128MB
1501 from start of memory.
1502
1503config ZRELADDR
1504 hex "Physical address of the decompressed kernel image"
1505 depends on !AUTO_ZRELADDR
1506 default 0x00008000 if ARCH_BCMRING ||\
1507 ARCH_CNS3XXX ||\
1508 ARCH_DOVE ||\
1509 ARCH_EBSA110 ||\
1510 ARCH_FOOTBRIDGE ||\
1511 ARCH_INTEGRATOR ||\
1512 ARCH_IOP13XX ||\
1513 ARCH_IOP33X ||\
1514 ARCH_IXP2000 ||\
1515 ARCH_IXP23XX ||\
1516 ARCH_IXP4XX ||\
1517 ARCH_KIRKWOOD ||\
1518 ARCH_KS8695 ||\
1519 ARCH_LOKI ||\
1520 ARCH_MMP ||\
1521 ARCH_MV78XX0 ||\
1522 ARCH_NOMADIK ||\
1523 ARCH_NUC93X ||\
1524 ARCH_NS9XXX ||\
1525 ARCH_ORION5X ||\
1526 ARCH_SPEAR3XX ||\
1527 ARCH_SPEAR6XX ||\
1528 ARCH_U8500 ||\
1529 ARCH_VERSATILE ||\
1530 ARCH_W90X900
1531 default 0x08008000 if ARCH_MX1 ||\
1532 ARCH_SHARK
1533 default 0x10008000 if ARCH_MSM ||\
1534 ARCH_OMAP1 ||\
1535 ARCH_RPC
1536 default 0x20008000 if ARCH_S5P6440 ||\
1537 ARCH_S5P6442 ||\
1538 ARCH_S5PC100 ||\
1539 ARCH_S5PV210
1540 default 0x30008000 if ARCH_S3C2410 ||\
1541 ARCH_S3C2400 ||\
1542 ARCH_S3C2412 ||\
1543 ARCH_S3C2416 ||\
1544 ARCH_S3C2440 ||\
1545 ARCH_S3C2443
1546 default 0x40008000 if ARCH_STMP378X ||\
1547 ARCH_STMP37XX ||\
1548 ARCH_SH7372 ||\
1549 ARCH_SH7377
1550 default 0x50008000 if ARCH_S3C64XX ||\
1551 ARCH_SH7367
1552 default 0x60008000 if ARCH_VEXPRESS
1553 default 0x80008000 if ARCH_MX25 ||\
1554 ARCH_MX3 ||\
1555 ARCH_NETX ||\
1556 ARCH_OMAP2PLUS ||\
1557 ARCH_PNX4008
1558 default 0x90008000 if ARCH_MX5 ||\
1559 ARCH_MX91231
1560 default 0xa0008000 if ARCH_IOP32X ||\
1561 ARCH_PXA ||\
1562 MACH_MX27
1563 default 0xc0008000 if ARCH_LH7A40X ||\
1564 MACH_MX21
1565 default 0xf0008000 if ARCH_AAEC2000 ||\
1566 ARCH_L7200
1567 default 0xc0028000 if ARCH_CLPS711X
1568 default 0x70008000 if ARCH_AT91 && (ARCH_AT91CAP9 || ARCH_AT91SAM9G45)
1569 default 0x20008000 if ARCH_AT91 && !(ARCH_AT91CAP9 || ARCH_AT91SAM9G45)
1570 default 0xc0008000 if ARCH_DAVINCI && ARCH_DAVINCI_DA8XX
1571 default 0x80008000 if ARCH_DAVINCI && !ARCH_DAVINCI_DA8XX
1572 default 0x00008000 if ARCH_EP93XX && EP93XX_SDCE3_SYNC_PHYS_OFFSET
1573 default 0xc0008000 if ARCH_EP93XX && EP93XX_SDCE0_PHYS_OFFSET
1574 default 0xd0008000 if ARCH_EP93XX && EP93XX_SDCE1_PHYS_OFFSET
1575 default 0xe0008000 if ARCH_EP93XX && EP93XX_SDCE2_PHYS_OFFSET
1576 default 0xf0008000 if ARCH_EP93XX && EP93XX_SDCE3_ASYNC_PHYS_OFFSET
1577 default 0x00008000 if ARCH_GEMINI && GEMINI_MEM_SWAP
1578 default 0x10008000 if ARCH_GEMINI && !GEMINI_MEM_SWAP
1579 default 0x70008000 if ARCH_REALVIEW && REALVIEW_HIGH_PHYS_OFFSET
1580 default 0x00008000 if ARCH_REALVIEW && !REALVIEW_HIGH_PHYS_OFFSET
1581 default 0xc0208000 if ARCH_SA1100 && SA1111
1582 default 0xc0008000 if ARCH_SA1100 && !SA1111
1583 default 0x30108000 if ARCH_S3C2410 && PM_H1940
1584 default 0x28E08000 if ARCH_U300 && MACH_U300_SINGLE_RAM
1585 default 0x48008000 if ARCH_U300 && !MACH_U300_SINGLE_RAM
1586 help
1587 ZRELADDR is the physical address where the decompressed kernel
1588 image will be placed. ZRELADDR has to be specified when the
1589 assumption of AUTO_ZRELADDR is not valid, or when ZBOOT_ROM is
1590 selected.
1591
1493endmenu 1592endmenu
1494 1593
1495menu "CPU Power Management" 1594menu "CPU Power Management"
diff --git a/arch/arm/boot/Makefile b/arch/arm/boot/Makefile
index 4a590f4113e2..f705213caa88 100644
--- a/arch/arm/boot/Makefile
+++ b/arch/arm/boot/Makefile
@@ -14,18 +14,16 @@
14MKIMAGE := $(srctree)/scripts/mkuboot.sh 14MKIMAGE := $(srctree)/scripts/mkuboot.sh
15 15
16ifneq ($(MACHINE),) 16ifneq ($(MACHINE),)
17include $(srctree)/$(MACHINE)/Makefile.boot 17-include $(srctree)/$(MACHINE)/Makefile.boot
18endif 18endif
19 19
20# Note: the following conditions must always be true: 20# Note: the following conditions must always be true:
21# ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)
22# PARAMS_PHYS must be within 4MB of ZRELADDR 21# PARAMS_PHYS must be within 4MB of ZRELADDR
23# INITRD_PHYS must be in RAM 22# INITRD_PHYS must be in RAM
24ZRELADDR := $(zreladdr-y)
25PARAMS_PHYS := $(params_phys-y) 23PARAMS_PHYS := $(params_phys-y)
26INITRD_PHYS := $(initrd_phys-y) 24INITRD_PHYS := $(initrd_phys-y)
27 25
28export ZRELADDR INITRD_PHYS PARAMS_PHYS 26export INITRD_PHYS PARAMS_PHYS
29 27
30targets := Image zImage xipImage bootpImage uImage 28targets := Image zImage xipImage bootpImage uImage
31 29
@@ -67,7 +65,7 @@ quiet_cmd_uimage = UIMAGE $@
67ifeq ($(CONFIG_ZBOOT_ROM),y) 65ifeq ($(CONFIG_ZBOOT_ROM),y)
68$(obj)/uImage: LOADADDR=$(CONFIG_ZBOOT_ROM_TEXT) 66$(obj)/uImage: LOADADDR=$(CONFIG_ZBOOT_ROM_TEXT)
69else 67else
70$(obj)/uImage: LOADADDR=$(ZRELADDR) 68$(obj)/uImage: LOADADDR=$(CONFIG_ZRELADDR)
71endif 69endif
72 70
73ifeq ($(CONFIG_THUMB2_KERNEL),y) 71ifeq ($(CONFIG_THUMB2_KERNEL),y)
diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile
index 2a80c9de6eaf..cc8380b879fe 100644
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
@@ -4,6 +4,7 @@
4# create a compressed vmlinuz image from the original vmlinux 4# create a compressed vmlinuz image from the original vmlinux
5# 5#
6 6
7AFLAGS_head.o += -DTEXT_OFFSET=$(TEXT_OFFSET)
7HEAD = head.o 8HEAD = head.o
8OBJS = misc.o decompress.o 9OBJS = misc.o decompress.o
9FONTC = $(srctree)/drivers/video/console/font_acorn_8x8.c 10FONTC = $(srctree)/drivers/video/console/font_acorn_8x8.c
@@ -79,8 +80,6 @@ endif
79EXTRA_CFLAGS := -fpic -fno-builtin 80EXTRA_CFLAGS := -fpic -fno-builtin
80EXTRA_AFLAGS := -Wa,-march=all 81EXTRA_AFLAGS := -Wa,-march=all
81 82
82# Supply ZRELADDR to the decompressor via a linker symbol.
83LDFLAGS_vmlinux := --defsym zreladdr=$(ZRELADDR)
84ifeq ($(CONFIG_CPU_ENDIAN_BE8),y) 83ifeq ($(CONFIG_CPU_ENDIAN_BE8),y)
85LDFLAGS_vmlinux += --be8 84LDFLAGS_vmlinux += --be8
86endif 85endif
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
index d27faa131796..abf4d65acf62 100644
--- a/arch/arm/boot/compressed/head.S
+++ b/arch/arm/boot/compressed/head.S
@@ -170,9 +170,16 @@ not_angel:
170 170
171 .text 171 .text
172 adr r0, LC0 172 adr r0, LC0
173 ARM( ldmia r0, {r1, r2, r3, r4, r5, r6, r11, ip, sp}) 173 ARM( ldmia r0, {r1, r2, r3, r5, r6, r11, ip, sp})
174 THUMB( ldmia r0, {r1, r2, r3, r4, r5, r6, r11, ip} ) 174 THUMB( ldmia r0, {r1, r2, r3, r5, r6, r11, ip} )
175 THUMB( ldr sp, [r0, #32] ) 175 THUMB( ldr sp, [r0, #32] )
176#ifdef CONFIG_AUTO_ZRELADDR
177 @ determine final kernel image address
178 and r4, pc, #0xf8000000
179 add r4, r4, #TEXT_OFFSET
180#else
181 ldr r4, =CONFIG_ZRELADDR
182#endif
176 subs r0, r0, r1 @ calculate the delta offset 183 subs r0, r0, r1 @ calculate the delta offset
177 184
178 @ if delta is zero, we are 185 @ if delta is zero, we are
@@ -310,7 +317,6 @@ wont_overwrite: mov r0, r4
310LC0: .word LC0 @ r1 317LC0: .word LC0 @ r1
311 .word __bss_start @ r2 318 .word __bss_start @ r2
312 .word _end @ r3 319 .word _end @ r3
313 .word zreladdr @ r4
314 .word _start @ r5 320 .word _start @ r5
315 .word _image_size @ r6 321 .word _image_size @ r6
316 .word _got_start @ r11 322 .word _got_start @ r11