MIPS support to sigsuspend and sigwait routines

Change-Id: I870e798ed7eac5a8c74e5784a670f3a4f24331a9
diff --git a/libc/SYSCALLS.TXT b/libc/SYSCALLS.TXT
index 504a050..e5a8c8d 100644
--- a/libc/SYSCALLS.TXT
+++ b/libc/SYSCALLS.TXT
@@ -215,7 +215,8 @@
 # signals
 int     sigaction(int, const struct sigaction *, struct sigaction *)  67
 int     sigprocmask(int, const sigset_t *, sigset_t *)  126
-int     __sigsuspend:sigsuspend(int unused1, int unused2, unsigned mask)  72
+int     __sigsuspend:sigsuspend(int unused1, int unused2, unsigned mask)  72,72,-1
+int     __sigsuspend:sigsuspend(const sigset_t *mask)  -1,-1,72
 int     __rt_sigaction:rt_sigaction (int sig, const struct sigaction *act, struct sigaction *oact, size_t sigsetsize)  174,174,194
 int     __rt_sigprocmask:rt_sigprocmask (int  how, const sigset_t *set, sigset_t *oset, size_t sigsetsize)  175,175,195
 int     __rt_sigtimedwait:rt_sigtimedwait(const sigset_t *set, struct siginfo_t  *info, struct timespec_t  *timeout, size_t  sigset_size)  177,177,197
diff --git a/libc/include/sys/linux-syscalls.h b/libc/include/sys/linux-syscalls.h
index c8a654c..eba4d35 100644
--- a/libc/include/sys/linux-syscalls.h
+++ b/libc/include/sys/linux-syscalls.h
@@ -47,7 +47,6 @@
 #define __NR_getppid                      (__NR_SYSCALL_BASE + 64)
 #define __NR_setsid                       (__NR_SYSCALL_BASE + 66)
 #define __NR_sigaction                    (__NR_SYSCALL_BASE + 67)
-#define __NR_sigsuspend                   (__NR_SYSCALL_BASE + 72)
 #define __NR_sigpending                   (__NR_SYSCALL_BASE + 73)
 #define __NR_setrlimit                    (__NR_SYSCALL_BASE + 75)
 #define __NR_getrusage                    (__NR_SYSCALL_BASE + 77)
@@ -167,6 +166,7 @@
 #define __NR_timer_delete                 (__NR_SYSCALL_BASE + 261)
 #define __NR_utimes                       (__NR_SYSCALL_BASE + 269)
 #define __NR_utimensat                    (__NR_SYSCALL_BASE + 348)
+#define __NR_sigsuspend                   (__NR_SYSCALL_BASE + 72)
 #define __NR_rt_sigaction                 (__NR_SYSCALL_BASE + 174)
 #define __NR_rt_sigprocmask               (__NR_SYSCALL_BASE + 175)
 #define __NR_rt_sigtimedwait              (__NR_SYSCALL_BASE + 177)
@@ -215,6 +215,7 @@
 #define __NR_waitpid                      (__NR_SYSCALL_BASE + 7)
 #define __NR_kill                         (__NR_SYSCALL_BASE + 37)
 #define __NR_pipe                         (__NR_SYSCALL_BASE + 42)
+#define __NR_sigsuspend                   (__NR_SYSCALL_BASE + 72)
 #define __NR_socketcall                   (__NR_SYSCALL_BASE + 102)
 #define __NR_fdatasync                    (__NR_SYSCALL_BASE + 148)
 #define __NR_mlock                        (__NR_SYSCALL_BASE + 150)
@@ -337,6 +338,7 @@
 #define __NR_getegid                      (__NR_SYSCALL_BASE + 50)
 #define __NR_setreuid                     (__NR_SYSCALL_BASE + 70)
 #define __NR_setregid                     (__NR_SYSCALL_BASE + 71)
+#define __NR_sigsuspend                   (__NR_SYSCALL_BASE + 72)
 #define __NR_getrlimit                    (__NR_SYSCALL_BASE + 76)
 #define __NR_getgroups                    (__NR_SYSCALL_BASE + 80)
 #define __NR_setgroups                    (__NR_SYSCALL_BASE + 81)
diff --git a/libc/unistd/sigsuspend.c b/libc/unistd/sigsuspend.c
index 0db05ed..fd08631 100644
--- a/libc/unistd/sigsuspend.c
+++ b/libc/unistd/sigsuspend.c
@@ -26,12 +26,18 @@
  * SUCH DAMAGE.
  */
 #include <signal.h>
-
+#ifdef __mips__
+extern int __sigsuspend(const sigset_t *);
+#else
 extern int __sigsuspend(int, int, unsigned int);
+#endif
 
 int sigsuspend(const sigset_t *_mask)
 {
-    unsigned int    mask = (unsigned int)*_mask;
-
-	return __sigsuspend(0, 0, mask);
+#ifdef __mips__
+        return __sigsuspend(_mask);
+#else
+        unsigned int    mask = (unsigned int)*_mask;
+        return __sigsuspend(0, 0, mask);
+#endif
 }
diff --git a/libc/unistd/sigwait.c b/libc/unistd/sigwait.c
index c9c2a54..1e90c41 100644
--- a/libc/unistd/sigwait.c
+++ b/libc/unistd/sigwait.c
@@ -47,6 +47,14 @@
 int sigwait(const sigset_t *set, int *sig)
 {
     int  ret;
+#ifdef __mips__
+    /* use a union to get rid of aliasing warnings. On MIPS sigset_t is 128 bits */
+    union {
+      sigset_t       kernel_sigset;
+      sigset_t       dummy_sigset;
+    } u;
+    u.dummy_sigset = *set;
+#else
     /* use a union to get rid of aliasing warnings */
     union {
       unsigned long  kernel_sigset[2];
@@ -55,6 +63,7 @@
 
     u.kernel_sigset[0] = *set;
     u.kernel_sigset[1] = 0;  /* no real-time signals supported ? */
+#endif
     for (;;)
     {
      /* __rt_sigtimedwait can return EAGAIN or EINTR, we need to loop