]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / powerpc / powerpc64 / sysdep.h
index 31a077dbf5e7ce5b984a38c7bc0b60e275619a27..91fd096ad0e9465c5d6faa71e2ff1fcc34623323 100644 (file)
@@ -1,5 +1,4 @@
-/* Copyright (C) 1992,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2012
-       Free Software Foundation, Inc.
+/* Copyright (C) 1992-2016 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 /* Alan Modra <amodra@bigpond.net.au> rewrote the INLINE_SYSCALL macro */
 
 #ifndef _LINUX_POWERPC_SYSDEP_H
 #define _LINUX_POWERPC_SYSDEP_H 1
 
+#include <sysdeps/unix/sysv/linux/sysdep.h>
 #include <sysdeps/unix/powerpc/sysdep.h>
 #include <tls.h>
 
 
 /* This seems to always be the case on PPC.  */
 # define ALIGNARG(log2) log2
-/* For ELF we need the `.type' directive to make shared libs work right.  */
-# define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg;
 # define ASM_SIZE_DIRECTIVE(name) .size name,.-name
 
 #endif /* __ASSEMBLER__ */
 
-/* This version is for kernels that implement system calls that
-   behave like function calls as far as register saving.
-   It falls back to the syscall in the case that the vDSO doesn't
-   exist or fails for ENOSYS */
-#ifdef SHARED
-# define INLINE_VSYSCALL(name, nr, args...) \
-  ({                                                                         \
-    __label__ out;                                                           \
-    __label__ iserr;                                                         \
-    INTERNAL_SYSCALL_DECL (sc_err);                                          \
-    long int sc_ret;                                                         \
-                                                                             \
-    if (__vdso_##name != NULL)                                               \
-      {                                                                              \
-       sc_ret = INTERNAL_VSYSCALL_NCS (__vdso_##name, sc_err, nr, ##args);   \
-       if (!INTERNAL_SYSCALL_ERROR_P (sc_ret, sc_err))                       \
-         goto out;                                                           \
-       if (INTERNAL_SYSCALL_ERRNO (sc_ret, sc_err) != ENOSYS)                \
-         goto iserr;                                                         \
-      }                                                                              \
-                                                                             \
-    sc_ret = INTERNAL_SYSCALL (name, sc_err, nr, ##args);                    \
-    if (INTERNAL_SYSCALL_ERROR_P (sc_ret, sc_err))                           \
-      {                                                                              \
-      iserr:                                                                 \
-        __set_errno (INTERNAL_SYSCALL_ERRNO (sc_ret, sc_err));               \
-        sc_ret = -1L;                                                        \
-      }                                                                              \
-  out:                                                                       \
-    sc_ret;                                                                  \
-  })
-#else
-# define INLINE_VSYSCALL(name, nr, args...) \
-  INLINE_SYSCALL (name, nr, ##args)
-#endif
-
-#ifdef SHARED
-# define INTERNAL_VSYSCALL(name, err, nr, args...) \
-  ({                                                                         \
-    __label__ out;                                                           \
-    long int v_ret;                                                          \
-                                                                             \
-    if (__vdso_##name != NULL)                                               \
-      {                                                                              \
-       v_ret = INTERNAL_VSYSCALL_NCS (__vdso_##name, err, nr, ##args);       \
-       if (!INTERNAL_SYSCALL_ERROR_P (v_ret, err)                            \
-           || INTERNAL_SYSCALL_ERRNO (v_ret, err) != ENOSYS)                 \
-         goto out;                                                           \
-      }                                                                              \
-    v_ret = INTERNAL_SYSCALL (name, err, nr, ##args);                        \
-  out:                                                                       \
-    v_ret;                                                                   \
-  })
-#else
-# define INTERNAL_VSYSCALL(name, err, nr, args...) \
-  INTERNAL_SYSCALL (name, err, nr, ##args)
-#endif
-
 /* This version is for internal uses when there is no desire
    to set errno */
-#define INTERNAL_VSYSCALL_NO_SYSCALL_FALLBACK(name, err, nr, args...)        \
+#define INTERNAL_VSYSCALL_NO_SYSCALL_FALLBACK(name, err, type, nr, args...)   \
   ({                                                                         \
-    long int sc_ret = ENOSYS;                                                \
+    type sc_ret = ENOSYS;                                                    \
                                                                              \
-    if (__vdso_##name != NULL)                                               \
-      sc_ret = INTERNAL_VSYSCALL_NCS (__vdso_##name, err, nr, ##args);       \
+    __typeof (__vdso_##name) vdsop = __vdso_##name;                          \
+    PTR_DEMANGLE (vdsop);                                                    \
+    if (vdsop != NULL)                                                       \
+      sc_ret =                                                               \
+        INTERNAL_VSYSCALL_CALL_TYPE (vdsop, err, type, nr, ##args);          \
     else                                                                     \
       err = 1 << 28;                                                         \
     sc_ret;                                                                  \
 /* List of system calls which are supported as vsyscalls.  */
 #define HAVE_CLOCK_GETRES_VSYSCALL     1
 #define HAVE_CLOCK_GETTIME_VSYSCALL    1
+#define HAVE_GETCPU_VSYSCALL           1
 
 /* Define a macro which expands inline into the wrapper code for a system
    call. This use is for internal calls that do not need to handle errors
    gave back in the non-error (CR0.SO cleared) case, otherwise (CR0.SO set)
    the negation of the return value in the kernel gets reverted.  */
 
-#define INTERNAL_VSYSCALL_NCS(funcptr, err, nr, args...) \
+#define INTERNAL_VSYSCALL_CALL_TYPE(funcptr, err, type, nr, args...)    \
   ({                                                                   \
     register void *r0  __asm__ ("r0");                                 \
     register long int r3  __asm__ ("r3");                              \
     register long int r6  __asm__ ("r6");                              \
     register long int r7  __asm__ ("r7");                              \
     register long int r8  __asm__ ("r8");                              \
+    register type rval  __asm__ ("r3");                                        \
     LOADARGS_##nr (funcptr, args);                                     \
     __asm__ __volatile__                                               \
       ("mtctr %0\n\t"                                                  \
        "bctrl\n\t"                                                     \
        "mfcr  %0\n\t"                                                  \
        "0:"                                                            \
-       : "=&r" (r0),                                                   \
-         "=&r" (r3), "=&r" (r4), "=&r" (r5),                           \
-         "=&r" (r6), "=&r" (r7), "=&r" (r8)                            \
-       : ASM_INPUT_##nr                                                        \
-       : "r9", "r10", "r11", "r12",                                    \
-         "cr0", "ctr", "lr", "memory");                                        \
-         err = (long int) r0;                                          \
-    r3;                                                                \
+       : "+r" (r0), "+r" (r3), "+r" (r4), "+r" (r5),  "+r" (r6),        \
+         "+r" (r7), "+r" (r8)                                          \
+       : : "r9", "r10", "r11", "r12", "cr0", "ctr", "lr", "memory");   \
+    err = (long int) r0;                                               \
+    __asm__ __volatile__ ("" : "=r" (rval) : "r" (r3));                        \
+    rval;                                                              \
   })
 
+#define INTERNAL_VSYSCALL_CALL(funcptr, err, nr, args...)              \
+  INTERNAL_VSYSCALL_CALL_TYPE(funcptr, err, long int, nr, args)
+
 #undef INLINE_SYSCALL
 
 /* This version is for kernels that implement system calls that
     register long int r7  __asm__ ("r7");                              \
     register long int r8  __asm__ ("r8");                              \
     LOADARGS_##nr (name, ##args);                                      \
+    ABORT_TRANSACTION;                                                 \
     __asm__ __volatile__                                               \
       ("sc\n\t"                                                                \
        "mfcr  %0\n\t"                                                  \
   INTERNAL_SYSCALL_NCS (__NR_##name, err, nr, args)
 
 #undef INTERNAL_SYSCALL_DECL
-#define INTERNAL_SYSCALL_DECL(err) long int err
+#define INTERNAL_SYSCALL_DECL(err) long int err __attribute__ ((unused))
 
 #undef INTERNAL_SYSCALL_ERROR_P
 #define INTERNAL_SYSCALL_ERROR_P(val, err) \
 
 
 /* Pointer mangling support.  */
-#if defined NOT_IN_libc && defined IS_IN_rtld
+#if IS_IN (rtld)
 /* We cannot use the thread descriptor because in ld.so we use setjmp
    earlier than the descriptor is initialized.  */
 #else