Blackfin arch: Print out doublefault addresses, so debug can occur
authorRobin Getz <rgetz@blackfin.uclinux.org>
Thu, 14 Aug 2008 06:44:33 +0000 (14:44 +0800)
committerBryan Wu <cooloney@kernel.org>
Thu, 14 Aug 2008 06:44:33 +0000 (14:44 +0800)
Signed-off-by: Robin Getz <rgetz@blackfin.uclinux.org>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
arch/blackfin/kernel/setup.c
arch/blackfin/mach-common/head.S

index 2ae84fea89eb487e1005141d103dd82d194d8a64..eb300550e0938974d79b94ba4bbb7718008d3323 100644 (file)
@@ -52,6 +52,7 @@ EXPORT_SYMBOL(mtd_size);
 #endif
 
 char __initdata command_line[COMMAND_LINE_SIZE];
+unsigned int __initdata *__retx;
 
 /* boot memmap, for parsing "memmap=" */
 #define BFIN_MEMMAP_MAX                128 /* number of entries in bfin_memmap */
@@ -785,7 +786,11 @@ void __init setup_arch(char **cmdline_p)
        bfin_write_SWRST(DOUBLE_FAULT);
 
        if (_bfin_swrst & RESET_DOUBLE)
-               printk(KERN_INFO "Recovering from Double Fault event\n");
+               /*
+                * don't decode the address, since you don't know if this
+                * kernel's symbol map is the same as the crashing kernel
+                */
+               printk(KERN_INFO "Recovering from Double Fault event at %p\n", __retx);
        else if (_bfin_swrst & RESET_WDOG)
                printk(KERN_INFO "Recovering from Watchdog event\n");
        else if (_bfin_swrst & RESET_SOFTWARE)
index 2c69ad49894e0cbeb1cc9a9124b2fcec7290edb4..fb7e2d426999a073198661487c2d0d9bbdde41eb 100644 (file)
@@ -90,6 +90,12 @@ ENTRY(__start)
        [p0] = R0;
        SSYNC;
 
+       /* Save RETX, in case of doublefault */
+       p0.l = ___retx;
+       p0.h = ___retx;
+       R0 = RETX;
+       [P0] = R0;
+
        /* Let each Blackfin family do its own thing */
        call _mach_early_start;