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