All of lore.kernel.org
 help / color / mirror / Atom feed
From: u.kleine-koenig@pengutronix.de (Uwe Kleine-König)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 11/11] Auto calculate ZRELADDR and provide option for exceptions
Date: Mon,  5 Jul 2010 16:15:29 +0200	[thread overview]
Message-ID: <1278339329-23739-11-git-send-email-u.kleine-koenig@pengutronix.de> (raw)
In-Reply-To: <20100705141344.GA25407@pengutronix.de>

From: Eric Miao <eric.miao@canonical.com>

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]

Signed-off-by: Eric Miao <eric.miao@canonical.com>
Signed-off-by: Uwe Kleine-K?nig <u.kleine-koenig@pengutronix.de>
---
 arch/arm/Kconfig                  |   99 +++++++++++++++++++++++++++++++++++++
 arch/arm/boot/Makefile            |    8 +--
 arch/arm/boot/compressed/Makefile |    3 +-
 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 a53ac65..0b0cf0d 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1490,6 +1490,105 @@ config ATAGS_PROC
 	  Should the atags used to boot the kernel be exported in an "atags"
 	  file in procfs. Useful with kexec.
 
+config AUTO_ZRELADDR
+	bool "Auto calculation of the decompressed kernel image address"
+	depends on !ZBOOT_ROM && !ARCH_U300
+	help
+	  ZRELADDR is the physical address where the decompressed kernel
+	  image will be placed. If AUTO_ZRELADDR is selected, the address
+	  will be determined at run-time by masking the current IP with
+	  0xf8000000. This assumes the zImage being placed in the first 128MB
+	  from start of memory.
+
+config ZRELADDR
+	hex "Physical address of the decompressed kernel image"
+	depends on !AUTO_ZRELADDR
+	default 0x00008000 if ARCH_BCMRING ||\
+		ARCH_CNS3XXX ||\
+		ARCH_DOVE ||\
+		ARCH_EBSA110 ||\
+		ARCH_FOOTBRIDGE ||\
+		ARCH_INTEGRATOR ||\
+		ARCH_IOP13XX ||\
+		ARCH_IOP33X ||\
+		ARCH_IXP2000 ||\
+		ARCH_IXP23XX ||\
+		ARCH_IXP4XX ||\
+		ARCH_KIRKWOOD ||\
+		ARCH_KS8695 ||\
+		ARCH_LOKI ||\
+		ARCH_MMP ||\
+		ARCH_MV78XX0 ||\
+		ARCH_NOMADIK ||\
+		ARCH_NUC93X ||\
+		ARCH_NS9XXX ||\
+		ARCH_ORION5X ||\
+		ARCH_SPEAR3XX ||\
+		ARCH_SPEAR6XX ||\
+		ARCH_U8500 ||\
+		ARCH_VERSATILE ||\
+		ARCH_W90X900
+	default 0x08008000 if ARCH_MX1 ||\
+		ARCH_SHARK
+	default 0x10008000 if ARCH_MSM ||\
+		ARCH_OMAP1 ||\
+		ARCH_RPC
+	default 0x20008000 if ARCH_S5P6440 ||\
+		ARCH_S5P6442 ||\
+		ARCH_S5PC100 ||\
+		ARCH_S5PV210
+	default 0x30008000 if ARCH_S3C2410 ||\
+		ARCH_S3C2400 ||\
+		ARCH_S3C2412 ||\
+		ARCH_S3C2416 ||\
+		ARCH_S3C2440 ||\
+		ARCH_S3C2443
+	default 0x40008000 if ARCH_STMP378X ||\
+		ARCH_STMP37XX ||\
+		ARCH_SH7372 ||\
+		ARCH_SH7377
+	default 0x50008000 if ARCH_S3C64XX ||\
+		ARCH_SH7367
+	default 0x60008000 if ARCH_VEXPRESS
+	default 0x80008000 if ARCH_MX25 ||\
+		ARCH_MX3 ||\
+		ARCH_NETX ||\
+		ARCH_OMAP2PLUS ||\
+		ARCH_PNX4008
+	default 0x90008000 if ARCH_MX5 ||\
+		ARCH_MX91231
+	default 0xa0008000 if ARCH_IOP32X ||\
+		ARCH_PXA ||\
+		MACH_MX27
+	default 0xc0008000 if ARCH_LH7A40X ||\
+		MACH_MX21
+	default 0xf0008000 if ARCH_AAEC2000 ||\
+		ARCH_L7200
+	default 0xc0028000 if ARCH_CLPS711X
+	default 0x70008000 if ARCH_AT91 && (ARCH_AT91CAP9 || ARCH_AT91SAM9G45)
+	default 0x20008000 if ARCH_AT91 && !(ARCH_AT91CAP9 || ARCH_AT91SAM9G45)
+	default 0xc0008000 if ARCH_DAVINCI && ARCH_DAVINCI_DA8XX
+	default 0x80008000 if ARCH_DAVINCI && !ARCH_DAVINCI_DA8XX
+	default 0x00008000 if ARCH_EP93XX && EP93XX_SDCE3_SYNC_PHYS_OFFSET
+	default 0xc0008000 if ARCH_EP93XX && EP93XX_SDCE0_PHYS_OFFSET
+	default 0xd0008000 if ARCH_EP93XX && EP93XX_SDCE1_PHYS_OFFSET
+	default 0xe0008000 if ARCH_EP93XX && EP93XX_SDCE2_PHYS_OFFSET
+	default 0xf0008000 if ARCH_EP93XX && EP93XX_SDCE3_ASYNC_PHYS_OFFSET
+	default 0x00008000 if ARCH_GEMINI && GEMINI_MEM_SWAP
+	default 0x10008000 if ARCH_GEMINI && !GEMINI_MEM_SWAP
+	default 0x70008000 if ARCH_REALVIEW && REALVIEW_HIGH_PHYS_OFFSET
+	default 0x00008000 if ARCH_REALVIEW && !REALVIEW_HIGH_PHYS_OFFSET
+	default 0xc0208000 if ARCH_SA1100 && SA1111
+	default 0xc0008000 if ARCH_SA1100 && !SA1111
+	default 0x30108000 if ARCH_S3C2410 && PM_H1940
+	default 0x28E08000 if ARCH_U300 && MACH_U300_SINGLE_RAM
+	default 0x48008000 if ARCH_U300 && !MACH_U300_SINGLE_RAM
+	help
+	  ZRELADDR is the physical address where the decompressed kernel
+	  image will be placed. ZRELADDR has to be specified when the
+	  assumption of AUTO_ZRELADDR is not valid, or when ZBOOT_ROM is
+	  selected.
+
 endmenu
 
 menu "CPU Power Management"
