Date: Fri, 27 Mar 2026 01:52:20 +0000 From: Konstantin Belousov <kib@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Subject: git: 81c2819ce8e3 - stable/15 - amd64: do reset %rip after page fault if pcb_onfault is set Message-ID: <69c5e2d4.1c858.23d63b24@gitrepo.freebsd.org>
index | next in thread | raw e-mail
The branch stable/15 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=81c2819ce8e38900f04f0d96fc9709126dad9c75 commit 81c2819ce8e38900f04f0d96fc9709126dad9c75 Author: Konstantin Belousov <kib@FreeBSD.org> AuthorDate: 2026-03-14 11:40:07 +0000 Commit: Konstantin Belousov <kib@FreeBSD.org> CommitDate: 2026-03-26 23:42:56 +0000 amd64: do reset %rip after page fault if pcb_onfault is set (cherry picked from commit 8365f877b1e4b6d4c30df72e0826ca60a412ce7d) --- sys/amd64/amd64/trap.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c index a4676f156431..6393da186db5 100644 --- a/sys/amd64/amd64/trap.c +++ b/sys/amd64/amd64/trap.c @@ -219,15 +219,19 @@ trap_uprintf_signal(struct thread *td, struct trapframe *frame, register_t addr, } static bool -trap_check_efirt(struct thread *td, struct trapframe *frame) +trap_check_pcb_onfault(struct thread *td, struct trapframe *frame) { - /* - * 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) { + bool res = false; + + if (curpcb->pcb_onfault == NULL) + return (res); + + if (__predict_false((td->td_pflags & TDP_EFIRT) != 0)) { + /* + * Most likely, EFI RT faulted. This check prevents + * kdb from handling breakpoints set on the BIOS text, + * if such option is ever needed. + */ u_long cnt = atomic_fetchadd_long(&cnt_efirt_faults, 1); if ((print_efirt_faults == 1 && cnt == 0) || @@ -236,10 +240,13 @@ trap_check_efirt(struct thread *td, struct trapframe *frame) traptype_to_msg(frame->tf_trapno)); trap_diag(frame, 0); } - frame->tf_rip = (long)curpcb->pcb_onfault; - return (true); + res = true; + } else if (frame->tf_trapno == T_PAGEFLT) { + res = true; } - return (false); + if (res) + frame->tf_rip = (register_t)curpcb->pcb_onfault; + return (res); } /* @@ -489,7 +496,7 @@ trap(struct trapframe *frame) KASSERT(cold || td->td_ucred != NULL, ("kernel trap doesn't have ucred")); - if (type != T_PAGEFLT && trap_check_efirt(td, frame)) + if (type != T_PAGEFLT && trap_check_pcb_onfault(td, frame)) return; switch (type) { @@ -899,7 +906,7 @@ trap_pfault(struct trapframe *frame, bool usermode, int *signo, int *ucode) return (1); after_vmfault: if (td->td_intr_nesting_level == 0 && - trap_check_efirt(td, frame)) + trap_check_pcb_onfault(td, frame)) return (0); trap_fatal(frame, eva); return (-1);home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69c5e2d4.1c858.23d63b24>
