From: Tom Hughes Date: Fri, 5 Aug 2005 07:32:04 +0000 (+0000) Subject: Implement the waitid system call. Fixes bug #110202. X-Git-Tag: svn/VALGRIND_3_1_0~661 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3f28625849dd73c57d5673b86fc74048467cd23d;p=thirdparty%2Fvalgrind.git Implement the waitid system call. Fixes bug #110202. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@4329 --- diff --git a/coregrind/m_syswrap/priv_syswrap-generic.h b/coregrind/m_syswrap/priv_syswrap-generic.h index 6d31ad7ea7..b91f59a845 100644 --- a/coregrind/m_syswrap/priv_syswrap-generic.h +++ b/coregrind/m_syswrap/priv_syswrap-generic.h @@ -146,6 +146,7 @@ DECL_TEMPLATE(generic, sys_setuid); DECL_TEMPLATE(generic, sys_gettimeofday); DECL_TEMPLATE(generic, sys_madvise); DECL_TEMPLATE(generic, sys_sigpending); +DECL_TEMPLATE(generic, sys_waitid); // These ones aren't POSIX, but are in some standard and look reasonably // generic, and are the same for all architectures under Linux. diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c index 238b90c920..6d20535e58 100644 --- a/coregrind/m_syswrap/syswrap-amd64-linux.c +++ b/coregrind/m_syswrap/syswrap-amd64-linux.c @@ -1473,7 +1473,7 @@ const SyscallTableEntry ML_(syscall_table)[] = { GENX_(__NR_mq_notify, sys_mq_notify), // 244 GENXY(__NR_mq_getsetattr, sys_mq_getsetattr), // 245 // (__NR_kexec_load, sys_ni_syscall), // 246 - // (__NR_waitid, sys_waitid), // 247 + GENXY(__NR_waitid, sys_waitid), // 247 }; const UInt ML_(syscall_table_size) = diff --git a/coregrind/m_syswrap/syswrap-generic.c b/coregrind/m_syswrap/syswrap-generic.c index a5cddcecce..e4e93915f2 100644 --- a/coregrind/m_syswrap/syswrap-generic.c +++ b/coregrind/m_syswrap/syswrap-generic.c @@ -5735,6 +5735,24 @@ POST(sys_clock_nanosleep) POST_MEM_WRITE( ARG4, sizeof(struct vki_timespec) ); } +PRE(sys_waitid) +{ + *flags |= SfMayBlock; + PRINT("sys_waitid( %d, %d, %p, %d, %p )", ARG1,ARG2,ARG3,ARG4,ARG5); + PRE_REG_READ5(int32_t, "sys_waitid", + int, which, vki_pid_t, pid, struct vki_siginfo *, infop, + int, options, struct vki_rusage *, ru); + PRE_MEM_WRITE( "waitid(infop)", ARG3, sizeof(struct vki_siginfo) ); + if (ARG5 != 0) + PRE_MEM_WRITE( "waitid(ru)", ARG5, sizeof(struct vki_rusage) ); +} +POST(sys_waitid) +{ + POST_MEM_WRITE( ARG3, sizeof(struct vki_siginfo) ); + if (ARG5 != 0) + POST_MEM_WRITE( ARG5, sizeof(struct vki_rusage) ); +} + #undef PRE #undef POST diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c index f455e7becd..d1dc1ec38c 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -2277,7 +2277,7 @@ const SyscallTableEntry ML_(syscall_table)[] = { GENX_(__NR_mq_notify, sys_mq_notify), // (mq_open+4) GENXY(__NR_mq_getsetattr, sys_mq_getsetattr), // (mq_open+5) GENX_(__NR_sys_kexec_load, sys_ni_syscall), // 283 -// GENXY(__NR_waitid, sys_waitid), // 284 + GENXY(__NR_waitid, sys_waitid), // 284 GENX_(285, sys_ni_syscall), // 285 // LINX_(__NR_add_key, sys_add_key), // 286