git: 73b3fb41e67a - main - amd64: Make the SYSENTER and INTn action same as for IDT case.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 27 Oct 2026 12:01:22 UTC
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=73b3fb41e67a11f18b9b63a5265e174e4b688661
commit 73b3fb41e67a11f18b9b63a5265e174e4b688661
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-10-27 10:08:14 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-10-27 11:59:41 +0000
amd64: Make the SYSENTER and INTn action same as for IDT case.
Fixes: 6e93f5e4d693 ("amd64: FRED support")
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
---
sys/amd64/amd64/trap.c | 30 +++++++++++++++++++++++-------
1 file changed, 23 insertions(+), 7 deletions(-)
diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c
index 044d44d9e8f2..62d8d3b06c90 100644
--- a/sys/amd64/amd64/trap.c
+++ b/sys/amd64/amd64/trap.c
@@ -1573,6 +1573,24 @@ fred_inst_len(const struct trapframe_fred *frame)
TF_FRED_EVINFO2_INSTLENSHIFT);
}
+/*
+ * Reaction to userspace having no permissions to generate the event.
+ * Report T_PROTFLT and rewind %rip back to emulate fault instead of
+ * trap.
+ */
+static void
+trap_fred_u_noperm(struct trapframe_fred *frame, ksiginfo_t *ksi)
+{
+ frame->tf_idt.tf_rip -= fred_inst_len(frame);
+ frame->tf_idt.tf_addr = 0;
+ frame->tf_idt.tf_trapno = T_PROTFLT;
+ ksiginfo_init_trap(ksi);
+ ksi->ksi_signo = SIGBUS;
+ ksi->ksi_code = BUS_OBJERR;
+ ksi->ksi_trapno = T_PROTFLT;
+ ksi->ksi_addr = (void *)frame->tf_idt.tf_rip;
+}
+
int fred_verbose_events;
void trap_fred_u(struct trapframe_fred *frame);
@@ -1648,12 +1666,9 @@ trap_fred_u(struct trapframe_fred *frame)
break;
}
#endif
- frame->tf_idt.tf_trapno = vec;
- ksiginfo_init_trap(&ksi);
- ksi.ksi_signo = SIGBUS;
- ksi.ksi_code = BUS_OBJERR;
- ksi.ksi_trapno = frame->tf_idt.tf_trapno;
- ksi.ksi_addr = (void *)frame->tf_idt.tf_rip;
+ trap_fred_u_noperm(frame, &ksi);
+ /* error code: gate selector from IDT */
+ frame->tf_idt.tf_err = (vec * 8) | 2;
do_trapsig = true;
break;
case TF_FRED_EVINFO2_TYPE_SYSCALL:
@@ -1665,7 +1680,8 @@ trap_fred_u(struct trapframe_fred *frame)
amd64_syscall(td, (frame->tf_idt.tf_rflags & PSL_T) !=
0);
} else {
- /* SYSENTER returns without action */
+ trap_fred_u_noperm(frame, &ksi);
+ do_trapsig = true;
}
break;
default: