1182219Sjkim/* Copyright (C) 2005 Free Software Foundation, Inc. 2182393Sjkim Contributed by Richard Henderson <rth@redhat.com>. 3182219Sjkim 4182219Sjkim This file is part of the GNU OpenMP Library (libgomp). 5182219Sjkim 6182219Sjkim Libgomp is free software; you can redistribute it and/or modify it 7182219Sjkim under the terms of the GNU Lesser General Public License as published by 8182219Sjkim the Free Software Foundation; either version 2.1 of the License, or 9182393Sjkim (at your option) any later version. 10199604Sjkim 11182219Sjkim Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY 12182219Sjkim WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 13182219Sjkim FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for 14182219Sjkim more details. 15182219Sjkim 16182219Sjkim You should have received a copy of the GNU Lesser General Public License 17182219Sjkim along with libgomp; see the file COPYING.LIB. If not, write to the 18182219Sjkim Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 19182219Sjkim MA 02110-1301, USA. */ 20182219Sjkim 21182219Sjkim/* As a special exception, if you link this library with other files, some 22182219Sjkim of which are compiled with GCC, to produce an executable, this library 23182219Sjkim does not by itself cause the resulting executable to be covered by the 24182219Sjkim GNU General Public License. This exception does not however invalidate 25182219Sjkim any other reasons why the executable file might be covered by the GNU 26182219Sjkim General Public License. */ 27182219Sjkim 28182219Sjkim/* Provide target-specific access to the futex system call. */ 29182219Sjkim 30182219Sjkim#include <sys/syscall.h> 31182393Sjkim#define FUTEX_WAIT 0 32199604Sjkim#define FUTEX_WAKE 1 33199604Sjkim 34199604Sjkimstatic inline void 35182219Sjkimsys_futex0 (int *addr, int op, int val) 36182219Sjkim{ 37 register long int r0 __asm__ ("r0"); 38 register long int r3 __asm__ ("r3"); 39 register long int r4 __asm__ ("r4"); 40 register long int r5 __asm__ ("r5"); 41 register long int r6 __asm__ ("r6"); 42 43 r0 = SYS_futex; 44 r3 = (long) addr; 45 r4 = op; 46 r5 = val; 47 r6 = 0; 48 49 /* ??? The powerpc64 sysdep.h file clobbers ctr; the powerpc32 sysdep.h 50 doesn't. It doesn't much matter for us. In the interest of unity, 51 go ahead and clobber it always. */ 52 53 __asm volatile ("sc" 54 : "=r"(r0), "=r"(r3), "=r"(r4), "=r"(r5), "=r"(r6) 55 : "r"(r0), "r"(r3), "r"(r4), "r"(r5), "r"(r6) 56 : "r7", "r8", "r9", "r10", "r11", "r12", 57 "cr0", "ctr", "memory"); 58} 59 60static inline void 61futex_wait (int *addr, int val) 62{ 63 sys_futex0 (addr, FUTEX_WAIT, val); 64} 65 66static inline void 67futex_wake (int *addr, int count) 68{ 69 sys_futex0 (addr, FUTEX_WAKE, count); 70} 71