]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
macos: Fix missing syscall ulock_wait (OS X 10.12). bz#379754
authorRhys Kidd <rhyskidd@gmail.com>
Mon, 12 Feb 2018 01:42:17 +0000 (20:42 -0500)
committerRhys Kidd <rhyskidd@gmail.com>
Sun, 19 Aug 2018 19:00:45 +0000 (15:00 -0400)
Based upon patch available at:
https://bugs.kde.org/attachment.cgi?id=105482

NEWS
coregrind/m_syswrap/priv_syswrap-darwin.h
coregrind/m_syswrap/syswrap-darwin.c
docs/internals/3_13_BUGSTATUS.txt
include/vki/vki-darwin.h

diff --git a/NEWS b/NEWS
index 19f911e13cc7aaf1d668f79438279ea9eda172c3..e14e44c245ab90036a138baf2db671647cf25707 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -69,6 +69,7 @@ where XXXXXX is the bug number as listed below.
 379373  Fix syscall param msg->desc.port.name points to uninitialised byte(s)
         on macOS 10.12
 379748  Fix missing pselect syscall (OS X 10.11)
+379754  Fix missing syscall ulock_wait (OS X 10.12)
 380397  s390x: __GI_strcspn() replacemenet needed
 381162  possible array overrun in VEX register allocator
 381272  ppc64 doesn't compile test_isa_2_06_partx.c without VSX support
index bdb38cf043fe80875431817d2d29d8e913752a97..4b90f5743cf1ad3013c5b660e3ba71551141bb76 100644 (file)
@@ -630,7 +630,7 @@ DECL_TEMPLATE(darwin, getentropy);                  // 500
 // 512
 // 513
 // 514
-// NYI ulock_wait                                   // 515
+DECL_TEMPLATE(darwin, ulock_wait);                  // 515
 DECL_TEMPLATE(darwin, ulock_wake);                  // 516
 // NYI fclonefileat                                 // 517
 // NYI fs_snapshot                                  // 518
index f5b5b61e2a24fb096084d2615c4c3e800654c73a..590493df4ded788f00c32852e21866eecb417c5f 100644 (file)
@@ -9922,6 +9922,15 @@ PRE(getentropy)
                   void*, buffer, size_t, size);
 }
 
+static const HChar *ulop_name(int op)
+{
+   switch (op) {
+      case VKI_UL_UNFAIR_LOCK:          return "UL_UNFAIR_LOCK";
+      case VKI_UL_COMPARE_AND_WAIT:     return "UL_COMPARE_AND_WAIT";
+      default: return "??";
+   }
+}
+
 PRE(ulock_wake)
 {
     PRINT("ulock_wake(operation:%ld, addr:%#lx, wake_value:%ld) FIXME",
@@ -9930,6 +9939,30 @@ PRE(ulock_wake)
                   uint32_t, operation, void*, addr, uint64_t, wake_value);
 }
 
+PRE(ulock_wait)
+{
+    uint ul_opcode = ARG1 & VKI_UL_OPCODE_MASK;
+    uint ul_flags = ARG1 & VKI_UL_FLAGS_MASK;
+
+    switch (ul_opcode) {
+    case VKI_UL_UNFAIR_LOCK:
+    case VKI_UL_COMPARE_AND_WAIT: {
+      const char* name = ulop_name(ul_opcode);
+      PRINT("ulock_wait(operation:%s (flags: %#x), addr:%#lx, value:%ld, timeout:%ld)",
+            name, ul_flags, ARG2, ARG3, ARG4);
+      PRE_REG_READ4(int, "ulock_wait",
+                    uint32_t, operation, void*, addr, uint64_t, value, uint32_t, timeout);
+      PRE_MEM_READ("ulock_wait(addr)", ARG2, 4 );
+      break;
+    }
+
+    default:
+      PRINT("ulock_wait(operation:%ld (opcode: %u [??], flags: %#x), addr:%#lx, value:%ld, timeout:%ld)", ARG1, ul_opcode, ul_flags, ARG2, ARG3, ARG4);
+      log_decaying("UNKNOWN ulock_wait %ld (opcode: %u [??], flags: %#x)!", ARG1, ul_opcode, ul_flags);
+      break;
+    }
+}
+
 PRE(host_create_mach_voucher_trap)
 {
     // munge_wwww -- no need to call helper
@@ -10629,7 +10662,7 @@ const SyscallTableEntry ML_(syscall_table)[] = {
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(512)),        // ???
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(513)),        // ???
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(514)),        // ???
-// _____(__NR_ulock_wait),                              // 515
+   MACX_(__NR_ulock_wait, ulock_wait),                  // 515
    MACX_(__NR_ulock_wake, ulock_wake),                  // 516
 // _____(__NR_fclonefileat),                            // 517
 // _____(__NR_fs_snapshot),                             // 518
index 3db6a030b8f1f539241890030eb00d89c1e721c6..ac2ad293ea4b0144830400b52e751d75e6b661b1 100644 (file)
@@ -229,8 +229,6 @@ Should possibly take
 379373  Syscall param msg->desc.port.name points to uninitialised byte(s)
         on macOS 10.12
 
-379754  Missing syscall ulock_wait (OS X 10.12)
-
 379893  valgrind segfault os x 10.12.4
 
 380269  No multithreading in macOS Sierra (10.12)
index 5bebbba72eea9acd38f26473a3f888920028206d..3b31ff116c6c493d3bb5d73a7e8666fa4d029a5f 100644 (file)
@@ -1128,5 +1128,17 @@ struct vki_necp_aggregate_result {
 };
 #endif /* DARWIN_VERS == DARWIN_10_10 */
 
+#if DARWIN_VERS >= DARWIN_10_12
+// ulock_wake & ulock_wait operations
+#define VKI_UL_OPCODE_MASK      0x000000FF
+#define VKI_UL_FLAGS_MASK       0xFFFFFF00
+#define VKI_UL_COMPARE_AND_WAIT 1
+#define VKI_UL_UNFAIR_LOCK      2
+// ulock_wake & ulock_wait flags
+#define ULF_NO_ERRNO            0x01000000
+
+// ulock_wait flags
+#define WKI_ULF_WAIT_WORKQ_DATA_CONTENTION     0x00010000
+#endif /* DARWIN_VERS >= DARWIN_10_12 */
 
 #endif