Even though it isn't clear that we'll use the futex-based futex
implementation on hppa anytime soon, here is a diff that implements
copyin32(9) for hppa.

ok?

P.S. I'm also looking at alpha right now.  It would be nice if other
     people could take care of mips64 (visa@?) and m88k as that would
     complete the set of architectures for which we have
     MULTIPROCESSOR kernels.

Index: arch/hppa/hppa/locore.S
===================================================================
RCS file: /cvs/src/sys/arch/hppa/hppa/locore.S,v
retrieving revision 1.196
diff -u -p -r1.196 locore.S
--- arch/hppa/hppa/locore.S     30 Apr 2017 16:45:45 -0000      1.196
+++ arch/hppa/hppa/locore.S     18 May 2017 11:36:44 -0000
@@ -2737,6 +2737,48 @@ $spstrcpy_exit
 EXIT(spstrcpy)
 
 /*
+ * int spcopy32 (pa_space_t ssp, const uint32_t *src, pa_space_t dsp,
+ *             uint32_t *dst)
+ * do an atomic space to space copy of a futex
+ */
+LEAF_ENTRY(spcopy32)
+       extru   arg1, 31, 2, t3
+       extru   arg3, 31, 2, t4
+       comb,<>,n 0, t3, $spcopy32_misaligned
+       comb,<>,n 0, t4, $spcopy32_misaligned
+
+       ldo     64(sp), sp
+       stw     rp, HPPA_FRAME_CRP(sp)
+       /* setup fault handler */
+       mfctl   cr29, t1
+       ldw     CI_CURPROC(t1), t3
+       ldil    L%copy_on_fault, t2
+       ldw     P_ADDR(t3), r2
+       ldo     R%copy_on_fault(t2), t2
+       ldw     PCB_ONFAULT+U_PCB(r2), r1
+       stw     t2, PCB_ONFAULT+U_PCB(r2)
+
+       mtsp    arg0, sr1
+       mtsp    arg2, sr2
+
+       ldw     0(sr1, arg1), t1
+       stw     t1, 0(sr2, arg3)
+
+       mtsp    r0, sr1
+       mtsp    r0, sr2
+       /* reset fault handler */
+       stw     r1, PCB_ONFAULT+U_PCB(r2)
+       ldw     HPPA_FRAME_CRP(sp), rp
+       ldo     -64(sp), sp
+       bv      0(rp)
+       copy    r0, ret0
+
+$spcopy32_misaligned
+       bv      0(rp)
+       ldi     EFAULT, ret0
+EXIT(spcopy32)
+
+/*
  * int cpu_switchto(struct proc *old, struct proc *new)
  * Switch from "old" proc to "new".
  */
Index: arch/hppa/hppa/machdep.c
===================================================================
RCS file: /cvs/src/sys/arch/hppa/hppa/machdep.c,v
retrieving revision 1.247
diff -u -p -r1.247 machdep.c
--- arch/hppa/hppa/machdep.c    9 Oct 2016 11:25:39 -0000       1.247
+++ arch/hppa/hppa/machdep.c    18 May 2017 11:36:44 -0000
@@ -1105,7 +1105,6 @@ copyinstr(const void *src, void *dst, si
            HPPA_SID_KERNEL, dst, size, lenp);
 }
 
-
 int
 copyoutstr(const void *src, void *dst, size_t size, size_t *lenp)
 {
@@ -1113,7 +1112,6 @@ copyoutstr(const void *src, void *dst, s
            curproc->p_addr->u_pcb.pcb_space, dst, size, lenp);
 }
 
-
 int
 copyin(const void *src, void *dst, size_t size)
 {
@@ -1126,6 +1124,13 @@ copyout(const void *src, void *dst, size
 {
        return spcopy(HPPA_SID_KERNEL, src,
            curproc->p_addr->u_pcb.pcb_space, dst, size);
+}
+
+int
+copyin32(const uint32_t *src, uint32_t *dst)
+{
+       return spcopy32(curproc->p_addr->u_pcb.pcb_space, src,
+           HPPA_SID_KERNEL, dst);
 }
 
 /*
Index: arch/hppa/include/cpu.h
===================================================================
RCS file: /cvs/src/sys/arch/hppa/include/cpu.h,v
retrieving revision 1.89
diff -u -p -r1.89 cpu.h
--- arch/hppa/include/cpu.h     10 May 2016 14:52:03 -0000      1.89
+++ arch/hppa/include/cpu.h     18 May 2017 11:36:44 -0000
@@ -228,6 +228,8 @@ void        hppa_init(paddr_t start);
 void   trap(int type, struct trapframe *frame);
 int    spcopy(pa_space_t ssp, const void *src,
                    pa_space_t dsp, void *dst, size_t size);
+int    spcopy32(pa_space_t ssp, const uint32_t *src,
+                   pa_space_t dsp, uint32_t *dst);
 int    spstrcpy(pa_space_t ssp, const void *src,
                      pa_space_t dsp, void *dst, size_t size, size_t *rsize);
 int    copy_on_fault(void);

Reply via email to