git: c874d312e78f - main - dtrace/arm: Fix and de-pessimize dtrace_copy

From: Mark Johnston <markj_at_FreeBSD.org>
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 */