diff --git a/arch/arm/boot/Makefile b/arch/arm/boot/Makefile
index 264dccf..5e89c2c 100644
--- a/arch/arm/boot/Makefile
+++ b/arch/arm/boot/Makefile
@@ -14,18 +14,16 @@
 MKIMAGE         := $(srctree)/scripts/mkuboot.sh
 
 ifneq ($(MACHINE),)
-include $(srctree)/$(MACHINE)/Makefile.boot
+-include $(srctree)/$(MACHINE)/Makefile.boot
 endif
 
 # Note: the following conditions must always be true:
-#   ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)
 #   PARAMS_PHYS must be within 4MB of ZRELADDR
 #   INITRD_PHYS must be in RAM
-ZRELADDR    := $(zreladdr-y)
 PARAMS_PHYS := $(params_phys-y)
 INITRD_PHYS := $(initrd_phys-y)
 
-export ZRELADDR INITRD_PHYS PARAMS_PHYS
+export INITRD_PHYS PARAMS_PHYS
 
 targets := Image zImage xipImage bootpImage uImage
 
@@ -68,7 +66,7 @@ ifeq ($(CONFIG_RUNTIME_PHYS_OFFSET),)
 ifeq ($(CONFIG_ZBOOT_ROM),y)
 $(obj)/uImage: LOADADDR=$(CONFIG_ZBOOT_ROM_TEXT)
 else
-$(obj)/uImage: LOADADDR=$(ZRELADDR)
+$(obj)/uImage: LOADADDR=$(CONFIG_ZRELADDR)
 endif
 endif
 
diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile
index 2a80c9d..cc8380b 100644
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
@@ -4,6 +4,7 @@
 # create a compressed vmlinuz image from the original vmlinux
 #
 
+AFLAGS_head.o += -DTEXT_OFFSET=$(TEXT_OFFSET)
 HEAD	= head.o
 OBJS	= misc.o decompress.o
 FONTC	= $(srctree)/drivers/video/console/font_acorn_8x8.c
@@ -79,8 +80,6 @@ endif
 EXTRA_CFLAGS  := -fpic -fno-builtin
 EXTRA_AFLAGS  := -Wa,-march=all
 
