]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Darwin: merge some fixes for macOS up to 10.13
authorPaul Floyd <pjfloyd@wanadoo.fr>
Wed, 27 Mar 2024 12:41:37 +0000 (13:41 +0100)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Wed, 27 Mar 2024 12:41:37 +0000 (13:41 +0100)
From https://github.com/LouisBrunner/valgrind-macos
Thanks, Louis Brunner

Before
== 742 tests, 312 stderr failures, 93 stdout failures, 0 stderrB failures, 0 stdoutB failures, 4 post failures ==

After
== 748 tests, 293 stderr failures, 71 stdout failures, 0 stderrB failures, 0 stdoutB failures, 4 post failures ==

coregrind/fixup_macho_loadcmds.c
coregrind/m_syswrap/priv_syswrap-darwin.h
coregrind/m_syswrap/syswrap-amd64-darwin.c
coregrind/m_syswrap/syswrap-darwin.c
include/vki/vki-darwin.h
include/vki/vki-scnums-darwin.h

index cdb3622a5066c6240d8d0271b389c52316820420..1a5cdf62adad3eda55e5880e721f19c620942248 100644 (file)
@@ -440,6 +440,10 @@ void modify_macho_loadcmds ( HChar* filename,
                if (DEBUGPRINTING)
                   printf("LC_UNIXTHREAD");
                break;
+            case LC_SOURCE_VERSION:
+               if (DEBUGPRINTING)
+                  printf("LC_SOURCE_VERSION");
+               break;
             default:
                if (DEBUGPRINTING)
                   printf("???");
index c2dd3507f07e2b5955ca2cebdd01a68634101b1d..ae1c36761e9fa90e5e93a90cd6cf2f3c6418e6e2 100644 (file)
@@ -225,7 +225,11 @@ DECL_TEMPLATE(darwin, gethostuuid);             // 142
 DECL_TEMPLATE(darwin, mount);                   // 167
 // old ustat
 DECL_TEMPLATE(darwin, csops);                   // 169
+#if DARWIN_VERS >= DARWIN_10_8
+DECL_TEMPLATE(darwin, csops_audittoken);        // 170
+#else
 // old table
+#endif
 // old wait3
 // old rpause
 // NYI waitid 173
@@ -290,7 +294,9 @@ DECL_TEMPLATE(darwin, exchangedata);            // 223
 // NYI searchfs 225
 // GEN delete 226
 // NYI copyfile 226
-// 228
+#if DARWIN_VERS >= DARWIN_10_6
+DECL_TEMPLATE(darwin, fgetattrlist);            // 228
+#endif
 // 229
 // GEN poll 230
 DECL_TEMPLATE(darwin, watchevent);              // 231
@@ -471,7 +477,7 @@ DECL_TEMPLATE(darwin, __thread_selfid);         // 372
 DECL_TEMPLATE(darwin, kevent_qos);              // 374
 #endif /* DARWIN_VERS >= DARWIN_10_11 */
 #if DARWIN_VERS >= DARWIN_10_13
-// NYI kevent_id                                // 375
+DECL_TEMPLATE(darwin, kevent_id);               // 375
 #endif /* DARWIN_VERS >= DARWIN_10_13 */
 // 376
 // 377
@@ -635,8 +641,8 @@ DECL_TEMPLATE(darwin, ulock_wake);                  // 516
 // NYI fclonefileat                                 // 517
 // NYI fs_snapshot                                  // 518
 // 519
-// NYI terminate_with_payload                       // 520
-// NYI abort_with_payload                           // 521
+DECL_TEMPLATE(darwin, terminate_with_payload);      // 520
+DECL_TEMPLATE(darwin, abort_with_payload);          // 521
 #endif /* DARWIN_VERS >= DARWIN_10_12 */
 #if DARWIN_VERS >= DARWIN_10_13
 // NYI necp_session_open                            // 522
@@ -765,7 +771,7 @@ DECL_TEMPLATE(darwin, task_for_pid);
 DECL_TEMPLATE(darwin, pid_for_task);
 
 #if DARWIN_VERS >= DARWIN_10_13
-// NYI thread_get_special_reply_port                // 50
+DECL_TEMPLATE(darwin, thread_get_special_reply_port);
 #endif /* DARWIN_VERS >= DARWIN_10_13 */
 
 #if DARWIN_VERS >= DARWIN_10_12
@@ -825,6 +831,7 @@ extern void wqthread_hijack(Addr self, Addr kport, Addr stackaddr, Addr workitem
 extern Addr pthread_starter;
 extern Addr wqthread_starter;
 extern SizeT pthread_structsize;
+extern SizeT pthread_tsd_offset;
 
 
 #endif
index 5b70e8377cb17cf1a95f74674d17a05c8d76d24c..6227352eee920c554601f503eb139f204eb90ee7 100644 (file)
@@ -361,6 +361,9 @@ void pthread_hijack(Addr self, Addr kport, Addr func, Addr func_arg,
    vex->guest_R8  = stacksize;
    vex->guest_R9  = flags;
    vex->guest_RSP = sp;
+#if DARWIN_VERS >= DARWIN_10_12
+   vex->guest_GS_CONST = self + pthread_tsd_offset;
+#endif
 
    // Record thread's stack and Mach port and pthread struct
    tst->os_state.pthread = self;
index d6d18ff21dd93e41a863259bb1afcee0c7321ad9..cc54486bab5213a29ec5aedebc002b7c3fc2433d 100644 (file)
@@ -2063,16 +2063,38 @@ POST(kevent64)
 Addr pthread_starter = 0;
 Addr wqthread_starter = 0;
 SizeT pthread_structsize = 0;
+SizeT pthread_tsd_offset = 0;
 
 PRE(bsdthread_register)
 {
+#if DARWIN_VERS >= DARWIN_10_12
+   PRINT("bsdthread_register( %#lx, %#lx, %lu, %#lx, %#lx, %#lx, %#lx )",
+         ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7);
+   PRE_REG_READ7(int,"__bsdthread_register", void *,"threadstart",
+                 void *,"wqthread", size_t,"pthsize",
+                 void *,"stack_addr_hint", void *,"targetconc_ptr",
+                 uint32_t,"dispatchqueue_offset", uint32_t,"tsd_offset");
+#else
    PRINT("bsdthread_register( %#lx, %#lx, %lu )", ARG1, ARG2, ARG3);
    PRE_REG_READ3(int,"__bsdthread_register", void *,"threadstart", 
                  void *,"wqthread", size_t,"pthsize");
+#endif
 
    pthread_starter = ARG1;
    wqthread_starter = ARG2;
    pthread_structsize = ARG3;
+   #if DARWIN_VERS >= DARWIN_10_12
+     typedef struct {
+       uint64_t version;
+       uint64_t dispatch_queue_offset;
+       uint64_t main_qos;
+       uint32_t tsd_offset;
+       uint32_t return_to_kernel_offset;
+       uint32_t mach_thread_self_offset;
+     } __attribute__ ((packed)) _pthread_registration_data;
+
+     pthread_tsd_offset = ((_pthread_registration_data*) ARG4)->tsd_offset;
+   #endif
    ARG1 = (Word)&pthread_hijack_asm;
    ARG2 = (Word)&wqthread_hijack_asm;
 }
@@ -2203,13 +2225,10 @@ PRE(__mac_syscall)
 PRE(exit)
 {
    ThreadId     t;
-   ThreadState* tst;
 
    PRINT("darwin exit( %ld )", SARG1);
    PRE_REG_READ1(void, "exit", int, status);
 
-   tst = VG_(get_ThreadState)(tid);
-
    /* A little complex; find all the threads with the same threadgroup
       as this one (including this one), and mark them to exit */
    for (t = 1; t < VG_N_THREADS; t++) {
@@ -3079,38 +3098,38 @@ static void scan_attrlist(ThreadId tid, struct vki_attrlist *attrList,
 #if DARWIN_VERS >= DARWIN_10_6
       { ATTR_CMN_RETURNED_ATTRS,  sizeof(attribute_set_t) }, 
 #endif
-      { ATTR_CMN_NAME,            -1 }, 
-      { ATTR_CMN_DEVID,           sizeof(dev_t) }, 
-      { ATTR_CMN_FSID,            sizeof(fsid_t) }, 
-      { ATTR_CMN_OBJTYPE,         sizeof(fsobj_type_t) }, 
-      { ATTR_CMN_OBJTAG,          sizeof(fsobj_tag_t) }, 
-      { ATTR_CMN_OBJID,           sizeof(fsobj_id_t) }, 
-      { ATTR_CMN_OBJPERMANENTID,  sizeof(fsobj_id_t) }, 
-      { ATTR_CMN_PAROBJID,        sizeof(fsobj_id_t) }, 
-      { ATTR_CMN_SCRIPT,          sizeof(text_encoding_t) }, 
-      { ATTR_CMN_CRTIME,          sizeof(struct timespec) }, 
-      { ATTR_CMN_MODTIME,         sizeof(struct timespec) }, 
-      { ATTR_CMN_CHGTIME,         sizeof(struct timespec) }, 
-      { ATTR_CMN_ACCTIME,         sizeof(struct timespec) }, 
-      { ATTR_CMN_BKUPTIME,        sizeof(struct timespec) }, 
-      { ATTR_CMN_FNDRINFO,        32 /*FileInfo+ExtendedFileInfo, or FolderInfo+ExtendedFolderInfo*/ }, 
-      { ATTR_CMN_OWNERID,         sizeof(uid_t) }, 
-      { ATTR_CMN_GRPID,           sizeof(gid_t) }, 
-      { ATTR_CMN_ACCESSMASK,      sizeof(uint32_t) }, 
-      { ATTR_CMN_NAMEDATTRCOUNT,  sizeof(uint32_t) }, 
-      { ATTR_CMN_NAMEDATTRLIST,   -1 }, 
-      { ATTR_CMN_FLAGS,           sizeof(uint32_t) }, 
-      { ATTR_CMN_USERACCESS,      sizeof(uint32_t) }, 
-      { ATTR_CMN_EXTENDED_SECURITY, -1 }, 
-      { ATTR_CMN_UUID,            sizeof(guid_t) }, 
-      { ATTR_CMN_GRPUUID,         sizeof(guid_t) }, 
-      { ATTR_CMN_FILEID,          sizeof(uint64_t) }, 
-      { ATTR_CMN_PARENTID,        sizeof(uint64_t) }, 
+      { ATTR_CMN_NAME,            -1 },
+      { ATTR_CMN_DEVID,           sizeof(dev_t) },
+      { ATTR_CMN_FSID,            sizeof(fsid_t) },
+      { ATTR_CMN_OBJTYPE,         sizeof(fsobj_type_t) },
+      { ATTR_CMN_OBJTAG,          sizeof(fsobj_tag_t) },
+      { ATTR_CMN_OBJID,           sizeof(fsobj_id_t) },
+      { ATTR_CMN_OBJPERMANENTID,  sizeof(fsobj_id_t) },
+      { ATTR_CMN_PAROBJID,        sizeof(fsobj_id_t) },
+      { ATTR_CMN_SCRIPT,          sizeof(text_encoding_t) },
+      { ATTR_CMN_CRTIME,          sizeof(struct timespec) },
+      { ATTR_CMN_MODTIME,         sizeof(struct timespec) },
+      { ATTR_CMN_CHGTIME,         sizeof(struct timespec) },
+      { ATTR_CMN_ACCTIME,         sizeof(struct timespec) },
+      { ATTR_CMN_BKUPTIME,        sizeof(struct timespec) },
+      { ATTR_CMN_FNDRINFO,        32 /*FileInfo+ExtendedFileInfo, or FolderInfo+ExtendedFolderInfo*/ },
+      { ATTR_CMN_OWNERID,         sizeof(uid_t) },
+      { ATTR_CMN_GRPID,           sizeof(gid_t) },
+      { ATTR_CMN_ACCESSMASK,      sizeof(uint32_t) },
+      { ATTR_CMN_NAMEDATTRCOUNT,  sizeof(uint32_t) },
+      { ATTR_CMN_NAMEDATTRLIST,   -1 },
+      { ATTR_CMN_FLAGS,           sizeof(uint32_t) },
+      { ATTR_CMN_USERACCESS,      sizeof(uint32_t) },
+      { ATTR_CMN_EXTENDED_SECURITY, -1 },
+      { ATTR_CMN_UUID,            sizeof(guid_t) },
+      { ATTR_CMN_GRPUUID,         sizeof(guid_t) },
+      { ATTR_CMN_FILEID,          sizeof(uint64_t) },
+      { ATTR_CMN_PARENTID,        sizeof(uint64_t) },
 #if DARWIN_VERS >= DARWIN_10_6
       { ATTR_CMN_FULLPATH,        -1 }, 
 #endif
 #if DARWIN_VERS >= DARWIN_10_8
-      { ATTR_CMN_ADDEDTIME,       -1 }, 
+      { ATTR_CMN_ADDEDTIME,       -1 },
 #endif
       { 0,                        0 }
    };
@@ -3138,14 +3157,14 @@ static void scan_attrlist(ThreadId tid, struct vki_attrlist *attrList,
 #if DARWIN_VERS >= DARWIN_10_6
       { ATTR_VOL_UUID,            sizeof(uuid_t) }, 
 #endif
-      { ATTR_VOL_ATTRIBUTES,      sizeof(vol_attributes_attr_t) }, 
+      { ATTR_VOL_ATTRIBUTES,      sizeof(vol_attributes_attr_t) },
       { 0,                        0 }
    };
    static const attrspec dirattr[] = {
       // This order is important.
-      { ATTR_DIR_LINKCOUNT,       sizeof(uint32_t) }, 
-      { ATTR_DIR_ENTRYCOUNT,      sizeof(uint32_t) }, 
-      { ATTR_DIR_MOUNTSTATUS,     sizeof(uint32_t) }, 
+      { ATTR_DIR_LINKCOUNT,       sizeof(uint32_t) },
+      { ATTR_DIR_ENTRYCOUNT,      sizeof(uint32_t) },
+      { ATTR_DIR_MOUNTSTATUS,     sizeof(uint32_t) },
       { 0,                        0 }
    };
    static const attrspec fileattr[] = {
@@ -3169,8 +3188,8 @@ static void scan_attrlist(ThreadId tid, struct vki_attrlist *attrList,
    };
    static const attrspec forkattr[] = {
       // This order is important.
-      { ATTR_FORK_TOTALSIZE,      sizeof(off_t) }, 
-      { ATTR_FORK_ALLOCSIZE,      sizeof(off_t) }, 
+      { ATTR_FORK_TOTALSIZE,      sizeof(off_t) },
+      { ATTR_FORK_ALLOCSIZE,      sizeof(off_t) },
       { 0,                        0 }
    };
 
@@ -8416,10 +8435,10 @@ PRE(mach_msg)
    // mach_port_t rcv_name = (mach_port_t)ARG5;
    size_t complex_header_size = 0;
 
-   PRE_REG_READ7(long, "mach_msg", 
-                 mach_msg_header_t*,"msg", mach_msg_option_t,"option", 
-                 mach_msg_size_t,"send_size", mach_msg_size_t,"rcv_size", 
-                 mach_port_t,"rcv_name", mach_msg_timeout_t,"timeout", 
+   PRE_REG_READ7(long, "mach_msg",
+                 mach_msg_header_t*,"msg", mach_msg_option_t,"option",
+                 mach_msg_size_t,"send_size", mach_msg_size_t,"rcv_size",
+                 mach_port_t,"rcv_name", mach_msg_timeout_t,"timeout",
                  mach_port_t,"notify");
 
    // Assume default POST handler until specified otherwise
@@ -9316,6 +9335,31 @@ POST(audit_session_self)
   PRINT("audit-session %#lx", RES);
 }
 
+PRE(fgetattrlist)
+{
+   PRINT("fgetattrlist(%ld, %#lx, %#lx, %lu, %lu)",
+         ARG1, ARG2, ARG3, ARG4, ARG5);
+   PRE_REG_READ5(int, "fgetattrlist",
+                 int,fd, struct vki_attrlist *,attrList,
+                 void *,attrBuf, vki_size_t,attrBufSize, unsigned int,options);
+   PRE_MEM_READ("fgetattrlist(attrList)", ARG2, sizeof(struct vki_attrlist));
+   PRE_MEM_WRITE("fgetattrlist(attrBuf)", ARG3, ARG4);
+}
+POST(fgetattrlist)
+{
+   if (ARG4 > sizeof(vki_uint32_t)) {
+      // attrBuf is uint32_t size followed by attr data
+      vki_uint32_t *sizep = (vki_uint32_t *)ARG3;
+      POST_MEM_WRITE(ARG3, sizeof(vki_uint32_t));
+      if (ARG5 & FSOPT_REPORT_FULLSIZE) {
+         // *sizep is bytes required for return value, including *sizep
+      } else {
+         // *sizep is actual bytes returned, including *sizep
+      }
+      scan_attrlist(tid, (struct vki_attrlist *)ARG2, sizep+1, MIN(*sizep, ARG4), &get1attr);
+   }
+}
+
 #endif /* DARWIN_VERS >= DARWIN_10_6 */
 
 
@@ -9589,6 +9633,37 @@ POST(process_policy)
    // munge_???
 }
 
+PRE(csops_audittoken)
+{
+  PRINT("csops_audittoken(%ld, %#lx, %#lx, %lu, %#lx)", SARG1, ARG2, ARG3, ARG4, ARG5);
+  PRE_REG_READ5(int, "csops_audittoken",
+    vki_pid_t, pid, uint32_t, ops,
+    void *, useraddr, vki_size_t, usersize, void *, uaudittoken);
+
+  if (ARG5 == 0) {
+    SET_STATUS_Failure( VKI_EINVAL );
+    return;
+  }
+
+  PRE_MEM_WRITE( "csops_audittoken(useraddr)", ARG3, ARG4 );
+
+  // If the pid is ours, don't mark the program as KILL or HARD
+  // Maybe we should keep track of this for later calls to STATUS
+  if (!ARG1 || VG_(getpid)() == ARG1) {
+    switch (ARG2) {
+    case VKI_CS_OPS_MARKINVALID:
+    case VKI_CS_OPS_MARKHARD:
+    case VKI_CS_OPS_MARKKILL:
+        SET_STATUS_Success(0);
+    }
+  }
+}
+
+POST(csops_audittoken)
+{
+   POST_MEM_WRITE( ARG3, ARG4 );
+}
+
 #endif /* DARWIN_VERS >= DARWIN_10_8 */
 
 
@@ -9771,18 +9846,35 @@ POST(getattrlistbulk)
 
 PRE(faccessat)
 {
-    PRINT("faccessat(FIXME)(fd:%ld, path:%#lx(%s), amode:%#lx, flag:%#lx)",
-        ARG1, ARG2, (HChar*)ARG2, ARG3, ARG4);
+    uint32_t fd = ARG1;
+    PRINT("faccessat(fd:%d, path:%#lx(%s), amode:%#lx, flag:%#lx)",
+          fd, ARG2, ARG2 ? (HChar*)ARG2 : "null", ARG3, ARG4);
     PRE_REG_READ4(int, "faccessat",
                   int, fd, user_addr_t, path, int, amode, int, flag);
+
+    if (fd != VKI_AT_FDCWD && !ML_(fd_allowed)(fd, "faccessat", tid, False)) {
+      SET_STATUS_Failure( VKI_EBADF );
+    }
+    PRE_MEM_RASCIIZ( "faccessat(path)", ARG2 );
 }
 
 PRE(fstatat64)
 {
-    PRINT("fstatat64(FIXME)(fd:%ld, path:%#lx(%s), ub:%#lx, flag:%#lx)",
-        ARG1, ARG2, (HChar*)ARG2, ARG3, ARG4);
+    uint32_t fd = ARG1;
+    PRINT("fstatat64(fd:%d, path:%#lx(%s), ub:%#lx, flag:%#lx)",
+          fd, ARG2, ARG2 ? (HChar*)ARG2 : "null", ARG3, ARG4);
     PRE_REG_READ4(int, "fstatat64",
                   int, fd, user_addr_t, path, user_addr_t, ub, int, flag);
+
+    if (fd != VKI_AT_FDCWD && !ML_(fd_allowed)(fd, "fstatat64", tid, False)) {
+      SET_STATUS_Failure( VKI_EBADF );
+    }
+    PRE_MEM_RASCIIZ( "fstatat64(path)", ARG2 );
+    PRE_MEM_WRITE( "fstatat64(ub)", ARG3, sizeof(struct vki_stat64) );
+}
+POST(fstatat64)
+{
+    POST_MEM_WRITE( ARG3, sizeof(struct vki_stat64) );
 }
 
 PRE(readlinkat)
@@ -10003,9 +10095,15 @@ PRE(pselect)
 
 PRE(getentropy)
 {
-    PRINT("getentropy(buffer:%#lx, size:%ld) FIXME", ARG1, ARG2);
+    PRINT("getentropy(buffer:%#lx, size:%ld)", ARG1, ARG2);
     PRE_REG_READ2(int, "getentropy",
                   void*, buffer, size_t, size);
+    PRE_MEM_WRITE( "getentropy(buffer)", ARG1, ARG2 );
+}
+POST(getentropy)
+{
+    vg_assert(SUCCESS);
+    POST_MEM_WRITE( ARG1, ARG2 );
 }
 
 static const HChar *ulop_name(int op)
@@ -10019,10 +10117,29 @@ static const HChar *ulop_name(int op)
 
 PRE(ulock_wake)
 {
-    PRINT("ulock_wake(operation:%ld, addr:%#lx, wake_value:%ld) FIXME",
-        ARG1, ARG2, ARG3);
+        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);
+     if (ul_flags & VKI_ULF_WAKE_THREAD) {
+       PRINT("ulock_wake(operation:%s (flags: %#x), addr:%#lx, wake_value:%s)",
+             name, ul_flags, ARG2, name_for_port(ARG3));
+     } else {
+       PRINT("ulock_wake(operation:%s (flags: %#x), addr:%#lx, wake_value:%ld /*unused*/)",
+             name, ul_flags, ARG2, ARG3);
+     }
     PRE_REG_READ3(int, "ulock_wake",
                   uint32_t, operation, void*, addr, uint64_t, wake_value);
+     break;
+}
+
+   default:
+      PRINT("ulock_wake(operation:%ld (opcode: %u [??], flags: %#x), addr:%#lx, wake_value:%ld)", ARG1, ul_opcode, ul_flags, ARG2, ARG3);
+      log_decaying("UNKNOWN ulock_wake %ld (opcode: %u [??], flags: %#x)!", ARG1, ul_opcode, ul_flags);
+      break;
+   }
 }
 
 PRE(ulock_wait)
@@ -10047,14 +10164,47 @@ PRE(ulock_wait)
       log_decaying("UNKNOWN ulock_wait %ld (opcode: %u [??], flags: %#x)!", ARG1, ul_opcode, ul_flags);
       break;
     }
+
+    *flags |= SfMayBlock;
+}
+
+PRE(terminate_with_payload)
+{
+    PRINT("terminate_with_payload"
+          "(pid: %ld, reason_namespace:%ld, reason_code:%ld, payload:%#lx, payload_size:%ld, reason_string:%s, reason_flags:%#x)",
+          ARG1, ARG2, ARG3, ARG4, ARG5, (char*)ARG6, (uint)ARG7);
+    PRE_REG_READ7(int, "terminate_with_payload", int, pid,
+                  uint32_t, reason_namespace, uint64_t, reason_code, void*, payload,
+                  uint32_t, payload_size, const char*, reason_string, uint64_t, reason_flags);
+    PRE_MEM_READ("abort_with_payload(payload)", ARG4, ARG5);
+    PRE_MEM_RASCIIZ("abort_with_payload(reason_string)", ARG6);
+}
+
+PRE(abort_with_payload)
+{
+    PRINT("abort_with_payload"
+          "(reason_namespace:%ld, reason_code:%ld, payload:%#lx, payload_size:%ld, reason_string:%s, reason_flags:%#x)",
+          ARG1, ARG2, ARG3, ARG4, (char*)ARG5, (uint)ARG6);
+    PRE_REG_READ6(uint32_t, "abort_with_payload",
+                  uint32_t, reason_namespace, uint64_t, reason_code, void*, payload,
+                  uint32_t, payload_size, const char*, reason_string, uint64_t, reason_flags);
+    PRE_MEM_READ("abort_with_payload(payload)", ARG3, ARG4);
+    PRE_MEM_RASCIIZ("abort_with_payload(reason_string)", ARG5);
 }
 
 PRE(host_create_mach_voucher_trap)
 {
     // munge_wwww -- no need to call helper
     PRINT("host_create_mach_voucher_trap"
-        "(host:%#lx, recipes:%#lx, recipes_size:%ld, voucher:%#lx) FIXME",
-        ARG1, ARG2, ARG3, ARG4);
+        "(host:%s, recipes:%#lx, recipes_size:%ld, voucher:%#lx)",
+        name_for_port(ARG1), ARG2, ARG3, ARG4);
+    PRE_MEM_READ( "host_create_mach_voucher_trap(recipes)", ARG2, ARG3 );
+    PRE_MEM_WRITE( "host_create_mach_voucher_trap(voucher)", ARG4, sizeof(mach_port_name_t) );
+}
+POST(host_create_mach_voucher_trap)
+{
+  vg_assert(SUCCESS);
+  POST_MEM_WRITE( ARG4, sizeof(mach_port_name_t) );
 }
 
 PRE(task_register_dyld_image_infos)
