Blackfin arch: Enable earlyprintk earlier - so any error after our interrupt tables...
authorRobin Getz <robin.getz@analog.com>
Tue, 9 Oct 2007 09:28:36 +0000 (17:28 +0800)
committerBryan Wu <bryan.wu@analog.com>
Tue, 9 Oct 2007 09:28:36 +0000 (17:28 +0800)
Also ensure that the traps_c code doesn't cause a double fault, by
sending a signal to a faulting kernel before the memory subsystem
is fully initialized, by printing out the error message before sending
the signal.

Signed-off-by: Robin Getz <robin.getz@analog.com>
Signed-off-by: Bryan Wu <bryan.wu@analog.com>
arch/blackfin/kernel/setup.c
arch/blackfin/kernel/traps.c

index abf34a8..8dcd76e 100644 (file)
@@ -44,6 +44,7 @@
 #include <asm/blackfin.h>
 #include <asm/cplbinit.h>
 #include <asm/fixed_code.h>
+#include <asm/early_printk.h>
 
 u16 _bfin_swrst;
 
@@ -157,8 +158,10 @@ static __init void parse_cmdline_early(char *cmdline_p)
                                                            1;
                                        }
                                }
+                       } else if (!memcmp(to, "earlyprintk=", 12)) {
+                               to += 12;
+                               setup_early_printk(to);
                        }
-
                }
                c = *(to++);
                if (!c)
@@ -177,6 +180,23 @@ void __init setup_arch(char **cmdline_p)
 #ifdef CONFIG_DUMMY_CONSOLE
        conswitchp = &dummy_con;
 #endif
+
+#if defined(CONFIG_CMDLINE_BOOL)
+       strncpy(&command_line[0], CONFIG_CMDLINE, sizeof(command_line));
+       command_line[sizeof(command_line) - 1] = 0;
+#endif
+
+       /* Keep a copy of command line */
+       *cmdline_p = &command_line[0];
+       memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
+       boot_command_line[COMMAND_LINE_SIZE - 1] = '\0';
+
+       /* setup memory defaults from the user config */
+       physical_mem_end = 0;
+       _ramend = CONFIG_MEM_SIZE * 1024 * 1024;
+
+       parse_cmdline_early(&command_line[0]);
+
        cclk = get_cclk();
        sclk = get_sclk();
 
@@ -210,22 +230,6 @@ void __init setup_arch(char **cmdline_p)
        flash_probe();
 #endif
 
-#if defined(CONFIG_CMDLINE_BOOL)
-       strncpy(&command_line[0], CONFIG_CMDLINE, sizeof(command_line));
-       command_line[sizeof(command_line) - 1] = 0;
-#endif
-
-       /* Keep a copy of command line */
-       *cmdline_p = &command_line[0];
-       memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
-       boot_command_line[COMMAND_LINE_SIZE - 1] = '\0';
-
-       /* setup memory defaults from the user config */
-       physical_mem_end = 0;
-       _ramend = CONFIG_MEM_SIZE * 1024 * 1024;
-
-       parse_cmdline_early(&command_line[0]);
-
        if (physical_mem_end == 0)
                physical_mem_end = _ramend;
 
index ba68eb2..8823e9a 100644 (file)
@@ -402,10 +402,6 @@ asmlinkage void trap_c(struct pt_regs *fp)
                break;
        }
 
-       info.si_signo = sig;
-       info.si_errno = 0;
-       info.si_addr = (void *)fp->pc;
-       force_sig_info(sig, &info, current);
        if (sig != 0 && sig != SIGTRAP) {
                unsigned long stack;
                dump_bfin_regs(fp, (void *)fp->retx);
@@ -414,6 +410,10 @@ asmlinkage void trap_c(struct pt_regs *fp)
                if (current->mm == NULL)
                        panic("Kernel exception");
        }
+       info.si_signo = sig;
+       info.si_errno = 0;
+       info.si_addr = (void *)fp->pc;
+       force_sig_info(sig, &info, current);
 
        /* if the address that we are about to return to is not valid, set it
         * to a valid address, if we have a current application or panic