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