git: c874d312e78f - main - dtrace/arm: Fix and de-pessimize dtrace_copy
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 03 Sep 2026 15:05:34 UTC
The branch main has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=c874d312e78fc60e6731a043fc45b47165618370
commit c874d312e78fc60e6731a043fc45b47165618370
Author: Benjamin Jacobs <freebsd@dev.thsi.be>
AuthorDate: 2026-09-03 13:52:21 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
CommitDate: 2026-09-03 15:05:03 +0000
dtrace/arm: Fix and de-pessimize dtrace_copy
Use an unprivileged load to access user memory from dtrace_copy, which
is running in SVC mode.
Abort the loop if the load is trapped, as it is useless, hence
wasteful, to keep faulting on successive addresses. I believe that
this de-pessimization should also be done on aarch64 and riscv.
PR: 298064
MFC after: 1 month
Reviewed by: markj
Differential Revision: https://reviews.freebsd.org/D59280
---
sys/cddl/dev/dtrace/arm/dtrace_asm.S | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/sys/cddl/dev/dtrace/arm/dtrace_asm.S b/sys/cddl/dev/dtrace/arm/dtrace_asm.S
index b0eba6f1ed9f..d4730384b581 100644
--- a/sys/cddl/dev/dtrace/arm/dtrace_asm.S
+++ b/sys/cddl/dev/dtrace/arm/dtrace_asm.S
@@ -130,13 +130,14 @@ dtrace_copy(uintptr_t uaddr, uintptr_t kaddr, size_t size)
ENTRY(dtrace_copy)
stmfd sp!, {r4-r5} /* stack is 8 byte aligned */
teq r2, #0x00000000
- mov r5, #0x00000000
beq 2f
-1: ldrb r4, [r0], #0x0001
- add r5, r5, #0x00000001
- strb r4, [r1], #0x0001
- teqne r5, r2
+1: mov r4, r0
+ ldrbt r3, [r0], #1
+ teq r0, r4 /* Check if the load was trapped */
+ beq 2f /* Yes, quit now */
+ strb r3, [r1], #1
+ subs r2, r2, #1
bne 1b
2: ldmfd sp!, {r4-r5} /* stack is 8 byte aligned */