]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Improve futex system call support. Patch from BZ#201757 which I have
authorTom Hughes <tom@compton.nu>
Wed, 29 Jul 2009 11:09:01 +0000 (11:09 +0000)
committerTom Hughes <tom@compton.nu>
Wed, 29 Jul 2009 11:09:01 +0000 (11:09 +0000)
attempted to cross check against current kernel code. Reading the
futex system call code mostly just made my head hurt however...

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

coregrind/m_syswrap/syswrap-linux.c
include/vki/vki-linux.h

index df61d5a5b362629abb24b120b2eac71dedcfa4df..7f81262fad8fb2e451c8777e9c25c9b333999d51 100644 (file)
@@ -865,31 +865,43 @@ PRE(sys_futex)
       ARG6 - int val3                          CMP_REQUEUE
     */
    PRINT("sys_futex ( %#lx, %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4,ARG5);
-   switch(ARG2) {
+   switch(ARG2 & ~(VKI_FUTEX_PRIVATE_FLAG|VKI_FUTEX_CLOCK_REALTIME)) {
    case VKI_FUTEX_CMP_REQUEUE:
-   case VKI_FUTEX_CMP_REQUEUE | VKI_FUTEX_PRIVATE_FLAG:
+   case VKI_FUTEX_WAKE_OP:
+   case VKI_FUTEX_CMP_REQUEUE_PI:
       PRE_REG_READ6(long, "futex", 
                     vki_u32 *, futex, int, op, int, val,
                     struct timespec *, utime, vki_u32 *, uaddr2, int, val3);
       break;
    case VKI_FUTEX_REQUEUE:
-   case VKI_FUTEX_REQUEUE | VKI_FUTEX_PRIVATE_FLAG:
+   case VKI_FUTEX_WAIT_REQUEUE_PI:
       PRE_REG_READ5(long, "futex", 
                     vki_u32 *, futex, int, op, int, val,
                     struct timespec *, utime, vki_u32 *, uaddr2);
       break;
+   case VKI_FUTEX_WAIT_BITSET:
+      PRE_REG_READ6(long, "futex", 
+                    vki_u32 *, futex, int, op, int, val,
+                    struct timespec *, utime, int, dummy, int, val3);
+      break;
+   case VKI_FUTEX_WAKE_BITSET:
+      PRE_REG_READ6(long, "futex", 
+                    vki_u32 *, futex, int, op, int, val,
+                    int, dummy, int, dummy2, int, val3);
+      break;
    case VKI_FUTEX_WAIT:
-   case VKI_FUTEX_WAIT | VKI_FUTEX_PRIVATE_FLAG:
+   case VKI_FUTEX_LOCK_PI:
       PRE_REG_READ4(long, "futex", 
                     vki_u32 *, futex, int, op, int, val,
                     struct timespec *, utime);
       break;
    case VKI_FUTEX_WAKE:
-   case VKI_FUTEX_WAKE | VKI_FUTEX_PRIVATE_FLAG:
    case VKI_FUTEX_FD:
+   case VKI_FUTEX_TRYLOCK_PI:
       PRE_REG_READ3(long, "futex", 
                     vki_u32 *, futex, int, op, int, val);
       break;
+   case VKI_FUTEX_UNLOCK_PI:
    default:
       PRE_REG_READ2(long, "futex", vki_u32 *, futex, int, op);
       break;
@@ -899,23 +911,27 @@ PRE(sys_futex)
 
    *flags |= SfMayBlock;
 
-   switch(ARG2) {
+   switch(ARG2 & ~(VKI_FUTEX_PRIVATE_FLAG|VKI_FUTEX_CLOCK_REALTIME)) {
    case VKI_FUTEX_WAIT:
-   case VKI_FUTEX_WAIT | VKI_FUTEX_PRIVATE_FLAG:
+   case VKI_FUTEX_LOCK_PI:
+   case VKI_FUTEX_WAIT_BITSET:
+   case VKI_FUTEX_WAIT_REQUEUE_PI:
       if (ARG4 != 0)
         PRE_MEM_READ( "futex(timeout)", ARG4, sizeof(struct vki_timespec) );
       break;
 
    case VKI_FUTEX_REQUEUE:
-   case VKI_FUTEX_REQUEUE | VKI_FUTEX_PRIVATE_FLAG:
    case VKI_FUTEX_CMP_REQUEUE:
-   case VKI_FUTEX_CMP_REQUEUE | VKI_FUTEX_PRIVATE_FLAG:
+   case VKI_FUTEX_CMP_REQUEUE_PI:
+   case VKI_FUTEX_WAKE_OP:
       PRE_MEM_READ( "futex(futex2)", ARG5, sizeof(Int) );
       break;
 
    case VKI_FUTEX_WAKE:
-   case VKI_FUTEX_WAKE | VKI_FUTEX_PRIVATE_FLAG:
    case VKI_FUTEX_FD:
+   case VKI_FUTEX_WAKE_BITSET:
+   case VKI_FUTEX_TRYLOCK_PI:
+   case VKI_FUTEX_UNLOCK_PI:
       /* no additional pointers */
       break;
 
index d31bd8be20aaa5d4b616ac6f8c82129ee57f921d..90bffe6b7b583a4eeb6ccaffde4b048ce1102ad7 100644 (file)
@@ -1150,7 +1150,7 @@ struct  vki_seminfo {
 #define VKI_MREMAP_FIXED       2
 
 //----------------------------------------------------------------------
-// From linux-2.6.10-rc3-mm1/include/linux/futex.h
+// From linux-2.6.31-rc4/include/linux/futex.h
 //----------------------------------------------------------------------
 
 #define VKI_FUTEX_WAIT (0)
@@ -1158,7 +1158,16 @@ struct  vki_seminfo {
 #define VKI_FUTEX_FD (2)
 #define VKI_FUTEX_REQUEUE (3)
 #define VKI_FUTEX_CMP_REQUEUE (4)
+#define VKI_FUTEX_WAKE_OP (5)
+#define VKI_FUTEX_LOCK_PI (6)
+#define VKI_FUTEX_UNLOCK_PI (7)
+#define VKI_FUTEX_TRYLOCK_PI (8)
+#define VKI_FUTEX_WAIT_BITSET (9)
+#define VKI_FUTEX_WAKE_BITSET (10)
+#define VKI_FUTEX_WAIT_REQUEUE_PI (11)
+#define VKI_FUTEX_CMP_REQUEUE_PI (12)
 #define VKI_FUTEX_PRIVATE_FLAG (128)
+#define VKI_FUTEX_CLOCK_REALTIME (256)
 
 struct vki_robust_list {
        struct vki_robust_list __user *next;