]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix SYSCALL_CANCEL for empty argumetns
authorAdhemerval Zanella <adhemerval.zanella@linaro.com>
Sat, 17 Oct 2015 19:56:27 +0000 (16:56 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Thu, 17 Dec 2015 20:16:59 +0000 (18:16 -0200)
This patch fixes the SYSCALL_CANCEL macro for usage with zero argument
number (for instance SYSCALL_CANCEL (pause)) using a similar approach
used for SOCKETCALL_CANCEL.

GLIBC build still does not hit this issue still since SYSCALL_CANCEL
is not currently being used for zero arguments calls.

Tested on i386, x86_64, powerpc64le, aarch64.

* sysdeps/unix/sysdep.h (SYSCALL_CANCEL): Fix macro for zero argument
syscalls.
(__SYSCALL0): New macro.
(__SYSCALL1): Likewise.
(__SYSCALL2): Likewise.
(__SYSCALL3): Likewise.
(__SYSCALL4): Likewise.
(__SYSCALL5): Likewise.
(__SYSCALL6): Likewise.
(__SYSCALL7): Likewise.
(__SYSCALL_CONCAT_X): Likewise.
(__SYSCALL_CONCAT): Likewise.
(__SYSCALL_DIST): Likewise.
(__SYSCALL_CALL): Likewise.

ChangeLog
sysdeps/unix/sysdep.h

index 9a3244040da7bec9bb5e4d1d35366a5cbe2c5561..722aecbdf61ac726c0177b8db8a71b1b0a4255cb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2015-12-17  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
+
+       * sysdeps/unix/sysdep.h (SYSCALL_CANCEL): Fix macro for zero argument
+       syscalls.
+       (__SYSCALL0): New macro.
+       (__SYSCALL1): Likewise.
+       (__SYSCALL2): Likewise.
+       (__SYSCALL3): Likewise.
+       (__SYSCALL4): Likewise.
+       (__SYSCALL5): Likewise.
+       (__SYSCALL6): Likewise.
+       (__SYSCALL_CONCAT_X): Likewise.
+       (__SYSCALL_CONCAT): Likewise.
+       (__SYSCALL_DIST): Likewise.
+       (__SYSCALL_CALL): Likewise.
+
 2015-12-17  H.J. Lu  <hongjiu.lu@intel.com>
 
        [BZ #19363]
@@ -5,6 +21,7 @@
 
 2015-12-17  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
 
+       [BZ #19375]
        * sysdeps/powerpc/power7/fpu/s_logb.c (__logb): Fix return for
        negative subnormals.
 
index 52dad582ce406af4dd728b75a9ac90baa8fdfa9d..5c8208f44107b654c75a15337714c575dce68868 100644 (file)
 #define        SYSCALL__(name, args)   PSEUDO (__##name, name, args)
 #define        SYSCALL(name, args)     PSEUDO (name, name, args)
 
-/* Cancellation macros.  */
-#define __SYSCALL_NARGS_X(a,b,c,d,e,f,g,n,...) n
+#define __SYSCALL0(name) \
+  INLINE_SYSCALL (name, 0)
+#define __SYSCALL1(name, a1) \
+  INLINE_SYSCALL (name, 1, a1)
+#define __SYSCALL2(name, a1, a2) \
+  INLINE_SYSCALL (name, 2, a1, a2)
+#define __SYSCALL3(name, a1, a2, a3) \
+  INLINE_SYSCALL (name, 3, a1, a2, a3)
+#define __SYSCALL4(name, a1, a2, a3, a4) \
+  INLINE_SYSCALL (name, 4, a1, a2, a3, a4)
+#define __SYSCALL5(name, a1, a2, a3, a4, a5) \
+  INLINE_SYSCALL (name, 5, a1, a2, a3, a4, a5)
+#define __SYSCALL6(name, a1, a2, a3, a4, a5, a6) \
+  INLINE_SYSCALL (name, 6, a1, a2, a3, a4, a5, a6)
+#define __SYSCALL7(name, a1, a2, a3, a4, a5, a6, a7) \
+  INLINE_SYSCALL (name, 7, a1, a2, a3, a4, a5, a6, a7)
+
+#define __SYSCALL_NARGS_X(a,b,c,d,e,f,g,h,n,...) n
 #define __SYSCALL_NARGS(...) \
-  __SYSCALL_NARGS_X (__VA_ARGS__, 7, 6, 5, 4, 3, 2, 1, 0,)
+  __SYSCALL_NARGS_X (__VA_ARGS__,7,6,5,4,3,2,1,0,)
+#define __SYSCALL_CONCAT_X(a,b)     a##b
+#define __SYSCALL_CONCAT(a,b)       __SYSCALL_CONCAT_X (a, b)
+#define __SYSCALL_DISP(b,...) \
+  __SYSCALL_CONCAT (b,__SYSCALL_NARGS(__VA_ARGS__))(__VA_ARGS__)
+
+#define __SYSCALL_CALL(...) __SYSCALL_DISP (__SYSCALL, __VA_ARGS__)
 
-#define SYSCALL_CANCEL(name, ...) \
+#define SYSCALL_CANCEL(...) \
   ({                                                                        \
     long int sc_ret;                                                        \
     if (SINGLE_THREAD_P)                                                    \
-      sc_ret = INLINE_SYSCALL (name, __SYSCALL_NARGS(__VA_ARGS__),          \
-                              __VA_ARGS__);                                 \
+      sc_ret = __SYSCALL_CALL (__VA_ARGS__);                                        \
     else                                                                    \
       {                                                                             \
        int sc_cancel_oldtype = LIBC_CANCEL_ASYNC ();                        \
-       sc_ret = INLINE_SYSCALL (name, __SYSCALL_NARGS (__VA_ARGS__),        \
-                                __VA_ARGS__);                               \
+       sc_ret = __SYSCALL_CALL (__VA_ARGS__);                               \
         LIBC_CANCEL_RESET (sc_cancel_oldtype);                              \
       }                                                                             \
     sc_ret;                                                                 \