|
From: Jeremy F. <je...@go...> - 2005-03-15 01:25:01
|
CVS commit by fitzhardinge:
sys_futex's FUTEX_(CMP_)REQUEUE requests use the futex2 pointer (not
timeout); FUTEX_CMP_REQUEUE also uses the timespec pointer as an integer.
Also, more clearly document the argument usages, and make the per-operation
special cases clearer.
M +33 -5 syscalls.c 1.9
--- valgrind/coregrind/linux/syscalls.c #1.8:1.9
@@ -413,13 +413,41 @@ POST(sys_sendfile64)
PRE(sys_futex, MayBlock)
{
+ /*
+ 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);
- SYS_PRE_MEM_READ( "futex(futex)", arg1, sizeof(int) );
- if (arg2 == VKI_FUTEX_WAIT && arg4 != 0)
+
+ SYS_PRE_MEM_READ( "futex(futex)", arg1, sizeof(Int) );
+
+ switch(arg2) {
+ case VKI_FUTEX_WAIT:
+ if (arg4 != 0)
SYS_PRE_MEM_READ( "futex(timeout)", arg4, sizeof(struct vki_timespec) );
- if (arg2 == VKI_FUTEX_REQUEUE)
- SYS_PRE_MEM_READ( "futex(futex2)", arg4, sizeof(int) );
+ break;
+
+ case VKI_FUTEX_REQUEUE:
+ case VKI_FUTEX_CMP_REQUEUE:
+ SYS_PRE_MEM_READ( "futex(futex2)", arg5, sizeof(Int) );
+ break;
+
+ case VKI_FUTEX_WAKE:
+ case VKI_FUTEX_FD:
+ /* no additional pointers */
+ break;
+
+ default:
+ set_result(-VKI_ENOSYS); // some futex function we don't understand
+ break;
+ }
}
|