]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Solaris syscall: Add support for lwp_cond_wait(170).
authorIvo Raisr <ivosh@ivosh.net>
Fri, 16 Oct 2015 12:20:20 +0000 (12:20 +0000)
committerIvo Raisr <ivosh@ivosh.net>
Fri, 16 Oct 2015 12:20:20 +0000 (12:20 +0000)
Provide scalar test as well.
Fixes BZ #353920.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15708

NEWS
coregrind/m_syswrap/syswrap-solaris.c
include/vki/vki-scnums-solaris.h
memcheck/tests/solaris/scalar.c
memcheck/tests/solaris/scalar.stderr.exp

diff --git a/NEWS b/NEWS
index 96d6be65dafcf53af8418bacf1ce3babdc64315c..2a0d810003073f667866a644a254dca4a7772f96 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -37,6 +37,7 @@ where XXXXXX is the bug number as listed below.
 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
 
 
 
index 2c4e0fe3c6db0d714fdc803d787615725b47b5f9..216e53c69ee46a492339dc5505ea1148fa9644bb 100644 (file)
@@ -1013,6 +1013,7 @@ DECL_TEMPLATE(solaris, sys_lwp_sigmask);
 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 @@ PRE(sys_lwp_wait)
    /* 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 @@ POST(sys_lwp_wait)
 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 @@ PRE(sys_lwp_mutex_wakeup)
 
 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 @@ PRE(sys_lwp_cond_broadcast)
 
 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 @@ static SyscallTableEntry syscall_table[] = {
    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 */
index be886c9e2f739c011644c02acaa997d120455660..d6fe22ce3062cad82b7ce55bf36b8ec83eda7c2d 100644 (file)
 #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
index 70ea81b20f23286433da494ba47f8ddb15418b12..211b39bfe47786c6c65710e6648f02a71a18b636 100644 (file)
@@ -2107,7 +2107,8 @@ int main(void)
    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. */
index 9cce0b0cc1daf92ce558dd69c727640f92a35443..d44723deea25eb8ad66ff52e53458018a8539a97 100644 (file)
@@ -2590,6 +2590,41 @@ Syscall param lwp_mutex_wakeup(lp->mutex_waiters) points to unaddressable byte(s
    ...
  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
 ---------------------------------------------------------