Avoid initrd and logbuffer area overlaps
authorMarian Balakowicz <m8@semihalf.com>
Wed, 7 May 2008 11:10:04 +0000 (13:10 +0200)
committerWolfgang Denk <wd@denx.de>
Fri, 9 May 2008 22:16:13 +0000 (00:16 +0200)
Add logbuffer to reserved LMB areas to prevent initrd allocation
from overlaping with it.

Make sure to use correct logbuffer base address.

Signed-off-by: Marian Balakowicz <m8@semihalf.com>
common/cmd_log.c
common/image.c
include/logbuff.h
lib_ppc/board.c

index b9f9ba03428fe2c7d35dff7b6ae2a2b2880c9374..8e04941d6106dddc5cce24901cdcd7f792907021 100644 (file)
@@ -66,6 +66,12 @@ static logbuff_t *log;
 #endif
 static char *lbuf;
 
+unsigned long __logbuffer_base(void)
+{
+       return CFG_SDRAM_BASE + gd->bd->bi_memsize - LOGBUFF_LEN;
+}
+unsigned long logbuffer_base (void) __attribute__((weak, alias("__logbuffer_base")));
+
 void logbuff_init_ptrs (void)
 {
        unsigned long tag, post_word;
@@ -75,7 +81,7 @@ void logbuff_init_ptrs (void)
        log = (logbuff_t *)CONFIG_ALT_LH_ADDR;
        lbuf = (char *)CONFIG_ALT_LB_ADDR;
 #else
-       log = (logbuff_t *)(gd->bd->bi_memsize-LOGBUFF_LEN) - 1;
+       log = (logbuff_t *)(logbuffer_base ()) - 1;
        lbuf = (char *)log->buf;
 #endif
 
index f4070fb387658fb86849ecf8ccce504faa1ed22b..f7faf504d428e3a63fe0d2b02194b8d5269df2d3 100644 (file)
 #include <dataflash.h>
 #endif
 
+#ifdef CONFIG_LOGBUFFER
+#include <logbuff.h>
+#endif
+
 #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE)
 #include <rtc.h>
 #endif
@@ -1018,6 +1022,9 @@ int boot_ramdisk_high (struct lmb *lmb, ulong rd_data, ulong rd_len,
                initrd_high = ~0;
        }
 
+       /* Prevent initrd from overwriting logbuffer */
+       lmb_reserve(lmb, logbuffer_base() - LOGBUFF_OVERHEAD, LOGBUFF_RESERVE);
+
        debug ("## initrd_high = 0x%08lx, copy_to_ram = %d\n",
                        initrd_high, initrd_copy_to_ram);
 
index d4157290538c1baf1433a5846469055712efd059..f117c66e37f69cd1d053e29c73f2192bb721c4d4 100644 (file)
@@ -60,6 +60,7 @@ int drv_logbuff_init (void);
 void logbuff_init_ptrs (void);
 void logbuff_log(char *msg);
 void logbuff_reset (void);
+unsigned long logbuffer_base (void);
 
 #endif /* CONFIG_LOGBUFFER */
 
index 4956403cce8d1439dbd5f41fd10fede6021a107a..bc49ea1284b37231277c02769f78c5b14882bc9a 100644 (file)
@@ -398,6 +398,11 @@ ulong get_effective_memsize(void)
  ************************************************************************
  */
 
+unsigned long logbuffer_base(void)
+{
+       return CFG_SDRAM_BASE + get_effective_memsize() - LOGBUFF_LEN;
+}
+
 void board_init_f (ulong bootflag)
 {
        bd_t *bd;