#undef _LOCORE
#define _LOCORE
#include <machine/asm.h>
#include <machine/frame.h>
#ifdef _KERNEL
#include <assym.h>
.import copy_on_fault, code
LEAF_ENTRY(spcopy)
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)
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
comib,>=,n 15, ret0, $spcopy.byte
extru arg1, 31, 2, t3
extru arg3, 31, 2, t4
add ret0, t4, ret0
comb,<> t3, t4, $spcopy.unaligned
dep r0, 31, 2, arg1
addi -16, ret0, ret0
$spcopy.loop16a
ldws,ma 4(sr1, arg1), t1
ldws,ma 4(sr1, arg1), t2
ldws,ma 4(sr1, arg1), t3
ldws,ma 4(sr1, arg1), t4
stbys,b,m t1, 4(sr2, arg3)
stws,ma t2, 4(sr2, arg3)
stws,ma t3, 4(sr2, arg3)
addib,>= -16, ret0, $spcopy.loop16a
stws,ma t4, 4(sr2, arg3)
addib,<,n 12, ret0, $spcopy.cleanup
$spcopy.word
ldws,ma 4(sr1, arg1), t1
addib,>= -4, ret0, $spcopy.word
stws,ma t1, 4(sr2, arg3)
$spcopy.cleanup
addib,=,n 4, ret0, $spcopy.done
ldws 0(sr1, arg1), t1
add arg3, ret0, arg3
b $spcopy.done
stbys,e t1, 0(sr2, arg3)
$spcopy.unaligned
sub,>= t4, t3, t2
ldwm 4(sr1, arg1), ret1
zdep t2, 28, 29, t1
mtsar t1
addi -16, ret0, ret0
$spcopy.loop16u
ldws,ma 4(sr1, arg1), t1
ldws,ma 4(sr1, arg1), t2
ldws,ma 4(sr1, arg1), t3
ldws,ma 4(sr1, arg1), t4
vshd ret1, t1, r31
stbys,b,m r31, 4(sr2, arg3)
vshd t1, t2, r31
stws,ma r31, 4(sr2, arg3)
vshd t2, t3, r31
stws,ma r31, 4(sr2, arg3)
vshd t3, t4, r31
stws,ma r31, 4(sr2, arg3)
addib,>= -16, ret0, $spcopy.loop16u
copy t4, ret1
addib,<,n 12, ret0, $spcopy.cleanup_un
$spcopy.word_un
ldws,ma 4(sr1, arg1), t1
vshd ret1, t1, t2
addib,< -4, ret0, $spcopy.cleanup1_un
stws,ma t2, 4(sr2, arg3)
ldws,ma 4(sr1, arg1), ret1
vshd t1, ret1, t2
addib,>= -4, ret0, $spcopy.word_un
stws,ma t2, 4(sr2, arg3)
$spcopy.cleanup_un
addib,<=,n 4, ret0, $spcopy.done
mfctl sar, t4
add arg3, ret0, arg3
extru t4, 28, 2, t4
sub,<= ret0, t4, r0
ldws,ma 4(sr1, arg1), t1
vshd ret1, t1, t2
b $spcopy.done
stbys,e t2, 0(sr2, arg3)
$spcopy.cleanup1_un
b $spcopy.cleanup_un
copy t1, ret1
$spcopy.byte
comb,>=,n r0, ret0, $spcopy.done
$spcopy.byte_loop
ldbs,ma 1(sr1, arg1), t1
addib,<> -1, ret0, $spcopy.byte_loop
stbs,ma t1, 1(sr2, arg3)
$spcopy.done
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)
copy r0, ret0
EXIT(spcopy)
#endif
.end