From a2ca87cf7b8f09b847391d82c49c645368490459 Mon Sep 17 00:00:00 2001 From: Julian Seward Date: Thu, 6 Nov 2014 20:29:01 +0000 Subject: [PATCH] Adds initial support for new syscalls on MacOS X 10.10, including new syscall numbers, and dummy wrappers for bsdthread_ctl and sysctlbyname. Mash up of patches from fxcoudert@gcc.gnu.org and Rhys Kidd (rhyskidd@gmail.com). Part of bug 339045. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14698 --- coregrind/m_syswrap/priv_syswrap-darwin.h | 66 ++++++++++++++++++++-- coregrind/m_syswrap/syswrap-amd64-darwin.c | 7 ++- coregrind/m_syswrap/syswrap-darwin.c | 33 ++++++++++- include/vki/vki-scnums-darwin.h | 14 ++++- 4 files changed, 112 insertions(+), 8 deletions(-) diff --git a/coregrind/m_syswrap/priv_syswrap-darwin.h b/coregrind/m_syswrap/priv_syswrap-darwin.h index 7c94205481..c9e2b59b66 100644 --- a/coregrind/m_syswrap/priv_syswrap-darwin.h +++ b/coregrind/m_syswrap/priv_syswrap-darwin.h @@ -332,7 +332,13 @@ DECL_TEMPLATE(darwin, sem_unlink); // 270 DECL_TEMPLATE(darwin, sem_wait); // 271 DECL_TEMPLATE(darwin, sem_trywait); // 272 DECL_TEMPLATE(darwin, sem_post); // 273 + +#if DARWIN_VERS < DARWIN_10_10 // NYI sem_getvalue 274 +#elif DARWIN_VERS == DARWIN_10_10 +DECL_TEMPLATE(darwin, sysctlbyname); // 274 +#endif + DECL_TEMPLATE(darwin, sem_init); // 275 DECL_TEMPLATE(darwin, sem_destroy); // 276 DECL_TEMPLATE(darwin, open_extended) // 277 @@ -383,7 +389,7 @@ DECL_TEMPLATE(darwin, aio_write); // 319 // NYI lio_listio 320 // NYI __pthread_cond_wait 321 // NYI iopolicysys 322 -// 323 +// NYI process_policy 323 // NYI mlockall 324 // NYI munlockall 325 // 326 @@ -496,6 +502,15 @@ DECL_TEMPLATE(darwin, audit_session_self); // 428 // NYI audit_session_join 429 DECL_TEMPLATE(darwin, fileport_makeport); // 430 +// NYI fileport_makefd 431 +// NYI audit_session_port 432 +// NYI pid_suspend 433 +// NYI pid_resume 434 +#if DARWIN_VERS == DARWIN_10_10 +// NYI pid_hibernate 435 +// NYI pid_shutdown_sockets 436 +#endif /* DARWIN_VERS == DARWIN_10_10 */ +// old old shared_region_slide_np 437 // NYI shared_region_map_and_slide_np // 438 // NYI kas_info // 439 // NYI memorystatus_control // 440 @@ -503,10 +518,53 @@ DECL_TEMPLATE(darwin, guarded_open_np); // 441 DECL_TEMPLATE(darwin, guarded_close_np); // 442 DECL_TEMPLATE(darwin, guarded_kqueue_np); // 443 DECL_TEMPLATE(darwin, change_fdguard_np); // 444 - +// old __proc_suppress 445 // NYI proc_rlimit_control // 446 DECL_TEMPLATE(darwin, connectx); // 447 DECL_TEMPLATE(darwin, disconnectx); // 448 +// NYI peeloff // 449 +// NYI socket_delegate // 450 +// NYI telemetry // 451 +// NYI proc_uuid_policy // 452 +// NYI memorystatus_get_level // 453 +// NYI system_override // 454 +// NYI vfs_purge // 455 +#if DARWIN_VERS == DARWIN_10_10 +// NYI sfi_ctl // 456 +// NYI sfi_pidctl // 457 +// NYI coalition // 458 +// NYI coalition_info // 459 +// NYI necp_match_policy // 460 +// NYI getattrlistbulk // 461 +// 462 +// NYI openat // 463 +// NYI openat_nocancel // 464 +// NYI renameat // 465 +// NYI faccessat // 466 +// NYI fchmodat // 467 +// NYI fchownat // 468 +// NYI fstatat // 469 +// NYI fstatat64 // 470 +// NYI linkat // 471 +// NYI unlinkat // 472 +// NYI readlinkat // 473 +// NYI symlinkat // 474 +// NYI mkdirat // 475 +// NYI getattrlistat // 476 +// NYI proc_trace_log // 477 +DECL_TEMPLATE(darwin, bsdthread_ctl); // 478 +// NYI openbyid_np // 479 +// NYI recvmsg_x // 480 +// NYI sendmsg_x // 481 +// NYI thread_selfusage // 482 +// NYI csrctl // 483 +// NYI guarded_open_dprotected_np // 484 +// NYI guarded_write_np // 485 +// NYI guarded_pwrite_np // 486 +// NYI guarded_writev_np // 487 +// NYI rename_ext // 488 +// NYI mremap_encrypted // 489 +#endif /* DARWIN_VERS == DARWIN_10_10 */ // Mach message helpers DECL_TEMPLATE(darwin, mach_port_set_context); @@ -579,7 +637,7 @@ DECL_TEMPLATE(darwin, mach_msg_task); DECL_TEMPLATE(darwin, mach_msg_thread); // Mach traps -#if DARWIN_VERS == DARWIN_10_8 || DARWIN_VERS == DARWIN_10_9 +#if DARWIN_VERS >= DARWIN_10_8 DECL_TEMPLATE(darwin, kernelrpc_mach_vm_allocate_trap); DECL_TEMPLATE(darwin, kernelrpc_mach_vm_deallocate_trap); DECL_TEMPLATE(darwin, kernelrpc_mach_vm_protect_trap); @@ -598,7 +656,7 @@ DECL_TEMPLATE(darwin, kernelrpc_mach_port_guard_trap); DECL_TEMPLATE(darwin, kernelrpc_mach_port_unguard_trap); DECL_TEMPLATE(darwin, iopolicysys); DECL_TEMPLATE(darwin, process_policy); -#endif /* DARWIN_VERS == DARWIN_10_8 || DARWIN_VERS == DARWIN_10_9 */ +#endif /* DARWIN_VERS >= DARWIN_10_8 */ DECL_TEMPLATE(darwin, mach_msg_unhandled); DECL_TEMPLATE(darwin, mach_msg_unhandled_check); DECL_TEMPLATE(darwin, mach_msg); diff --git a/coregrind/m_syswrap/syswrap-amd64-darwin.c b/coregrind/m_syswrap/syswrap-amd64-darwin.c index b51b652169..b1790bb476 100644 --- a/coregrind/m_syswrap/syswrap-amd64-darwin.c +++ b/coregrind/m_syswrap/syswrap-amd64-darwin.c @@ -467,6 +467,11 @@ void wqthread_hijack(Addr self, Addr kport, Addr stackaddr, Addr workitem, Bool is_reuse = reuse != 0; # elif DARWIN_VERS == DARWIN_10_8 || DARWIN_VERS == DARWIN_10_9 Bool is_reuse = (reuse & 0x20000 /* == WQ_FLAG_THREAD_REUSE */) != 0; +# elif DARWIN_VERS == DARWIN_10_10 + // XXX FIXME is this correct? + Bool is_reuse = (reuse & 0x20000 /* == WQ_FLAG_THREAD_REUSE */) != 0; +# else +# error "Unsupported Darwin version" # endif if (is_reuse) { @@ -478,7 +483,7 @@ void wqthread_hijack(Addr self, Addr kport, Addr stackaddr, Addr workitem, UWord magic_delta = 0; # elif DARWIN_VERS == DARWIN_10_7 || DARWIN_VERS == DARWIN_10_8 UWord magic_delta = 0x60; -# elif DARWIN_VERS == DARWIN_10_9 +# elif DARWIN_VERS == DARWIN_10_9 || DARWIN_VERS == DARWIN_10_10 UWord magic_delta = 0xE0; # else # error "magic_delta: to be computed on new OS version" diff --git a/coregrind/m_syswrap/syswrap-darwin.c b/coregrind/m_syswrap/syswrap-darwin.c index c8c33a439b..016ef7f0df 100644 --- a/coregrind/m_syswrap/syswrap-darwin.c +++ b/coregrind/m_syswrap/syswrap-darwin.c @@ -8918,6 +8918,31 @@ PRE(kernelrpc_mach_port_unguard_trap) #endif /* DARWIN_VERS >= DARWIN_10_9 */ +/* --------------------------------------------------------------------- + Added for OSX 10.10 (Yosemite) + ------------------------------------------------------------------ */ + +#if DARWIN_VERS >= DARWIN_10_10 + +PRE(bsdthread_ctl) +{ + // int bsdthread_ctl(user_addr_t cmd, user_addr_t arg1, + // user_addr_t arg2, user_addr_t arg3) + PRINT("bsdthread_ctl(FIXME)(%lx,%lx,%lx,%lx)", ARG1, ARG2, ARG3, ARG4); +} + +PRE(sysctlbyname) +{ + // int sysctlbyname(const char *name, size_t namelen, void *old, + // size_t *oldlenp, void *new, size_t newlen) + PRINT("sysctlbyname(FIXME)(%lx(%s),%ld, %lx,%lx, %lx,%lx", + ARG1, ARG1 ? (const HChar*)ARG1 : "(null)", + ARG2, ARG3, ARG4, ARG5, ARG6); +} + +#endif /* DARWIN_VERS >= DARWIN_10_10 */ + + /* --------------------------------------------------------------------- syscall tables ------------------------------------------------------------------ */ @@ -9234,7 +9259,8 @@ const SyscallTableEntry ML_(syscall_table)[] = { MACX_(__NR_sem_wait, sem_wait), MACX_(__NR_sem_trywait, sem_trywait), MACX_(__NR_sem_post, sem_post), -// _____(__NR_sem_getvalue), + // 274 seems to have been repurposed for 10.10. Was sem_getvalue, + // has become sysctlbyname. See below. MACXY(__NR_sem_init, sem_init), MACX_(__NR_sem_destroy, sem_destroy), MACX_(__NR_open_extended, open_extended), // 277 @@ -9426,7 +9452,10 @@ const SyscallTableEntry ML_(syscall_table)[] = { MACX_(__NR_connectx, connectx), MACX_(__NR_disconnectx, disconnectx), #endif - +#if DARWIN_VERS >= DARWIN_10_10 + MACX_(__NR_bsdthread_ctl, bsdthread_ctl), + MACX_(__NR_sysctlbyname, sysctlbyname), +#endif // _____(__NR_MAXSYSCALL) MACX_(__NR_DARWIN_FAKE_SIGRETURN, FAKE_SIGRETURN) }; diff --git a/include/vki/vki-scnums-darwin.h b/include/vki/vki-scnums-darwin.h index cb958c6516..9146a5e165 100644 --- a/include/vki/vki-scnums-darwin.h +++ b/include/vki/vki-scnums-darwin.h @@ -505,7 +505,13 @@ #define __NR_sem_wait VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(271) #define __NR_sem_trywait VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(272) #define __NR_sem_post VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(273) + +#if DARWIN_VERS < DARWIN_10_10 #define __NR_sem_getvalue VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(274) +#elif DARWIN_VERS == DARWIN_10_10 +#define __NR_sysctlbyname VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(274) +#endif + #define __NR_sem_init VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(275) #define __NR_sem_destroy VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(276) #define __NR_open_extended VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(277) @@ -675,7 +681,7 @@ #define __NR_fsgetpath VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(427) #define __NR_audit_session_self VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(428) #define __NR_audit_session_join VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(429) -#endif +#endif /* DARWIN_VERS >= DARWIN_10_6 */ #if DARWIN_VERS >= DARWIN_10_9 #define __NR_fileport_makeport VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(430) #define __NR_fileport_makefd VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(431) @@ -703,6 +709,10 @@ #define __NR_memorystatus_get_level VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(453) #define __NR_system_override VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(454) #define __NR_vfs_purge VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(455) +#endif /* DARWIN_VERS >= DARWIN_10_9 */ + +#if DARWIN_VERS == DARWIN_10_10 +#define __NR_bsdthread_ctl VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(478) #endif #if DARWIN_VERS < DARWIN_10_6 @@ -713,6 +723,8 @@ #define __NR_MAXSYSCALL VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(430) #elif DARWIN_VERS == DARWIN_10_9 #define __NR_MAXSYSCALL VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(456) +#elif DARWIN_VERS == DARWIN_10_10 +#define __NR_MAXSYSCALL VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(490) #else #error unknown darwin version #endif -- 2.47.2