summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarian Balakowicz <m8@semihalf.com>2008-05-07 13:10:04 +0200
committerWolfgang Denk <wd@denx.de>2008-05-10 00:16:13 +0200
commit1b5605ca57fbb364f4d78eeee28b974ed875e888 (patch)
tree0a19c491ded69f7b2e1771e654e6b90807bde522
parentc59518e15949b3403df5c5b0c2c48ea0e5bea24b (diff)
Avoid initrd and logbuffer area overlaps
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>
-rw-r--r--common/cmd_log.c8
-rw-r--r--common/image.c7
-rw-r--r--include/logbuff.h1
-rw-r--r--lib_ppc/board.c5
4 files changed, 20 insertions, 1 deletions
diff --git a/common/cmd_log.c b/common/cmd_log.c
index b9f9ba0342..8e04941d61 100644
--- a/common/cmd_log.c
+++ b/common/cmd_log.c
@@ -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
diff --git a/common/image.c b/common/image.c
index f4070fb387..f7faf504d4 100644
--- a/common/image.c
+++ b/common/image.c
@@ -36,6 +36,10 @@
#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);
diff --git a/include/logbuff.h b/include/logbuff.h
index d415729053..f117c66e37 100644
--- a/include/logbuff.h
+++ b/include/logbuff.h
@@ -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 */
diff --git a/lib_ppc/board.c b/lib_ppc/board.c
index 4956403cce..bc49ea1284 100644
--- a/lib_ppc/board.c
+++ b/lib_ppc/board.c
@@ -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;