xref: /src/sys/amd64/linux/linux_support.S (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
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