diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1997-06-17 13:20:30 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1997-06-17 13:20:30 +0000 |
commit | 7acb77a6e7bddd4c4c5aa975bbf976927c013798 (patch) | |
tree | 4139829ec6edb85f73774bb95cdec376758bfc73 /arch/sparc64/mm | |
parent | 64d58d4c8cd6a89ee218301ec0dc0ebfec91a4db (diff) |
Merge with 2.1.43.
Diffstat (limited to 'arch/sparc64/mm')
-rw-r--r-- | arch/sparc64/mm/fault.c | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/arch/sparc64/mm/fault.c b/arch/sparc64/mm/fault.c index e23e736a9..6df923a4b 100644 --- a/arch/sparc64/mm/fault.c +++ b/arch/sparc64/mm/fault.c @@ -1,4 +1,4 @@ -/* $Id: fault.c,v 1.9 1997/05/19 05:58:54 davem Exp $ +/* $Id: fault.c,v 1.11 1997/06/01 05:46:15 davem Exp $ * arch/sparc64/mm/fault.c: Page fault handlers for the 64-bit Sparc. * * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) @@ -135,6 +135,7 @@ asmlinkage int lookup_fault(unsigned long pc, unsigned long ret_pc, } /* #define FAULT_TRACER */ +/* #define FAULT_TRACER_VERBOSE */ asmlinkage void do_sparc64_fault(struct pt_regs *regs, int text_fault, int write, unsigned long address, unsigned long tag, @@ -150,12 +151,23 @@ asmlinkage void do_sparc64_fault(struct pt_regs *regs, int text_fault, int write static unsigned long last_addr = 0; static int rcnt = 0; - printk("FAULT(PC[%016lx],t[%d],w[%d],addr[%016lx])\n", +#ifdef FAULT_TRACER_VERBOSE + printk("FAULT(PC[%016lx],t[%d],w[%d],addr[%016lx])...", regs->tpc, text_fault, write, address); - if(address == last_addr && rcnt++ > 5) { - printk("Wheee lotsa bogus faults, something wrong, spinning\n"); - while(1) - barrier(); +#else + printk("F[%016lx:%016lx:w(%d)", regs->tpc, address, write); +#endif + if(address == last_addr) { + if(rcnt++ > 15) { + printk("Wheee lotsa bogus faults, something wrong, spinning\n"); + __asm__ __volatile__("flushw"); + printk("o7[%016lx] i7[%016lx]\n", + regs->u_regs[UREG_I7], + ((struct reg_window *)(regs->u_regs[UREG_FP]+STACK_BIAS))->ins[7]); + sti(); + while(1) + barrier(); + } } else rcnt = 0; last_addr = address; #endif @@ -205,6 +217,13 @@ bad_area: goto out; } if(from_user) { +#if 1 + unsigned long cpc; + __asm__ __volatile__("mov %%i7, %0" : "=r" (cpc)); + printk("[%s:%d] SIGSEGV pc[%016lx] addr[%016lx] w[%d] sfsr[%016lx] " + "caller[%016lx]\n", current->comm, current->pid, regs->tpc, + address, write, sfsr, cpc); +#endif tsk->tss.sig_address = address; tsk->tss.sig_desc = SUBSIG_NOMAPPING; send_sig(SIGSEGV, tsk, 1); @@ -213,4 +232,12 @@ bad_area: unhandled_fault (address, tsk, regs); out: unlock_kernel(); +#ifdef FAULT_TRACER +#ifdef FAULT_TRACER_VERBOSE + printk(" done\n"); +#else + printk("]"); +#endif +#endif } + |