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$
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	xchgq	%rdi,(%rsi)
49	movq	%rdi,(%rdx)
50	xorq	%rax,%rax
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	xaddq	%rdi,(%rsi)
64	movq	%rdi,(%rdx)
65	xorq	%rax,%rax
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	movq	(%rsi),%rax
761:	movq	%rax,%rcx
77	orq	%rdi,%rcx
78#ifdef SMP
79	lock
80#endif
81	cmpxchgq %rcx,(%rsi)
82	jnz	1b
83	movq	%rax,(%rdx)
84	xorq	%rax,%rax
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	movq	(%rsi),%rax
951:	movq	%rax,%rcx
96	andq	%rdi,%rcx
97#ifdef SMP
98	lock
99#endif
100	cmpxchgq %rcx,(%rsi)
101	jnz	1b
102	movq	%rax,(%rdx)
103	xorq	%rax,%rax
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	movq	(%rsi),%rax
1141:	movq	%rax,%rcx
115	xorq	%rdi,%rcx
116#ifdef SMP
117	lock
118#endif
119	cmpxchgq %rcx,(%rsi)
120	jnz	1b
121	movq	%rax,(%rdx)
122	xorq	%rax,%rax
123	movq	%rax,PCB_ONFAULT(%r8)
124	ret
125