Index: sys/amd64/amd64/trap.c =================================================================== --- sys/amd64/amd64/trap.c +++ sys/amd64/amd64/trap.c @@ -761,6 +761,9 @@ u_int type; struct soft_segment_descriptor softseg; char *msg; +#ifdef KDB + bool handled, reenter; +#endif code = frame->tf_err; type = frame->tf_trapno; @@ -811,9 +814,16 @@ curproc->p_pid, curthread->td_name); #ifdef KDB - if (debugger_on_panic || kdb_active) - if (kdb_trap(type, 0, frame)) + if (debugger_on_panic || kdb_active) { + reenter = kdb_active; + if (!reenter) + kdb_why = KDB_WHY_TRAP; + handled = kdb_trap(type, 0, frame); + if (!reenter) + kdb_why = KDB_WHY_UNSET; + if (handled) return; + } #endif printf("trap number = %d\n", type); if (type <= MAX_TRAP_MSG) Index: sys/i386/i386/trap.c =================================================================== --- sys/i386/i386/trap.c +++ sys/i386/i386/trap.c @@ -879,6 +879,9 @@ int code, ss, esp; u_int type; struct soft_segment_descriptor softseg; +#ifdef KDB + bool handled, reenter; +#endif code = frame->tf_err; type = frame->tf_trapno; @@ -938,12 +941,16 @@ #ifdef KDB if (debugger_on_panic || kdb_active) { + reenter = kdb_active; + if (!reenter) + kdb_why = KDB_WHY_TRAP; frame->tf_err = eva; /* smuggle fault address to ddb */ - if (kdb_trap(type, 0, frame)) { - frame->tf_err = code; /* restore error code */ + handled = kdb_trap(type, 0, frame); + frame->tf_err = code; /* restore error code */ + if (!reenter) + kdb_why = KDB_WHY_UNSET; + if (handled) return; - } - frame->tf_err = code; /* restore error code */ } #endif printf("trap number = %d\n", type); Index: sys/powerpc/powerpc/trap.c =================================================================== --- sys/powerpc/powerpc/trap.c +++ sys/powerpc/powerpc/trap.c @@ -449,12 +449,22 @@ static void trap_fatal(struct trapframe *frame) { +#ifdef KDB + bool handled, reenter; +#endif printtrap(frame->exc, frame, 1, (frame->srr1 & PSL_PR)); #ifdef KDB - if ((debugger_on_panic || kdb_active) && - kdb_trap(frame->exc, 0, frame)) - return; + if (debugger_on_panic || kdb_active) { + reenter = kdb_active; + if (!reenter) + kdb_why = KDB_WHY_TRAP; + handled = kdb_trap(frame->exc, 0, frame); + if (!reenter) + kdb_why = KDB_WHY_UNSET; + if (handled) + return; + } #endif panic("%s trap", trapname(frame->exc)); } Index: sys/sys/kdb.h =================================================================== --- sys/sys/kdb.h +++ sys/sys/kdb.h @@ -101,6 +101,7 @@ #define KDB_WHY_UNSET NULL /* No reason set. */ #define KDB_WHY_PANIC "panic" /* panic() was called. */ #define KDB_WHY_KASSERT "kassert" /* kassert failed. */ +#define KDB_WHY_TRAP "trap" /* Fatal trap. */ #define KDB_WHY_SYSCTL "sysctl" /* Sysctl entered debugger. */ #define KDB_WHY_BOOTFLAGS "bootflags" /* Boot flags were set. */ #define KDB_WHY_WITNESS "witness" /* Witness entered debugger. */