Cleanup after m_syscalls changes: fix some NPTL ish syscalls (x86)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3850 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/m_syscalls/syscalls-linux.c b/coregrind/m_syscalls/syscalls-linux.c
index c8f3bfc..5018d82 100644
--- a/coregrind/m_syscalls/syscalls-linux.c
+++ b/coregrind/m_syscalls/syscalls-linux.c
@@ -30,16 +30,18 @@
#include "core.h"
#include "pub_core_aspacemgr.h"
+#include "pub_core_libcbase.h"
#include "pub_core_libcassert.h"
#include "pub_core_libcfile.h"
#include "pub_core_libcprint.h"
#include "pub_core_tooliface.h"
#include "pub_core_options.h"
+#include "pub_core_signals.h"
#include "priv_types_n_macros.h"
+#include "priv_syscalls-generic.h"
#include "priv_syscalls-linux.h"
-
/* ---------------------------------------------------------------------
PRE/POST wrappers for arch-generic, Linux-specific syscalls
------------------------------------------------------------------ */
@@ -50,6 +52,12 @@
#define PRE(name) DEFN_PRE_TEMPLATE(linux, name)
#define POST(name) DEFN_POST_TEMPLATE(linux, name)
+PRE(sys_set_tid_address)
+{
+ PRINT("sys_set_tid_address ( %p )", ARG1);
+ PRE_REG_READ1(long, "set_tid_address", int *, tidptr);
+}
+
PRE(sys_exit_group)
{
ThreadId t;
@@ -416,62 +424,65 @@
//zz POST_MEM_WRITE( ARG3, sizeof(vki_loff_t) );
//zz }
//zz }
-//zz
-//zz PRE(sys_futex, MayBlock)
-//zz {
-//zz /*
-//zz arg param used by ops
-//zz
-//zz ARG1 - u32 *futex all
-//zz ARG2 - int op
-//zz ARG3 - int val WAIT,WAKE,FD,REQUEUE,CMP_REQUEUE
-//zz ARG4 - struct timespec *utime WAIT:time* REQUEUE,CMP_REQUEUE:val2
-//zz ARG5 - u32 *uaddr2 REQUEUE,CMP_REQUEUE
-//zz ARG6 - int val3 CMP_REQUEUE
-//zz */
-//zz PRINT("sys_futex ( %p, %d, %d, %p, %p )", ARG1,ARG2,ARG3,ARG4,ARG5);
-//zz PRE_REG_READ6(long, "futex",
-//zz vki_u32 *, futex, int, op, int, val,
-//zz struct timespec *, utime, vki_u32 *, uaddr2, int, val3);
-//zz
-//zz PRE_MEM_READ( "futex(futex)", ARG1, sizeof(Int) );
-//zz
-//zz switch(ARG2) {
-//zz case VKI_FUTEX_WAIT:
-//zz if (ARG4 != 0)
-//zz PRE_MEM_READ( "futex(timeout)", ARG4, sizeof(struct vki_timespec) );
-//zz break;
-//zz
-//zz case VKI_FUTEX_REQUEUE:
-//zz case VKI_FUTEX_CMP_REQUEUE:
-//zz PRE_MEM_READ( "futex(futex2)", ARG5, sizeof(Int) );
-//zz break;
-//zz
-//zz case VKI_FUTEX_WAKE:
-//zz case VKI_FUTEX_FD:
-//zz /* no additional pointers */
-//zz break;
-//zz
-//zz default:
-//zz SET_RESULT(-VKI_ENOSYS); // some futex function we don't understand
-//zz break;
-//zz }
-//zz }
-//zz
-//zz POST(sys_futex)
-//zz {
-//zz POST_MEM_WRITE( ARG1, sizeof(int) );
-//zz if (ARG2 == VKI_FUTEX_FD) {
-//zz if (!VG_(fd_allowed)(RES, "futex", tid, True)) {
-//zz VG_(close)(RES);
-//zz SET_RESULT( -VKI_EMFILE );
-//zz } else {
-//zz if (VG_(clo_track_fds))
-//zz VG_(record_fd_open)(tid, RES, VG_(arena_strdup)(VG_AR_CORE, (Char*)ARG1));
-//zz }
-//zz }
-//zz }
-//zz
+
+PRE(sys_futex)
+{
+ /*
+ arg param used by ops
+
+ ARG1 - u32 *futex all
+ ARG2 - int op
+ ARG3 - int val WAIT,WAKE,FD,REQUEUE,CMP_REQUEUE
+ ARG4 - struct timespec *utime WAIT:time* REQUEUE,CMP_REQUEUE:val2
+ ARG5 - u32 *uaddr2 REQUEUE,CMP_REQUEUE
+ ARG6 - int val3 CMP_REQUEUE
+ */
+ PRINT("sys_futex ( %p, %d, %d, %p, %p )", ARG1,ARG2,ARG3,ARG4,ARG5);
+ PRE_REG_READ6(long, "futex",
+ vki_u32 *, futex, int, op, int, val,
+ struct timespec *, utime, vki_u32 *, uaddr2, int, val3);
+
+ PRE_MEM_READ( "futex(futex)", ARG1, sizeof(Int) );
+
+ *flags |= SfMayBlock;
+
+ switch(ARG2) {
+ case VKI_FUTEX_WAIT:
+ if (ARG4 != 0)
+ PRE_MEM_READ( "futex(timeout)", ARG4, sizeof(struct vki_timespec) );
+ break;
+
+ case VKI_FUTEX_REQUEUE:
+ case VKI_FUTEX_CMP_REQUEUE:
+ PRE_MEM_READ( "futex(futex2)", ARG5, sizeof(Int) );
+ break;
+
+ case VKI_FUTEX_WAKE:
+ case VKI_FUTEX_FD:
+ /* no additional pointers */
+ break;
+
+ default:
+ SET_STATUS_Failure( VKI_ENOSYS ); // some futex function we don't understand
+ break;
+ }
+}
+
+POST(sys_futex)
+{
+ vg_assert(SUCCESS);
+ POST_MEM_WRITE( ARG1, sizeof(int) );
+ if (ARG2 == VKI_FUTEX_FD) {
+ if (!VG_(fd_allowed)(RES, "futex", tid, True)) {
+ VG_(close)(RES);
+ SET_STATUS_Failure( VKI_EMFILE );
+ } else {
+ if (VG_(clo_track_fds))
+ VG_(record_fd_open)(tid, RES, VG_(arena_strdup)(VG_AR_CORE, (Char*)ARG1));
+ }
+ }
+}
+
//zz PRE(sys_epoll_create, 0)
//zz {
//zz PRINT("sys_epoll_create ( %d )", ARG1);
@@ -482,7 +493,7 @@
//zz {
//zz if (!VG_(fd_allowed)(RES, "epoll_create", tid, True)) {
//zz VG_(close)(RES);
-//zz SET_RESULT( -VKI_EMFILE );
+//zz SET_STATUS_( -VKI_EMFILE );
//zz } else {
//zz if (VG_(clo_track_fds))
//zz VG_(record_fd_open) (tid, RES, NULL);
@@ -530,16 +541,16 @@
//zz PRINT("sys_tkill ( %d, %d )", ARG1,ARG2);
//zz PRE_REG_READ2(long, "tkill", int, tid, int, sig);
//zz if (!VG_(client_signal_OK)(ARG2)) {
-//zz SET_RESULT( -VKI_EINVAL );
+//zz SET_STATUS_( -VKI_EINVAL );
//zz return;
//zz }
//zz
//zz /* If we're sending SIGKILL, check to see if the target is one of
//zz our threads and handle it specially. */
//zz if (ARG2 == VKI_SIGKILL && VG_(do_sigkill)(ARG1, -1))
-//zz SET_RESULT(0);
+//zz SET_STATUS_(0);
//zz else
-//zz SET_RESULT(VG_(do_syscall2)(SYSNO, ARG1, ARG2));
+//zz SET_STATUS_(VG_(do_syscall2)(SYSNO, ARG1, ARG2));
//zz
//zz if (VG_(clo_trace_signals))
//zz VG_(message)(Vg_DebugMsg, "tkill: sent signal %d to pid %d",
@@ -547,40 +558,38 @@
//zz // Check to see if this kill gave us a pending signal
//zz XXX FIXME VG_(poll_signals)(tid);
//zz }
-//zz
-//zz PRE(sys_tgkill, Special)
-//zz {
-//zz /* int tgkill(pid_t tgid, pid_t tid, int sig); */
-//zz PRINT("sys_tgkill ( %d, %d, %d )", ARG1,ARG2,ARG3);
-//zz PRE_REG_READ3(long, "tgkill", int, tgid, int, tid, int, sig);
-//zz if (!VG_(client_signal_OK)(ARG3)) {
-//zz SET_RESULT( -VKI_EINVAL );
-//zz return;
-//zz }
-//zz
-//zz /* If we're sending SIGKILL, check to see if the target is one of
-//zz our threads and handle it specially. */
-//zz if (ARG3 == VKI_SIGKILL && VG_(do_sigkill)(ARG2, ARG1))
-//zz SET_RESULT(0);
-//zz else
-//zz SET_RESULT(VG_(do_syscall3)(SYSNO, ARG1, ARG2, ARG3));
-//zz
-//zz if (VG_(clo_trace_signals))
-//zz VG_(message)(Vg_DebugMsg, "tgkill: sent signal %d to pid %d/%d",
-//zz ARG3, ARG1, ARG2);
-//zz // Check to see if this kill gave us a pending signal
-//zz XXX FIXME VG_(poll_signals)(tid);
-//zz }
-//zz
-//zz POST(sys_tgkill)
-//zz {
-//zz if (VG_(clo_trace_signals))
-//zz VG_(message)(Vg_DebugMsg, "tgkill: sent signal %d to pid %d/%d",
-//zz ARG3, ARG1, ARG2);
-//zz // Check to see if this kill gave us a pending signal
-//zz XXX FIXME VG_(poll_signals)(tid);
-//zz }
-//zz
+
+PRE(sys_tgkill)
+{
+ /* int tgkill(pid_t tgid, pid_t tid, int sig); */
+ PRINT("sys_tgkill ( %d, %d, %d )", ARG1,ARG2,ARG3);
+ PRE_REG_READ3(long, "tgkill", int, tgid, int, tid, int, sig);
+ if (!VG_(client_signal_OK)(ARG3)) {
+ SET_STATUS_Failure( VKI_EINVAL );
+ return;
+ }
+
+ /* If we're sending SIGKILL, check to see if the target is one of
+ our threads and handle it specially. */
+ if (ARG3 == VKI_SIGKILL && VG_(do_sigkill)(ARG2, ARG1))
+ SET_STATUS_Success(0);
+ else
+ SET_STATUS_from_SysRes(VG_(do_syscall3)(SYSNO, ARG1, ARG2, ARG3));
+
+ if (VG_(clo_trace_signals))
+ VG_(message)(Vg_DebugMsg, "tgkill: sent signal %d to pid %d/%d",
+ ARG3, ARG1, ARG2);
+ /* Check to see if this kill gave us a pending signal */
+ *flags |= SfPollAfter;
+}
+
+POST(sys_tgkill)
+{
+ if (VG_(clo_trace_signals))
+ VG_(message)(Vg_DebugMsg, "tgkill: sent signal %d to pid %d/%d",
+ ARG3, ARG1, ARG2);
+}
+
//zz PRE(sys_fadvise64, 0)
//zz {
//zz PRINT("sys_fadvise64 ( %d, %lld, %lu, %d )", ARG1,ARG2,ARG3);
@@ -613,14 +622,14 @@
//zz addr = VG_(find_map_space)(0, size, True);
//zz
//zz if (addr == 0) {
-//zz SET_RESULT( -VKI_ENOMEM );
+//zz SET_STATUS_( -VKI_ENOMEM );
//zz return;
//zz }
//zz
//zz VG_(map_segment)(addr, size, VKI_PROT_READ|VKI_PROT_WRITE, SF_FIXED);
//zz
//zz VG_(pad_address_space)(0);
-//zz SET_RESULT( VG_(do_syscall2)(SYSNO, ARG1, ARG2) );
+//zz SET_STATUS_( VG_(do_syscall2)(SYSNO, ARG1, ARG2) );
//zz VG_(unpad_address_space)(0);
//zz
//zz if (RES == 0) {
@@ -660,7 +669,7 @@
//zz size = VG_PGROUNDUP(sizeof(struct vki_aio_ring) +
//zz r->nr*sizeof(struct vki_io_event));
//zz
-//zz SET_RESULT( VG_(do_syscall1)(SYSNO, ARG1) );
+//zz SET_STATUS_( VG_(do_syscall1)(SYSNO, ARG1) );
//zz
//zz if (RES == 0 && s != NULL) {
//zz VG_TRACK( die_mem_munmap, ARG1, size );