Commit 337d390b authored by Robin Getz's avatar Robin Getz Committed by Bryan Wu

Blackfin arch: Print out debug info, as early as possible

Print out debug info, as early as possible - even before the
kernel initializes the interrupt vectors. Now we can print out debug
messages almost anytime during the boot process.
Signed-off-by: default avatarRobin Getz <robin.getz@analog.com>
Signed-off-by: default avatarBryan Wu <bryan.wu@analog.com>
parent ce3afa1c
...@@ -38,13 +38,13 @@ extern struct console *bfin_earlyserial_init(unsigned int port, ...@@ -38,13 +38,13 @@ extern struct console *bfin_earlyserial_init(unsigned int port,
static struct console *early_console; static struct console *early_console;
/* Default console /* Default console */
* Port n == ttyBFn
* cflags == UART output modes
*/
#define DEFAULT_PORT 0 #define DEFAULT_PORT 0
#define DEFAULT_CFLAG CS8|B57600 #define DEFAULT_CFLAG CS8|B57600
/* Default console for early crashes */
#define DEFAULT_EARLY_PORT "serial,uart0,57600"
#ifdef CONFIG_SERIAL_CORE #ifdef CONFIG_SERIAL_CORE
/* What should get here is "0,57600" */ /* What should get here is "0,57600" */
static struct console * __init earlyserial_init(char *buf) static struct console * __init earlyserial_init(char *buf)
...@@ -158,4 +158,57 @@ int __init setup_early_printk(char *buf) ...@@ -158,4 +158,57 @@ int __init setup_early_printk(char *buf)
return 0; return 0;
} }
/*
* Set up a temporary Event Vector Table, so if something bad happens before
* the kernel is fully started, it doesn't vector off into somewhere we don't
* know
*/
asmlinkage void __init init_early_exception_vectors(void)
{
SSYNC();
/* cannot program in software:
* evt0 - emulation (jtag)
* evt1 - reset
*/
bfin_write_EVT2(early_trap);
bfin_write_EVT3(early_trap);
bfin_write_EVT5(early_trap);
bfin_write_EVT6(early_trap);
bfin_write_EVT7(early_trap);
bfin_write_EVT8(early_trap);
bfin_write_EVT9(early_trap);
bfin_write_EVT10(early_trap);
bfin_write_EVT11(early_trap);
bfin_write_EVT12(early_trap);
bfin_write_EVT13(early_trap);
bfin_write_EVT14(early_trap);
bfin_write_EVT15(early_trap);
CSYNC();
/* Set all the return from interupt, exception, NMI to a known place
* so if we do a RETI, RETX or RETN by mistake - we go somewhere known
* Note - don't change RETS - we are in a subroutine, or
* RETE - since it might screw up if emulator is attached
*/
asm("\tRETI = %0; RETX = %0; RETN = %0;\n"
: : "p"(early_trap));
}
asmlinkage void __init early_trap_c(struct pt_regs *fp, void *retaddr)
{
/* This can happen before the uart is initialized, so initialize
* the UART now
*/
if (likely(early_console == NULL))
setup_early_printk(DEFAULT_EARLY_PORT);
dump_bfin_regs(fp, retaddr);
dump_bfin_trace_buffer();
panic("Died early");
}
early_param("earlyprintk", setup_early_printk); early_param("earlyprintk", setup_early_printk);
...@@ -181,6 +181,12 @@ ENTRY(__start) ...@@ -181,6 +181,12 @@ ENTRY(__start)
fp = sp; fp = sp;
usp = sp; usp = sp;
#ifdef CONFIG_EARLY_PRINTK
SP += -12;
call _init_early_exception_vectors;
SP += 12;
#endif
/* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */ /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */
call _bf53x_relocate_l1_mem; call _bf53x_relocate_l1_mem;
#if CONFIG_BFIN_KERNEL_CLOCK #if CONFIG_BFIN_KERNEL_CLOCK
......
...@@ -224,6 +224,12 @@ ENTRY(__start) ...@@ -224,6 +224,12 @@ ENTRY(__start)
fp = sp; fp = sp;
usp = sp; usp = sp;
#ifdef CONFIG_EARLY_PRINTK
SP += -12;
call _init_early_exception_vectors;
SP += 12;
#endif
/* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */ /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */
call _bf53x_relocate_l1_mem; call _bf53x_relocate_l1_mem;
#if CONFIG_BFIN_KERNEL_CLOCK #if CONFIG_BFIN_KERNEL_CLOCK
......
...@@ -125,6 +125,12 @@ ENTRY(__stext) ...@@ -125,6 +125,12 @@ ENTRY(__stext)
FP = SP; FP = SP;
USP = SP; USP = SP;
#ifdef CONFIG_EARLY_PRINTK
SP += -12;
call _init_early_exception_vectors;
SP += 12;
#endif
/* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */ /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */
call _bf53x_relocate_l1_mem; call _bf53x_relocate_l1_mem;
#if CONFIG_BFIN_KERNEL_CLOCK #if CONFIG_BFIN_KERNEL_CLOCK
......
...@@ -169,6 +169,12 @@ ENTRY(__start) ...@@ -169,6 +169,12 @@ ENTRY(__start)
fp = sp; fp = sp;
usp = sp; usp = sp;
#ifdef CONFIG_EARLY_PRINTK
SP += -12;
call _init_early_exception_vectors;
SP += 12;
#endif
/* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */ /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */
call _bf53x_relocate_l1_mem; call _bf53x_relocate_l1_mem;
#if CONFIG_BFIN_KERNEL_CLOCK #if CONFIG_BFIN_KERNEL_CLOCK
......
...@@ -835,12 +835,13 @@ ENTRY(_ex_trace_buff_full) ...@@ -835,12 +835,13 @@ ENTRY(_ex_trace_buff_full)
P2 = [sp++]; P2 = [sp++];
P3 = [sp++]; P3 = [sp++];
jump _return_from_exception; jump _return_from_exception;
ENDPROC(_ex_trace_buff_full)
#if CONFIG_DEBUG_BFIN_HWTRACE_EXPAND_LEN == 4 #if CONFIG_DEBUG_BFIN_HWTRACE_EXPAND_LEN == 4
.data .data
#else #else
.section .l1.data.B .section .l1.data.B
#endif #endif /* CONFIG_DEBUG_BFIN_HWTRACE_EXPAND_LEN */
ENTRY(_trace_buff_offset) ENTRY(_trace_buff_offset)
.long 0; .long 0;
ALIGN ALIGN
...@@ -848,7 +849,45 @@ ENTRY(_software_trace_buff) ...@@ -848,7 +849,45 @@ ENTRY(_software_trace_buff)
.rept ((1 << CONFIG_DEBUG_BFIN_HWTRACE_EXPAND_LEN)*256); .rept ((1 << CONFIG_DEBUG_BFIN_HWTRACE_EXPAND_LEN)*256);
.long 0 .long 0
.endr .endr
#endif #endif /* CONFIG_DEBUG_BFIN_HWTRACE_EXPAND */
#if CONFIG_EARLY_PRINTK
.section .init.text
ENTRY(_early_trap)
SAVE_ALL_SYS
trace_buffer_stop(p0,r0);
/* Turn caches off, to ensure we don't get double exceptions */
P4.L = LO(IMEM_CONTROL);
P4.H = HI(IMEM_CONTROL);
R5 = [P4]; /* Control Register*/
BITCLR(R5,ENICPLB_P);
CLI R1;
SSYNC; /* SSYNC required before writing to IMEM_CONTROL. */
.align 8;
[P4] = R5;
SSYNC;
P4.L = LO(DMEM_CONTROL);
P4.H = HI(DMEM_CONTROL);
R5 = [P4];
BITCLR(R5,ENDCPLB_P);
SSYNC; /* SSYNC required before writing to DMEM_CONTROL. */
.align 8;
[P4] = R5;
SSYNC;
STI R1;
r0 = sp; /* stack frame pt_regs pointer argument ==> r0 */
r1 = RETX;
SP += -12;
call _early_trap_c;
SP += 12;
ENDPROC(_early_trap)
#endif /* CONFIG_EARLY_PRINTK */
/* /*
* Put these in the kernel data section - that should always be covered by * Put these in the kernel data section - that should always be covered by
......
...@@ -22,6 +22,7 @@ asmlinkage void evt_system_call(void); ...@@ -22,6 +22,7 @@ asmlinkage void evt_system_call(void);
asmlinkage void init_exception_buff(void); asmlinkage void init_exception_buff(void);
asmlinkage void trap_c(struct pt_regs *fp); asmlinkage void trap_c(struct pt_regs *fp);
asmlinkage void ex_replaceable(void); asmlinkage void ex_replaceable(void);
asmlinkage void early_trap(void);
extern void *ex_table[]; extern void *ex_table[];
extern void return_from_exception(void); extern void return_from_exception(void);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment