Blackfin arch: Enable earlyprintk earlier - so any error after our interrupt tables are set up will print out

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>
This commit is contained in:
Robin Getz 2007-10-09 17:28:36 +08:00 committed by Bryan Wu
parent 2ebcade590
commit ce3afa1c04
2 changed files with 25 additions and 21 deletions

View File

@ -44,6 +44,7 @@
#include <asm/blackfin.h> #include <asm/blackfin.h>
#include <asm/cplbinit.h> #include <asm/cplbinit.h>
#include <asm/fixed_code.h> #include <asm/fixed_code.h>
#include <asm/early_printk.h>
u16 _bfin_swrst; u16 _bfin_swrst;
@ -157,8 +158,10 @@ static __init void parse_cmdline_early(char *cmdline_p)
1; 1;
} }
} }
} else if (!memcmp(to, "earlyprintk=", 12)) {
to += 12;
setup_early_printk(to);
} }
} }
c = *(to++); c = *(to++);
if (!c) if (!c)
@ -177,6 +180,23 @@ void __init setup_arch(char **cmdline_p)
#ifdef CONFIG_DUMMY_CONSOLE #ifdef CONFIG_DUMMY_CONSOLE
conswitchp = &dummy_con; conswitchp = &dummy_con;
#endif #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(); cclk = get_cclk();
sclk = get_sclk(); sclk = get_sclk();
@ -210,22 +230,6 @@ void __init setup_arch(char **cmdline_p)
flash_probe(); flash_probe();
#endif #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) if (physical_mem_end == 0)
physical_mem_end = _ramend; physical_mem_end = _ramend;

View File

@ -402,10 +402,6 @@ asmlinkage void trap_c(struct pt_regs *fp)
break; 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) { if (sig != 0 && sig != SIGTRAP) {
unsigned long stack; unsigned long stack;
dump_bfin_regs(fp, (void *)fp->retx); dump_bfin_regs(fp, (void *)fp->retx);
@ -414,6 +410,10 @@ asmlinkage void trap_c(struct pt_regs *fp)
if (current->mm == NULL) if (current->mm == NULL)
panic("Kernel exception"); 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 /* 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 * to a valid address, if we have a current application or panic