diff options
author | iraisr <iraisr@a5019735-40e9-0310-863c-91ae7b9d1cf9> | 2015-10-16 12:20:20 +0000 |
---|---|---|
committer | iraisr <iraisr@a5019735-40e9-0310-863c-91ae7b9d1cf9> | 2015-10-16 12:20:20 +0000 |
commit | 173bb6eca54e6678fddc5c63840d61341830335a (patch) | |
tree | a357da61014bf641179afcc502170c4f6007cd74 | |
parent | c593e2fb742b5461caa9844ddb40303dd7a9a923 (diff) | |
download | valgrind-173bb6eca54e6678fddc5c63840d61341830335a.tar.gz |
Solaris syscall: Add support for lwp_cond_wait(170).
Provide scalar test as well.
Fixes BZ #353920.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15708 a5019735-40e9-0310-863c-91ae7b9d1cf9
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | coregrind/m_syswrap/syswrap-solaris.c | 46 | ||||
-rw-r--r-- | include/vki/vki-scnums-solaris.h | 2 | ||||
-rw-r--r-- | memcheck/tests/solaris/scalar.c | 3 | ||||
-rw-r--r-- | memcheck/tests/solaris/scalar.stderr.exp | 35 |
5 files changed, 78 insertions, 9 deletions
@@ -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 diff --git a/coregrind/m_syswrap/syswrap-solaris.c b/coregrind/m_syswrap/syswrap-solaris.c index 2c4e0fe3c..216e53c69 100644 --- a/coregrind/m_syswrap/syswrap-solaris.c +++ b/coregrind/m_syswrap/syswrap-solaris.c @@ -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 */ diff --git a/include/vki/vki-scnums-solaris.h b/include/vki/vki-scnums-solaris.h index be886c9e2..d6fe22ce3 100644 --- a/include/vki/vki-scnums-solaris.h +++ b/include/vki/vki-scnums-solaris.h @@ -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 diff --git a/memcheck/tests/solaris/scalar.c b/memcheck/tests/solaris/scalar.c index 70ea81b20..211b39bfe 100644 --- a/memcheck/tests/solaris/scalar.c +++ b/memcheck/tests/solaris/scalar.c @@ -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. */ diff --git a/memcheck/tests/solaris/scalar.stderr.exp b/memcheck/tests/solaris/scalar.stderr.exp index 9cce0b0cc..d44723dee 100644 --- a/memcheck/tests/solaris/scalar.stderr.exp +++ b/memcheck/tests/solaris/scalar.stderr.exp @@ -2591,6 +2591,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 --------------------------------------------------------- Syscall param lwp_cond_broadcast(cvp) contains uninitialised byte(s) |