00db10
From 51a8476450158fb522c791c73b7b56dc30a741fc Mon Sep 17 00:00:00 2001
00db10
From: Anton Blanchard <anton@samba.org>
00db10
Date: Tue, 15 Jan 2013 12:50:46 -0600
00db10
Subject: [PATCH 14/42] PowerPC: Rename __kernel_vdso_get_tbfreq to
00db10
 __kernel_get_tbfreq.
00db10
00db10
In order for the __kernel_get_tbfreq vDSO call to work the
00db10
INTERNAL_VSYSCALL_NCS macro needed to be updated to prevent it from
00db10
assuming an integer return type (since the timebase frequency is a 64-bit
00db10
value) by specifying the type of the return type as a macro parameter.  The
00db10
macro then specifically declares the return value as a 'register' (or
00db10
implied pair) of the denoted type.  The compiler is then informed that this
00db10
register (or implied pair) is to be used for the return value.
00db10
(cherry picked from commit 471a1672d4d55124de4db8273829f96cc14d424a)
00db10
---
00db10
 sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c    |  3 ++-
00db10
 sysdeps/unix/sysv/linux/powerpc/init-first.c       |  2 +-
00db10
 sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h | 28 +++++++++++----------
00db10
 sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h | 29 +++++++++++-----------
00db10
 5 files changed, 55 insertions(+), 29 deletions(-)
00db10
00db10
diff --git glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c
00db10
index a863a27..021594c 100644
00db10
--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c
00db10
+++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/get_clockfreq.c
00db10
@@ -41,7 +41,8 @@ __get_clockfreq (void)
00db10
   /* If we can use the vDSO to obtain the timebase even better.  */
00db10
 #ifdef SHARED
00db10
   INTERNAL_SYSCALL_DECL (err);
00db10
-  timebase_freq = INTERNAL_VSYSCALL_NO_SYSCALL_FALLBACK (get_tbfreq, err, 0);
00db10
+  timebase_freq =
00db10
+    INTERNAL_VSYSCALL_NO_SYSCALL_FALLBACK (get_tbfreq, err, hp_timing_t, 0);
00db10
   if (INTERNAL_SYSCALL_ERROR_P (timebase_freq, err)
00db10
       && INTERNAL_SYSCALL_ERRNO (timebase_freq, err) == ENOSYS)
00db10
 #endif
00db10
diff --git glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/init-first.c glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/init-first.c
00db10
index 6bcb7d5..5587e2a 100644
00db10
--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/init-first.c
00db10
+++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/init-first.c
00db10
@@ -41,7 +41,7 @@ _libc_vdso_platform_setup (void)
00db10
 
00db10
   __vdso_clock_getres = _dl_vdso_vsym ("__kernel_clock_getres", &linux2615);
00db10
 
00db10
-  __vdso_get_tbfreq = _dl_vdso_vsym ("__kernel_vdso_get_tbfreq", &linux2615);
00db10
+  __vdso_get_tbfreq = _dl_vdso_vsym ("__kernel_get_tbfreq", &linux2615);
00db10
 
00db10
   __vdso_getcpu = _dl_vdso_vsym ("__kernel_getcpu", &linux2615);
00db10
 }
00db10
diff --git glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h
00db10
index da25c01..fa4116e 100644
00db10
--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h
00db10
+++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h
00db10
@@ -60,7 +60,8 @@
00db10
 									      \
