aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitchell Horne <mhorne@FreeBSD.org>2023-02-06 18:04:21 +0000
committerMitchell Horne <mhorne@FreeBSD.org>2023-02-15 16:41:39 +0000
commit698af78e78093aed0b84f1e5d396e127ae13f52c (patch)
tree770fff69a5102e00ed90c1324092d041a8a0bc2e
parent2f0fc9ab8912d3446ba67ed28bc7f6d226b16144 (diff)
downloadsrc-698af78e78093aed0b84f1e5d396e127ae13f52c.tar.gz
src-698af78e78093aed0b84f1e5d396e127ae13f52c.zip
dtrace_asm.S: properly enter/exit user access
In order to read or write userspace memory without generating an access fault, we must first enable the SUM bit in the sstatus CSR. Reviewed by: markj MFC after: 1 week Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D38298 (cherry picked from commit 0e563bde48b1af6bd472e940f04a8d76315749ab)
-rw-r--r--sys/cddl/dev/dtrace/riscv/dtrace_asm.S16
1 files changed, 15 insertions, 1 deletions
diff --git a/sys/cddl/dev/dtrace/riscv/dtrace_asm.S b/sys/cddl/dev/dtrace/riscv/dtrace_asm.S
index eeaf64061675..98c22a2aedfd 100644
--- a/sys/cddl/dev/dtrace/riscv/dtrace_asm.S
+++ b/sys/cddl/dev/dtrace/riscv/dtrace_asm.S
@@ -74,7 +74,9 @@ uint8_t
dtrace_fuword8_nocheck(void *addr)
*/
ENTRY(dtrace_fuword8_nocheck)
+ ENTER_USER_ACCESS(t0)
lb a0, 0(a0)
+ EXIT_USER_ACCESS(t0)
RET
END(dtrace_fuword8_nocheck)
@@ -83,7 +85,9 @@ uint16_t
dtrace_fuword16_nocheck(void *addr)
*/
ENTRY(dtrace_fuword16_nocheck)
+ ENTER_USER_ACCESS(t0)
lh a0, 0(a0)
+ EXIT_USER_ACCESS(t0)
RET
END(dtrace_fuword16_nocheck)
@@ -92,7 +96,9 @@ uint32_t
dtrace_fuword32_nocheck(void *addr)
*/
ENTRY(dtrace_fuword32_nocheck)
+ ENTER_USER_ACCESS(t0)
lw a0, 0(a0)
+ EXIT_USER_ACCESS(t0)
RET
END(dtrace_fuword32_nocheck)
@@ -101,7 +107,9 @@ uint64_t
dtrace_fuword64_nocheck(void *addr)
*/
ENTRY(dtrace_fuword64_nocheck)
+ ENTER_USER_ACCESS(t0)
ld a0, 0(a0)
+ EXIT_USER_ACCESS(t0)
RET
END(dtrace_fuword64_nocheck)
@@ -111,6 +119,7 @@ dtrace_copy(uintptr_t uaddr, uintptr_t kaddr, size_t size)
*/
ENTRY(dtrace_copy)
beqz a2, 2f /* If len == 0 then skip loop */
+ ENTER_USER_ACCESS(t0)
1:
lb a4, 0(a0) /* Load from uaddr */
addi a0, a0, 1
@@ -118,6 +127,7 @@ ENTRY(dtrace_copy)
addi a1, a1, 1
addi a2, a2, -1 /* len-- */
bnez a2, 1b
+ EXIT_USER_ACCESS(t0)
2:
RET
END(dtrace_copy)
@@ -129,7 +139,9 @@ dtrace_copystr(uintptr_t uaddr, uintptr_t kaddr, size_t size,
XXX: Check for flags?
*/
ENTRY(dtrace_copystr)
- beqz a2, 2f /* If len == 0 then skip loop */
+ beqz a2, 3f /* If len == 0 then skip loop */
+ ENTER_USER_ACCESS(t0)
+1:
lb a4, 0(a0) /* Load from uaddr */
addi a0, a0, 1
sb a4, 0(a1) /* Store in kaddr */
@@ -138,6 +150,8 @@ ENTRY(dtrace_copystr)
addi a2, a2, -1 /* len-- */
bnez a2, 1b
2:
+ EXIT_USER_ACCESS(t0)
+3:
RET
END(dtrace_copystr)