git: e27089cda589 - stable/14 - amd64: on any fault during call to EFI RT, restore execution and print fault details
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 01 Jan 2025 10:38:13 UTC
The branch stable/14 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=e27089cda5897633545d3df6707cd06970f03fae commit e27089cda5897633545d3df6707cd06970f03fae Author: Konstantin Belousov <kib@FreeBSD.org> AuthorDate: 2024-12-24 02:35:16 +0000 Commit: Konstantin Belousov <kib@FreeBSD.org> CommitDate: 2025-01-01 10:30:20 +0000 amd64: on any fault during call to EFI RT, restore execution and print fault details (cherry picked from commit dd2b5443644505af51c95503898ab363e7d7c29d) --- sys/amd64/amd64/trap.c | 30 ++++++++++++++++++------------ 1 file 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); @@ -608,18 +622,6 @@ trap(struct trapframe *frame) * 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_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); }