Changeset View
Changeset View
Standalone View
Standalone View
head/sys/i386/i386/trap.c
Show First 20 Lines • Show All 873 Lines • ▼ Show 20 Lines | |||||
static void | static void | ||||
trap_fatal(frame, eva) | trap_fatal(frame, eva) | ||||
struct trapframe *frame; | struct trapframe *frame; | ||||
vm_offset_t eva; | vm_offset_t eva; | ||||
{ | { | ||||
int code, ss, esp; | int code, ss, esp; | ||||
u_int type; | u_int type; | ||||
struct soft_segment_descriptor softseg; | struct soft_segment_descriptor softseg; | ||||
#ifdef KDB | |||||
bool handled; | |||||
#endif | |||||
code = frame->tf_err; | code = frame->tf_err; | ||||
type = frame->tf_trapno; | type = frame->tf_trapno; | ||||
sdtossd(&gdt[IDXSEL(frame->tf_cs & 0xffff)].sd, &softseg); | sdtossd(&gdt[IDXSEL(frame->tf_cs & 0xffff)].sd, &softseg); | ||||
printf("\n\nFatal trap %d: %s while in %s mode\n", type, trap_msg(type), | printf("\n\nFatal trap %d: %s while in %s mode\n", type, trap_msg(type), | ||||
frame->tf_eflags & PSL_VM ? "vm86" : | frame->tf_eflags & PSL_VM ? "vm86" : | ||||
ISPL(frame->tf_cs) == SEL_UPL ? "user" : "kernel"); | ISPL(frame->tf_cs) == SEL_UPL ? "user" : "kernel"); | ||||
▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | #endif | ||||
if (frame->tf_eflags & PSL_VM) | if (frame->tf_eflags & PSL_VM) | ||||
printf("vm86, "); | printf("vm86, "); | ||||
printf("IOPL = %d\n", (frame->tf_eflags & PSL_IOPL) >> 12); | printf("IOPL = %d\n", (frame->tf_eflags & PSL_IOPL) >> 12); | ||||
printf("current process = %d (%s)\n", | printf("current process = %d (%s)\n", | ||||
curproc->p_pid, curthread->td_name); | curproc->p_pid, curthread->td_name); | ||||
#ifdef KDB | #ifdef KDB | ||||
if (debugger_on_panic) { | if (debugger_on_panic) { | ||||
kdb_why = KDB_WHY_TRAP; | |||||
frame->tf_err = eva; /* smuggle fault address to ddb */ | frame->tf_err = eva; /* smuggle fault address to ddb */ | ||||
if (kdb_trap(type, 0, frame)) { | handled = kdb_trap(type, 0, frame); | ||||
frame->tf_err = code; /* restore error code */ | frame->tf_err = code; /* restore error code */ | ||||
kdb_why = KDB_WHY_UNSET; | |||||
if (handled) | |||||
return; | return; | ||||
} | |||||
frame->tf_err = code; /* restore error code */ | |||||
} | } | ||||
#endif | #endif | ||||
printf("trap number = %d\n", type); | printf("trap number = %d\n", type); | ||||
if (trap_msg(type) != NULL) | if (trap_msg(type) != NULL) | ||||
panic("%s", trap_msg(type)); | panic("%s", trap_msg(type)); | ||||
else | else | ||||
panic("unknown/reserved trap"); | panic("unknown/reserved trap"); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 173 Lines • Show Last 20 Lines |