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
This commit is contained in:
parent
02676f0961
commit
c577e950d8
@ -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 */
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user