From abd10011a7a6066df76de7acf5eecb2cc870b0c4 Mon Sep 17 00:00:00 2001 From: Raghu Gandham Date: Thu, 9 Aug 2012 10:49:32 -0700 Subject: [PATCH] MIPS support to sigsuspend and sigwait routines Change-Id: I870e798ed7eac5a8c74e5784a670f3a4f24331a9 --- libc/SYSCALLS.TXT | 3 ++- libc/include/sys/linux-syscalls.h | 4 +++- libc/unistd/sigsuspend.c | 14 ++++++++++---- libc/unistd/sigwait.c | 9 +++++++++ 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/libc/SYSCALLS.TXT b/libc/SYSCALLS.TXT index 504a05099..e5a8c8df2 100644 --- a/libc/SYSCALLS.TXT +++ b/libc/SYSCALLS.TXT @@ -215,7 +215,8 @@ int utimensat(int, const char *, const struct timespec times[2], int) # 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 c8a654ca8..eba4d3533 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 0db05ed40..fd0863167 100644 --- a/libc/unistd/sigsuspend.c +++ b/libc/unistd/sigsuspend.c @@ -26,12 +26,18 @@ * SUCH DAMAGE. */ #include - +#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 c9c2a5404..1e90c41df 100644 --- a/libc/unistd/sigwait.c +++ b/libc/unistd/sigwait.c @@ -47,6 +47,14 @@ int __rt_sigtimedwait(const sigset_t *uthese, siginfo_t *uinfo, const struct tim 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 @@ int sigwait(const sigset_t *set, int *sig) 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