git: 4604502157b3 - stable/15 - amd64 FRED: fix dtrace fbt
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 03 Nov 2026 09:02:25 UTC
The branch stable/15 has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=4604502157b3e60ff5e8e9d549e2f27a0a9b6194
commit 4604502157b3e60ff5e8e9d549e2f27a0a9b6194
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-10-29 03:34:45 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-11-03 09:01:19 +0000
amd64 FRED: fix dtrace fbt
(cherry picked from commit cf4ff7bd369e42fb0a1c6f5cf2dc4fa7a990158e)
---
sys/amd64/amd64/exception.S | 12 ++++++++++++
sys/amd64/amd64/genassym.c | 4 ++++
sys/cddl/dev/dtrace/amd64/dtrace_asm.S | 18 ++++++++++++------
3 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/sys/amd64/amd64/exception.S b/sys/amd64/amd64/exception.S
index e7e91cded2fc..d81d942b4b22 100644
--- a/sys/amd64/amd64/exception.S
+++ b/sys/amd64/amd64/exception.S
@@ -1671,6 +1671,18 @@ fred_events_handlers:
movq %r14,TF_R14(%rsp)
movq %r15,TF_R15(%rsp)
movq %rsp, %rdi
+#ifdef KDTRACE_HOOKS
+ movl TF_FRED_EVINFO2(%rsp),%eax
+ andl $TF_FRED_EVINFO2_EXCMASK,%eax
+ cmpl $(TF_FRED_EVINFO2_TYPE_INT3 | IDT_BP),%eax
+ jne 2f
+ cmpq $0,dtrace_invop_jump_addr
+ je 1f
+ movq $1f,dtrace_invop_calltrap_addr(%rip)
+ jmpq *dtrace_invop_jump_addr
+1: movq %rsp,%rdi
+2:
+#endif
KMSAN_ENTER
call trap_fred_k
KMSAN_LEAVE
diff --git a/sys/amd64/amd64/genassym.c b/sys/amd64/amd64/genassym.c
index affcf38576ac..96421a90a102 100644
--- a/sys/amd64/amd64/genassym.c
+++ b/sys/amd64/amd64/genassym.c
@@ -192,8 +192,11 @@ ASSYM(TF_FRED_EVINFO2_VECMASK, TF_FRED_EVINFO2_VECMASK);
ASSYM(TF_FRED_EVINFO2_VEC_SYSCALL, TF_FRED_EVINFO2_VEC_SYSCALL);
ASSYM(TF_FRED_EVINFO2_SYSCALLMASK, TF_FRED_EVINFO2_TYPEMASK |
TF_FRED_EVINFO2_VECMASK | TF_FRED_EVINFO2_LM);
+ASSYM(TF_FRED_EVINFO2_EXCMASK, TF_FRED_EVINFO2_TYPEMASK |
+ TF_FRED_EVINFO2_VECMASK);
ASSYM(TF_FRED_EVINFO2_TYPE_EXC, TF_FRED_EVINFO2_TYPE_EXC);
ASSYM(TF_FRED_EVINFO2_TYPE_SYSCALL, TF_FRED_EVINFO2_TYPE_SYSCALL);
+ASSYM(TF_FRED_EVINFO2_TYPE_INT3, TF_FRED_EVINFO2_TYPE_INT3);
ASSYM(TF_FRED_EVINFO2_TYPEMASK, TF_FRED_EVINFO2_TYPEMASK);
ASSYM(TF_FRED_EVINFO2_SYSCALLVAL, TF_FRED_EVINFO2_TYPE_SYSCALL |
TF_FRED_EVINFO2_VEC_SYSCALL | TF_FRED_EVINFO2_LM);
@@ -290,6 +293,7 @@ ASSYM(SEL_RPL_MASK, SEL_RPL_MASK);
ASSYM(IDT_NP, IDT_NP);
ASSYM(IDT_GP, IDT_GP);
+ASSYM(IDT_BP, IDT_BP);
ASSYM(__FreeBSD_version, __FreeBSD_version);
diff --git a/sys/cddl/dev/dtrace/amd64/dtrace_asm.S b/sys/cddl/dev/dtrace/amd64/dtrace_asm.S
index 217d8c2936eb..3e78d004024f 100644
--- a/sys/cddl/dev/dtrace/amd64/dtrace_asm.S
+++ b/sys/cddl/dev/dtrace/amd64/dtrace_asm.S
@@ -56,7 +56,13 @@
swapgs; \
1: addq $TF_RIP,%rsp;
- ENTRY(dtrace_invop_start)
+doret: cmpb $0,fred(%rip)
+ jne 1f
+ iretq
+1: subq $8,%rsp /* fake error code, ignored by ERETS */
+ erets
+
+ENTRY(dtrace_invop_start)
KMSAN_ENTER
@@ -121,7 +127,7 @@ bp_push:
movq 32(%rsp), %rax /* reload calling RSP */
movq %rbp, (%rax) /* store %rbp there */
popq %rax /* pop off temp */
- iretq /* return from interrupt */
+ jmp doret
/*NOTREACHED*/
bp_call:
@@ -155,7 +161,7 @@ bp_call:
popq %rbx /* pop temp */
popq %rax /* pop temp */
- iretq /* return from interrupt */
+ jmp doret
/*NOTREACHED*/
bp_leave:
@@ -175,13 +181,13 @@ bp_leave:
movq %rbp, 32(%rsp) /* store new %rsp */
movq %rax, %rbp /* set new %rbp */
popq %rax /* pop off temp */
- iretq /* return from interrupt */
+ jmp doret
/*NOTREACHED*/
bp_nop:
/* We must emulate a "nop". */
INTR_POP
- iretq
+ jmp doret
/*NOTREACHED*/
bp_ret:
@@ -192,7 +198,7 @@ bp_ret:
movq %rax, 8(%rsp) /* store calling RIP */
addq $8, 32(%rsp) /* adjust new %rsp */
popq %rax /* pop off temp */
- iretq /* return from interrupt */
+ jmp doret
/*NOTREACHED*/
END(dtrace_invop_start)