Blackfin: fix crash when booting from external memory
authorMike Frysinger <vapier@gentoo.org>
Fri, 13 Feb 2009 22:10:58 +0000 (17:10 -0500)
committerMike Frysinger <vapier@gentoo.org>
Thu, 2 Apr 2009 10:41:56 +0000 (06:41 -0400)
When testing a u-boot binary that hasn't been booted from the bootrom, we
have to make sure the bootstruct structure has sane storage space.  If we
don't, the initcode will crash when it tries to dereference an invalid
pointer.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
cpu/blackfin/initcode.c
cpu/blackfin/start.S

index 7bd4b227e6d3b71c07a5338e80ba2d77fad4b103..3120447c517e2feb51fcdfc3288b1db4a1f70e1e 100644 (file)
@@ -249,6 +249,8 @@ static inline void serial_putc(char c)
 BOOTROM_CALLED_FUNC_ATTR
 void initcode(ADI_BOOT_DATA *bootstruct)
 {
+       ADI_BOOT_DATA bootstruct_scratch;
+
        /* Save the clock pieces that are used in baud rate calculation */
        unsigned int sdivB, divB, vcoB;
        serial_init();
@@ -260,6 +262,13 @@ void initcode(ADI_BOOT_DATA *bootstruct)
 
        serial_putc('A');
 
+       /* If the bootstruct is NULL, then it's because we're loading
+        * dynamically and not via LDR (bootrom).  So set the struct to
+        * some scratch space.
+        */
+       if (!bootstruct)
+               bootstruct = &bootstruct_scratch;
+
 #ifdef CONFIG_HW_WATCHDOG
 # ifndef CONFIG_HW_WATCHDOG_TIMEOUT_INITCODE
 #  define CONFIG_HW_WATCHDOG_TIMEOUT_INITCODE 20000
index 506fea58cc6d3c42c67c00b937ac80c3ccefb8d7..7cbd6322059023072884fd18de58f9db35d70aae 100644 (file)
@@ -131,6 +131,7 @@ ENTRY(_start)
        r3.h = 0x2000;
        cc = r5 < r3 (iu);
        if cc jump .Ldma_and_reprogram;
+       r0 = 0 (x);     /* set bootstruct to NULL */
        call _initcode;
        jump .Lprogrammed;
 
@@ -147,6 +148,7 @@ ENTRY(_start)
        r1 = r1 + r5;   /* ... to current (not load) address of initcode */
        p3 = r0;
        call _dma_memcpy_nocache;
+       r0 = 0 (x);     /* set bootstruct to NULL */
        call (p3);
 
        /* Since we reprogrammed SCLK, we need to update the serial divisor */