followup to r332730/r332752: set kdb_why to "trap" for fatal traps

This change updates arm, arm64 and mips achitectures.  Additionally, it
removes redundant checks for kdb_active where it already results in
kdb_reenter() and adds kdb_reenter() calls where they were missing.

Some architectures check the return value of kdb_trap(), but some don't.
I haven't changed any of that.

Some trap handling routines have a return code.  I am not sure if I
provided correct ones for returns after kdb_reenter().  kdb_reenter
should never return unless kdb_jmpbufp is NULL for some reason.

Only compile tested for all affected architectures.  There can be bugs
resulting from my poor understanding of architecture specific details.

Reported by:	jhb
Reviewed by:	jhb, eadler
MFC after:	4 weeks
Differential Revision: https://reviews.freebsd.org/D15431
This commit is contained in:
Andriy Gapon 2018-05-16 06:52:08 +00:00
parent d6b97a6497
commit c9c4d38aa8
4 changed files with 38 additions and 7 deletions

View File

@ -404,7 +404,16 @@ dab_fatal(struct trapframe *tf, u_int fsr, u_int far, struct thread *td,
struct ksig *ksig)
{
const char *mode;
#ifdef KDB
bool handled;
#endif
#ifdef KDB
if (kdb_active) {
kdb_reenter();
return (0);
}
#endif
#ifdef KDTRACE_HOOKS
if (!TRAP_USERMODE(tf)) {
if (dtrace_trap_func != NULL && (*dtrace_trap_func)(tf, far & FAULT_TYPE_MASK))
@ -447,9 +456,13 @@ dab_fatal(struct trapframe *tf, u_int fsr, u_int far, struct thread *td,
printf(", pc =%08x\n\n", tf->tf_pc);
#ifdef KDB
if (debugger_on_panic || kdb_active)
if (kdb_trap(fsr, 0, tf))
if (debugger_on_panic) {
kdb_why = KDB_WHY_TRAP;
handled = kdb_trap(fsr, 0, tf);
kdb_why = KDB_WHY_UNSET;
if (handled)
return (0);
}
#endif
panic("Fatal abort");
/*NOTREACHED*/

View File

@ -599,8 +599,11 @@ abort_fatal(struct trapframe *tf, u_int idx, u_int fsr, u_int far,
printf(", pc =%08x\n\n", tf->tf_pc);
#ifdef KDB
if (debugger_on_panic || kdb_active)
if (debugger_on_panic) {
kdb_why = KDB_WHY_TRAP;
kdb_trap(fsr, 0, tf);
kdb_why = KDB_WHY_UNSET;
}
#endif
panic("Fatal abort");
/*NOTREACHED*/

View File

@ -156,6 +156,9 @@ data_abort(struct thread *td, struct trapframe *frame, uint64_t esr,
vm_prot_t ftype;
vm_offset_t va;
int error, sig, ucode;
#ifdef KDB
bool handled;
#endif
/*
* According to the ARMv8-A rev. A.g, B2.10.5 "Load-Exclusive
@ -226,9 +229,14 @@ data_abort(struct thread *td, struct trapframe *frame, uint64_t esr,
printf(" esr: %.8lx\n", esr);
#ifdef KDB
if (debugger_on_panic || kdb_active)
if (kdb_trap(ESR_ELx_EXCEPTION(esr), 0, frame))
if (debugger_on_panic) {
kdb_why = KDB_WHY_TRAP;
handled = kdb_trap(ESR_ELx_EXCEPTION(esr), 0,
frame);
kdb_why = KDB_WHY_UNSET;
if (handled)
return;
}
#endif
panic("vm_fault failed: %lx", frame->tf_elr);
}

View File

@ -530,7 +530,12 @@ trap(struct trapframe *trapframe)
register_t *frame_regs;
trapdebug_enter(trapframe, 0);
#ifdef KDB
if (kdb_active) {
kdb_reenter();
return (0);
}
#endif
type = (trapframe->cause & MIPS_CR_EXC_CODE) >> MIPS_CR_EXC_CODE_SHIFT;
if (TRAPF_USERMODE(trapframe)) {
type |= T_USER;
@ -1095,8 +1100,10 @@ trap(struct trapframe *trapframe)
#endif
#ifdef KDB
if (debugger_on_panic || kdb_active) {
if (debugger_on_panic) {
kdb_why = KDB_WHY_TRAP;
kdb_trap(type, 0, trapframe);
kdb_why = KDB_WHY_UNSET;
}
#endif
panic("trap");