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: releng/11.0/sys/amd64/linux/linux_support.s 284159 2015-06-08 17:39:25Z dchagin $
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
53
54ENTRY(futex_addl)
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#ifdef SMP
61	lock
62#endif
63	xaddl	%edi,(%rsi)
64	movl	%edi,(%rdx)
65	xorl	%eax,%eax
66	movq	%rax,PCB_ONFAULT(%r8)
67	ret
68
69ENTRY(futex_orl)
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	movl	(%rsi),%eax
761:	movl	%eax,%ecx
77	orl	%edi,%ecx
78#ifdef SMP
79	lock
80#endif
81	cmpxchgl %ecx,(%rsi)
82	jnz	1b
83	movl	%eax,(%rdx)
84	xorl	%eax,%eax
85	movq	%rax,PCB_ONFAULT(%r8)
86	ret
87
88ENTRY(futex_andl)
89	movq	PCPU(CURPCB),%r8
90	movq	$futex_fault,PCB_ONFAULT(%r8)
91	movq	$VM_MAXUSER_ADDRESS-4,%rax
92	cmpq	%rax,%rsi
93	ja	futex_fault
94	movl	(%rsi),%eax
951:	movl	%eax,%ecx
96	andl	%edi,%ecx
97#ifdef SMP
98	lock
99#endif
100	cmpxchgl %ecx,(%rsi)
101	jnz	1b
102	movl	%eax,(%rdx)
103	xorl	%eax,%eax
104	movq	%rax,PCB_ONFAULT(%r8)
105	ret
106
107ENTRY(futex_xorl)
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
1141:	movl	%eax,%ecx
115	xorl	%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