[U-Boot] [PATCH v2] Added arch_lmb_reserve to allow arch specific memory regions protection

Kumar Gala galak at kernel.crashing.org
Wed Oct 15 15:48:23 CEST 2008


Each architecture has different ways of determine what regions of memory
might not be valid to get overwritten when we boot.  This provides a
hook to allow them to reserve any regions they care about.  Currently
only ppc, m68k and sparc need/use this.

Signed-off-by: Kumar Gala <galak at kernel.crashing.org>
---

For some reason I had two commits in my tree and the cmd_bootm.c changes didn't
make it out.

- k

 common/cmd_bootm.c |    7 +++++++
 lib_m68k/bootm.c   |   29 ++++++++++++++++-------------
 lib_ppc/bootm.c    |   50 ++++++++++++++++++++++++++++----------------------
 lib_sparc/bootm.c  |   16 +++++++++-------
 4 files changed, 60 insertions(+), 42 deletions(-)

diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index 897e9f6..e49d6f7 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -128,6 +128,12 @@ void __board_lmb_reserve(struct lmb *lmb)
 }
 void board_lmb_reserve(struct lmb *lmb) __attribute__((weak, alias("__board_lmb_reserve")));
 
+void __arch_lmb_reserve(struct lmb *lmb)
+{
+	/* please define platform specific arch_lmb_reserve() */
+}
+void arch_lmb_reserve(struct lmb *lmb) __attribute__((weak, alias("__arch_lmb_reserve")));
+
 #if defined(__ARM__)
   #define IH_INITRD_ARCH IH_ARCH_ARM
 #elif defined(__avr32__)