00db10
     if (__vdso_##name != NULL)						      \
00db10
       {									      \
00db10
-	sc_ret = INTERNAL_VSYSCALL_NCS (__vdso_##name, sc_err, nr, ##args);   \
00db10
+	sc_ret =							      \
00db10
+	  INTERNAL_VSYSCALL_NCS (__vdso_##name, sc_err, long int, nr, ##args);\
00db10
 	if (!INTERNAL_SYSCALL_ERROR_P (sc_ret, sc_err))			      \
00db10
 	  goto out;							      \
00db10
 	if (INTERNAL_SYSCALL_ERRNO (sc_ret, sc_err) != ENOSYS)		      \
00db10
@@ -90,7 +91,8 @@
00db10
 									      \
00db10
     if (__vdso_##name != NULL)						      \
00db10
       {									      \
00db10
-	v_ret = INTERNAL_VSYSCALL_NCS (__vdso_##name, err, nr, ##args);	      \
00db10
+	v_ret =								      \
00db10
+	  INTERNAL_VSYSCALL_NCS (__vdso_##name, err, long int, nr, ##args);   \
00db10
 	if (!INTERNAL_SYSCALL_ERROR_P (v_ret, err)			      \
00db10
 	    || INTERNAL_SYSCALL_ERRNO (v_ret, err) != ENOSYS)		      \
00db10
 	  goto out;							      \
00db10
@@ -104,12 +106,12 @@
00db10
   INTERNAL_SYSCALL (name, err, nr, ##args)
00db10
 # endif
00db10
 
00db10
-# define INTERNAL_VSYSCALL_NO_SYSCALL_FALLBACK(name, err, nr, args...)	      \
00db10
+# define INTERNAL_VSYSCALL_NO_SYSCALL_FALLBACK(name, err, type, nr, args...)  \
00db10
   ({									      \
00db10
-    long int sc_ret = ENOSYS;						      \
00db10
+    type sc_ret = ENOSYS;						      \
00db10
 									      \
00db10
     if (__vdso_##name != NULL)						      \
00db10
-      sc_ret = INTERNAL_VSYSCALL_NCS (__vdso_##name, err, nr, ##args);	      \
00db10
+      sc_ret = INTERNAL_VSYSCALL_NCS (__vdso_##name, err, type, nr, ##args);  \
00db10
     else								      \
00db10
       err = 1 << 28;							      \
00db10
     sc_ret;								      \
00db10
@@ -126,7 +128,7 @@
00db10
    function call, with the exception of LR (which is needed for the
00db10
    "sc; bnslr+" sequence) and CR (where only CR0.SO is clobbered to signal
00db10
    an error return status).  */
00db10
-# define INTERNAL_VSYSCALL_NCS(funcptr, err, nr, args...) \
00db10
+# define INTERNAL_VSYSCALL_NCS(funcptr, err, type, nr, args...) \
00db10
   ({									      \
00db10
     register void *r0  __asm__ ("r0");					      \
00db10
     register long int r3  __asm__ ("r3");				      \
00db10
@@ -139,18 +141,18 @@
00db10
     register long int r10 __asm__ ("r10");				      \
00db10
     register long int r11 __asm__ ("r11");				      \
00db10
     register long int r12 __asm__ ("r12");				      \
00db10
+    register type rval  __asm__ ("r3");					      \
00db10
     LOADARGS_##nr (funcptr, args);					      \
00db10
     __asm__ __volatile__						      \
00db10
       ("mtctr %0\n\t"							      \
00db10
        "bctrl\n\t"							      \
00db10
        "mfcr %0"							      \
00db10
-       : "=&r" (r0),							      \
00db10
-	 "=&r" (r3), "=&r" (r4), "=&r" (r5),  "=&r" (r6),  "=&r" (r7),	      \
00db10
-	 "=&r" (r8), "=&r" (r9), "=&r" (r10), "=&r" (r11), "=&r" (r12)	      \
00db10
-       : ASM_INPUT_##nr							      \
00db10
-       : "cr0", "ctr", "lr", "memory");					      \
00db10
+       : "+r" (r0), "+r" (r3), "+r" (r4), "+r" (r5),  "+r" (r6),  "+r" (r7),  \
00db10
+	 "+r" (r8), "+r" (r9), "+r" (r10), "+r" (r11), "+r" (r12)	      \
00db10
+       : : "cr0", "ctr", "lr", "memory");				      \
00db10
     err = (long int) r0;						      \
00db10
-    (int) r3;								      \
00db10
+    __asm__ __volatile__ ("" : "=r" (rval) : "r" (r3), "r" (r4));	      \
00db10
+    rval;								      \
00db10
   })
00db10
 
00db10
 # undef INLINE_SYSCALL
00db10
@@ -191,7 +193,7 @@
00db10
     register long int r10 __asm__ ("r10");				\
00db10
     register long int r11 __asm__ ("r11");				\
00db10
     register long int r12 __asm__ ("r12");				\
00db10
-    LOADARGS_##nr(name, args);					\
00db10
+    LOADARGS_##nr(name, args);						\
00db10
     __asm__ __volatile__						\
00db10
       ("sc   \n\t"							\
00db10
        "mfcr %0"							\
00db10
diff --git glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h
00db10
index 059cf70..b4cdbbb 100644
00db10
--- glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h
00db10
+++ glibc-2.17-c758a686/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h
00db10
@@ -75,7 +75,8 @@
00db10
 									      \
00db10
     if (__vdso_##name != NULL)						      \
00db10
       {									      \
00db10
-	sc_ret = INTERNAL_VSYSCALL_NCS (__vdso_##name, sc_err, nr, ##args);   \
00db10
+	sc_ret =							      \
00db10
+	  INTERNAL_VSYSCALL_NCS (__vdso_##name, sc_err, long int, nr, ##args);\
00db10
 	if (!INTERNAL_SYSCALL_ERROR_P (sc_ret, sc_err))			      \
00db10
 	  goto out;							      \
00db10
 	if (INTERNAL_SYSCALL_ERRNO (sc_ret, sc_err) != ENOSYS)		      \
00db10
@@ -105,7 +106,8 @@
00db10
 									      \
00db10
     if (__vdso_##name != NULL)						      \
00db10
       {									      \
00db10
-	v_ret = INTERNAL_VSYSCALL_NCS (__vdso_##name, err, nr, ##args);	      \
00db10
+	v_ret =								      \
00db10
+	  INTERNAL_VSYSCALL_NCS (__vdso_##name, err, long int, nr, ##args);   \
00db10
 	if (!INTERNAL_SYSCALL_ERROR_P (v_ret, err)			      \
00db10
 	    || INTERNAL_SYSCALL_ERRNO (v_ret, err) != ENOSYS)		      \
00db10
 	  goto out;							      \
00db10
@@ -121,12 +123,12 @@
00db10
 
00db10
 /* This version is for internal uses when there is no desire
00db10
    to set errno */
00db10
-#define INTERNAL_VSYSCALL_NO_SYSCALL_FALLBACK(name, err, nr, args...)	      \
00db10
+#define INTERNAL_VSYSCALL_NO_SYSCALL_FALLBACK(name, err, type, nr, args...)   \
00db10
   ({									      \
00db10
-    long int sc_ret = ENOSYS;						      \
00db10
+    type sc_ret = ENOSYS;						      \
00db10
 									      \
00db10
     if (__vdso_##name != NULL)						      \
00db10
-      sc_ret = INTERNAL_VSYSCALL_NCS (__vdso_##name, err, nr, ##args);	      \
00db10
+      sc_ret = INTERNAL_VSYSCALL_NCS (__vdso_##name, err, type, nr, ##args);  \
00db10
     else								      \
00db10
       err = 1 << 28;							      \
00db10
     sc_ret;								      \
00db10
@@ -142,7 +144,7 @@
00db10
    gave back in the non-error (CR0.SO cleared) case, otherwise (CR0.SO set)
00db10
    the negation of the return value in the kernel gets reverted.  */
00db10
 
00db10
-#define INTERNAL_VSYSCALL_NCS(funcptr, err, nr, args...) \
00db10
+#define INTERNAL_VSYSCALL_NCS(funcptr, err, type, nr, args...) \
00db10
   ({									\
00db10
     register void *r0  __asm__ ("r0");					\
00db10
     register long int r3  __asm__ ("r3");				\
00db10
@@ -151,20 +153,19 @@
00db10
     register long int r6  __asm__ ("r6");				\
00db10
     register long int r7  __asm__ ("r7");				\
00db10
     register long int r8  __asm__ ("r8");				\
00db10
+    register type rval  __asm__ ("r3");				        \
00db10
     LOADARGS_##nr (funcptr, args);					\
00db10
     __asm__ __volatile__						\
00db10
       ("mtctr %0\n\t"							\
00db10
        "bctrl\n\t"							\
00db10
        "mfcr  %0\n\t"							\
00db10
        "0:"								\
00db10
-       : "=&r" (r0),							\
00db10
-         "=&r" (r3), "=&r" (r4), "=&r" (r5),				\
00db10
-         "=&r" (r6), "=&r" (r7), "=&r" (r8)				\
00db10
-       : ASM_INPUT_##nr							\
00db10
-       : "r9", "r10", "r11", "r12",					\
00db10
-         "cr0", "ctr", "lr", "memory");					\
00db10
-	  err = (long int) r0;						\
00db10
-    r3;								\
00db10
+       : "+r" (r0), "+r" (r3), "+r" (r4), "+r" (r5),  "+r" (r6),        \
00db10
+         "+r" (r7), "+r" (r8)						\
00db10
+       : : "r9", "r10", "r11", "r12", "cr0", "ctr", "lr", "memory");	\
00db10
+    err = (long int) r0;						\
00db10
+    __asm__ __volatile__ ("" : "=r" (rval) : "r" (r3));		        \
00db10
+    rval;								\
00db10
   })
00db10
 
00db10
 #undef INLINE_SYSCALL
00db10
-- 
00db10
1.7.11.7
00db10