Page MenuHomeFreeBSD

D15093.id41628.diff
No OneTemporary

D15093.id41628.diff

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;
+#endif
code = frame->tf_err;
type = frame->tf_trapno;
@@ -811,9 +814,13 @@
curproc->p_pid, curthread->td_name);
#ifdef KDB
- if (debugger_on_panic)
- if (kdb_trap(type, 0, frame))
+ if (debugger_on_panic) {
+ kdb_why = KDB_WHY_TRAP;
+ handled = kdb_trap(type, 0, frame);
+ 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;
+#endif
code = frame->tf_err;
type = frame->tf_trapno;
@@ -938,12 +941,13 @@
#ifdef KDB
if (debugger_on_panic) {
+ 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 */
+ 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,11 +449,19 @@
static void
trap_fatal(struct trapframe *frame)
{
+#ifdef KDB
+ bool handled;
+#endif
printtrap(frame->exc, frame, 1, (frame->srr1 & PSL_PR));
#ifdef KDB
- if (debugger_on_panic && kdb_trap(frame->exc, 0, frame))
- return;
+ if (debugger_on_panic) {
+ kdb_why = KDB_WHY_TRAP;
+ handled = kdb_trap(frame->exc, 0, frame);
+ 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. */

File Metadata

Mime Type
text/plain
Expires
Sat, Apr 25, 9:12 PM (16 h, 24 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32142811
Default Alt Text
D15093.id41628.diff (2 KB)

Event Timeline