svn commit: r316732 - head/sys/arm64/arm64
Andrew Turner
andrew at FreeBSD.org
Wed Apr 12 12:34:29 UTC 2017
Author: andrew
Date: Wed Apr 12 12:34:27 2017
New Revision: 316732
URL: https://svnweb.freebsd.org/changeset/base/316732
Log:
Use the unprivileged variant of the load and store instructions most
places possible in the kernel. This forces these functions to fail if
userspace is unable to access a given memory location, even if it is in
the user memory range.
This will simplify adding Privileged Access Never support later.
MFC after: 1 week
Sponsored by: DARPA, AFRL
Modified:
head/sys/arm64/arm64/copyinout.S
head/sys/arm64/arm64/support.S
Modified: head/sys/arm64/arm64/copyinout.S
==============================================================================
--- head/sys/arm64/arm64/copyinout.S Wed Apr 12 11:41:35 2017 (r316731)
+++ head/sys/arm64/arm64/copyinout.S Wed Apr 12 12:34:27 2017 (r316732)
@@ -103,7 +103,8 @@ ENTRY(copyinstr)
ldr x7, =VM_MAXUSER_ADDRESS
1: cmp x0, x7
b.cs copyio_fault
- ldrb w4, [x0], #1 /* Load from uaddr */
+ ldtrb w4, [x0] /* Load from uaddr */
+ add x0, x0, #1 /* Next char */
strb w4, [x1], #1 /* Store in kaddr */
add x5, x5, #1 /* count++ */
cbz w4, 2f /* Break when NUL-terminated */
Modified: head/sys/arm64/arm64/support.S
==============================================================================
--- head/sys/arm64/arm64/support.S Wed Apr 12 11:41:35 2017 (r316731)
+++ head/sys/arm64/arm64/support.S Wed Apr 12 12:34:27 2017 (r316732)
@@ -97,7 +97,7 @@ ENTRY(fubyte)
b.cs fsu_fault_nopcb
adr x6, fsu_fault /* Load the fault handler */
SET_FAULT_HANDLER(x6, x1) /* And set it */
- ldrb w0, [x0] /* Try loading the data */
+ ldtrb w0, [x0] /* Try loading the data */
SET_FAULT_HANDLER(xzr, x1) /* Reset the fault handler */
ret /* Return */
END(fubyte)
@@ -111,7 +111,7 @@ ENTRY(fuword16)
b.cs fsu_fault_nopcb
adr x6, fsu_fault /* Load the fault handler */
SET_FAULT_HANDLER(x6, x1) /* And set it */
- ldrh w0, [x0] /* Try loading the data */
+ ldtrh w0, [x0] /* Try loading the data */
SET_FAULT_HANDLER(xzr, x1) /* Reset the fault handler */
ret /* Return */
END(fuword16)
@@ -125,7 +125,7 @@ ENTRY(fueword32)
b.cs fsu_fault_nopcb
adr x6, fsu_fault /* Load the fault handler */
SET_FAULT_HANDLER(x6, x2) /* And set it */
- ldr w0, [x0] /* Try loading the data */
+ ldtr w0, [x0] /* Try loading the data */
SET_FAULT_HANDLER(xzr, x2) /* Reset the fault handler */
str w0, [x1] /* Save the data in kernel space */
mov w0, #0 /* Success */
@@ -143,7 +143,7 @@ EENTRY(fueword64)
b.cs fsu_fault_nopcb
adr x6, fsu_fault /* Load the fault handler */
SET_FAULT_HANDLER(x6, x2) /* And set it */
- ldr x0, [x0] /* Try loading the data */
+ ldtr x0, [x0] /* Try loading the data */
SET_FAULT_HANDLER(xzr, x2) /* Reset the fault handler */
str x0, [x1] /* Save the data in kernel space */
mov x0, #0 /* Success */
@@ -160,7 +160,7 @@ ENTRY(subyte)
b.cs fsu_fault_nopcb
adr x6, fsu_fault /* Load the fault handler */
SET_FAULT_HANDLER(x6, x2) /* And set it */
- strb w1, [x0] /* Try storing the data */
+ sttrb w1, [x0] /* Try storing the data */
SET_FAULT_HANDLER(xzr, x2) /* Reset the fault handler */
mov x0, #0 /* Success */
ret /* Return */
@@ -175,7 +175,7 @@ ENTRY(suword16)
b.cs fsu_fault_nopcb
adr x6, fsu_fault /* Load the fault handler */
SET_FAULT_HANDLER(x6, x2) /* And set it */
- strh w1, [x0] /* Try storing the data */
+ sttrh w1, [x0] /* Try storing the data */
SET_FAULT_HANDLER(xzr, x2) /* Reset the fault handler */
mov x0, #0 /* Success */
ret /* Return */
@@ -190,7 +190,7 @@ ENTRY(suword32)
b.cs fsu_fault_nopcb
adr x6, fsu_fault /* Load the fault handler */
SET_FAULT_HANDLER(x6, x2) /* And set it */
- str w1, [x0] /* Try storing the data */
+ sttr w1, [x0] /* Try storing the data */
SET_FAULT_HANDLER(xzr, x2) /* Reset the fault handler */
mov x0, #0 /* Success */
ret /* Return */
@@ -206,7 +206,7 @@ EENTRY(suword64)
b.cs fsu_fault_nopcb
adr x6, fsu_fault /* Load the fault handler */
SET_FAULT_HANDLER(x6, x2) /* And set it */
- str x1, [x0] /* Try storing the data */
+ sttr x1, [x0] /* Try storing the data */
SET_FAULT_HANDLER(xzr, x2) /* Reset the fault handler */
mov x0, #0 /* Success */
ret /* Return */
@@ -237,7 +237,7 @@ ENTRY(fuswintr)
b.cs fsu_fault_nopcb
adr x6, fsu_intr_fault /* Load the fault handler */
SET_FAULT_HANDLER(x6, x1) /* And set it */
- ldr w0, [x0] /* Try loading the data */
+ ldtr w0, [x0] /* Try loading the data */
SET_FAULT_HANDLER(xzr, x1) /* Reset the fault handler */
ret /* Return */
END(fuswintr)
@@ -251,7 +251,7 @@ ENTRY(suswintr)
b.cs fsu_fault_nopcb
adr x6, fsu_intr_fault /* Load the fault handler */
SET_FAULT_HANDLER(x6, x2) /* And set it */
- str w1, [x0] /* Try storing the data */
+ sttr w1, [x0] /* Try storing the data */
SET_FAULT_HANDLER(xzr, x2) /* Reset the fault handler */
mov x0, #0 /* Success */
ret /* Return */
More information about the svn-src-all
mailing list