Blackfin arch: split apart dump_bfin_regs and merge/remove show_regs from process.c, which was largely duplicated
Signed-off-by: Mike Frysinger <michael.frysinger@analog.com> Signed-off-by: Bryan Wu <bryan.wu@analog.com>
This commit is contained in:
parent
9cb07b23db
commit
49dce9124b
|
@ -205,7 +205,8 @@ asmlinkage void __init early_trap_c(struct pt_regs *fp, void *retaddr)
|
||||||
if (likely(early_console == NULL))
|
if (likely(early_console == NULL))
|
||||||
setup_early_printk(DEFAULT_EARLY_PORT);
|
setup_early_printk(DEFAULT_EARLY_PORT);
|
||||||
|
|
||||||
dump_bfin_regs(fp, retaddr);
|
dump_bfin_mem((void *)fp->retx);
|
||||||
|
show_regs(fp);
|
||||||
dump_bfin_trace_buffer();
|
dump_bfin_trace_buffer();
|
||||||
|
|
||||||
panic("Died early");
|
panic("Died early");
|
||||||
|
|
|
@ -134,27 +134,6 @@ void cpu_idle(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_regs(struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
printk(KERN_NOTICE "\n");
|
|
||||||
printk(KERN_NOTICE
|
|
||||||
"PC: %08lu Status: %04lu SysStatus: %04lu RETS: %08lu\n",
|
|
||||||
regs->pc, regs->astat, regs->seqstat, regs->rets);
|
|
||||||
printk(KERN_NOTICE
|
|
||||||
"A0.x: %08lx A0.w: %08lx A1.x: %08lx A1.w: %08lx\n",
|
|
||||||
regs->a0x, regs->a0w, regs->a1x, regs->a1w);
|
|
||||||
printk(KERN_NOTICE "P0: %08lx P1: %08lx P2: %08lx P3: %08lx\n",
|
|
||||||
regs->p0, regs->p1, regs->p2, regs->p3);
|
|
||||||
printk(KERN_NOTICE "P4: %08lx P5: %08lx\n", regs->p4, regs->p5);
|
|
||||||
printk(KERN_NOTICE "R0: %08lx R1: %08lx R2: %08lx R3: %08lx\n",
|
|
||||||
regs->r0, regs->r1, regs->r2, regs->r3);
|
|
||||||
printk(KERN_NOTICE "R4: %08lx R5: %08lx R6: %08lx R7: %08lx\n",
|
|
||||||
regs->r4, regs->r5, regs->r6, regs->r7);
|
|
||||||
|
|
||||||
if (!regs->ipend)
|
|
||||||
printk(KERN_NOTICE "USP: %08lx\n", rdusp());
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fill in the fpu structure for a core dump. */
|
/* Fill in the fpu structure for a core dump. */
|
||||||
|
|
||||||
int dump_fpu(struct pt_regs *regs, elf_fpregset_t * fpregs)
|
int dump_fpu(struct pt_regs *regs, elf_fpregset_t * fpregs)
|
||||||
|
|
|
@ -169,7 +169,9 @@ asmlinkage void double_fault_c(struct pt_regs *fp)
|
||||||
console_verbose();
|
console_verbose();
|
||||||
oops_in_progress = 1;
|
oops_in_progress = 1;
|
||||||
printk(KERN_EMERG "\n" KERN_EMERG "Double Fault\n");
|
printk(KERN_EMERG "\n" KERN_EMERG "Double Fault\n");
|
||||||
dump_bfin_regs(fp, (void *)fp->retx);
|
dump_bfin_process(fp);
|
||||||
|
dump_bfin_mem((void *)fp->retx);
|
||||||
|
show_regs(fp);
|
||||||
panic("Double Fault - unrecoverable event\n");
|
panic("Double Fault - unrecoverable event\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -444,7 +446,9 @@ asmlinkage void trap_c(struct pt_regs *fp)
|
||||||
|
|
||||||
if (sig != SIGTRAP) {
|
if (sig != SIGTRAP) {
|
||||||
unsigned long stack;
|
unsigned long stack;
|
||||||
dump_bfin_regs(fp, (void *)fp->retx);
|
dump_bfin_process(fp);
|
||||||
|
dump_bfin_mem((void *)fp->retx);
|
||||||
|
show_regs(fp);
|
||||||
|
|
||||||
/* Print out the trace buffer if it makes sense */
|
/* Print out the trace buffer if it makes sense */
|
||||||
#ifndef CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE
|
#ifndef CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE
|
||||||
|
@ -601,16 +605,28 @@ void dump_stack(void)
|
||||||
show_stack(current, &stack);
|
show_stack(current, &stack);
|
||||||
trace_buffer_restore(tflags);
|
trace_buffer_restore(tflags);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(dump_stack);
|
EXPORT_SYMBOL(dump_stack);
|
||||||
|
|
||||||
void dump_bfin_regs(struct pt_regs *fp, void *retaddr)
|
void dump_bfin_process(struct pt_regs *fp)
|
||||||
{
|
{
|
||||||
char buf [150];
|
/* We should be able to look at fp->ipend, but we don't push it on the
|
||||||
|
* stack all the time, so do this until we fix that */
|
||||||
|
unsigned int context = bfin_read_IPEND();
|
||||||
|
|
||||||
|
if (oops_in_progress)
|
||||||
|
printk(KERN_EMERG "Kernel OOPS in progress\n");
|
||||||
|
|
||||||
|
if (context & 0x0020)
|
||||||
|
printk(KERN_NOTICE "Deferred excecption or HW Error context\n");
|
||||||
|
else if (context & 0x3FC0)
|
||||||
|
printk(KERN_NOTICE "Interrupt context\n");
|
||||||
|
else if (context & 0x4000)
|
||||||
|
printk(KERN_NOTICE "Deferred Interrupt context\n");
|
||||||
|
else if (context & 0x8000)
|
||||||
|
printk(KERN_NOTICE "Kernel process context\n");
|
||||||
|
|
||||||
if (!oops_in_progress) {
|
|
||||||
if (current->pid && current->mm) {
|
if (current->pid && current->mm) {
|
||||||
printk(KERN_NOTICE "\n" KERN_NOTICE "CURRENT PROCESS:\n");
|
printk(KERN_NOTICE "CURRENT PROCESS:\n");
|
||||||
printk(KERN_NOTICE "COMM=%s PID=%d\n",
|
printk(KERN_NOTICE "COMM=%s PID=%d\n",
|
||||||
current->comm, current->pid);
|
current->comm, current->pid);
|
||||||
|
|
||||||
|
@ -624,15 +640,13 @@ void dump_bfin_regs(struct pt_regs *fp, void *retaddr)
|
||||||
(void *)current->mm->end_data,
|
(void *)current->mm->end_data,
|
||||||
(void *)current->mm->brk,
|
(void *)current->mm->brk,
|
||||||
(void *)current->mm->start_stack);
|
(void *)current->mm->start_stack);
|
||||||
} else {
|
} else
|
||||||
printk (KERN_NOTICE "\n" KERN_NOTICE
|
printk(KERN_NOTICE "\n" KERN_NOTICE
|
||||||
"No Valid pid - Either things are really messed up,"
|
"No Valid process in current context\n");
|
||||||
" or you are in the kernel\n");
|
}
|
||||||
}
|
|
||||||
} else {
|
void dump_bfin_mem(void *retaddr)
|
||||||
printk(KERN_NOTICE "Kernel or interrupt exception\n");
|
{
|
||||||
print_modules();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (retaddr >= (void *)FIXED_CODE_START && retaddr < (void *)physical_mem_end
|
if (retaddr >= (void *)FIXED_CODE_START && retaddr < (void *)physical_mem_end
|
||||||
#if L1_CODE_LENGTH != 0
|
#if L1_CODE_LENGTH != 0
|
||||||
|
@ -675,6 +689,11 @@ void dump_bfin_regs(struct pt_regs *fp, void *retaddr)
|
||||||
printk("\n" KERN_NOTICE
|
printk("\n" KERN_NOTICE
|
||||||
"Cannot look at the [PC] <%p> for it is"
|
"Cannot look at the [PC] <%p> for it is"
|
||||||
" in unreadable memory - sorry\n", retaddr);
|
" in unreadable memory - sorry\n", retaddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void show_regs(struct pt_regs *fp)
|
||||||
|
{
|
||||||
|
char buf [150];
|
||||||
|
|
||||||
printk(KERN_NOTICE "\n" KERN_NOTICE "SEQUENCER STATUS:\n");
|
printk(KERN_NOTICE "\n" KERN_NOTICE "SEQUENCER STATUS:\n");
|
||||||
printk(KERN_NOTICE " SEQSTAT: %08lx IPEND: %04lx SYSCFG: %04lx\n",
|
printk(KERN_NOTICE " SEQSTAT: %08lx IPEND: %04lx SYSCFG: %04lx\n",
|
||||||
|
@ -688,6 +707,8 @@ void dump_bfin_regs(struct pt_regs *fp, void *retaddr)
|
||||||
printk(KERN_NOTICE " RETX: %s\n", buf);
|
printk(KERN_NOTICE " RETX: %s\n", buf);
|
||||||
decode_address(buf, fp->rets);
|
decode_address(buf, fp->rets);
|
||||||
printk(KERN_NOTICE " RETS: %s\n", buf);
|
printk(KERN_NOTICE " RETS: %s\n", buf);
|
||||||
|
decode_address(buf, fp->pc);
|
||||||
|
printk(KERN_NOTICE " PC: %s\n", buf);
|
||||||
|
|
||||||
if ((long)fp->seqstat & SEQSTAT_EXCAUSE) {
|
if ((long)fp->seqstat & SEQSTAT_EXCAUSE) {
|
||||||
decode_address(buf, bfin_read_DCPLB_FAULT_ADDR());
|
decode_address(buf, bfin_read_DCPLB_FAULT_ADDR());
|
||||||
|
@ -802,7 +823,9 @@ void panic_cplb_error(int cplb_panic, struct pt_regs *fp)
|
||||||
|
|
||||||
printk(KERN_EMERG "DCPLB_FAULT_ADDR=%p\n", (void *)bfin_read_DCPLB_FAULT_ADDR());
|
printk(KERN_EMERG "DCPLB_FAULT_ADDR=%p\n", (void *)bfin_read_DCPLB_FAULT_ADDR());
|
||||||
printk(KERN_EMERG "ICPLB_FAULT_ADDR=%p\n", (void *)bfin_read_ICPLB_FAULT_ADDR());
|
printk(KERN_EMERG "ICPLB_FAULT_ADDR=%p\n", (void *)bfin_read_ICPLB_FAULT_ADDR());
|
||||||
dump_bfin_regs(fp, (void *)fp->retx);
|
dump_bfin_process(fp);
|
||||||
|
dump_bfin_mem((void *)fp->retx);
|
||||||
|
show_regs(fp);
|
||||||
dump_stack();
|
dump_stack();
|
||||||
panic("Unrecoverable event\n");
|
panic("Unrecoverable event\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -173,7 +173,9 @@ asmlinkage void irq_panic(int reason, struct pt_regs *regs)
|
||||||
}
|
}
|
||||||
|
|
||||||
regs->ipend = bfin_read_IPEND();
|
regs->ipend = bfin_read_IPEND();
|
||||||
dump_bfin_regs(regs, (void *)regs->pc);
|
dump_bfin_process(regs);
|
||||||
|
dump_bfin_mem((void *)regs->pc);
|
||||||
|
show_regs(regs);
|
||||||
if (0 == (info.si_signo = sig) || 0 == user_mode(regs)) /* in kernelspace */
|
if (0 == (info.si_signo = sig) || 0 == user_mode(regs)) /* in kernelspace */
|
||||||
panic("Unhandled IRQ or exceptions!\n");
|
panic("Unhandled IRQ or exceptions!\n");
|
||||||
else { /* in userspace */
|
else { /* in userspace */
|
||||||
|
|
|
@ -50,7 +50,8 @@ extern unsigned long get_sclk(void);
|
||||||
extern unsigned long sclk_to_usecs(unsigned long sclk);
|
extern unsigned long sclk_to_usecs(unsigned long sclk);
|
||||||
extern unsigned long usecs_to_sclk(unsigned long usecs);
|
extern unsigned long usecs_to_sclk(unsigned long usecs);
|
||||||
|
|
||||||
extern void dump_bfin_regs(struct pt_regs *fp, void *retaddr);
|
extern void dump_bfin_process(struct pt_regs *regs);
|
||||||
|
extern void dump_bfin_mem(void *retaddr);
|
||||||
extern void dump_bfin_trace_buffer(void);
|
extern void dump_bfin_trace_buffer(void);
|
||||||
|
|
||||||
extern int init_arch_irq(void);
|
extern int init_arch_irq(void);
|
||||||
|
|
Loading…
Reference in New Issue