1b2f58791SDmitry Chagin/*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 37eb2159fSEd Maste * 4b2f58791SDmitry Chagin * Copyright (c) 2007 Konstantin Belousov 5b2f58791SDmitry Chagin * All rights reserved. 6b2f58791SDmitry Chagin * 7b2f58791SDmitry Chagin * Redistribution and use in source and binary forms, with or without 8b2f58791SDmitry Chagin * modification, are permitted provided that the following conditions 9b2f58791SDmitry Chagin * are met: 10b2f58791SDmitry Chagin * 1. Redistributions of source code must retain the above copyright 11b2f58791SDmitry Chagin * notice, this list of conditions and the following disclaimer. 12b2f58791SDmitry Chagin * 2. Redistributions in binary form must reproduce the above copyright 13b2f58791SDmitry Chagin * notice, this list of conditions and the following disclaimer in the 14b2f58791SDmitry Chagin * documentation and/or other materials provided with the distribution. 15b2f58791SDmitry Chagin * 167eb2159fSEd Maste * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17b2f58791SDmitry Chagin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18b2f58791SDmitry Chagin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 197eb2159fSEd Maste * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20b2f58791SDmitry Chagin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21b2f58791SDmitry Chagin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22b2f58791SDmitry Chagin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23b2f58791SDmitry Chagin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24b2f58791SDmitry Chagin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25b2f58791SDmitry Chagin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26b2f58791SDmitry Chagin * SUCH DAMAGE. 27b2f58791SDmitry Chagin */ 28b2f58791SDmitry Chagin 29b2f58791SDmitry Chagin#include "linux_assym.h" /* system definitions */ 30b2f58791SDmitry Chagin#include <machine/asmacros.h> /* miscellaneous asm macros */ 31a59f0285SKonstantin Belousov#include <machine/specialreg.h> 32b2f58791SDmitry Chagin 33fc2a8776SEd Maste#include "assym.inc" 34b2f58791SDmitry Chagin 35b2f58791SDmitry Chaginfutex_fault: 3691aae953SKonstantin Belousov testl $CPUID_STDEXT_SMAP,cpu_stdext_feature(%rip) 3791aae953SKonstantin Belousov je 1f 3891aae953SKonstantin Belousov clac 3991aae953SKonstantin Belousov1: movq $0,PCB_ONFAULT(%r8) 4007d10893SDmitry Chagin movl $EFAULT,%eax 41b2f58791SDmitry Chagin ret 42b2f58791SDmitry Chagin 43cb0eecdfSKonstantin BelousovENTRY(futex_xchgl_nosmap) 44b2f58791SDmitry Chagin movq PCPU(CURPCB),%r8 45b2f58791SDmitry Chagin movq $futex_fault,PCB_ONFAULT(%r8) 46b2f58791SDmitry Chagin movq $VM_MAXUSER_ADDRESS-4,%rax 47b2f58791SDmitry Chagin cmpq %rax,%rsi 48b2f58791SDmitry Chagin ja futex_fault 49c2bc5b15SDmitry Chagin xchgl %edi,(%rsi) 50c2bc5b15SDmitry Chagin movl %edi,(%rdx) 51c2bc5b15SDmitry Chagin xorl %eax,%eax 52b2f58791SDmitry Chagin movq %rax,PCB_ONFAULT(%r8) 53b2f58791SDmitry Chagin ret 54cb0eecdfSKonstantin BelousovEND(futex_xchgl_nosmap) 55b2f58791SDmitry Chagin 56cb0eecdfSKonstantin BelousovENTRY(futex_xchgl_smap) 57cb0eecdfSKonstantin Belousov movq PCPU(CURPCB),%r8 58cb0eecdfSKonstantin Belousov movq $futex_fault,PCB_ONFAULT(%r8) 59cb0eecdfSKonstantin Belousov movq $VM_MAXUSER_ADDRESS-4,%rax 60cb0eecdfSKonstantin Belousov cmpq %rax,%rsi 61cb0eecdfSKonstantin Belousov ja futex_fault 62cb0eecdfSKonstantin Belousov stac 63cb0eecdfSKonstantin Belousov xchgl %edi,(%rsi) 64cb0eecdfSKonstantin Belousov clac 65cb0eecdfSKonstantin Belousov movl %edi,(%rdx) 66cb0eecdfSKonstantin Belousov xorl %eax,%eax 67cb0eecdfSKonstantin Belousov movq %rax,PCB_ONFAULT(%r8) 68cb0eecdfSKonstantin Belousov ret 69cb0eecdfSKonstantin BelousovEND(futex_xchgl_smap) 70cb0eecdfSKonstantin Belousov 71cb0eecdfSKonstantin BelousovENTRY(futex_addl_nosmap) 72b2f58791SDmitry Chagin movq PCPU(CURPCB),%r8 73b2f58791SDmitry Chagin movq $futex_fault,PCB_ONFAULT(%r8) 74b2f58791SDmitry Chagin movq $VM_MAXUSER_ADDRESS-4,%rax 75b2f58791SDmitry Chagin cmpq %rax,%rsi 76b2f58791SDmitry Chagin ja futex_fault 77b2f58791SDmitry Chagin#ifdef SMP 78b2f58791SDmitry Chagin lock 79b2f58791SDmitry Chagin#endif 80c2bc5b15SDmitry Chagin xaddl %edi,(%rsi) 81c2bc5b15SDmitry Chagin movl %edi,(%rdx) 82c2bc5b15SDmitry Chagin xorl %eax,%eax 83b2f58791SDmitry Chagin movq %rax,PCB_ONFAULT(%r8) 84b2f58791SDmitry Chagin ret 85cb0eecdfSKonstantin BelousovEND(futex_addl_nosmap) 86b2f58791SDmitry Chagin 87cb0eecdfSKonstantin BelousovENTRY(futex_addl_smap) 88cb0eecdfSKonstantin Belousov movq PCPU(CURPCB),%r8 89cb0eecdfSKonstantin Belousov movq $futex_fault,PCB_ONFAULT(%r8) 90cb0eecdfSKonstantin Belousov movq $VM_MAXUSER_ADDRESS-4,%rax 91cb0eecdfSKonstantin Belousov cmpq %rax,%rsi 92cb0eecdfSKonstantin Belousov ja futex_fault 93cb0eecdfSKonstantin Belousov stac 94cb0eecdfSKonstantin Belousov#ifdef SMP 95cb0eecdfSKonstantin Belousov lock 96cb0eecdfSKonstantin Belousov#endif 97cb0eecdfSKonstantin Belousov xaddl %edi,(%rsi) 98cb0eecdfSKonstantin Belousov clac 99cb0eecdfSKonstantin Belousov movl %edi,(%rdx) 100cb0eecdfSKonstantin Belousov xorl %eax,%eax 101cb0eecdfSKonstantin Belousov movq %rax,PCB_ONFAULT(%r8) 102cb0eecdfSKonstantin Belousov ret 103cb0eecdfSKonstantin BelousovEND(futex_addl_smap) 104cb0eecdfSKonstantin Belousov 105cb0eecdfSKonstantin BelousovENTRY(futex_orl_nosmap) 106b2f58791SDmitry Chagin movq PCPU(CURPCB),%r8 107b2f58791SDmitry Chagin movq $futex_fault,PCB_ONFAULT(%r8) 108b2f58791SDmitry Chagin movq $VM_MAXUSER_ADDRESS-4,%rax 109b2f58791SDmitry Chagin cmpq %rax,%rsi 110b2f58791SDmitry Chagin ja futex_fault 111c2bc5b15SDmitry Chagin movl (%rsi),%eax 112c2bc5b15SDmitry Chagin1: movl %eax,%ecx 113c2bc5b15SDmitry Chagin orl %edi,%ecx 114b2f58791SDmitry Chagin#ifdef SMP 115b2f58791SDmitry Chagin lock 116b2f58791SDmitry Chagin#endif 117c2bc5b15SDmitry Chagin cmpxchgl %ecx,(%rsi) 118b2f58791SDmitry Chagin jnz 1b 119c2bc5b15SDmitry Chagin movl %eax,(%rdx) 120c2bc5b15SDmitry Chagin xorl %eax,%eax 121b2f58791SDmitry Chagin movq %rax,PCB_ONFAULT(%r8) 122b2f58791SDmitry Chagin ret 123cb0eecdfSKonstantin BelousovEND(futex_orl_nosmap) 124b2f58791SDmitry Chagin 125cb0eecdfSKonstantin BelousovENTRY(futex_orl_smap) 126cb0eecdfSKonstantin Belousov movq PCPU(CURPCB),%r8 127cb0eecdfSKonstantin Belousov movq $futex_fault,PCB_ONFAULT(%r8) 128cb0eecdfSKonstantin Belousov movq $VM_MAXUSER_ADDRESS-4,%rax 129cb0eecdfSKonstantin Belousov cmpq %rax,%rsi 130cb0eecdfSKonstantin Belousov ja futex_fault 131fb580451SMark Johnston stac 132cb0eecdfSKonstantin Belousov movl (%rsi),%eax 133cb0eecdfSKonstantin Belousov1: movl %eax,%ecx 134cb0eecdfSKonstantin Belousov orl %edi,%ecx 135cb0eecdfSKonstantin Belousov#ifdef SMP 136cb0eecdfSKonstantin Belousov lock 137cb0eecdfSKonstantin Belousov#endif 138cb0eecdfSKonstantin Belousov cmpxchgl %ecx,(%rsi) 139cb0eecdfSKonstantin Belousov jnz 1b 140fb580451SMark Johnston clac 141cb0eecdfSKonstantin Belousov movl %eax,(%rdx) 142cb0eecdfSKonstantin Belousov xorl %eax,%eax 143cb0eecdfSKonstantin Belousov movq %rax,PCB_ONFAULT(%r8) 144cb0eecdfSKonstantin Belousov ret 145cb0eecdfSKonstantin BelousovEND(futex_orl_smap) 146cb0eecdfSKonstantin Belousov 147cb0eecdfSKonstantin BelousovENTRY(futex_andl_nosmap) 148b2f58791SDmitry Chagin movq PCPU(CURPCB),%r8 149b2f58791SDmitry Chagin movq $futex_fault,PCB_ONFAULT(%r8) 150b2f58791SDmitry Chagin movq $VM_MAXUSER_ADDRESS-4,%rax 151b2f58791SDmitry Chagin cmpq %rax,%rsi 152b2f58791SDmitry Chagin ja futex_fault 153c2bc5b15SDmitry Chagin movl (%rsi),%eax 154c2bc5b15SDmitry Chagin1: movl %eax,%ecx 155c2bc5b15SDmitry Chagin andl %edi,%ecx 156b2f58791SDmitry Chagin#ifdef SMP 157b2f58791SDmitry Chagin lock 158b2f58791SDmitry Chagin#endif 159c2bc5b15SDmitry Chagin cmpxchgl %ecx,(%rsi) 160b2f58791SDmitry Chagin jnz 1b 161c2bc5b15SDmitry Chagin movl %eax,(%rdx) 162c2bc5b15SDmitry Chagin xorl %eax,%eax 163b2f58791SDmitry Chagin movq %rax,PCB_ONFAULT(%r8) 164b2f58791SDmitry Chagin ret 165cb0eecdfSKonstantin BelousovEND(futex_andl_nosmap) 166b2f58791SDmitry Chagin 167cb0eecdfSKonstantin BelousovENTRY(futex_andl_smap) 168cb0eecdfSKonstantin Belousov movq PCPU(CURPCB),%r8 169cb0eecdfSKonstantin Belousov movq $futex_fault,PCB_ONFAULT(%r8) 170cb0eecdfSKonstantin Belousov movq $VM_MAXUSER_ADDRESS-4,%rax 171cb0eecdfSKonstantin Belousov cmpq %rax,%rsi 172cb0eecdfSKonstantin Belousov ja futex_fault 173fb580451SMark Johnston stac 174cb0eecdfSKonstantin Belousov movl (%rsi),%eax 175cb0eecdfSKonstantin Belousov1: movl %eax,%ecx 176cb0eecdfSKonstantin Belousov andl %edi,%ecx 177cb0eecdfSKonstantin Belousov#ifdef SMP 178cb0eecdfSKonstantin Belousov lock 179cb0eecdfSKonstantin Belousov#endif 180cb0eecdfSKonstantin Belousov cmpxchgl %ecx,(%rsi) 181cb0eecdfSKonstantin Belousov jnz 1b 182fb580451SMark Johnston clac 183cb0eecdfSKonstantin Belousov movl %eax,(%rdx) 184cb0eecdfSKonstantin Belousov xorl %eax,%eax 185cb0eecdfSKonstantin Belousov movq %rax,PCB_ONFAULT(%r8) 186cb0eecdfSKonstantin Belousov ret 187cb0eecdfSKonstantin BelousovEND(futex_andl_smap) 188cb0eecdfSKonstantin Belousov 189cb0eecdfSKonstantin BelousovENTRY(futex_xorl_nosmap) 190b2f58791SDmitry Chagin movq PCPU(CURPCB),%r8 191b2f58791SDmitry Chagin movq $futex_fault,PCB_ONFAULT(%r8) 192b2f58791SDmitry Chagin movq $VM_MAXUSER_ADDRESS-4,%rax 193b2f58791SDmitry Chagin cmpq %rax,%rsi 194b2f58791SDmitry Chagin ja futex_fault 195c2bc5b15SDmitry Chagin movl (%rsi),%eax 196c2bc5b15SDmitry Chagin1: movl %eax,%ecx 197c2bc5b15SDmitry Chagin xorl %edi,%ecx 198b2f58791SDmitry Chagin#ifdef SMP 199b2f58791SDmitry Chagin lock 200b2f58791SDmitry Chagin#endif 201c2bc5b15SDmitry Chagin cmpxchgl %ecx,(%rsi) 202b2f58791SDmitry Chagin jnz 1b 203c2bc5b15SDmitry Chagin movl %eax,(%rdx) 204c2bc5b15SDmitry Chagin xorl %eax,%eax 205b2f58791SDmitry Chagin movq %rax,PCB_ONFAULT(%r8) 206b2f58791SDmitry Chagin ret 207cb0eecdfSKonstantin BelousovEND(futex_xorl_nosmap) 208cb0eecdfSKonstantin Belousov 209cb0eecdfSKonstantin BelousovENTRY(futex_xorl_smap) 210cb0eecdfSKonstantin Belousov movq PCPU(CURPCB),%r8 211cb0eecdfSKonstantin Belousov movq $futex_fault,PCB_ONFAULT(%r8) 212cb0eecdfSKonstantin Belousov movq $VM_MAXUSER_ADDRESS-4,%rax 213cb0eecdfSKonstantin Belousov cmpq %rax,%rsi 214cb0eecdfSKonstantin Belousov ja futex_fault 215fb580451SMark Johnston stac 216cb0eecdfSKonstantin Belousov movl (%rsi),%eax 217cb0eecdfSKonstantin Belousov1: movl %eax,%ecx 218cb0eecdfSKonstantin Belousov xorl %edi,%ecx 219cb0eecdfSKonstantin Belousov#ifdef SMP 220cb0eecdfSKonstantin Belousov lock 221cb0eecdfSKonstantin Belousov#endif 222cb0eecdfSKonstantin Belousov cmpxchgl %ecx,(%rsi) 223cb0eecdfSKonstantin Belousov jnz 1b 224fb580451SMark Johnston clac 225cb0eecdfSKonstantin Belousov movl %eax,(%rdx) 226cb0eecdfSKonstantin Belousov xorl %eax,%eax 227cb0eecdfSKonstantin Belousov movq %rax,PCB_ONFAULT(%r8) 228cb0eecdfSKonstantin Belousov ret 229cb0eecdfSKonstantin BelousovEND(futex_xorl_smap) 230