#include <machine/asmacros.h>
#include <machine/asm_mjgmacros.h>
#include <machine/pmap.h>
#include "assym.s"
ALIGN_DATA
.text
ENTRY(bzero)
subq %r10,%r10
movq %rsi,%rdx
MEMSET erms=0 end=ret
END(bzero)
.weak _bzero
.equ _bzero, bzero
ENTRY(memset)
movzbq %sil,%r8
movabs $0x0101010101010101,%r10
imulq %r8,%r10
MEMSET erms=0 end=ret
END(memset)
.weak _memset
.equ _memset, memset
#if 1
ENTRY(pagezero)
movq $PAGE_SIZE>>3,%rcx
xorl %eax,%eax
rep
stosq
ret
END(pagezero)
#else
ENTRY(pagezero)
addq $4096,%rdi
movq $-4096,%rax
ALIGN_TEXT
1:
movq $0,(%rdi,%rax,1)
movq $0,8(%rdi,%rax,1)
addq $16,%rax
jne 1b
ret
END(pagezero)
#endif
ENTRY(bcopy)
xchgq %rsi,%rdi
MEMMOVE erms=0 overlap=1 end=ret
END(bcopy)
.weak _bcopy
.equ _bcopy, bcopy
ENTRY(memmove)
movq %rdi,%rax
MEMMOVE erms=0 overlap=1 end=ret
END(memmove)
.weak _memmove
.equ _memmove, memmove
ENTRY(reset_dbregs)
movq $0x200,%rax
movq %rax,%dr7
movq $0,%rax
movq %rax,%dr0
movq %rax,%dr1
movq %rax,%dr2
movq %rax,%dr3
movq %rax,%dr6
ret
END(reset_dbregs)
ENTRY(memcpy)
movq %rdi,%rax
MEMMOVE erms=0 overlap=0 end=ret
END(memcpy)
.weak _memcpy
.equ _memcpy, memcpy
ENTRY(fillw)
movq %rdi,%rax
movq %rsi,%rdi
movq %rdx,%rcx
rep
stosw
ret
END(fillw)
ENTRY(kreadmem64)
SMAP_OPEN
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $kreadmem64fault,PCB_ONFAULT(%rcx)
movq %rsp,PCB_ONFAULT_SP(%rcx)
movq (%rdi),%rax
movq $0,PCB_ONFAULT(%rcx)
SMAP_CLOSE
ret
kreadmem64fault:
SMAP_CLOSE
movq PCPU(curthread),%rcx
xorl %eax,%eax
movq TD_PCB(%rcx),%rcx
movq %rax,PCB_ONFAULT(%rcx)
decq %rax
ret
END(kreadmem64)
.macro COPYOUT_END
jmp done_copyout
nop
.endm
ENTRY(std_copyout)
SMAP_OPEN
movq PCPU(curthread),%rax
movq TD_PCB(%rax), %rax
movq $copyout_fault,PCB_ONFAULT(%rax)
movq %rsp,PCB_ONFAULT_SP(%rax)
testq %rdx,%rdx
jz done_copyout
movq %rsi,%rax
addq %rdx,%rax
jc copyout_fault
movq $VM_MAX_USER_ADDRESS,%rcx
cmpq %rcx,%rax
ja copyout_fault
xchgq %rdi,%rsi
MEMMOVE erms=0 overlap=0 end=COPYOUT_END
done_copyout:
SMAP_CLOSE
xorl %eax,%eax
movq PCPU(curthread),%rdx
movq TD_PCB(%rdx), %rdx
movq %rax,PCB_ONFAULT(%rdx)
ret
ALIGN_TEXT
copyout_fault:
SMAP_CLOSE
movq PCPU(curthread),%rdx
movq TD_PCB(%rdx), %rdx
movq $0,PCB_ONFAULT(%rdx)
movq $EFAULT,%rax
ret
END(std_copyout)
.macro COPYIN_END
jmp done_copyin
nop
.endm
ENTRY(std_copyin)
SMAP_OPEN
movq PCPU(curthread),%rax
movq TD_PCB(%rax), %rax
movq $copyin_fault,PCB_ONFAULT(%rax)
movq %rsp,PCB_ONFAULT_SP(%rax)
testq %rdx,%rdx
jz done_copyin
movq %rdi,%rax
addq %rdx,%rax
jc copyin_fault
movq $VM_MAX_USER_ADDRESS,%rcx
cmpq %rcx,%rax
ja copyin_fault
xchgq %rdi,%rsi
MEMMOVE erms=0 overlap=0 end=COPYIN_END
done_copyin:
SMAP_CLOSE
xorl %eax,%eax
movq PCPU(curthread),%rdx
movq TD_PCB(%rdx), %rdx
movq %rax,PCB_ONFAULT(%rdx)
ret
ALIGN_TEXT
copyin_fault:
SMAP_CLOSE
movq PCPU(curthread),%rdx
movq TD_PCB(%rdx), %rdx
movq $0,PCB_ONFAULT(%rdx)
movq $EFAULT,%rax
ret
END(std_copyin)
ENTRY(casu32)
SMAP_OPEN
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $fusufault,PCB_ONFAULT(%rcx)
movq %rsp,PCB_ONFAULT_SP(%rcx)
movq $VM_MAX_USER_ADDRESS-4,%rax
cmpq %rax,%rdi
ja fusufault
movl %esi,%eax
lock
cmpxchgl %edx,(%rdi)
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $0,PCB_ONFAULT(%rcx)
SMAP_CLOSE
ret
END(casu32)
ENTRY(std_swapu32)
SMAP_OPEN
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $fusufault,PCB_ONFAULT(%rcx)
movq %rsp,PCB_ONFAULT_SP(%rcx)
movq $VM_MAX_USER_ADDRESS-4,%rax
cmpq %rax,%rdi
ja fusufault
movq %rsi,%rax
xchgl %eax,(%rdi)
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $0,PCB_ONFAULT(%rcx)
SMAP_CLOSE
ret
END(std_swapu32)
ENTRY(std_fuwordadd32)
SMAP_OPEN
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $fusufault,PCB_ONFAULT(%rcx)
movq %rsp,PCB_ONFAULT_SP(%rcx)
movq $VM_MAX_USER_ADDRESS-4,%rax
cmpq %rax,%rdi
ja fusufault
movq %rsi,%rax
lock xaddl %eax,(%rdi)
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $0,PCB_ONFAULT(%rcx)
SMAP_CLOSE
ret
END(std_fuwordadd32)
ENTRY(casu64)
SMAP_OPEN
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $fusufault,PCB_ONFAULT(%rcx)
movq %rsp,PCB_ONFAULT_SP(%rcx)
movq $VM_MAX_USER_ADDRESS-8,%rax
cmpq %rax,%rdi
ja fusufault
movq %rsi,%rax
lock
cmpxchgq %rdx,(%rdi)
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $0,PCB_ONFAULT(%rcx)
SMAP_CLOSE
ret
END(casu64)
ENTRY(std_swapu64)
SMAP_OPEN
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $fusufault,PCB_ONFAULT(%rcx)
movq %rsp,PCB_ONFAULT_SP(%rcx)
movq $VM_MAX_USER_ADDRESS-8,%rax
cmpq %rax,%rdi
ja fusufault
movq %rsi,%rax
xchgq %rax,(%rdi)
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $0,PCB_ONFAULT(%rcx)
SMAP_CLOSE
ret
END(std_swapu64)
ENTRY(std_fuwordadd64)
SMAP_OPEN
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $fusufault,PCB_ONFAULT(%rcx)
movq %rsp,PCB_ONFAULT_SP(%rcx)
movq $VM_MAX_USER_ADDRESS-8,%rax
cmpq %rax,%rdi
ja fusufault
movq %rsi,%rax
lock xaddq %rax,(%rdi)
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $0,PCB_ONFAULT(%rcx)
SMAP_CLOSE
ret
END(std_fuwordadd64)
ENTRY(std_fuword64)
SMAP_OPEN
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $fusufault,PCB_ONFAULT(%rcx)
movq %rsp,PCB_ONFAULT_SP(%rcx)
movq $VM_MAX_USER_ADDRESS-8,%rax
cmpq %rax,%rdi
ja fusufault
movq (%rdi),%rax
movq $0,PCB_ONFAULT(%rcx)
SMAP_CLOSE
ret
END(std_fuword64)
ENTRY(std_fuword32)
SMAP_OPEN
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $fusufault,PCB_ONFAULT(%rcx)
movq %rsp,PCB_ONFAULT_SP(%rcx)
movq $VM_MAX_USER_ADDRESS-4,%rax
cmpq %rax,%rdi
ja fusufault
movl (%rdi),%eax
movq $0,PCB_ONFAULT(%rcx)
SMAP_CLOSE
ret
END(std_fuword32)
ENTRY(std_fubyte)
SMAP_OPEN
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $fusufault,PCB_ONFAULT(%rcx)
movq %rsp,PCB_ONFAULT_SP(%rcx)
movq $VM_MAX_USER_ADDRESS-1,%rax
cmpq %rax,%rdi
ja fusufault
movzbl (%rdi),%eax
movq $0,PCB_ONFAULT(%rcx)
SMAP_CLOSE
ret
ALIGN_TEXT
fusufault:
movq PCPU(curthread),%rcx
xorl %eax,%eax
movq TD_PCB(%rcx), %rcx
movq %rax,PCB_ONFAULT(%rcx)
decq %rax
SMAP_CLOSE
ret
END(std_fubyte)
ENTRY(std_suword64)
SMAP_OPEN
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $fusufault,PCB_ONFAULT(%rcx)
movq %rsp,PCB_ONFAULT_SP(%rcx)
movq $VM_MAX_USER_ADDRESS-8,%rax
cmpq %rax,%rdi
ja fusufault
movq %rsi,(%rdi)
xorl %eax,%eax
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq %rax,PCB_ONFAULT(%rcx)
SMAP_CLOSE
ret
END(std_suword64)
ENTRY(std_suword32)
SMAP_OPEN
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $fusufault,PCB_ONFAULT(%rcx)
movq %rsp,PCB_ONFAULT_SP(%rcx)
movq $VM_MAX_USER_ADDRESS-4,%rax
cmpq %rax,%rdi
ja fusufault
movl %esi,(%rdi)
xorl %eax,%eax
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq %rax,PCB_ONFAULT(%rcx)
SMAP_CLOSE
ret
END(std_suword32)
ENTRY(std_subyte)
SMAP_OPEN
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $fusufault,PCB_ONFAULT(%rcx)
movq %rsp,PCB_ONFAULT_SP(%rcx)
movq $VM_MAX_USER_ADDRESS-1,%rax
cmpq %rax,%rdi
ja fusufault
movl %esi,%eax
movb %al,(%rdi)
xorl %eax,%eax
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq %rax,PCB_ONFAULT(%rcx)
SMAP_CLOSE
ret
END(std_subyte)
ENTRY(std_copyinstr)
SMAP_OPEN
movq %rdx,%r8
movq %rcx,%r9
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $cpystrflt,PCB_ONFAULT(%rcx)
movq %rsp,PCB_ONFAULT_SP(%rcx)
movq $VM_MAX_USER_ADDRESS,%rax
subq %rdi,%rax
jbe cpystrflt
cmpq %rdx,%rax
jae 1f
movq %rax,%rdx
movq %rax,%r8
1:
incq %rdx
2:
decq %rdx
jz 3f
movb (%rdi),%al
movb %al,(%rsi)
leaq 1(%rdi),%rdi
leaq 1(%rsi),%rsi
testb %al,%al
jnz 2b
decq %rdx
xorl %eax,%eax
jmp cpystrflt_x
3:
movq $VM_MAX_USER_ADDRESS,%rax
cmpq %rax,%rsi
jae cpystrflt
4:
movq $ENAMETOOLONG,%rax
jmp cpystrflt_x
cpystrflt:
movq $EFAULT,%rax
cpystrflt_x:
SMAP_CLOSE
movq PCPU(curthread),%rcx
movq TD_PCB(%rcx), %rcx
movq $0,PCB_ONFAULT(%rcx)
testq %r9,%r9
jz 1f
subq %rdx,%r8
movq %r8,(%r9)
1:
ret
END(std_copyinstr)
ENTRY(copystr)
movq %rdx,%r8
incq %rdx
1:
decq %rdx
jz 4f
movb (%rdi),%al
movb %al,(%rsi)
leaq 1(%rdi),%rdi
leaq 1(%rsi),%rsi
testb %al,%al
jnz 1b
decq %rdx
xorl %eax,%eax
jmp 6f
4:
movq $ENAMETOOLONG,%rax
6:
testq %rcx,%rcx
jz 7f
subq %rdx,%r8
movq %r8,(%rcx)
7:
ret
END(copystr)
ENTRY(lgdt)
lgdt (%rdi)
jmp 1f
nop
1:
movl $KDSEL,%eax
movl %eax,%ds
movl %eax,%es
movl %eax,%fs
movl %eax,%gs
movl %eax,%ss
popq %rax
pushq $KCSEL
pushq %rax
MEXITCOUNT
lretq
END(lgdt)
ENTRY(setjmp)
movq %rbx,0(%rdi)
movq %rsp,8(%rdi)
movq %rbp,16(%rdi)
movq %r12,24(%rdi)
movq %r13,32(%rdi)
movq %r14,40(%rdi)
movq %r15,48(%rdi)
movq 0(%rsp),%rdx
movq %rdx,56(%rdi)
xorl %eax,%eax
ret
END(setjmp)
ENTRY(longjmp)
movq 0(%rdi),%rbx
movq 8(%rdi),%rsp
movq 16(%rdi),%rbp
movq 24(%rdi),%r12
movq 32(%rdi),%r13
movq 40(%rdi),%r14
movq 48(%rdi),%r15
movq 56(%rdi),%rdx
movq %rdx,0(%rsp)
xorl %eax,%eax
incl %eax
ret
END(longjmp)
ENTRY(rdmsr_safe)
movq PCPU(curthread),%r8
movq TD_PCB(%r8), %r8
movq $msr_onfault,PCB_ONFAULT(%r8)
movq %rsp,PCB_ONFAULT_SP(%r8)
movl %edi,%ecx
rdmsr
salq $32,%rdx
movl %eax,%eax
orq %rdx,%rax
movq %rax,(%rsi)
xorq %rax,%rax
movq %rax,PCB_ONFAULT(%r8)
ret
END(rdmsr_safe)
ENTRY(wrmsr_safe)
movq PCPU(curthread),%r8
movq TD_PCB(%r8), %r8
movq $msr_onfault,PCB_ONFAULT(%r8)
movq %rsp,PCB_ONFAULT_SP(%r8)
movl %edi,%ecx
movl %esi,%eax
sarq $32,%rsi
movl %esi,%edx
wrmsr
xorq %rax,%rax
movq %rax,PCB_ONFAULT(%r8)
ret
END(wrmsr_safe)
ALIGN_TEXT
msr_onfault:
movq PCPU(curthread),%r8
movq TD_PCB(%r8), %r8
movq $0,PCB_ONFAULT(%r8)
movl $EFAULT,%eax
ret
ENTRY(smap_open)
SMAP_OPEN
ret
END(smap_open)
ENTRY(smap_close)
SMAP_CLOSE
ret
END(smap_close)