Browse Source

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>
Marian Balakowicz 17 years ago
parent
commit
1b5605ca57
4 changed files with 20 additions and 1 deletions
  1. 7 1
      common/cmd_log.c
  2. 7 0
      common/image.c
  3. 1 0
      include/logbuff.h
  4. 5 0
      lib_ppc/board.c

+ 7 - 1
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
 

+ 7 - 0
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);
 

+ 1 - 0
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 */
 

+ 5 - 0
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;