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);