futex_fault:
testl $CPUID_STDEXT_SMAP,cpu_stdext_feature(%rip)
je 1f
clac
1: movq $0,PCB_ONFAULT(%r8)
movl $EFAULT,%eax
ret
ENTRY(futex_xchgl_nosmap)
movq PCPU(CURPCB),%r8
movq $futex_fault,PCB_ONFAULT(%r8)
movq $VM_MAXUSER_ADDRESS-4,%rax
cmpq %rax,%rsi
ja futex_fault
xchgl %edi,(%rsi)
movl %edi,(%rdx)
xorl %eax,%eax
movq %rax,PCB_ONFAULT(%r8)
ret
END(futex_xchgl_nosmap)
ENTRY(futex_xchgl_smap)
movq PCPU(CURPCB),%r8
movq $futex_fault,PCB_ONFAULT(%r8)
movq $VM_MAXUSER_ADDRESS-4,%rax
cmpq %rax,%rsi
ja futex_fault
stac
xchgl %edi,(%rsi)
clac
movl %edi,(%rdx)
xorl %eax,%eax
movq %rax,PCB_ONFAULT(%r8)
ret
END(futex_xchgl_smap)
ENTRY(futex_addl_nosmap)
movq PCPU(CURPCB),%r8
movq $futex_fault,PCB_ONFAULT(%r8)
movq $VM_MAXUSER_ADDRESS-4,%rax
cmpq %rax,%rsi
ja futex_fault
lock
xaddl %edi,(%rsi)
movl %edi,(%rdx)
xorl %eax,%eax
movq %rax,PCB_ONFAULT(%r8)
ret
END(futex_addl_nosmap)
ENTRY(futex_addl_smap)
movq PCPU(CURPCB),%r8
movq $futex_fault,PCB_ONFAULT(%r8)
movq $VM_MAXUSER_ADDRESS-4,%rax
cmpq %rax,%rsi
ja futex_fault
stac
lock
xaddl %edi,(%rsi)
clac
movl %edi,(%rdx)
xorl %eax,%eax
movq %rax,PCB_ONFAULT(%r8)
ret
END(futex_addl_smap)
ENTRY(futex_orl_nosmap)
movq PCPU(CURPCB),%r8
movq $futex_fault,PCB_ONFAULT(%r8)
movq $VM_MAXUSER_ADDRESS-4,%rax
cmpq %rax,%rsi
ja futex_fault
movl (%rsi),%eax
1: movl %eax,%ecx
orl %edi,%ecx
lock
cmpxchgl %ecx,(%rsi)
jnz 1b
movl %eax,(%rdx)
xorl %eax,%eax
movq %rax,PCB_ONFAULT(%r8)
ret
END(futex_orl_nosmap)
ENTRY(futex_orl_smap)
movq PCPU(CURPCB),%r8
movq $futex_fault,PCB_ONFAULT(%r8)
movq $VM_MAXUSER_ADDRESS-4,%rax
cmpq %rax,%rsi
ja futex_fault
stac
movl (%rsi),%eax
1: movl %eax,%ecx
orl %edi,%ecx
lock
cmpxchgl %ecx,(%rsi)
jnz 1b
clac
movl %eax,(%rdx)
xorl %eax,%eax
movq %rax,PCB_ONFAULT(%r8)
ret
END(futex_orl_smap)
ENTRY(futex_andl_nosmap)
movq PCPU(CURPCB),%r8
movq $futex_fault,PCB_ONFAULT(%r8)
movq $VM_MAXUSER_ADDRESS-4,%rax
cmpq %rax,%rsi
ja futex_fault
movl (%rsi),%eax
1: movl %eax,%ecx
andl %edi,%ecx
lock
cmpxchgl %ecx,(%rsi)
jnz 1b
movl %eax,(%rdx)
xorl %eax,%eax
movq %rax,PCB_ONFAULT(%r8)
ret
END(futex_andl_nosmap)
ENTRY(futex_andl_smap)
movq PCPU(CURPCB),%r8
movq $futex_fault,PCB_ONFAULT(%r8)
movq $VM_MAXUSER_ADDRESS-4,%rax
cmpq %rax,%rsi
ja futex_fault
stac
movl (%rsi),%eax
1: movl %eax,%ecx
andl %edi,%ecx
lock
cmpxchgl %ecx,(%rsi)
jnz 1b
clac
movl %eax,(%rdx)
xorl %eax,%eax
movq %rax,PCB_ONFAULT(%r8)
ret
END(futex_andl_smap)
ENTRY(futex_xorl_nosmap)
movq PCPU(CURPCB),%r8
movq $futex_fault,PCB_ONFAULT(%r8)
movq $VM_MAXUSER_ADDRESS-4,%rax
cmpq %rax,%rsi
ja futex_fault
movl (%rsi),%eax
1: movl %eax,%ecx
xorl %edi,%ecx
lock
cmpxchgl %ecx,(%rsi)
jnz 1b
movl %eax,(%rdx)
xorl %eax,%eax
movq %rax,PCB_ONFAULT(%r8)
ret
END(futex_xorl_nosmap)
ENTRY(futex_xorl_smap)
movq PCPU(CURPCB),%r8
movq $futex_fault,PCB_ONFAULT(%r8)
movq $VM_MAXUSER_ADDRESS-4,%rax
cmpq %rax,%rsi
ja futex_fault
stac
movl (%rsi),%eax
1: movl %eax,%ecx
xorl %edi,%ecx
lock
cmpxchgl %ecx,(%rsi)
jnz 1b
clac
movl %eax,(%rdx)
xorl %eax,%eax
movq %rax,PCB_ONFAULT(%r8)
ret
END(futex_xorl_smap)