1/*-
2 * Copyright (c) 2007 Konstantin Belousov
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 4. Neither the name of the University nor the names of its contributors
14 *    may be used to endorse or promote products derived from this software
15 *    without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * $FreeBSD: stable/11/sys/amd64/linux/linux_support.s 337650 2018-08-11 17:52:58Z kib $
30 */
31
32#include "linux_assym.h"		/* system definitions */
33#include <machine/asmacros.h>		/* miscellaneous asm macros */
34
35#include "assym.s"
36
37futex_fault:
38	movq	$0,PCB_ONFAULT(%r8)
39	movl	$-EFAULT,%eax
40	ret
41
42ENTRY(futex_xchgl)
43	movq	PCPU(CURPCB),%r8
44	movq	$futex_fault,PCB_ONFAULT(%r8)
45	movq	$VM_MAXUSER_ADDRESS-4,%rax
46	cmpq	%rax,%rsi
47	ja	futex_fault
48	xchgl	%edi,(%rsi)
49	movl	%edi,(%rdx)
50	xorl	%eax,%eax
51	movq	%rax,PCB_ONFAULT(%r8)
52	ret
53END(futex_xchgl)
54
55ENTRY(futex_addl)
56	movq	PCPU(CURPCB),%r8
57	movq	$futex_fault,PCB_ONFAULT(%r8)
58	movq	$VM_MAXUSER_ADDRESS-4,%rax
59	cmpq	%rax,%rsi
60	ja	futex_fault
61#ifdef SMP
62	lock
63#endif
64	xaddl	%edi,(%rsi)
65	movl	%edi,(%rdx)
66	xorl	%eax,%eax
67	movq	%rax,PCB_ONFAULT(%r8)
68	ret
69END(futex_addl)
70
71ENTRY(futex_orl)
72	movq	PCPU(CURPCB),%r8
73	movq	$futex_fault,PCB_ONFAULT(%r8)
74	movq	$VM_MAXUSER_ADDRESS-4,%rax
75	cmpq	%rax,%rsi
76	ja	futex_fault
77	movl	(%rsi),%eax
781:	movl	%eax,%ecx
79	orl	%edi,%ecx
80#ifdef SMP
81	lock
82#endif
83	cmpxchgl %ecx,(%rsi)
84	jnz	1b
85	movl	%eax,(%rdx)
86	xorl	%eax,%eax
87	movq	%rax,PCB_ONFAULT(%r8)
88	ret
89END(futex_orl)
90
91ENTRY(futex_andl)
92	movq	PCPU(CURPCB),%r8
93	movq	$futex_fault,PCB_ONFAULT(%r8)
94	movq	$VM_MAXUSER_ADDRESS-4,%rax
95	cmpq	%rax,%rsi
96	ja	futex_fault
97	movl	(%rsi),%eax
981:	movl	%eax,%ecx
99	andl	%edi,%ecx
100#ifdef SMP
101	lock
102#endif
103	cmpxchgl %ecx,(%rsi)
104	jnz	1b
105	movl	%eax,(%rdx)
106	xorl	%eax,%eax
107	movq	%rax,PCB_ONFAULT(%r8)
108	ret
109END(futex_andl)
110
111ENTRY(futex_xorl)
112	movq	PCPU(CURPCB),%r8
113	movq	$futex_fault,PCB_ONFAULT(%r8)
114	movq	$VM_MAXUSER_ADDRESS-4,%rax
115	cmpq	%rax,%rsi
116	ja	futex_fault
117	movl	(%rsi),%eax
1181:	movl	%eax,%ecx
119	xorl	%edi,%ecx
120#ifdef SMP
121	lock
122#endif
123	cmpxchgl %ecx,(%rsi)
124	jnz	1b
125	movl	%eax,(%rdx)
126	xorl	%eax,%eax
127	movq	%rax,PCB_ONFAULT(%r8)
128	ret
129END(futex_xorl)
130