Author: iraisr
Date: Sun Nov 20 00:20:34 2016
New Revision: 16144
Log:
Solaris: Add syscall wrapper for sigsuspend(95)
n-i-bz
Modified:
trunk/coregrind/m_syswrap/syswrap-solaris.c
trunk/include/vki/vki-scnums-solaris.h
trunk/memcheck/tests/solaris/scalar.c
trunk/memcheck/tests/solaris/scalar.stderr.exp
Modified: trunk/coregrind/m_syswrap/syswrap-solaris.c
==============================================================================
--- trunk/coregrind/m_syswrap/syswrap-solaris.c (original)
+++ trunk/coregrind/m_syswrap/syswrap-solaris.c Sun Nov 20 00:20:34 2016
@@ -956,6 +956,7 @@
DECL_TEMPLATE(solaris, sys_putmsg);
DECL_TEMPLATE(solaris, sys_lstat);
DECL_TEMPLATE(solaris, sys_sigprocmask);
+DECL_TEMPLATE(solaris, sys_sigsuspend);
DECL_TEMPLATE(solaris, sys_sigaction);
DECL_TEMPLATE(solaris, sys_sigpending);
DECL_TEMPLATE(solaris, sys_getsetcontext);
@@ -4807,6 +4808,26 @@
POST_MEM_WRITE(ARG3, sizeof(vki_sigset_t));
}
+PRE(sys_sigsuspend)
+{
+ *flags |= SfMayBlock;
+
+ /* int sigsuspend(const sigset_t *set); */
+ PRINT("sys_sigsuspend ( %#lx )", ARG1);
+ PRE_REG_READ1(long, "sigsuspend", vki_sigset_t *, set);
+ PRE_MEM_READ("sigsuspend(set)", ARG1, sizeof(vki_sigset_t));
+
+ /* Be safe. */
+ if (ARG1 && ML_(safe_to_deref((void *) ARG1, sizeof(vki_sigset_t)))) {
+ VG_(sigdelset)((vki_sigset_t *) ARG1, VG_SIGVGKILL);
+ /* We cannot mask VG_SIGVGKILL, as otherwise this thread would not
+ be killable by VG_(nuke_all_threads_except).
+ We thus silently ignore the user request to mask this signal.
+ Note that this is similar to what is done for e.g.
+ sigprocmask (see m_signals.c calculate_SKSS_from_SCSS). */
+ }
+}
+
PRE(sys_sigaction)
{
/* int sigaction(int signal, const struct sigaction *act,
@@ -10717,6 +10738,7 @@
GENX_(__NR_fchown, sys_fchown), /* 94 */
#endif /* SOLARIS_OLD_SYSCALLS */
SOLXY(__NR_sigprocmask, sys_sigprocmask), /* 95 */
+ SOLX_(__NR_sigsuspend, sys_sigsuspend), /* 96 */
GENXY(__NR_sigaltstack, sys_sigaltstack), /* 97 */
SOLXY(__NR_sigaction, sys_sigaction), /* 98 */
SOLXY(__NR_sigpending, sys_sigpending), /* 99 */
Modified: trunk/include/vki/vki-scnums-solaris.h
==============================================================================
--- trunk/include/vki/vki-scnums-solaris.h (original)
+++ trunk/include/vki/vki-scnums-solaris.h Sun Nov 20 00:20:34 2016
@@ -144,7 +144,7 @@
#define __NR_setgroups SYS_setgroups
#define __NR_getgroups SYS_getgroups
#define __NR_sigprocmask SYS_sigprocmask
-//#define __NR_sigsuspend SYS_sigsuspend
+#define __NR_sigsuspend SYS_sigsuspend
#define __NR_sigaltstack SYS_sigaltstack
#define __NR_sigaction SYS_sigaction
#define __NR_sigpending SYS_sigpending
Modified: trunk/memcheck/tests/solaris/scalar.c
==============================================================================
--- trunk/memcheck/tests/solaris/scalar.c (original)
+++ trunk/memcheck/tests/solaris/scalar.c Sun Nov 20 00:20:34 2016
@@ -1885,7 +1885,8 @@
SY(SYS_sigprocmask, x0, x0 + 1, x0 + 1); FAILx(EFAULT);
/* SYS_sigsuspend 96 */
- /* XXX Missing wrapper. */
+ GO(SYS_sigsuspend, "1s 1m");
+ SY(SYS_sigsuspend, x0 + 1); FAILx(EFAULT);
/* SYS_sigaltstack 97 */
GO(SYS_sigaltstack, "2s 2m");
Modified: trunk/memcheck/tests/solaris/scalar.stderr.exp
==============================================================================
--- trunk/memcheck/tests/solaris/scalar.stderr.exp (original)
+++ trunk/memcheck/tests/solaris/scalar.stderr.exp Sun Nov 20 00:20:34 2016
@@ -1623,6 +1623,16 @@
Address 0x........ is not stack'd, malloc'd or (recently) free'd
---------------------------------------------------------
+ 96: SYS_sigsuspend 1s 1m
+---------------------------------------------------------
+Syscall param sigsuspend(set) contains uninitialised byte(s)
+ ...
+
+Syscall param sigsuspend(set) points to unaddressable byte(s)
+ ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+---------------------------------------------------------
97: SYS_sigaltstack 2s 2m
---------------------------------------------------------
Syscall param sigaltstack(ss) contains uninitialised byte(s)
|