From: Paul Floyd Date: Wed, 27 Mar 2024 12:41:37 +0000 (+0100) Subject: Darwin: merge some fixes for macOS up to 10.13 X-Git-Tag: VALGRIND_3_23_0~94 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8796e55e04bc132ba0721e3f5000ef137663c317;p=thirdparty%2Fvalgrind.git Darwin: merge some fixes for macOS up to 10.13 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 == --- diff --git a/coregrind/fixup_macho_loadcmds.c b/coregrind/fixup_macho_loadcmds.c index cdb3622a5..1a5cdf62a 100644 --- a/coregrind/fixup_macho_loadcmds.c +++ b/coregrind/fixup_macho_loadcmds.c @@ -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("???"); diff --git a/coregrind/m_syswrap/priv_syswrap-darwin.h b/coregrind/m_syswrap/priv_syswrap-darwin.h index c2dd3507f..ae1c36761 100644 --- a/coregrind/m_syswrap/priv_syswrap-darwin.h +++ b/coregrind/m_syswrap/priv_syswrap-darwin.h @@ -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 diff --git a/coregrind/m_syswrap/syswrap-amd64-darwin.c b/coregrind/m_syswrap/syswrap-amd64-darwin.c index 5b70e8377..6227352ee 100644 --- a/coregrind/m_syswrap/syswrap-amd64-darwin.c +++ b/coregrind/m_syswrap/syswrap-amd64-darwin.c @@ -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; diff --git a/coregrind/m_syswrap/syswrap-darwin.c b/coregrind/m_syswrap/syswrap-darwin.c index d6d18ff21..cc54486ba 100644 --- a/coregrind/m_syswrap/syswrap-darwin.c +++ b/coregrind/m_syswrap/syswrap-darwin.c @@ -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)), diff --git a/include/vki/vki-darwin.h b/include/vki/vki-darwin.h index 392558fc8..4be0f5f97 100644 --- a/include/vki/vki-darwin.h +++ b/include/vki/vki-darwin.h @@ -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 */ diff --git a/include/vki/vki-scnums-darwin.h b/include/vki/vki-scnums-darwin.h index 3aa35d1fc..2abc8aea8 100644 --- a/include/vki/vki-scnums-darwin.h +++ b/include/vki/vki-scnums-darwin.h @@ -395,7 +395,11 @@ #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)