Author: brooks
Date: Mon Mar 12 22:10:06 2018
New Revision: 330817
URL: https://svnweb.freebsd.org/changeset/base/330817

Log:
  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

Modified:
  head/sys/kern/subr_uio.c
  head/sys/mips/include/param.h
  head/sys/mips/mips/support.S

Modified: head/sys/kern/subr_uio.c
==============================================================================
--- head/sys/kern/subr_uio.c    Mon Mar 12 21:49:59 2018        (r330816)
+++ head/sys/kern/subr_uio.c    Mon Mar 12 22:10:06 2018        (r330817)
@@ -505,8 +505,8 @@ copyout_unmap(struct thread *td, vm_offset_t addr, siz
 /*
  * 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

Modified: head/sys/mips/include/param.h
==============================================================================
--- head/sys/mips/include/param.h       Mon Mar 12 21:49:59 2018        
(r330816)
+++ head/sys/mips/include/param.h       Mon Mar 12 22:10:06 2018        
(r330817)
@@ -185,8 +185,4 @@
 
 #define        pgtok(x)                ((x) * (PAGE_SIZE / 1024))
 
-#ifdef _KERNEL
-#define        NO_FUEWORD      1
-#endif
-
 #endif /* !_MIPS_INCLUDE_PARAM_H_ */

Modified: head/sys/mips/mips/support.S
==============================================================================
--- head/sys/mips/mips/support.S        Mon Mar 12 21:49:59 2018        
(r330816)
+++ head/sys/mips/mips/support.S        Mon Mar 12 22:10:06 2018        
(r330817)
@@ -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
 
 /*
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to