Added arch_lmb_reserve to allow arch specific memory regions protection
authorKumar Gala <galak@kernel.crashing.org>
Fri, 17 Oct 2008 02:52:08 +0000 (21:52 -0500)
committerWolfgang Denk <wd@denx.de>
Sat, 18 Oct 2008 19:54:04 +0000 (21:54 +0200)
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@kernel.crashing.org>
common/cmd_bootm.c
lib_m68k/bootm.c
lib_ppc/bootm.c
lib_sparc/bootm.c

index 2a9c59f2a266c6281c88081d23db4cc62a75c703..b02da3e34a692fb536703ff464ec1ca91939f1d0 100644 (file)
@@ -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 */
index a73f6ebb99d4d0f3bb0f297fe4a1ae3002ef6c39..c52dd2fbaae677fb02b48267d904ddf8925bbe18 100644 (file)
@@ -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, (CONFIG_SYS_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);
index d49881837058201db90b85e71fe5fc58187b53cd..1f3501ae32855bb543131dd9ac5a7a749a4af23a 100644 (file)
@@ -55,30 +55,10 @@ static void set_clocks_in_mhz (bd_t *kbd);
 #define CONFIG_SYS_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, (CONFIG_SYS_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);
index 2baafcc555998021bf01f01ea6cbda0f914bf558..565b41caf6b7ddd3160de6d2c42afd4b654096f3 100644 (file)
@@ -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, CONFIG_SYS_RELOC_MONITOR_BASE, CONFIG_SYS_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, CONFIG_SYS_RELOC_MONITOR_BASE, CONFIG_SYS_RAM_END);
-
                ret = boot_ramdisk_high(lmb, images->rd_start, rd_len,
                                        &initrd_start, &initrd_end);
                if (ret) {