aboutsummaryrefslogtreecommitdiff
path: root/lib_ppc
diff options
context:
space:
mode:
authorKumar Gala <galak@kernel.crashing.org>2008-10-16 21:52:08 -0500
committerWolfgang Denk <wd@denx.de>2008-10-18 21:54:04 +0200
commit76da19df5b8e186d269f29190696bd31fb6c836b (patch)
tree95c2eac7c96460257f163f358e146b6375be2180 /lib_ppc
parente02d4a9904c8f36395994c0c81469d552b82f5ea (diff)
Added arch_lmb_reserve to allow arch specific memory regions protection
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>
Diffstat (limited to 'lib_ppc')
-rw-r--r--lib_ppc/bootm.c50
1 files changed, 28 insertions, 22 deletions
diff --git a/lib_ppc/bootm.c b/lib_ppc/bootm.c
index d49881837..1f3501ae3 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 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);