Page MenuHomeFreeBSD

D48186.id148371.diff
No OneTemporary

D48186.id148371.diff

diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c
--- a/sys/amd64/amd64/trap.c
+++ b/sys/amd64/amd64/trap.c
@@ -107,6 +107,7 @@
void dblfault_handler(struct trapframe *frame);
static int trap_pfault(struct trapframe *, bool, int *, int *);
+static void trap_diag(struct trapframe *, vm_offset_t);
static void trap_fatal(struct trapframe *, vm_offset_t);
#ifdef KDTRACE_HOOKS
static bool trap_user_dtrace(struct trapframe *,
@@ -150,6 +151,13 @@
[T_DTRACE_RET] = "DTrace pid return trap",
};
+static const char *
+traptype_to_msg(u_int type)
+{
+ return (type < nitems(trap_msg) ? trap_msg[type] :
+ "unknown/reserved trap");
+}
+
static int uprintf_signal;
SYSCTL_INT(_machdep, OID_AUTO, uprintf_signal, CTLFLAG_RWTUN,
&uprintf_signal, 0,
@@ -415,6 +423,20 @@
KASSERT(cold || td->td_ucred != NULL,
("kernel trap doesn't have ucred"));
+
+ /*
+ * Most likely, EFI RT faulted. This check prevents
+ * kdb from handling breakpoints set on the BIOS text,
+ * if such option is ever needed.
+ */
+ if ((td->td_pflags & TDP_EFIRT) != 0 &&
+ curpcb->pcb_onfault != NULL && type != T_PAGEFLT) {
+ trap_diag(frame, 0);
+ printf("EFI RT fault %s\n", traptype_to_msg(type));
+ frame->tf_rip = (long)curpcb->pcb_onfault;
+ return;
+ }
+
switch (type) {
case T_PAGEFLT: /* page fault */
(void)trap_pfault(frame, false, NULL, NULL);
@@ -578,18 +600,6 @@
* FALLTHROUGH (TRCTRAP kernel mode, kernel address)
*/
case T_BPTFLT:
- /*
- * Most likely, EFI RT hitting INT3. This
- * check prevents kdb from handling
- * breakpoints set on the BIOS text, if such
- * option is ever needed.
- */
- if ((td->td_pflags & TDP_EFIRT) != 0 &&
- curpcb->pcb_onfault != NULL) {
- frame->tf_rip = (long)curpcb->pcb_onfault;
- return;
- }
-
/*
* If KDB is enabled, let it handle the debugger trap.
* Otherwise, debugger traps "can't happen".
@@ -849,6 +859,10 @@
after_vmfault:
if (td->td_intr_nesting_level == 0 &&
curpcb->pcb_onfault != NULL) {
+ if ((td->td_pflags & TDP_EFIRT) != 0) {
+ trap_diag(frame, eva);
+ printf("EFI RT page fault\n");
+ }
frame->tf_rip = (long)curpcb->pcb_onfault;
return (0);
}
@@ -857,15 +871,12 @@
}
static void
-trap_fatal(struct trapframe *frame, vm_offset_t eva)
+trap_diag(struct trapframe *frame, vm_offset_t eva)
{
int code, ss;
u_int type;
struct soft_segment_descriptor softseg;
struct user_segment_descriptor *gdt;
-#ifdef KDB
- bool handled;
-#endif
code = frame->tf_err;
type = frame->tf_trapno;
@@ -925,8 +936,20 @@
printf("r13: %016lx r14: %016lx r15: %016lx\n", frame->tf_r13,
frame->tf_r14, frame->tf_r15);
+ printf("trap number = %d\n", type);
+}
+
+static void
+trap_fatal(struct trapframe *frame, vm_offset_t eva)
+{
+ u_int type;
+
+ type = frame->tf_trapno;
+ trap_diag(frame, eva);
#ifdef KDB
if (debugger_on_trap) {
+ bool handled;
+
kdb_why = KDB_WHY_TRAP;
handled = kdb_trap(type, 0, frame);
kdb_why = KDB_WHY_UNSET;
@@ -934,9 +957,7 @@
return;
}
#endif
- printf("trap number = %d\n", type);
- panic("%s", type < nitems(trap_msg) ? trap_msg[type] :
- "unknown/reserved trap");
+ panic("%s", traptype_to_msg(type));
}
#ifdef KDTRACE_HOOKS

File Metadata

Mime Type
text/plain
Expires
Thu, Feb 5, 10:33 AM (5 h, 21 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28441733
Default Alt Text
D48186.id148371.diff (3 KB)

Event Timeline