@@ -10207,6 +10357,49 @@ POST(openat_nocancel)
    }
 }
 
+PRE(kevent_id)
+{
+  PRINT("kevent_id(id:%ld, changelist:%#lx, nchanges:%ld, eventlist:%#lx, nevents:%ld, data_out:%#lx, data_available:%ld, flags:%lx)",
+        ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8);
+  PRE_REG_READ8(int,"kevent_id",
+                uint64_t,id,
+                const struct vki_kevent_qos_s *,changelist,
+                int,nchanges,
+                struct vki_kevent_qos_s *,eventlist,
+                int,nevents,
+                void*,data_out,
+                size_t*,data_available,
+                unsigned int,flags);
+
+  if (ARG3) PRE_MEM_READ ("kevent_id(changelist)",
+                          ARG2, ARG3 * sizeof(struct vki_kevent_qos_s));
+  if (ARG5) PRE_MEM_WRITE("kevent_id(eventlist)",
+                          ARG4, ARG5 * sizeof(struct vki_kevent_qos_s));
+  if (ARG7) PRE_MEM_WRITE ("kevent_id(data_out)",
+                          ARG6, ARG7 * sizeof(void*));
+
+  *flags |= SfMayBlock;
+}
+
+POST(kevent_id)
+{
+   PRINT("kevent_id ret %ld dst %#lx (%zu)", RES, ARG4, sizeof(struct vki_kevent_qos_s));
+   if (RES > 0) {
+      POST_MEM_WRITE(ARG4, RES * sizeof(struct vki_kevent_qos_s));
+   }
+}
+
+PRE(thread_get_special_reply_port)
+{
+   PRINT("thread_get_special_reply_port()");
+}
+
+POST(thread_get_special_reply_port)
+{
+   record_named_port(tid, RES, MACH_PORT_RIGHT_RECEIVE, "special-reply-%p");
+   PRINT("special reply port %s", name_for_port(RES));
+}
+
 #endif /* DARWIN_VERS >= DARWIN_10_13 */
 
 /* ---------------------------------------------------------------------
@@ -10407,7 +10600,11 @@ const SyscallTableEntry ML_(syscall_table)[] = {
    MACX_(__NR_mount,       mount), 
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(168)),   // old ustat
    MACXY(__NR_csops,       csops),                 // code-signing ops
+#if DARWIN_VERS >= DARWIN_10_8
+   MACXY(__NR_csops_audittoken, csops_audittoken), // 170
+#else
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(170)),   // old table
+#endif
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(171)),   // old wait3
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(172)),   // old rpause
 // _____(__NR_waitid), 
@@ -10475,8 +10672,8 @@ const SyscallTableEntry ML_(syscall_table)[] = {
    GENX_(__NR_delete,      sys_unlink), 
 // _____(__NR_copyfile), 
 #if DARWIN_VERS >= DARWIN_10_6
-// _____(__NR_fgetattrlist), 
-// _____(__NR_fsetattrlist), 
+   MACX_(__NR_fgetattrlist, fgetattrlist), // 228
+// _____(__NR_fsetattrlist),
 #else
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(228)),   // ?? 
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(229)),   // ?? 
@@ -10545,15 +10742,15 @@ const SyscallTableEntry ML_(syscall_table)[] = {
 #if DARWIN_VERS >= DARWIN_10_8
    MACX_(__NR_gettid, gettid),  // 286
 #endif
-// _____(__NR_setsgroups), 
-// _____(__NR_getsgroups), 
-// _____(__NR_setwgroups), 
-// _____(__NR_getwgroups), 
-// _____(__NR_mkfifo_extended), 
-// _____(__NR_mkdir_extended), 
-// _____(__NR_identitysvc), 
-// _____(__NR_shared_region_check_np), 
-// _____(__NR_shared_region_map_np), 
+// _____(__NR_setsgroups),
+// _____(__NR_getsgroups),
+// _____(__NR_setwgroups),
+// _____(__NR_getwgroups),
+// _____(__NR_mkfifo_extended),
+// _____(__NR_mkdir_extended),
+// _____(__NR_identitysvc),
+// _____(__NR_shared_region_check_np),
+// _____(__NR_shared_region_map_np),
 #if DARWIN_VERS >= DARWIN_10_6
 // _____(__NR_vm_pressure_monitor), 
 // _____(__NR_psynch_rw_longrdlock), 
@@ -10592,13 +10789,13 @@ const SyscallTableEntry ML_(syscall_table)[] = {
 #else
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(308)),   // old __pthread_cond_timedwait
 #endif
-// _____(__NR_aio_fsync), 
+// _____(__NR_aio_fsync),
    MACX_(__NR_aio_return,     aio_return),
-   MACX_(__NR_aio_suspend,    aio_suspend), 
-// _____(__NR_aio_cancel), 
-   MACX_(__NR_aio_error,      aio_error), 
-   MACXY(__NR_aio_read,       aio_read), 
-   MACX_(__NR_aio_write,      aio_write), 
+   MACX_(__NR_aio_suspend,    aio_suspend),
+// _____(__NR_aio_cancel),
+   MACX_(__NR_aio_error,      aio_error),
+   MACXY(__NR_aio_read,       aio_read),
+   MACX_(__NR_aio_write,      aio_write),
 // _____(__NR_lio_listio),   // 320
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(321)),   // ???
 
@@ -10614,10 +10811,10 @@ const SyscallTableEntry ML_(syscall_table)[] = {
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(326)),   // ???
    MACX_(__NR_issetugid,               issetugid), 
    MACX_(__NR___pthread_kill,          __pthread_kill),
-   MACX_(__NR___pthread_sigmask,       __pthread_sigmask), 
+   MACX_(__NR___pthread_sigmask,       __pthread_sigmask),
    MACXY(__NR___sigwait,               __sigwait),  // 330
-   MACX_(__NR___disable_threadsignal,  __disable_threadsignal), 
-   MACX_(__NR___pthread_markcancel,    __pthread_markcancel), 
+   MACX_(__NR___disable_threadsignal,  __disable_threadsignal),
+   MACX_(__NR___pthread_markcancel,    __pthread_markcancel),
    MACX_(__NR___pthread_canceled,      __pthread_canceled),
    MACX_(__NR___semwait_signal,        __semwait_signal), 
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(335)),   // old utrace
@@ -10670,7 +10867,9 @@ const SyscallTableEntry ML_(syscall_table)[] = {
 #if DARWIN_VERS < DARWIN_10_11
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(374)),   // ???
 #endif
+#if DARWIN_VERS < DARWIN_10_13
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(375)),   // ???
+#endif
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(376)),   // ???
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(377)),   // ???
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(378)),   // ???
@@ -10756,10 +10955,10 @@ const SyscallTableEntry ML_(syscall_table)[] = {
    MACXY(__NR_openat_nocancel,     openat_nocancel),    // 464
 #endif
    MACX_(__NR_faccessat,           faccessat),          // 466
-   MACX_(__NR_fstatat64,           fstatat64),          // 470
+   MACXY(__NR_fstatat64,           fstatat64),          // 470
    MACX_(__NR_readlinkat,          readlinkat),         // 473
    MACX_(__NR_bsdthread_ctl,       bsdthread_ctl),      // 478
-   MACX_(__NR_csrctl,              csrctl),             // 483
+   MACXY(__NR_csrctl,              csrctl),             // 483
    MACX_(__NR_guarded_open_dprotected_np, guarded_open_dprotected_np),  // 484
    MACX_(__NR_guarded_write_np, guarded_write_np),      // 485
    MACX_(__NR_guarded_pwrite_np, guarded_pwrite_np),    // 486
@@ -10785,7 +10984,7 @@ const SyscallTableEntry ML_(syscall_table)[] = {
 // _____(__NR_kdebug_typefilter),                       // 177
 // _____(__NR_clonefileat),                             // 462
 // _____(__NR_renameatx_np),                            // 488
-   MACX_(__NR_getentropy, getentropy),                  // 500
+   MACXY(__NR_getentropy, getentropy),                  // 500
 // _____(__NR_necp_open),                               // 501
 // _____(__NR_necp_client_action),                      // 502
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(503)),        // ???
@@ -10805,12 +11004,12 @@ const SyscallTableEntry ML_(syscall_table)[] = {
 // _____(__NR_fclonefileat),                            // 517
 // _____(__NR_fs_snapshot),                             // 518
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(519)),        // ???
-// _____(__NR_terminate_with_payload),                  // 520
-// _____(__NR_abort_with_payload),                      // 521
+   MACX_(__NR_terminate_with_payload, terminate_with_payload), // 520
+   MACX_(__NR_abort_with_payload, abort_with_payload),  // 521
 #endif
 #if DARWIN_VERS >= DARWIN_10_13
 // _____(__NR_thread_selfcounts),                       // 186
-// _____(__NR_kevent_id,                                // 375
+  MACXY(__NR_kevent_id, kevent_id),                     // 375
 // _____(__NR_necp_session_open),                       // 522
 // _____(__NR_necp_session_action),                     // 523
 // _____(__NR_setattrlistat),                           // 524
@@ -10898,20 +11097,20 @@ const SyscallTableEntry ML_(mach_trap_table)[] = {
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(25)),
 #  endif
 
-   MACXY(__NR_mach_reply_port, mach_reply_port), 
-   MACXY(__NR_thread_self_trap, mach_thread_self), 
-   MACXY(__NR_task_self_trap, mach_task_self), 
-   MACXY(__NR_host_self_trap, mach_host_self), 
-   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(30)), 
-   MACXY(__NR_mach_msg_trap, mach_msg), 
-// _____(__NR_mach_msg_overwrite_trap), 
-   MACX_(__NR_semaphore_signal_trap, semaphore_signal), 
-   MACX_(__NR_semaphore_signal_all_trap, semaphore_signal_all), 
-   MACX_(__NR_semaphore_signal_thread_trap, semaphore_signal_thread), 
-   MACX_(__NR_semaphore_wait_trap, semaphore_wait), 
-   MACX_(__NR_semaphore_wait_signal_trap, semaphore_wait_signal), 
-   MACX_(__NR_semaphore_timedwait_trap, semaphore_timedwait), 
-   MACX_(__NR_semaphore_timedwait_signal_trap, semaphore_timedwait_signal), 
+   MACXY(__NR_mach_reply_port, mach_reply_port),
+   MACXY(__NR_thread_self_trap, mach_thread_self),
+   MACXY(__NR_task_self_trap, mach_task_self),
+   MACXY(__NR_host_self_trap, mach_host_self),
+   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(30)),
+   MACXY(__NR_mach_msg_trap, mach_msg),
+// _____(__NR_mach_msg_overwrite_trap),
+   MACX_(__NR_semaphore_signal_trap, semaphore_signal),
+   MACX_(__NR_semaphore_signal_all_trap, semaphore_signal_all),
+   MACX_(__NR_semaphore_signal_thread_trap, semaphore_signal_thread),
+   MACX_(__NR_semaphore_wait_trap, semaphore_wait),
+   MACX_(__NR_semaphore_wait_signal_trap, semaphore_wait_signal),
+   MACX_(__NR_semaphore_timedwait_trap, semaphore_timedwait),
+   MACX_(__NR_semaphore_timedwait_signal_trap, semaphore_timedwait_signal),
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(40)),    // -40
 
 #  if DARWIN_VERS >= DARWIN_10_9
@@ -10932,19 +11131,19 @@ const SyscallTableEntry ML_(mach_trap_table)[] = {
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(43)),
 #  endif
 
-// _____(__NR_task_name_for_pid), 
-   MACXY(__NR_task_for_pid, task_for_pid), 
-   MACXY(__NR_pid_for_task, pid_for_task), 
-   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(47)), 
+// _____(__NR_task_name_for_pid),
+   MACXY(__NR_task_for_pid, task_for_pid),
+   MACXY(__NR_pid_for_task, pid_for_task),
+   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(47)),
 #if defined(VGA_x86)
-// _____(__NR_macx_swapon), 
-// _____(__NR_macx_swapoff), 
+// _____(__NR_macx_swapon),
+// _____(__NR_macx_swapoff),
 #else
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(48)),
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(49)),
 #endif
 #if DARWIN_VERS >= DARWIN_10_13
-// _____(__NR_thread_get_special_reply_port,            // 50
+   MACXY(__NR_thread_get_special_reply_port, thread_get_special_reply_port),
 #else
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(50)), 
 #endif /* DARWIN_VERS >= DARWIN_10_13 */
@@ -10974,19 +11173,19 @@ const SyscallTableEntry ML_(mach_trap_table)[] = {
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(68)), 
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(69)),
 #if DARWIN_VERS >= DARWIN_10_12
-   MACX_(__NR_host_create_mach_voucher_trap, host_create_mach_voucher_trap),
-#else 
-   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(70)), 
+   MACXY(__NR_host_create_mach_voucher_trap, host_create_mach_voucher_trap),
+#else
+   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(70)),
 #endif
-   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(71)), 
-   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(72)), 
-   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(73)), 
-   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(74)), 
-   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(75)), 
-   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(76)), 
-   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(77)), 
-   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(78)), 
-   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(79)), 
+   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(71)),
+   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(72)),
+   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(73)),
+   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(74)),
+   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(75)),
+   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(76)),
+   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(77)),
+   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(78)),
+   _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(79)),
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(80)),   // -80
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(81)), 
    _____(VG_DARWIN_SYSCALL_CONSTRUCT_MACH(82)), 
index 392558fc89de3a2c9205e2a5a1f0db2128aeb329..4be0f5f97900cd3f65a5fbef150a6e3286696887 100644 (file)
@@ -1146,6 +1146,10 @@ struct vki_necp_aggregate_result {
 // ulock_wake & ulock_wait flags
 #define ULF_NO_ERRNO            0x01000000
 
+// ulock_wake flags
+#define VKI_ULF_WAKE_ALL          0x00000100
+#define VKI_ULF_WAKE_THREAD       0x00000200
+
 // ulock_wait flags
 #define WKI_ULF_WAIT_WORKQ_DATA_CONTENTION     0x00010000
 #endif /* DARWIN_VERS >= DARWIN_10_12 */
index 3aa35d1fc66df398b7c7c30eddf85f4584f9a402..2abc8aea8b302907a99a2cc36ce48c02c27ad179 100644 (file)
 #define        __NR_mount          VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(167)
                        /* 168  old ustat */
 #define __NR_csops          VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(169)
+#if DARWIN_VERS >= DARWIN_10_8
+#define __NR_csops_audittoken VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(170)
+#else
                        /* 170  old table */
+#endif
                        /* 171  old wait3 */
                        /* 172  old rpause */
 #define        __NR_waitid         VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(173)