Author: iraisr
Date: Fri Oct 16 13:20:20 2015
New Revision: 15708
Log:
Solaris syscall: Add support for lwp_cond_wait(170).
Provide scalar test as well.
Fixes BZ #353920.
Modified:
trunk/NEWS
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/NEWS
==============================================================================
--- trunk/NEWS (original)
+++ trunk/NEWS Fri Oct 16 13:20:20 2015
@@ -37,6 +37,7 @@
353398 WARNING: unhandled amd64-solaris syscall: 207
353680 s390x: Crash with certain glibc versions due to non-implemented TBEGIN
353917 unhandled amd64-solaris syscall fchdir(120)
+353920 unhandled amd64-solaris syscall: 170
Modified: trunk/coregrind/m_syswrap/syswrap-solaris.c
==============================================================================
--- trunk/coregrind/m_syswrap/syswrap-solaris.c (original)
+++ trunk/coregrind/m_syswrap/syswrap-solaris.c Fri Oct 16 13:20:20 2015
@@ -1013,6 +1013,7 @@
DECL_TEMPLATE(solaris, sys_lwp_private);
DECL_TEMPLATE(solaris, sys_lwp_wait);
DECL_TEMPLATE(solaris, sys_lwp_mutex_wakeup);
+DECL_TEMPLATE(solaris, sys_lwp_cond_wait);
DECL_TEMPLATE(solaris, sys_lwp_cond_broadcast);
DECL_TEMPLATE(solaris, sys_pread);
DECL_TEMPLATE(solaris, sys_pwrite);
@@ -6960,7 +6961,7 @@
/* int lwp_wait(id_t lwpid, id_t *departed); */
*flags |= SfMayBlock;
PRINT("sys_lwp_wait ( %ld, %#lx )", SARG1, ARG2);
- PRE_REG_READ2(long, "lwp_wait", vki_id_t, lwpid, id_t *, departed);
+ PRE_REG_READ2(long, "lwp_wait", vki_id_t, lwpid, vki_id_t *, departed);
if (ARG2)
PRE_MEM_WRITE("lwp_wait(departed)", ARG2, sizeof(vki_id_t));
}
@@ -6973,11 +6974,11 @@
PRE(sys_lwp_mutex_wakeup)
{
/* int lwp_mutex_wakeup(lwp_mutex_t *lp, int release_all); */
- vki_lwp_mutex_t *lp = (vki_lwp_mutex_t*)ARG1;
*flags |= SfMayBlock;
PRINT("sys_lwp_mutex_wakeup ( %#lx, %ld )", ARG1, SARG2);
- PRE_REG_READ2(long, "lwp_mutex_wakeup", lwp_mutex_t *, lp,
+ PRE_REG_READ2(long, "lwp_mutex_wakeup", vki_lwp_mutex_t *, lp,
int, release_all);
+ vki_lwp_mutex_t *lp = (vki_lwp_mutex_t *) ARG1;
PRE_FIELD_READ("lwp_mutex_wakeup(lp->mutex_type)", lp->vki_mutex_type);
PRE_FIELD_WRITE("lwp_mutex_wakeup(lp->mutex_waiters)",
lp->vki_mutex_waiters);
@@ -6985,18 +6986,48 @@
POST(sys_lwp_mutex_wakeup)
{
- vki_lwp_mutex_t *lp = (vki_lwp_mutex_t*)ARG1;
+ vki_lwp_mutex_t *lp = (vki_lwp_mutex_t *) ARG1;
POST_FIELD_WRITE(lp->vki_mutex_waiters);
}
+PRE(sys_lwp_cond_wait)
+{
+ /* int lwp_cond_wait(lwp_cond_t *cvp, lwp_mutex_t *mp, timespec_t *tsp,
+ int check_park); */
+ *flags |= SfMayBlock;
+ PRINT("sys_lwp_cond_wait( %#lx, %#lx, %#lx, %ld )", ARG1, ARG2, ARG3, SARG4);
+ PRE_REG_READ4(long, "lwp_cond_wait", vki_lwp_cond_t *, cvp,
+ vki_lwp_mutex_t *, mp, vki_timespec_t *, tsp, int, check_part);
+
+ vki_lwp_cond_t *cvp = (vki_lwp_cond_t *) ARG1;
+ vki_lwp_mutex_t *mp = (vki_lwp_mutex_t *) ARG2;
+ PRE_FIELD_READ("lwp_cond_wait(cvp->type)", cvp->vki_cond_type);
+ PRE_FIELD_READ("lwp_cond_wait(cvp->waiters_kernel)",
+ cvp->vki_cond_waiters_kernel);
+ PRE_FIELD_READ("lwp_cond_wait(mp->mutex_type)", mp->vki_mutex_type);
+ PRE_FIELD_WRITE("lwp_cond_wait(mp->mutex_waiters)", mp->vki_mutex_waiters);
+ if (ARG3 != 0)
+ PRE_MEM_READ("lwp_cond_wait(tsp)", ARG3, sizeof(vki_timespec_t));
+}
+
+POST(sys_lwp_cond_wait)
+{
+ vki_lwp_cond_t *cvp = (vki_lwp_cond_t *) ARG1;
+ vki_lwp_mutex_t *mp = (vki_lwp_mutex_t *) ARG2;
+ POST_FIELD_WRITE(cvp->vki_cond_waiters_kernel);
+ POST_FIELD_WRITE(mp->vki_mutex_waiters);
+ if (ARG3 != 0)
+ POST_MEM_WRITE(ARG3, sizeof(vki_timespec_t));
+}
+
PRE(sys_lwp_cond_broadcast)
{
/* int lwp_cond_broadcast(lwp_cond_t *cvp); */
- vki_lwp_cond_t *cvp = (vki_lwp_cond_t*)ARG1;
*flags |= SfMayBlock;
PRINT("sys_lwp_cond_broadcast ( %#lx )", ARG1);
- PRE_REG_READ1(long, "lwp_cond_broadcast", lwp_cond_t *, cvp);
+ PRE_REG_READ1(long, "lwp_cond_broadcast", vki_lwp_cond_t *, cvp);
+ vki_lwp_cond_t *cvp = (vki_lwp_cond_t *) ARG1;
PRE_FIELD_READ("lwp_cond_broadcast(cvp->type)", cvp->vki_cond_type);
PRE_FIELD_READ("lwp_cond_broadcast(cvp->waiters_kernel)",
cvp->vki_cond_waiters_kernel);
@@ -7006,7 +7037,7 @@
POST(sys_lwp_cond_broadcast)
{
- vki_lwp_cond_t *cvp = (vki_lwp_cond_t*)ARG1;
+ vki_lwp_cond_t *cvp = (vki_lwp_cond_t *) ARG1;
POST_FIELD_WRITE(cvp->vki_cond_waiters_kernel);
}
@@ -10375,6 +10406,7 @@
SOLX_(__NR_lwp_private, sys_lwp_private), /* 166 */
SOLXY(__NR_lwp_wait, sys_lwp_wait), /* 167 */
SOLXY(__NR_lwp_mutex_wakeup, sys_lwp_mutex_wakeup), /* 168 */
+ SOLXY(__NR_lwp_cond_wait, sys_lwp_cond_wait), /* 170 */
SOLX_(__NR_lwp_cond_broadcast, sys_lwp_cond_broadcast), /* 172 */
SOLXY(__NR_pread, sys_pread), /* 173 */
SOLX_(__NR_pwrite, sys_pwrite), /* 174 */
Modified: trunk/include/vki/vki-scnums-solaris.h
==============================================================================
--- trunk/include/vki/vki-scnums-solaris.h (original)
+++ trunk/include/vki/vki-scnums-solaris.h Fri Oct 16 13:20:20 2015
@@ -224,7 +224,7 @@
#define __NR_lwp_private SYS_lwp_private
#define __NR_lwp_wait SYS_lwp_wait
#define __NR_lwp_mutex_wakeup SYS_lwp_mutex_wakeup
-//#define __NR_lwp_cond_wait SYS_lwp_cond_wait
+#define __NR_lwp_cond_wait SYS_lwp_cond_wait
//#define __NR_lwp_cond_signal SYS_lwp_cond_signal
#define __NR_lwp_cond_broadcast SYS_lwp_cond_broadcast
#define __NR_pread SYS_pread
Modified: trunk/memcheck/tests/solaris/scalar.c
==============================================================================
--- trunk/memcheck/tests/solaris/scalar.c (original)
+++ trunk/memcheck/tests/solaris/scalar.c Fri Oct 16 13:20:20 2015
@@ -2107,7 +2107,8 @@
SY(SYS_lwp_mutex_wakeup, x0, x0); FAIL;
/* SYS_lwp_cond_wait 170 */
- /* XXX Missing wrapper. */
+ GO(SYS_lwp_cond_wait, "4s 5m");
+ SY(SYS_lwp_cond_wait, x0 + 1, x0 + 1, x0 + 1, x0); FAIL;
/* SYS_lwp_cond_signal 171 */
/* XXX Missing wrapper. */
Modified: trunk/memcheck/tests/solaris/scalar.stderr.exp
==============================================================================
--- trunk/memcheck/tests/solaris/scalar.stderr.exp (original)
+++ trunk/memcheck/tests/solaris/scalar.stderr.exp Fri Oct 16 13:20:20 2015
@@ -2591,6 +2591,41 @@
Address 0x........ is not stack'd, malloc'd or (recently) free'd
---------------------------------------------------------
+170: SYS_lwp_cond_wait 4s 5m
+---------------------------------------------------------
+Syscall param lwp_cond_wait(cvp) contains uninitialised byte(s)
+ ...
+
+Syscall param lwp_cond_wait(mp) contains uninitialised byte(s)
+ ...
+
+Syscall param lwp_cond_wait(tsp) contains uninitialised byte(s)
+ ...
+
+Syscall param lwp_cond_wait(check_part) contains uninitialised byte(s)
+ ...
+
+Syscall param lwp_cond_wait(cvp->type) points to unaddressable byte(s)
+ ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param lwp_cond_wait(cvp->waiters_kernel) points to unaddressable byte(s)
+ ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param lwp_cond_wait(mp->mutex_type) points to unaddressable byte(s)
+ ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param lwp_cond_wait(mp->mutex_waiters) points to unaddressable byte(s)
+ ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+Syscall param lwp_cond_wait(tsp) points to unaddressable byte(s)
+ ...
+ Address 0x........ is not stack'd, malloc'd or (recently) free'd
+
+---------------------------------------------------------
172: SYS_lwp_cond_broadcast 1s 2m
---------------------------------------------------------
Syscall param lwp_cond_broadcast(cvp) contains uninitialised byte(s)
|