#include <machine/asmacros.h>
#include <machine/cputypes.h>
#include <machine/pmap.h>
#include <machine/specialreg.h>
#include "assym.inc"
.text
ENTRY(copyout_fast)
pushl %ebp
movl %esp, %ebp
pushl %esi
pushl %edi
pushl %ebx
movl 20(%ebp),%ebx
movl 16(%ebp),%ecx
movl 8(%ebp),%esi
movl %esp,%eax
movl $copyout_fault,%edx
cli
movl PCPU(COPYOUT_BUF),%edi
pf_y1: rep; movsb
movl 16(%ebp),%ecx
movl PCPU(COPYOUT_BUF),%esi
movl 12(%ebp),%edi
movl PCPU(TRAMPSTK),%esp
movl PCPU(CURPCB),%edx
movl PCB_CR3(%edx),%edx
movl %edx,%cr3
movl $copyout_fault,%edx
pf_x1: rep; movsb
movl %ebx,%cr3
movl %eax,%esp
sti
xorl %eax,%eax
popl %ebx
popl %edi
popl %esi
leave
ret
END(copyout_fast)
ENTRY(copyin_fast)
pushl %ebp
movl %esp, %ebp
pushl %esi
pushl %edi
pushl %ebx
movl 20(%ebp),%ebx
movl PCPU(CURPCB),%eax
movl PCB_CR3(%eax),%edx
movl 16(%ebp),%ecx
movl 8(%ebp),%esi
movl %esp,%eax
cli
movl PCPU(COPYOUT_BUF),%edi
movl PCPU(TRAMPSTK),%esp
movl %edx,%cr3
movl $copyout_fault,%edx
pf_x2: rep; movsb
movl %ebx,%cr3
movl %eax,%esp
movl 16(%ebp),%ecx
movl 12(%ebp),%edi
movl PCPU(COPYOUT_BUF),%esi
pf_y2: rep; movsb
sti
xorl %eax,%eax
popl %ebx
popl %edi
popl %esi
leave
ret
END(copyin_fast)
ALIGN_TEXT
copyout_fault:
movl %eax,%esp
sti
movl $EFAULT,%eax
popl %ebx
popl %edi
popl %esi
leave
ret
ENTRY(fueword_fast)
pushl %ebp
movl %esp,%ebp
pushl %ebx
pushl %esi
pushl %edi
movl 8(%ebp),%ecx
movl PCPU(CURPCB),%eax
movl PCB_CR3(%eax),%eax
movl $fusufault,%edx
movl 16(%ebp),%ebx
movl %esp,%esi
cli
movl PCPU(TRAMPSTK),%esp
movl %eax,%cr3
pf_x3: movl (%ecx),%eax
movl %ebx,%cr3
movl %esi,%esp
sti
movl 12(%ebp),%edx
movl %eax,(%edx)
xorl %eax,%eax
popl %edi
popl %esi
popl %ebx
leave
ret
END(fueword_fast)
ENTRY(fuword16_fast)
pushl %ebp
movl %esp,%ebp
pushl %ebx
pushl %esi
pushl %edi
movl 8(%ebp),%ecx
movl PCPU(CURPCB),%eax
movl PCB_CR3(%eax),%eax
movl $fusufault,%edx
movl 12(%ebp),%ebx
movl %esp,%esi
cli
movl PCPU(TRAMPSTK),%esp
movl %eax,%cr3
pf_x4: movzwl (%ecx),%eax
movl %ebx,%cr3
movl %esi,%esp
sti
popl %edi
popl %esi
popl %ebx
leave
ret
END(fuword16_fast)
ENTRY(fubyte_fast)
pushl %ebp
movl %esp,%ebp
pushl %ebx
pushl %esi
pushl %edi
movl 8(%ebp),%ecx
movl PCPU(CURPCB),%eax
movl PCB_CR3(%eax),%eax
movl $fusufault,%edx
movl 12(%ebp),%ebx
movl %esp,%esi
cli
movl PCPU(TRAMPSTK),%esp
movl %eax,%cr3
pf_x5: movzbl (%ecx),%eax
movl %ebx,%cr3
movl %esi,%esp
sti
popl %edi
popl %esi
popl %ebx
leave
ret
END(fubyte_fast)
ALIGN_TEXT
fusufault:
movl %esi,%esp
sti
xorl %eax,%eax
decl %eax
popl %edi
popl %esi
popl %ebx
leave
ret
ENTRY(suword_fast)
pushl %ebp
movl %esp,%ebp
pushl %ebx
pushl %esi
pushl %edi
movl PCPU(CURPCB),%eax
movl PCB_CR3(%eax),%eax
movl $fusufault,%edx
movl 8(%ebp),%ecx
movl 12(%ebp),%edi
movl 16(%ebp),%ebx
movl %esp,%esi
cli
movl PCPU(TRAMPSTK),%esp
movl %eax,%cr3
pf_x6: movl %edi,(%ecx)
movl %ebx,%cr3
movl %esi,%esp
sti
xorl %eax,%eax
popl %edi
popl %esi
popl %ebx
leave
ret
END(suword_fast)
ENTRY(suword16_fast)
pushl %ebp
movl %esp,%ebp
pushl %ebx
pushl %esi
pushl %edi
movl PCPU(CURPCB),%eax
movl PCB_CR3(%eax),%eax
movl $fusufault,%edx
movl 8(%ebp),%ecx
movl 12(%ebp),%edi
movl 16(%ebp),%ebx
movl %esp,%esi
cli
movl PCPU(TRAMPSTK),%esp
movl %eax,%cr3
pf_x7: movw %di,(%ecx)
movl %ebx,%cr3
movl %esi,%esp
sti
xorl %eax,%eax
popl %edi
popl %esi
popl %ebx
leave
ret
END(suword16_fast)
ENTRY(subyte_fast)
pushl %ebp
movl %esp,%ebp
pushl %ebx
pushl %esi
pushl %edi
movl PCPU(CURPCB),%eax
movl PCB_CR3(%eax),%eax
movl $fusufault,%edx
movl 8(%ebp),%ecx
movl 12(%ebp),%edi
movl 16(%ebp),%ebx
movl %esp,%esi
cli
movl PCPU(TRAMPSTK),%esp
movl %eax,%cr3
movl %edi,%eax
pf_x8: movb %al,(%ecx)
movl %ebx,%cr3
movl %esi,%esp
sti
xorl %eax,%eax
popl %edi
popl %esi
popl %ebx
leave
ret
END(subyte_fast)