1405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham/*
2405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * Copyright (C) 2008 The Android Open Source Project
3405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * All rights reserved.
4405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham *
5405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * Redistribution and use in source and binary forms, with or without
6405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * modification, are permitted provided that the following conditions
7405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * are met:
8405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham *  * Redistributions of source code must retain the above copyright
9405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham *    notice, this list of conditions and the following disclaimer.
10405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham *  * Redistributions in binary form must reproduce the above copyright
11405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham *    notice, this list of conditions and the following disclaimer in
12405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham *    the documentation and/or other materials provided with the
13405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham *    distribution.
14405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham *
15405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * SUCH DAMAGE.
27405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham */
28405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
29405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#include <asm/unistd.h>
30405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
31405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#define FUTEX_WAIT 0
32405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#define FUTEX_WAKE 1
33405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
34405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham/*
35405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * __futex_wait(*ftx, val, *timespec)
36405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * futex_syscall(*ftx, op, val, *timespec, *addr2, val3)
37405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham */
38405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.type	__futex_wait, @function
39405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.global	__futex_wait
40405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.align	4
41405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.ent	__futex_wait
42405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham__futex_wait:
43405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	subu	$sp,4*6
44405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	sw	$0,20($sp)	/* val3 */
45405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	sw	$0,16($sp)	/* addr2 */
46405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	move	$a3,$a2		/* timespec */
47405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	move	$a2,$a1		/* val */
48405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	li	$a1,FUTEX_WAIT	/* op */
49405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#	move	$a0,$a0		/* ftx */
50405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	li	$v0,__NR_futex
51405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	syscall
52405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.set noreorder
53405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	bnez	$a3, 1f		/* Check for error */
54405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham         neg	$v0		/* Negate error number if it's valid */
55405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	move	$v0,$0		/* Otherwise return 0 */
56405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham1:
57405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.set reorder
58405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	addu	$sp,4*6
59405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	j	$ra
60405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.end	__futex_wait
61405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
62405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham/*
63405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * int __futex_wake(volatile void *ftx, int count)
64405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * int futex_syscall(*ftx, op, val, *timespec, *addr2, val3)
65405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham */
66405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.type	__futex_wake, @function
67405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.globl	__futex_wake
68405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.align	4
69405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.ent	__futex_wake
70405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham__futex_wake:
71405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	subu	$sp,4*6
72405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	sw	$0,20($sp)	/* val3 */
73405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	sw	$0,16($sp)	/* addr2 */
74405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	move	$a3,$0		/* timespec */
75405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	move	$a2,$a1		/* val */
76405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	li	$a1,FUTEX_WAKE	/* op */
77405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#	move	$a0,$a0		/* ftx */
78405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	li	$v0,__NR_futex
79405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	syscall
80405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.set noreorder
81405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	bnez	$a3, 1f		/* Check for error */
82405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham         neg	$v0		/* Negate error number if it's valid */
83405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	move	$v0,$0		/* Otherwise return 0 */
84405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham1:
85405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.set reorder
86405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	addu	$sp,4*6
87405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	j	$ra
88405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.end	__futex_wake
89405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
90405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham/* __futex_syscall3(*ftx, op, val)
91405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * futex_syscall(*ftx, op, val, *timespec, *addr2, val3)
92405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham */
93405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.type	__futex_syscall3, @function
94405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.global	__futex_syscall3
95405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.align	4
96405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.ent	__futex_syscall3
97405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham__futex_syscall3:
98405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	subu	$sp,4*6
99405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	sw	$0,20($sp)	/* val3 */
100405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	sw	$0,16($sp)	/* addr2 */
101405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	move	$a3,$0		/* timespec */
102405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#	move	$a2,$a2		/* val */
103405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#	li	$a1,$a1		/* op */
104405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#	move	$a0,$a0		/* ftx */
105405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	li	$v0,__NR_futex
106405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	syscall
107405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.set noreorder
108405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	bnez	$a3, 1f		/* Check for error */
109405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham         neg	$v0		/* Negate error number if it's valid */
110405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	move	$v0,$0		/* Otherwise return 0 */
111405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham1:
112405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.set reorder
113405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	addu	$sp,4*6
114405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	j	$ra
115405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.end	__futex_syscall3
116405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham
117405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham/* __futex_syscall4(*ftx, op, val)
118405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham * futex_syscall(*ftx, op, val, *timespec, *addr2, val3)
119405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham */
120405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.type	__futex_syscall4, @function
121405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.global	__futex_syscall4
122405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.align	4
123405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.ent	__futex_syscall4
124405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham__futex_syscall4:
125405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	subu	$sp,4*6
126405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	sw	$0,20($sp)	/* val3 */
127405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	sw	$0,16($sp)	/* addr2 */
128405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#	move	$a3,$a3		/* timespec */
129405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#	move	$a2,$a2		/* val */
130405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#	li	$a1,$a1		/* op */
131405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham#	move	$a0,$a0		/* ftx */
132405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	li	$v0,__NR_futex
133405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	syscall
134405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.set noreorder
135405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	bnez	$a3, 1f		/* Check for error */
136405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham         neg	$v0		/* Negate error number if it's valid */
137405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	move	$v0,$0		/* Otherwise return 0 */
138405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham1:
139405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.set reorder
140405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	addu	$sp,4*6
141405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	j	$ra
142405b8029a6888f386adf3512113a33546141d1c8Raghu Gandham	.end	__futex_syscall4
143