diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2024-12-24 02:35:16 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2025-01-01 10:30:20 +0000 |
| commit | e27089cda5897633545d3df6707cd06970f03fae (patch) | |
| tree | 81a01250541a5b555432c27718fe1bebccac5069 | |
| parent | 8094b35e5769e6f8848ce4fd929f898cacc81bc6 (diff) | |
amd64: on any fault during call to EFI RT, restore execution and print fault details
(cherry picked from commit dd2b5443644505af51c95503898ab363e7d7c29d)
| -rw-r--r-- | sys/amd64/amd64/trap.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c index 396c2abd3f1f..7f1175da41df 100644 --- a/sys/amd64/amd64/trap.c +++ b/sys/amd64/amd64/trap.c @@ -445,6 +445,20 @@ trap(struct trapframe *frame) 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_pflags2 & TDP2_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); @@ -609,18 +623,6 @@ trap(struct trapframe *frame) */ 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_pflags2 & TDP2_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". */ @@ -883,6 +885,10 @@ trap_pfault(struct trapframe *frame, bool usermode, int *signo, int *ucode) after_vmfault: if (td->td_intr_nesting_level == 0 && curpcb->pcb_onfault != NULL) { + if ((td->td_pflags2 & TDP2_EFIRT) != 0) { + trap_diag(frame, eva); + printf("EFI RT page fault\n"); + } frame->tf_rip = (long)curpcb->pcb_onfault; return (0); } |
