Add uc_sigmask64.

Added to each ucontext_t for source compatibility between platforms where
sigset_t and sigset64_t differ (arm, x86) and where they're the same
(all the rest).

Bug: http://b/72493232
Test: ran tests
Change-Id: I65a37bfa177933701bbe6c2350448885fd0f9c43
diff --git a/libc/include/bits/signal_types.h b/libc/include/bits/signal_types.h
new file mode 100644
index 0000000..881ac58
--- /dev/null
+++ b/libc/include/bits/signal_types.h
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _BITS_SIGNAL_TYPES_H_
+#define _BITS_SIGNAL_TYPES_H_
+
+#include <limits.h>
+#include <sys/cdefs.h>
+#include <sys/types.h>
+
+/* For 64-bit (and mips), the kernel's struct sigaction doesn't match the
+ * POSIX one, so we need to expose our own and translate behind the scenes.
+ * For 32-bit, we're stuck with the definitions we already shipped,
+ * even though they contain a sigset_t that's too small. See sigaction64.
+ */
+#define sigaction __kernel_sigaction
+#include <linux/signal.h>
+#undef sigaction
+
+/* The arm and x86 kernel header files don't define _NSIG. */
+#ifndef _KERNEL__NSIG
+#define _KERNEL__NSIG 64
+#endif
+
+/* Userspace's NSIG is the kernel's _NSIG + 1. */
+#define _NSIG (_KERNEL__NSIG + 1)
+#define NSIG _NSIG
+
+typedef int sig_atomic_t;
+
+typedef __sighandler_t sig_t; /* BSD compatibility. */
+typedef __sighandler_t sighandler_t; /* glibc compatibility. */
+
+/* sigset_t is already large enough on LP64 and mips, but other LP32's sigset_t
+ * is just `unsigned long`.
+ */
+#if defined(__LP64__) || defined(__mips__)
+typedef sigset_t sigset64_t;
+#else
+typedef struct { unsigned long __bits[_KERNEL__NSIG/LONG_BIT]; } sigset64_t;
+#endif
+
+#if defined(__LP64__)
+
+#define __SIGACTION_BODY \
+  int sa_flags; \
+  union { \
+    sighandler_t sa_handler; \
+    void (*sa_sigaction)(int, struct siginfo*, void*); \
+  }; \
+  sigset_t sa_mask; \
+  void (*sa_restorer)(void); \
+
+struct sigaction { __SIGACTION_BODY };
+struct sigaction64 { __SIGACTION_BODY };
+
+#undef __SIGACTION_BODY
+
+#elif defined(__mips__)
+
+#define __SIGACTION_BODY \
+  int sa_flags; \
+  union { \
+    sighandler_t sa_handler; \
+    void (*sa_sigaction)(int, struct siginfo*, void*); \
+  }; \
+  sigset_t sa_mask; \
+
+struct sigaction { __SIGACTION_BODY };
+struct sigaction64 { __SIGACTION_BODY };
+
+#undef __SIGACTION_BODY
+
+#else
+
+#undef sa_handler
+#undef sa_sigaction
+
+struct sigaction {
+  union {
+    sighandler_t sa_handler;
+    void (*sa_sigaction)(int, struct siginfo*, void*);
+  };
+  sigset_t sa_mask;
+  int sa_flags;
+  void (*sa_restorer)(void);
+};
+
+/* This matches the kernel's internal structure. */
+struct sigaction64 {
+  union {
+    sighandler_t sa_handler;
+    void (*sa_sigaction)(int, struct siginfo*, void*);
+  };
+  int sa_flags;
+  void (*sa_restorer)(void);
+  sigset64_t sa_mask;
+};
+
+#endif
+
+#endif
diff --git a/libc/include/signal.h b/libc/include/signal.h
index 0aa798c..00860d5 100644
--- a/libc/include/signal.h
+++ b/libc/include/signal.h
@@ -34,34 +34,15 @@
 
 #include <asm/sigcontext.h>
 #include <bits/pthread_types.h>
+#include <bits/signal_types.h>
 #include <bits/timespec.h>
 #include <limits.h>
 
-/* For 64-bit (and mips), the kernel's struct sigaction doesn't match the
- * POSIX one, so we need to expose our own and translate behind the scenes.
- * For 32-bit, we're stuck with the definitions we already shipped,
- * even though they contain a sigset_t that's too small. See sigaction64.
- */
-#define sigaction __kernel_sigaction
-#include <linux/signal.h>
-#undef sigaction
-
 #include <sys/ucontext.h>
 #define __BIONIC_HAVE_UCONTEXT_T
 
 __BEGIN_DECLS
 
-typedef int sig_atomic_t;
-
-/* The arm and x86 kernel header files don't define _NSIG. */
-#ifndef _KERNEL__NSIG
-#define _KERNEL__NSIG 64
-#endif
-
-/* Userspace's NSIG is the kernel's _NSIG + 1. */
-#define _NSIG (_KERNEL__NSIG + 1)
-#define NSIG _NSIG
-
 /* The kernel headers define SIG_DFL (0) and SIG_IGN (1) but not SIG_HOLD, since
  * SIG_HOLD is only used by the deprecated SysV signal API.
  */
