]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/amd64/linux32/linux32_support.s
amd64/linux*: add required header to get the constant value
[FreeBSD/FreeBSD.git] / sys / amd64 / linux32 / linux32_support.s
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 "linux32_assym.h"              /* system definitions */
32 #include <machine/asmacros.h>           /* miscellaneous asm macros */
33 #include <machine/specialreg.h>
34
35 #include "assym.inc"
36
37 futex_fault:
38         testl   $CPUID_STDEXT_SMAP,cpu_stdext_feature(%rip)
39         je      1f
40         clac
41 1:      movq    $0,PCB_ONFAULT(%r8)
42         movl    $-EFAULT,%eax
43         ret
44
45 ENTRY(futex_xchgl_nosmap)
46         movq    PCPU(CURPCB),%r8
47         movq    $futex_fault,PCB_ONFAULT(%r8)
48         movq    $VM_MAXUSER_ADDRESS-4,%rax
49         cmpq    %rax,%rsi
50         ja      futex_fault
51         xchgl   %edi,(%rsi)
52         movl    %edi,(%rdx)
53         xorl    %eax,%eax
54         movq    %rax,PCB_ONFAULT(%r8)
55         ret
56 END(futex_xchgl_nosmap)
57
58 ENTRY(futex_xchgl_smap)
59         movq    PCPU(CURPCB),%r8
60         movq    $futex_fault,PCB_ONFAULT(%r8)
61         movq    $VM_MAXUSER_ADDRESS-4,%rax
62         cmpq    %rax,%rsi
63         ja      futex_fault
64         stac
65         xchgl   %edi,(%rsi)
66         clac
67         movl    %edi,(%rdx)
68         xorl    %eax,%eax
69         movq    %rax,PCB_ONFAULT(%r8)
70         ret
71 END(futex_xchgl_smap)
72
73 ENTRY(futex_addl_nosmap)
74         movq    PCPU(CURPCB),%r8
75         movq    $futex_fault,PCB_ONFAULT(%r8)
76         movq    $VM_MAXUSER_ADDRESS-4,%rax
77         cmpq    %rax,%rsi
78         ja      futex_fault
79 #ifdef SMP
80         lock
81 #endif
82         xaddl   %edi,(%rsi)
83         movl    %edi,(%rdx)
84         xorl    %eax,%eax
85         movq    %rax,PCB_ONFAULT(%r8)
86         ret
87 END(futex_addl_nosmap)
88
89 ENTRY(futex_addl_smap)
90         movq    PCPU(CURPCB),%r8
91         movq    $futex_fault,PCB_ONFAULT(%r8)
92         movq    $VM_MAXUSER_ADDRESS-4,%rax
93         cmpq    %rax,%rsi
94         ja      futex_fault
95         stac
96 #ifdef SMP
97         lock
98 #endif
99         xaddl   %edi,(%rsi)
100         clac
101         movl    %edi,(%rdx)
102         xorl    %eax,%eax
103         movq    %rax,PCB_ONFAULT(%r8)
104         ret
105 END(futex_addl_smap)
106
107 ENTRY(futex_orl_nosmap)
108         movq    PCPU(CURPCB),%r8
109         movq    $futex_fault,PCB_ONFAULT(%r8)
110         movq    $VM_MAXUSER_ADDRESS-4,%rax
111         cmpq    %rax,%rsi
112         ja      futex_fault
113         movl    (%rsi),%eax
114 1:      movl    %eax,%ecx
115         orl     %edi,%ecx
116 #ifdef SMP
117         lock
118 #endif
119         cmpxchgl %ecx,(%rsi)
120         jnz     1b
121         movl    %eax,(%rdx)
122         xorl    %eax,%eax
123         movq    %rax,PCB_ONFAULT(%r8)
124         ret
125 END(futex_orl_nosmap)
126
127 ENTRY(futex_orl_smap)
128         movq    PCPU(CURPCB),%r8
129         movq    $futex_fault,PCB_ONFAULT(%r8)
130         movq    $VM_MAXUSER_ADDRESS-4,%rax
131         cmpq    %rax,%rsi
132         ja      futex_fault
133         stac
134         movl    (%rsi),%eax
135 1:      movl    %eax,%ecx
136         orl     %edi,%ecx
137 #ifdef SMP
138         lock
139 #endif
140         cmpxchgl %ecx,(%rsi)
141         jnz     1b
142         clac
143         movl    %eax,(%rdx)
144         xorl    %eax,%eax
145         movq    %rax,PCB_ONFAULT(%r8)
146         ret
147 END(futex_orl_smap)
148
149 ENTRY(futex_andl_nosmap)
150         movq    PCPU(CURPCB),%r8
151         movq    $futex_fault,PCB_ONFAULT(%r8)
152         movq    $VM_MAXUSER_ADDRESS-4,%rax
153         cmpq    %rax,%rsi
154         ja      futex_fault
155         movl    (%rsi),%eax
156 1:      movl    %eax,%ecx
157         andl    %edi,%ecx
158 #ifdef SMP
159         lock
160 #endif
161         cmpxchgl %ecx,(%rsi)
162         jnz     1b
163         movl    %eax,(%rdx)
164         xorl    %eax,%eax
165         movq    %rax,PCB_ONFAULT(%r8)
166         ret
167 END(futex_andl_nosmap)
168
169 ENTRY(futex_andl_smap)
170         movq    PCPU(CURPCB),%r8
171         movq    $futex_fault,PCB_ONFAULT(%r8)
172         movq    $VM_MAXUSER_ADDRESS-4,%rax
173         cmpq    %rax,%rsi
174         ja      futex_fault
175         stac
176         movl    (%rsi),%eax
177 1:      movl    %eax,%ecx
178         andl    %edi,%ecx
179 #ifdef SMP
180         lock
181 #endif
182         cmpxchgl %ecx,(%rsi)
183         jnz     1b
184         clac
185         movl    %eax,(%rdx)
186         xorl    %eax,%eax
187         movq    %rax,PCB_ONFAULT(%r8)
188         ret
189 END(futex_andl_smap)
190
191 ENTRY(futex_xorl_nosmap)
192         movq    PCPU(CURPCB),%r8
193         movq    $futex_fault,PCB_ONFAULT(%r8)
194         movq    $VM_MAXUSER_ADDRESS-4,%rax
195         cmpq    %rax,%rsi
196         ja      futex_fault
197         movl    (%rsi),%eax
198 1:      movl    %eax,%ecx
199         xorl    %edi,%ecx
200 #ifdef SMP
201         lock
202 #endif
203         cmpxchgl %ecx,(%rsi)
204         jnz     1b
205         movl    %eax,(%rdx)
206         xorl    %eax,%eax
207         movq    %rax,PCB_ONFAULT(%r8)
208         ret
209 END(futex_xorl_nosmap)
210
211 ENTRY(futex_xorl_smap)
212         movq    PCPU(CURPCB),%r8
213         movq    $futex_fault,PCB_ONFAULT(%r8)
214         movq    $VM_MAXUSER_ADDRESS-4,%rax
215         cmpq    %rax,%rsi
216         ja      futex_fault
217         stac
218         movl    (%rsi),%eax
219 1:      movl    %eax,%ecx
220         xorl    %edi,%ecx
221 #ifdef SMP
222         lock
223 #endif
224         cmpxchgl %ecx,(%rsi)
225         jnz     1b
226         clac
227         movl    %eax,(%rdx)
228         xorl    %eax,%eax
229         movq    %rax,PCB_ONFAULT(%r8)
230         ret
231 END(futex_xorl_smap)