-# Supply ZRELADDR to the decompressor via a linker symbol.
-LDFLAGS_vmlinux := --defsym zreladdr=$(ZRELADDR)
 ifeq ($(CONFIG_CPU_ENDIAN_BE8),y)
 LDFLAGS_vmlinux += --be8
 endif
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
index d27faa1..abf4d65 100644
--- a/arch/arm/boot/compressed/head.S
+++ b/arch/arm/boot/compressed/head.S
@@ -170,9 +170,16 @@ not_angel:
 
 		.text
 		adr	r0, LC0
- ARM(		ldmia	r0, {r1, r2, r3, r4, r5, r6, r11, ip, sp})
- THUMB(		ldmia	r0, {r1, r2, r3, r4, r5, r6, r11, ip}	)
+ ARM(		ldmia	r0, {r1, r2, r3, r5, r6, r11, ip, sp})
+ THUMB(		ldmia	r0, {r1, r2, r3, r5, r6, r11, ip}	)
  THUMB(		ldr	sp, [r0, #32]				)
+#ifdef CONFIG_AUTO_ZRELADDR
+		@ determine final kernel image address
+		and	r4, pc, #0xf8000000
+		add	r4, r4, #TEXT_OFFSET
+#else
+		ldr	r4, =CONFIG_ZRELADDR
+#endif
 		subs	r0, r0, r1		@ calculate the delta offset
 
 						@ if delta is zero, we are
@@ -310,7 +317,6 @@ wont_overwrite:	mov	r0, r4
 LC0:		.word	LC0			@ r1
 		.word	__bss_start		@ r2
 		.word	_end			@ r3
-		.word	zreladdr		@ r4
 		.word	_start			@ r5
 		.word	_image_size		@ r6
 		.word	_got_start		@ r11
-- 
1.7.1

  parent reply	other threads:[~2010-07-05 14:15 UTC|newest]

Thread overview: 138+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-03  7:36 [PATCH 0/5] Makefile.boot cleanup Eric Miao
2010-06-03  7:36 ` [PATCH 1/5] [ARM] Remove unused PARAMS_PHYS from arch/arm/boot/compressed Eric Miao
2010-06-10  8:48   ` Uwe Kleine-König
2010-06-03  7:36 ` [PATCH 2/5] [ARM] Remove unused INITRD_PHYS " Eric Miao
2010-06-10  8:27   ` Uwe Kleine-König
2010-06-10  9:55     ` Eric Miao
2010-06-03  7:36 ` [PATCH 3/5] [ARM] Make TEXT_OFFSET a configurable option Eric Miao
2010-06-10  8:50   ` Uwe Kleine-König
2010-06-10  9:45     ` Eric Miao
2010-06-10 10:00       ` Uwe Kleine-König
2010-06-03  7:36 ` [PATCH 4/5] [ARM] Auto calculate ZRELADDR and provide option for exceptions Eric Miao
2010-06-07  8:51   ` Tony Lindgren
2010-06-07 15:12   ` Marek Vasut
2010-06-08  6:12     ` Eric Miao
2010-06-10  9:00   ` Uwe Kleine-König
2010-06-10  9:16     ` Russell King - ARM Linux
2010-06-10  9:35       ` Uwe Kleine-König
2010-06-10  9:38       ` Eric Miao
2010-06-10  9:43         ` Uwe Kleine-König
2010-06-10  9:47           ` Eric Miao
2010-06-10  9:18     ` Eric Miao
2010-06-10  9:58       ` Uwe Kleine-König
2010-06-10 10:20         ` Eric Miao
2010-06-10 22:06           ` Linus Walleij
2010-06-10 22:23       ` Linus Walleij
2010-06-11  1:34         ` Eric Miao
2010-06-10 18:40     ` Nicolas Pitre
2010-06-10 22:17   ` Linus Walleij
2010-06-11  6:37     ` Uwe Kleine-König
2010-06-17 19:33       ` Russell King - ARM Linux
2010-06-11  4:27   ` srinidhi
2010-09-02 21:21   ` Russell King - ARM Linux
2010-09-02 21:27     ` Russell King - ARM Linux
2010-09-03  7:48       ` Uwe Kleine-König
2010-09-03  9:55         ` Uwe Kleine-König
2010-09-03  9:56           ` [PATCH 1/7] ARM: specify ZRELADDR for ARCH_TEGRA Uwe Kleine-König
2010-09-03 17:46             ` Erik Gilling
2010-09-03 19:01               ` Uwe Kleine-König
2010-09-03 19:19                 ` Erik Gilling
2010-09-03 19:23                   ` Uwe Kleine-König
2010-09-08  9:11                     ` Russell King - ARM Linux
2010-09-08 11:56                       ` Russell King - ARM Linux
2010-09-08 12:16                         ` Uwe Kleine-König
2010-09-08 22:07                           ` Russell King - ARM Linux
2010-09-09  7:24                             ` Uwe Kleine-König
2010-09-09 16:56                               ` Erik Gilling
2010-09-03  9:56           ` [PATCH 2/7] [RFC] ARM: shmobile: remove unneeded hack to calculate zreladdr 
2010-09-03  9:56             ` Uwe Kleine-König
2010-09-03 13:39             ` [PATCH 2/7] [RFC] ARM: shmobile: remove unneeded hack to Eric Miao
2010-09-03 13:39               ` [PATCH 2/7] [RFC] ARM: shmobile: remove unneeded hack to calculate zreladdr Eric Miao
2010-09-03 18:53               ` [PATCH 2/7] [RFC] ARM: shmobile: remove unneeded hack to 
2010-09-03 18:53                 ` [PATCH 2/7] [RFC] ARM: shmobile: remove unneeded hack to calculate zreladdr Uwe Kleine-König
2010-09-14  8:08             ` Paul Mundt
2010-09-14  8:08               ` Paul Mundt
2010-09-14 12:23               ` [PATCH 2/7] [RFC] ARM: shmobile: remove unneeded hack to 
2010-09-14 12:23                 ` [PATCH 2/7] [RFC] ARM: shmobile: remove unneeded hack to calculate zreladdr Uwe Kleine-König
2010-09-03  9:56           ` [PATCH 3/7] ARM: specify ZRELADDR for ARCH_H720X Uwe Kleine-König
2010-09-03 13:40             ` Eric Miao
2010-09-03  9:56           ` [PATCH 4/7] ARM: specify ZRELADDR for ARCH_LPC32XX Uwe Kleine-König
2010-09-03 13:41             ` Eric Miao
2010-09-03  9:56           ` [PATCH 5/7] ARM: don't expose CONFIG_ZRELADDR to the users Uwe Kleine-König
2010-09-03 13:30             ` Eric Miao
2010-09-03 18:53               ` Uwe Kleine-König
2010-09-04  8:52                 ` Eric Miao
2010-09-07 22:39                   ` Mathieu Rondonneau
2010-09-08  5:04                     ` Uwe Kleine-König
2010-09-03  9:56           ` [PATCH 6/7] ARM: fix ordering of defaults for config ZRELADDR Uwe Kleine-König
2010-09-03  9:56           ` [PATCH 7/7] ARM: removed unused zreladdr specifications in all Makefile.boot files Uwe Kleine-König
2010-09-03 15:01             ` Eric Miao
2010-09-03 18:48               ` [PATCH 7/7 v2] " Uwe Kleine-König
2010-09-03 20:46           ` [PATCH 4/5] [ARM] Auto calculate ZRELADDR and provide option for exceptions Uwe Kleine-König
2010-09-05 18:52           ` Uwe Kleine-König
2010-09-08  9:14             ` Russell King - ARM Linux
2010-09-08  9:11           ` Russell King - ARM Linux
2010-09-08 20:31             ` Robert Schwebel
2010-09-03 13:33         ` Eric Miao
2010-06-03  7:36 ` [PATCH 5/5] [ARM] Move inclusion of Makefile.boot into arch/arm/boot/bootp Eric Miao
2010-06-10  9:01   ` Uwe Kleine-König
2010-06-03  7:43 ` [PATCH 0/5] Makefile.boot cleanup Eric Miao
2010-06-03  8:00   ` Uwe Kleine-König
2010-06-03  8:27     ` Eric Miao
2010-06-03  7:57 ` Uwe Kleine-König
2010-06-10 18:44   ` Nicolas Pitre
2010-06-11  4:55     ` Uwe Kleine-König
2010-06-17 19:22   ` Nicolas Pitre
2010-06-18  1:31     ` Eric Miao
2010-06-18  2:30     ` Eric Miao
2010-06-10 10:24 ` [PATCH 0/10] cleanup in early boot code Uwe Kleine-König
2010-06-10 10:27   ` [PATCH 01/10] arm/zImage: don't hard code the stack size twice Uwe Kleine-König
2010-06-10 10:31     ` Eric Miao
2010-06-10 18:47       ` Nicolas Pitre
2010-06-10 10:27   ` [PATCH 02/10] arm/zImage: some comments for __armv3_mpu_cache_on Uwe Kleine-König
2010-06-10 21:36     ` Sergei Shtylyov
2010-06-16  3:16     ` Eric Miao
2010-06-16  9:19       ` Russell King - ARM Linux
2010-06-10 10:27   ` [PATCH 03/10] arm/zImage: __armv3_mpu_cache_flush: respect should-be-zero specification Uwe Kleine-König
2010-06-11  1:23     ` Eric Miao
2010-06-10 10:27   ` [PATCH 04/10] arm/zImage: fix comments for cache_on, cache_off and cache_clean_flush Uwe Kleine-König
2010-06-17  9:28     ` Eric Miao
2010-06-10 10:27   ` [PATCH 05/10] arm/zImage: annotate debug functions about corrupted registers Uwe Kleine-König
2010-06-17  9:37     ` Eric Miao
2010-06-17  9:49       ` Uwe Kleine-König
2010-06-10 10:27   ` [PATCH 06/10] arm: remove bit-rotten STANDALONE_DEBUG for decompressor Uwe Kleine-König
2010-06-17  9:50     ` Eric Miao
2010-06-10 10:27   ` [PATCH 07/10] arm/zImage: don't define unused symbol initrd_phys Uwe Kleine-König
2010-06-17  9:19     ` Eric Miao
2010-06-10 10:27   ` [PATCH 08/10] arm: deprecate support for old way to pass kernel parameters Uwe Kleine-König
2010-06-17  9:58     ` Eric Miao
2010-06-17 23:00       ` Russell King - ARM Linux
2010-06-10 10:27   ` [PATCH 09/10] arm/uImage: require passing a LOADADDR when building with RUNTIME_PHYSOFFSET Uwe Kleine-König
2010-06-10 10:27   ` [PATCH 10/10] arm: Allow PHYS_OFFSET to be runtime determined Uwe Kleine-König
2010-06-10 10:28   ` [PATCH 0/10] cleanup in early boot code Eric Miao
2010-07-05 14:13 ` [PATCH 0/5] Makefile.boot cleanup Uwe Kleine-König
2010-07-05 14:15   ` [PATCH 01/11] ARM: zImage: don't hard code the stack size twice Uwe Kleine-König
2010-07-05 14:15   ` [PATCH 02/11] ARM: zImage: some comments for __armv3_mpu_cache_on Uwe Kleine-König
2010-07-05 14:15   ` [PATCH 03/11] ARM: zImage: __armv3_mpu_cache_flush: respect should-be-zero specification Uwe Kleine-König
2010-07-05 14:15   ` [PATCH 04/11] ARM: zImage: fix comments for cache_on, cache_off and cache_clean_flush Uwe Kleine-König
2010-07-05 14:15   ` [PATCH 05/11] ARM: zImage: annotate debug functions about corrupted registers Uwe Kleine-König
2010-07-05 14:15   ` [PATCH 06/11] ARM: remove bit-rotten STANDALONE_DEBUG for decompressor Uwe Kleine-König
2010-07-05 15:36     ` Nicolas Pitre
2010-07-05 14:15   ` [PATCH 07/11] ARM: zImage: don't define unused symbol initrd_phys Uwe Kleine-König
2010-07-05 14:15   ` [PATCH 08/11] ARM: deprecate support for old way to pass kernel parameters Uwe Kleine-König
2010-07-05 14:15   ` [PATCH 09/11] ARM: uImage: require passing a LOADADDR when building with RUNTIME_PHYSOFFSET Uwe Kleine-König
2010-07-05 16:03     ` Nicolas Pitre
2010-07-05 14:15   ` [PATCH 10/11] ARM: Remove unused PARAMS_PHYS from arch/arm/boot/compressed Uwe Kleine-König
2010-07-05 14:15   ` Uwe Kleine-König [this message]
2010-07-05 15:31     ` [PATCH 11/11] Auto calculate ZRELADDR and provide option for exceptions Nicolas Pitre
2010-07-06  2:09       ` Eric Miao
2010-07-31 15:54     ` Russell King - ARM Linux
2010-07-31 17:44       ` Nicolas Pitre
2010-08-02  8:42       ` [PATCH] ARM: don't expose CONFIG_ZRELADDR to the users Uwe Kleine-König
2010-07-07 14:45   ` [PATCH 0/5] Makefile.boot cleanup Uwe Kleine-König
2010-07-07 15:54     ` Nicolas Pitre
2010-07-08  7:08       ` Uwe Kleine-König
2010-07-08 20:49         ` Nicolas Pitre
2010-07-10  9:16         ` Eric Miao
2010-07-21  8:20         ` Uwe Kleine-König
2010-07-29 16:17           ` Git pull request, was " Nicolas Pitre

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1278339329-23739-11-git-send-email-u.kleine-koenig@pengutronix.de \
    --to=u.kleine-koenig@pengutronix.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.