diff options
-rw-r--r-- | arch/arm/Kconfig | 99 | ||||
-rw-r--r-- | arch/arm/boot/Makefile | 8 | ||||
-rw-r--r-- | arch/arm/boot/compressed/Makefile | 3 | ||||
-rw-r--r-- | arch/arm/boot/compressed/head.S | 12 |
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 | ||
1493 | config 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 | |||
1503 | config 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 | |||
1493 | endmenu | 1592 | endmenu |
1494 | 1593 | ||
1495 | menu "CPU Power Management" | 1594 | menu "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 @@ | |||
14 | MKIMAGE := $(srctree)/scripts/mkuboot.sh | 14 | MKIMAGE := $(srctree)/scripts/mkuboot.sh |
15 | 15 | ||
16 | ifneq ($(MACHINE),) | 16 | ifneq ($(MACHINE),) |
17 | include $(srctree)/$(MACHINE)/Makefile.boot | 17 | -include $(srctree)/$(MACHINE)/Makefile.boot |
18 | endif | 18 | endif |
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 |
24 | ZRELADDR := $(zreladdr-y) | ||
25 | PARAMS_PHYS := $(params_phys-y) | 23 | PARAMS_PHYS := $(params_phys-y) |
26 | INITRD_PHYS := $(initrd_phys-y) | 24 | INITRD_PHYS := $(initrd_phys-y) |
27 | 25 | ||
28 | export ZRELADDR INITRD_PHYS PARAMS_PHYS | 26 | export INITRD_PHYS PARAMS_PHYS |
29 | 27 | ||
30 | targets := Image zImage xipImage bootpImage uImage | 28 | targets := Image zImage xipImage bootpImage uImage |
31 | 29 | ||
@@ -67,7 +65,7 @@ quiet_cmd_uimage = UIMAGE $@ | |||
67 | ifeq ($(CONFIG_ZBOOT_ROM),y) | 65 | ifeq ($(CONFIG_ZBOOT_ROM),y) |
68 | $(obj)/uImage: LOADADDR=$(CONFIG_ZBOOT_ROM_TEXT) | 66 | $(obj)/uImage: LOADADDR=$(CONFIG_ZBOOT_ROM_TEXT) |
69 | else | 67 | else |
70 | $(obj)/uImage: LOADADDR=$(ZRELADDR) | 68 | $(obj)/uImage: LOADADDR=$(CONFIG_ZRELADDR) |
71 | endif | 69 | endif |
72 | 70 | ||
73 | ifeq ($(CONFIG_THUMB2_KERNEL),y) | 71 | ifeq ($(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 | ||
7 | AFLAGS_head.o += -DTEXT_OFFSET=$(TEXT_OFFSET) | ||
7 | HEAD = head.o | 8 | HEAD = head.o |
8 | OBJS = misc.o decompress.o | 9 | OBJS = misc.o decompress.o |
9 | FONTC = $(srctree)/drivers/video/console/font_acorn_8x8.c | 10 | FONTC = $(srctree)/drivers/video/console/font_acorn_8x8.c |
@@ -79,8 +80,6 @@ endif | |||
79 | EXTRA_CFLAGS := -fpic -fno-builtin | 80 | EXTRA_CFLAGS := -fpic -fno-builtin |
80 | EXTRA_AFLAGS := -Wa,-march=all | 81 | EXTRA_AFLAGS := -Wa,-march=all |
81 | 82 | ||
82 | # Supply ZRELADDR to the decompressor via a linker symbol. | ||
83 | LDFLAGS_vmlinux := --defsym zreladdr=$(ZRELADDR) | ||
84 | ifeq ($(CONFIG_CPU_ENDIAN_BE8),y) | 83 | ifeq ($(CONFIG_CPU_ENDIAN_BE8),y) |
85 | LDFLAGS_vmlinux += --be8 | 84 | LDFLAGS_vmlinux += --be8 |
86 | endif | 85 | endif |
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 | |||
310 | LC0: .word LC0 @ r1 | 317 | LC0: .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 |