config/linux/powerpc/futex.h

Go to the documentation of this file.
00001 /* Copyright (C) 2005, 2008, 2009 Free Software Foundation, Inc.
00002    Contributed by Richard Henderson <rth@redhat.com>.
00003 
00004    This file is part of the GNU OpenMP Library (libgomp).
00005 
00006    Libgomp is free software; you can redistribute it and/or modify it
00007    under the terms of the GNU General Public License as published by
00008    the Free Software Foundation; either version 3, or (at your option)
00009    any later version.
00010 
00011    Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
00012    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00013    FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
00014    more details.
00015 
00016    Under Section 7 of GPL version 3, you are granted additional
00017    permissions described in the GCC Runtime Library Exception, version
00018    3.1, as published by the Free Software Foundation.
00019 
00020    You should have received a copy of the GNU General Public License and
00021    a copy of the GCC Runtime Library Exception along with this program;
00022    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
00023    <http://www.gnu.org/licenses/>.  */
00024 
00025 /* Provide target-specific access to the futex system call.  */
00026 
00027 #include <sys/syscall.h>
00028 
00029 static inline long
00030 sys_futex0 (int *addr, int op, int val)
00031 {
00032   register long int r0  __asm__ ("r0");
00033   register long int r3  __asm__ ("r3");
00034   register long int r4  __asm__ ("r4");
00035   register long int r5  __asm__ ("r5");
00036   register long int r6  __asm__ ("r6");
00037 
00038   r0 = SYS_futex;
00039   r3 = (long) addr;
00040   r4 = op;
00041   r5 = val;
00042   r6 = 0;
00043 
00044   /* ??? The powerpc64 sysdep.h file clobbers ctr; the powerpc32 sysdep.h
00045      doesn't.  It doesn't much matter for us.  In the interest of unity,
00046      go ahead and clobber it always.  */
00047 
00048   __asm volatile ("sc; mfcr %0"
00049           : "=r"(r0), "=r"(r3), "=r"(r4), "=r"(r5), "=r"(r6)
00050           : "r"(r0), "r"(r3), "r"(r4), "r"(r5), "r"(r6)
00051           : "r7", "r8", "r9", "r10", "r11", "r12",
00052             "cr0", "ctr", "memory");
00053   if (__builtin_expect (r0 & (1 << 28), 0))
00054     return r3;
00055   return 0;
00056 }
00057 
00058 static inline void
00059 futex_wait (int *addr, int val)
00060 {
00061   long err = sys_futex0 (addr, gomp_futex_wait, val);
00062   if (__builtin_expect (err == ENOSYS, 0))
00063     {
00064       gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
00065       gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
00066       sys_futex0 (addr, gomp_futex_wait, val);
00067     }
00068 }
00069 
00070 static inline void
00071 futex_wake (int *addr, int count)
00072 {
00073   long err = sys_futex0 (addr, gomp_futex_wake, count);
00074   if (__builtin_expect (err == ENOSYS, 0))
00075     {
00076       gomp_futex_wait &= ~FUTEX_PRIVATE_FLAG;
00077       gomp_futex_wake &= ~FUTEX_PRIVATE_FLAG;
00078       sys_futex0 (addr, gomp_futex_wake, count);
00079     }
00080 }
00081 
00082 static inline void
00083 cpu_relax (void)
00084 {
00085   __asm volatile ("" : : : "memory");
00086 }
00087 
00088 static inline void
00089 atomic_write_barrier (void)
00090 {
00091   __asm volatile ("eieio" : : : "memory");
00092 }

Generated on Fri Apr 5 05:38:09 2013 for Libgomp by  doxygen 1.4.7