diff options
-rw-r--r-- | sys/arch/hppa/hppa/locore.S | 47 | ||||
-rw-r--r-- | sys/lib/libkern/arch/hppa/bcopy.m4 | 40 |
2 files changed, 50 insertions, 37 deletions
diff --git a/sys/arch/hppa/hppa/locore.S b/sys/arch/hppa/hppa/locore.S index 7a489870090..a34d423fbd0 100644 --- a/sys/arch/hppa/hppa/locore.S +++ b/sys/arch/hppa/hppa/locore.S @@ -1,4 +1,4 @@ -/* $OpenBSD: locore.S,v 1.80 2002/08/13 05:27:44 mickey Exp $ */ +/* $OpenBSD: locore.S,v 1.81 2002/08/27 16:29:22 mickey Exp $ */ /* * Copyright (c) 1998-2002 Michael Shalayeff @@ -2220,6 +2220,7 @@ LEAF_ENTRY(name) ! \ #define FUX(name,insn) \ FUSUX(name) ! \ insn 0(sr1, arg0), ret0 ! \ + mtsp r0, sr1 ! \ bv r0(rp) ! \ stw r1, U_PCB+PCB_ONFAULT(t1) ! \ EXIT(name) @@ -2227,11 +2228,13 @@ EXIT(name) #define SUX(name,insn) \ FUSUX(name) ! \ insn arg1, 0(sr1, arg0) ! \ + mtsp r0, sr1 ! \ bv r0(rp) ! \ stw r1, U_PCB+PCB_ONFAULT(t1) ! \ EXIT(name) LEAF_ENTRY(fusufault) + mtsp r0, sr1 stw r1, U_PCB+PCB_ONFAULT(t1) ALTENTRY(fusubadaddr) bv 0(rp) @@ -2250,7 +2253,11 @@ SUX(suswintr, sth) .align 64 LEAF_ENTRY(copy_on_fault) - stw r1, PCB_ONFAULT+U_PCB(t4) + mtsp r0, sr1 + mtsp r0, sr2 + stw r1, PCB_ONFAULT+U_PCB(r2) + ldw HPPA_FRAME_CRP(sp), rp + ldo -64(sp), sp bv 0(rp) ldi EFAULT, %ret0 EXIT(copy_on_fault) @@ -2261,40 +2268,42 @@ EXIT(copy_on_fault) * do a space to space strncpy, return actual copy size in the rsize; */ LEAF_ENTRY(spstrcpy) + ldw HPPA_FRAME_ARG(4)(sp), t2 + ldo 64(sp), sp + add t2, arg1, t2 + stw rp, HPPA_FRAME_CRP(sp) /* setup fault handler */ - ldil L%curproc, t4 - ldw R%curproc(t4), t4 - ldil L%copy_on_fault, t2 - ldw P_ADDR(t4), t4 - ldo R%copy_on_fault(t2), t2 - ldw PCB_ONFAULT+U_PCB(t4), r1 - stw t2, PCB_ONFAULT+U_PCB(t4) - - ldw HPPA_FRAME_ARG(4)(sp), ret1 - mfsp sr1, ret0 /* XXX need this? */ - mfsp sr2, ret1 /* XXX need this? */ + ldil L%curproc, t1 + ldw R%curproc(t1), t3 + ldil L%copy_on_fault, t4 + ldw P_ADDR(t3), r2 + ldo R%copy_on_fault(t4), t4 + ldw PCB_ONFAULT+U_PCB(r2), r1 + stw t4, PCB_ONFAULT+U_PCB(r2) + mtsp arg0, sr1 mtsp arg2, sr2 - add ret1, arg1, ret1 copy arg1, arg0 $spstrcpy_loop ldbs,ma 1(sr1, arg1), t1 - comb,= ret1, arg1, $spstrcpy_exit + comb,= t2, arg1, $spstrcpy_exit stbs,ma t1, 1(sr2, arg3) comb,<>,n r0, t1, $spstrcpy_loop nop $spstrcpy_exit + mtsp r0, sr1 + mtsp r0, sr2 + stw r1, PCB_ONFAULT+U_PCB(r2) + ldw HPPA_FRAME_CRP(sp), rp sub arg1, arg0, arg1 - mtsp ret0, sr1 - mtsp ret1, sr2 /* XXX need this? */ + ldo -64(sp), sp ldw HPPA_FRAME_ARG(5)(sp), arg0 - copy r0, ret0 sub,= r0, arg0, r0 stw arg1, 0(arg0) bv 0(rp) - stw r1, PCB_ONFAULT+U_PCB(t4) + copy r0, ret0 EXIT(spstrcpy) diff --git a/sys/lib/libkern/arch/hppa/bcopy.m4 b/sys/lib/libkern/arch/hppa/bcopy.m4 index 363a46588ab..aabab3a0717 100644 --- a/sys/lib/libkern/arch/hppa/bcopy.m4 +++ b/sys/lib/libkern/arch/hppa/bcopy.m4 @@ -1,4 +1,4 @@ -define(_rcsid,``$OpenBSD: bcopy.m4,v 1.12 2002/08/13 05:24:22 mickey Exp $'')dnl +define(_rcsid,``$OpenBSD: bcopy.m4,v 1.13 2002/08/27 16:29:22 mickey Exp $'')dnl dnl dnl dnl This is the source file for bcopy.S, spcopy.S @@ -101,7 +101,7 @@ L($1, cleanup) addib,=,n 4, $6, L($1, done) ldws 0($2, $3), t1 add $5, $6, $5 - bv r0(rp) + b L($1, done) stbys,E t1, 0($4, $5) ') dnl @@ -175,7 +175,7 @@ L($1, cleanup_un) sub,<= $6, t4, r0 ldws,M F`'4($2, $3), t1 vshd ret1, t1, t2 - bv r0(rp) + b L($1, done) stbys,E t2, 0($4, $5) L($1, cleanup1_un) @@ -215,10 +215,10 @@ ALTENTRY(ovbcopy) ALTENTRY(bcopy) comb,>,n arg1, arg0, L(bcopy, reverse) hppa_copy(bcopy_f, sr0, arg0, sr0, arg1, arg2, `+') - b,n L(bcopy, ret) + bv 0(rp) + nop L(bcopy, reverse) hppa_copy(bcopy_r, sr0, arg0, sr0, arg1, arg2, `-') -L(bcopy, ret) bv 0(rp) nop EXIT(memcpy) @@ -239,29 +239,33 @@ ifelse(NAME, `spcopy', .import curproc, data .import copy_on_fault, code LEAF_ENTRY(spcopy) - ldw HPPA_FRAME_ARG(4)(sp), ret1 - comb,>=,n r0, ret1, L(spcopy, ret) + ldw HPPA_FRAME_ARG(4)(sp), ret0 + sub,<> r0, ret0, r0 + bv r0(rp) + nop ` + ldo 64(sp), sp + stw rp, HPPA_FRAME_CRP(sp) /* setup fault handler */ - ldil L%curproc, r31 - ldw R%curproc(r31), r31 + ldil L%curproc, t1 + ldw R%curproc(t1), t3 ldil L%copy_on_fault, t2 - ldw P_ADDR(r31), t4 + ldw P_ADDR(t3), r2 ldo R%copy_on_fault(t2), t2 - ldw PCB_ONFAULT+U_PCB(t4), r1 - stw t2, PCB_ONFAULT+U_PCB(t4) + ldw PCB_ONFAULT+U_PCB(r2), r1 + stw t2, PCB_ONFAULT+U_PCB(r2) ' - mfsp sr2, ret0 /* XXX need this?, sr1 is scratchable */ mtsp arg0, sr1 mtsp arg2, sr2 - copy ret1, arg0 /* ret1 is used in hppa`'_blcopy() */ - hppa_copy(spcopy, sr1, arg1, sr2, arg3, ret1, `+') + hppa_copy(spcopy, sr1, arg1, sr2, arg3, ret0, `+') + mtsp r0, sr1 + mtsp r0, sr2 /* reset fault handler */ - stw r1, PCB_ONFAULT+U_PCB(r31) - mtsp ret0, sr2 -L(spcopy, ret) + stw r1, PCB_ONFAULT+U_PCB(r2) + ldw HPPA_FRAME_CRP(sp), rp + ldo -64(sp), sp bv 0(rp) copy r0, ret0 EXIT(spcopy) |