@@ -76,79 +57,8 @@
 extern const char* const sys_siglist[_NSIG];
 extern const char* const sys_signame[_NSIG]; /* BSD compatibility. */
 
-typedef __sighandler_t sig_t; /* BSD compatibility. */
-typedef __sighandler_t sighandler_t; /* glibc compatibility. */
-
 #define si_timerid si_tid /* glibc compatibility. */
 
-/* sigset_t is already large enough on LP64 and mips, but other LP32's sigset_t
- * is just `unsigned long`.
- */
-#if defined(__LP64__) || defined(__mips__)
-typedef sigset_t sigset64_t;
-#else
-typedef struct { unsigned long __bits[_KERNEL__NSIG/LONG_BIT]; } sigset64_t;
-#endif
-
-#if defined(__LP64__)
-
-#define __SIGACTION_BODY \
-  int sa_flags; \
-  union { \
-    sighandler_t sa_handler; \
-    void (*sa_sigaction)(int, struct siginfo*, void*); \
-  }; \
-  sigset_t sa_mask; \
-  void (*sa_restorer)(void); \
-
-struct sigaction { __SIGACTION_BODY };
-struct sigaction64 { __SIGACTION_BODY };
-
-#undef __SIGACTION_BODY
-
-#elif defined(__mips__)
-
-#define __SIGACTION_BODY \
-  int sa_flags; \
-  union { \
-    sighandler_t sa_handler; \
-    void (*sa_sigaction)(int, struct siginfo*, void*); \
-  }; \
-  sigset_t sa_mask; \
-
-struct sigaction { __SIGACTION_BODY };
-struct sigaction64 { __SIGACTION_BODY };
-
-#undef __SIGACTION_BODY
-
-#else
-
-#undef sa_handler
-#undef sa_sigaction
-
-struct sigaction {
-  union {
-    sighandler_t sa_handler;
-    void (*sa_sigaction)(int, struct siginfo*, void*);
-  };
-  sigset_t sa_mask;
-  int sa_flags;
-  void (*sa_restorer)(void);
-};
-
-/* This matches the kernel's internal structure. */
-struct sigaction64 {
-  union {
-    sighandler_t sa_handler;
-    void (*sa_sigaction)(int, struct siginfo*, void*);
-  };
-  int sa_flags;
-  void (*sa_restorer)(void);
-  sigset64_t sa_mask;
-};
-
-#endif
-
 int sigaction(int __signal, const struct sigaction* __new_action, struct sigaction* __old_action);
 int sigaction64(int __signal, const struct sigaction64* __new_action, struct sigaction64* __old_action) __INTRODUCED_IN(28);
 
diff --git a/libc/include/sys/ucontext.h b/libc/include/sys/ucontext.h
index 4cc66eb..730ac69 100644
--- a/libc/include/sys/ucontext.h
+++ b/libc/include/sys/ucontext.h
@@ -87,9 +87,14 @@
   struct ucontext* uc_link;
   stack_t uc_stack;
   mcontext_t uc_mcontext;
-  sigset_t uc_sigmask;
-  /* Android has a wrong (smaller) sigset_t on ARM. */
-  uint32_t __padding_rt_sigset;
+  union {
+    struct {
+      sigset_t uc_sigmask;
+      /* Android has a wrong (smaller) sigset_t on ARM. */
+      uint32_t __padding_rt_sigset;
+    };
+    sigset64_t uc_sigmask64;
+  };
   /* The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM. */
   char __padding[120];
   unsigned long uc_regspace[128] __attribute__((__aligned__(8)));
@@ -109,7 +114,10 @@
   unsigned long uc_flags;
   struct ucontext *uc_link;
   stack_t uc_stack;
-  sigset_t uc_sigmask;
+  union {
+    sigset_t uc_sigmask;
+    sigset64_t uc_sigmask64;
+  };
   /* The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM64. */
   char __padding[128 - sizeof(sigset_t)];
   mcontext_t uc_mcontext;
@@ -194,9 +202,14 @@
   struct ucontext* uc_link;
   stack_t uc_stack;
   mcontext_t uc_mcontext;
-  sigset_t uc_sigmask;
-  /* Android has a wrong (smaller) sigset_t on x86. */
-  uint32_t __padding_rt_sigset;
+  union {
+    struct {
+      sigset_t uc_sigmask;
+      /* Android has a wrong (smaller) sigset_t on x86. */
+      uint32_t __padding_rt_sigset;
+    };
+    sigset64_t uc_sigmask64;
+  };
   struct _libc_fpstate __fpregs_mem;
 } ucontext_t;
 
@@ -266,7 +279,10 @@
   struct ucontext* uc_link;
   stack_t uc_stack;
   mcontext_t uc_mcontext;
-  sigset_t uc_sigmask;
+  union {
+    sigset_t uc_sigmask;
+    sigset64_t uc_sigmask64;
+  };
 } ucontext_t;
 
 #elif defined(__x86_64__)
@@ -362,7 +378,10 @@
   struct ucontext* uc_link;
   stack_t uc_stack;
   mcontext_t uc_mcontext;
-  sigset_t uc_sigmask;
+  union {
+    sigset_t uc_sigmask;
+    sigset64_t uc_sigmask64;
+  };
   struct _libc_fpstate __fpregs_mem;
 } ucontext_t;