mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
MIPS: Implement fue*word* and casueword* in assembly.
Remove NO_FUEWORD so the 'e' variants are wrapped by the non-'e' variants. This is more correct and leaves sparc64 as the outlier. Reviewed by: jmallett, kib Obtained from: CheriBSD Sponsored by: DARPA, AFRL Differential Revision: https://reviews.freebsd.org/D14603
This commit is contained in:
parent
ac15bcde8a
commit
97519ff698
3 changed files with 41 additions and 38 deletions
|
|
@ -505,8 +505,8 @@ copyout_unmap(struct thread *td, vm_offset_t addr, size_t sz)
|
|||
/*
|
||||
* XXXKIB The temporal implementation of fue*() functions which do not
|
||||
* handle usermode -1 properly, mixing it with the fault code. Keep
|
||||
* this until MD code is written. Currently sparc64 and mips do not
|
||||
* have proper implementation.
|
||||
* this until MD code is written. Currently sparc64 does not have a
|
||||
* proper implementation.
|
||||
*/
|
||||
|
||||
int
|
||||
|
|
|
|||
|
|
@ -185,8 +185,4 @@
|
|||
|
||||
#define pgtok(x) ((x) * (PAGE_SIZE / 1024))
|
||||
|
||||
#ifdef _KERNEL
|
||||
#define NO_FUEWORD 1
|
||||
#endif
|
||||
|
||||
#endif /* !_MIPS_INCLUDE_PARAM_H_ */
|
||||
|
|
|
|||
|
|
@ -285,8 +285,8 @@ END(copyerr)
|
|||
* user-space.
|
||||
*/
|
||||
#ifdef __mips_n64
|
||||
LEAF(fuword64)
|
||||
XLEAF(fuword)
|
||||
LEAF(fueword64)
|
||||
XLEAF(fueword)
|
||||
PTR_LA v0, fswberr
|
||||
blt a0, zero, fswberr # make sure address is in user space
|
||||
nop
|
||||
|
|
@ -294,14 +294,16 @@ XLEAF(fuword)
|
|||
PTR_L v1, PC_CURPCB(v1)
|
||||
PTR_S v0, U_PCB_ONFAULT(v1)
|
||||
ld v0, 0(a0) # fetch word
|
||||
j ra
|
||||
PTR_S zero, U_PCB_ONFAULT(v1)
|
||||
END(fuword64)
|
||||
sd v0, 0(a1) # store word
|
||||
j ra
|
||||
li v0, 0
|
||||
END(fueword64)
|
||||
#endif
|
||||
|
||||
LEAF(fuword32)
|
||||
LEAF(fueword32)
|
||||
#ifndef __mips_n64
|
||||
XLEAF(fuword)
|
||||
XLEAF(fueword)
|
||||
#endif
|
||||
PTR_LA v0, fswberr
|
||||
blt a0, zero, fswberr # make sure address is in user space
|
||||
|
|
@ -310,11 +312,13 @@ XLEAF(fuword)
|
|||
PTR_L v1, PC_CURPCB(v1)
|
||||
PTR_S v0, U_PCB_ONFAULT(v1)
|
||||
lw v0, 0(a0) # fetch word
|
||||
j ra
|
||||
PTR_S zero, U_PCB_ONFAULT(v1)
|
||||
END(fuword32)
|
||||
sw v0, 0(a1) # store word
|
||||
j ra
|
||||
li v0, 0
|
||||
END(fueword32)
|
||||
|
||||
LEAF(fusword)
|
||||
LEAF(fuesword)
|
||||
PTR_LA v0, fswberr
|
||||
blt a0, zero, fswberr # make sure address is in user space
|
||||
nop
|
||||
|
|
@ -322,9 +326,11 @@ LEAF(fusword)
|
|||
PTR_L v1, PC_CURPCB(v1)
|
||||
PTR_S v0, U_PCB_ONFAULT(v1)
|
||||
lhu v0, 0(a0) # fetch short
|
||||
j ra
|
||||
PTR_S zero, U_PCB_ONFAULT(v1)
|
||||
END(fusword)
|
||||
sh v0, 0(a1) # store short
|
||||
j ra
|
||||
li v0, 0
|
||||
END(fuesword)
|
||||
|
||||
LEAF(fubyte)
|
||||
PTR_LA v0, fswberr
|
||||
|
|
@ -371,17 +377,18 @@ END(suword64)
|
|||
#endif
|
||||
|
||||
/*
|
||||
* casuword(9)
|
||||
* <v0>u_long casuword(<a0>u_long *p, <a1>u_long oldval, <a2>u_long newval)
|
||||
* casueword(9)
|
||||
* <v0>u_long casueword(<a0>u_long *p, <a1>u_long oldval, <a2>u_long *oldval_p,
|
||||
* <a3>u_long newval)
|
||||
*/
|
||||
/*
|
||||
* casuword32(9)
|
||||
* <v0>uint32_t casuword(<a0>uint32_t *p, <a1>uint32_t oldval,
|
||||
* <a2>uint32_t newval)
|
||||
* casueword32(9)
|
||||
* <v0>uint32_t casueword(<a0>uint32_t *p, <a1>uint32_t oldval,
|
||||
* <a2>uint32_t newval)
|
||||
*/
|
||||
LEAF(casuword32)
|
||||
LEAF(casueword32)
|
||||
#ifndef __mips_n64
|
||||
XLEAF(casuword)
|
||||
XLEAF(casueword)
|
||||
#endif
|
||||
PTR_LA v0, fswberr
|
||||
blt a0, zero, fswberr # make sure address is in user space
|
||||
|
|
@ -390,26 +397,26 @@ XLEAF(casuword)
|
|||
PTR_L v1, PC_CURPCB(v1)
|
||||
PTR_S v0, U_PCB_ONFAULT(v1)
|
||||
1:
|
||||
move t0, a2
|
||||
ll v0, 0(a0)
|
||||
bne a1, v0, 2f
|
||||
move t0, a3
|
||||
ll t1, 0(a0)
|
||||
bne a1, t1, 2f
|
||||
nop
|
||||
sc t0, 0(a0) # store word
|
||||
beqz t0, 1b
|
||||
nop
|
||||
j 3f
|
||||
nop
|
||||
li v0, 0
|
||||
2:
|
||||
li v0, -1
|
||||
3:
|
||||
PTR_S zero, U_PCB_ONFAULT(v1)
|
||||
jr ra
|
||||
nop
|
||||
END(casuword32)
|
||||
sw t1, 0(a2) # unconditionally store old word
|
||||
END(casueword32)
|
||||
|
||||
#ifdef __mips_n64
|
||||
LEAF(casuword64)
|
||||
XLEAF(casuword)
|
||||
LEAF(casueword64)
|
||||
XLEAF(casueword)
|
||||
PTR_LA v0, fswberr
|
||||
blt a0, zero, fswberr # make sure address is in user space
|
||||
nop
|
||||
|
|
@ -417,22 +424,22 @@ XLEAF(casuword)
|
|||
PTR_L v1, PC_CURPCB(v1)
|
||||
PTR_S v0, U_PCB_ONFAULT(v1)
|
||||
1:
|
||||
move t0, a2
|
||||
lld v0, 0(a0)
|
||||
bne a1, v0, 2f
|
||||
move t0, a3
|
||||
lld t1, 0(a0)
|
||||
bne a1, t1, 2f
|
||||
nop
|
||||
scd t0, 0(a0) # store double word
|
||||
beqz t0, 1b
|
||||
nop
|
||||
j 3f
|
||||
nop
|
||||
li v0, 0
|
||||
2:
|
||||
li v0, -1
|
||||
3:
|
||||
PTR_S zero, U_PCB_ONFAULT(v1)
|
||||
jr ra
|
||||
nop
|
||||
END(casuword64)
|
||||
sd t1, 0(a2) # unconditionally store old word
|
||||
END(casueword64)
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in a new issue