@@ -173,6 +179,7 @@ static int bootm_start(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
 	lmb_add(&images.lmb, (phys_addr_t)mem_start, mem_size);
 
+	arch_lmb_reserve(&images.lmb);
 	board_lmb_reserve(&images.lmb);
 
 	/* get kernel image header, start address and length */
diff --git a/lib_m68k/bootm.c b/lib_m68k/bootm.c
index 6504cc9..1d773d3 100644
--- a/lib_m68k/bootm.c
+++ b/lib_m68k/bootm.c
@@ -43,22 +43,10 @@ DECLARE_GLOBAL_DATA_PTR;
 static ulong get_sp (void);
 static void set_clocks_in_mhz (bd_t *kbd);
 
-int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
+void arch_lmb_reserve(struct lmb *lmb)
 {
 	ulong sp;
 
-	ulong rd_len;
-	ulong initrd_start, initrd_end;
-	int ret;
-
-	ulong cmd_start, cmd_end;
-	ulong bootmap_base;
-	bd_t  *kbd;
-	void  (*kernel) (bd_t *, ulong, ulong, ulong, ulong);
-	struct lmb *lmb = &images->lmb;
-
-	bootmap_base = getenv_bootm_low();
-
 	/*
 	 * Booting a (Linux) kernel image
 	 *
@@ -74,6 +62,21 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
 	/* adjust sp by 1K to be safe */
 	sp -= 1024;
 	lmb_reserve(lmb, sp, (CFG_SDRAM_BASE + gd->ram_size - sp));
+}
+
+int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
+{
+	ulong rd_len;
+	ulong initrd_start, initrd_end;
+	int ret;
+
+	ulong cmd_start, cmd_end;
+	ulong bootmap_base;
+	bd_t  *kbd;
+	void  (*kernel) (bd_t *, ulong, ulong, ulong, ulong);
+	struct lmb *lmb = &images->lmb;
+
+	bootmap_base = getenv_bootm_low();
 
 	/* allocate space and init command line */
 	ret = boot_get_cmdline (lmb, &cmd_start, &cmd_end, bootmap_base);
diff --git a/lib_ppc/bootm.c b/lib_ppc/bootm.c
index 5af25dd..99bb5db 100644
--- a/lib_ppc/bootm.c
+++ b/lib_ppc/bootm.c
@@ -55,30 +55,10 @@ static void set_clocks_in_mhz (bd_t *kbd);
 #define CFG_LINUX_LOWMEM_MAX_SIZE	(768*1024*1024)
 #endif
 
-__attribute__((noinline))
-int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
+void arch_lmb_reserve(struct lmb *lmb)
 {
-	ulong	sp;
-
-	ulong	initrd_start, initrd_end;
-	ulong	rd_len;
-	ulong	size;
 	phys_size_t bootm_size;
-
-	ulong	cmd_start, cmd_end, bootmap_base;
-	bd_t	*kbd;
-	void	(*kernel)(bd_t *, ulong r4, ulong r5, ulong r6,
-			  ulong r7, ulong r8, ulong r9);
-	int	ret;
-	ulong	of_size = images->ft_len;
-	struct lmb *lmb = &images->lmb;
-
-#if defined(CONFIG_OF_LIBFDT)
-	char	*of_flat_tree = images->ft_addr;
-#endif
-
-	kernel = (void (*)(bd_t *, ulong, ulong, ulong,
-			   ulong, ulong, ulong))images->ep;
+	ulong size, sp, bootmap_base;
 
 	bootmap_base = getenv_bootm_low();
 	bootm_size = getenv_bootm_size();
@@ -116,6 +96,32 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
 	sp -= 1024;
 	lmb_reserve(lmb, sp, (CFG_SDRAM_BASE + get_effective_memsize() - sp));
 
+	return ;
+}
+
+__attribute__((noinline))
+int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
+{
+	ulong	initrd_start, initrd_end;
+	ulong	rd_len;
+
+	ulong	cmd_start, cmd_end, bootmap_base;
+	bd_t	*kbd;
+	void	(*kernel)(bd_t *, ulong r4, ulong r5, ulong r6,
+			  ulong r7, ulong r8, ulong r9);
+	int	ret;
+	ulong	of_size = images->ft_len;
+	struct lmb *lmb = &images->lmb;
+
+#if defined(CONFIG_OF_LIBFDT)
+	char	*of_flat_tree = images->ft_addr;
+#endif
+
+	kernel = (void (*)(bd_t *, ulong, ulong, ulong,
+			   ulong, ulong, ulong))images->ep;
+
+	bootmap_base = getenv_bootm_low();
+
 	if (!of_size) {
 		/* allocate space and init command line */
 		ret = boot_get_cmdline (lmb, &cmd_start, &cmd_end, bootmap_base);
diff --git a/lib_sparc/bootm.c b/lib_sparc/bootm.c
index 4e8c920..d6b2e98 100644
--- a/lib_sparc/bootm.c
+++ b/lib_sparc/bootm.c
@@ -81,6 +81,15 @@ struct __attribute__ ((packed)) {
 /* temporary initrd image holder */
 image_header_t ihdr;
 
+void arch_lmb_reserve(struct lmb *lmb)
+{
+	/* Reserve the space used by PROM and stack. This is done
+	 * to avoid that the RAM image is copied over stack or
+	 * PROM.
+	 */
+	lmb_reserve(lmb, CFG_RELOC_MONITOR_BASE, CFG_RAM_END);
+}
+
 /* boot the linux kernel */
 int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t * images)
 {
@@ -124,13 +133,6 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t * images)
 	rd_len = images->rd_end - images->rd_start;
 
 	if (rd_len) {
-
-		/* Reserve the space used by PROM and stack. This is done
-		 * to avoid that the RAM image is copied over stack or
-		 * PROM.
-		 */
-		lmb_reserve(lmb, CFG_RELOC_MONITOR_BASE, CFG_RAM_END);
-
 		ret = boot_ramdisk_high(lmb, images->rd_start, rd_len,
 					&initrd_start, &initrd_end);
 		if (ret) {
-- 
1.5.5.1



More information about the U-Boot mailing list