From f25a578ea577d0bf9cb3fa553c2b25eb45442978 Mon Sep 17 00:00:00 2001 From: Lubos Dolezel Date: Thu, 2 Mar 2017 19:02:36 +0100 Subject: [PATCH] Dispatch all mach traps through a syscall table to allow for easy tracing --- src/kernel/libsyscall/CMakeLists.txt | 1 + .../mach/{mach_traps.s => mach_traps.S} | 0 src/kernel/mach_server/client/CMakeLists.txt | 2 + .../mach_server/client/darling_mach_syscall.S | 76 +++++++ src/kernel/mach_server/client/mach-syscall.S | 77 +++++++ src/kernel/mach_server/client/mach_table.c | 63 ++++++ src/kernel/mach_server/client/mach_time.c | 4 +- src/kernel/mach_server/client/mach_time.h | 12 ++ src/kernel/mach_server/client/mach_traps.c | 101 ++++----- src/kernel/mach_server/client/mach_traps.h | 196 ++++++++++++++++++ 10 files changed, 480 insertions(+), 52 deletions(-) rename src/kernel/libsyscall/mach/{mach_traps.s => mach_traps.S} (100%) create mode 100644 src/kernel/mach_server/client/darling_mach_syscall.S create mode 100644 src/kernel/mach_server/client/mach-syscall.S create mode 100644 src/kernel/mach_server/client/mach_table.c create mode 100644 src/kernel/mach_server/client/mach_time.h create mode 100644 src/kernel/mach_server/client/mach_traps.h diff --git a/src/kernel/libsyscall/CMakeLists.txt b/src/kernel/libsyscall/CMakeLists.txt index 597f9a26e..4c8239ef8 100644 --- a/src/kernel/libsyscall/CMakeLists.txt +++ b/src/kernel/libsyscall/CMakeLists.txt @@ -68,6 +68,7 @@ set(syscall_dynamic_sources wrappers/_libkernel_init.c) set(syscall_sources + mach/mach_traps.S os/alloc_once.c wrappers/libproc/libproc.c wrappers/libproc/proc_listpidspath.c diff --git a/src/kernel/libsyscall/mach/mach_traps.s b/src/kernel/libsyscall/mach/mach_traps.S similarity index 100% rename from src/kernel/libsyscall/mach/mach_traps.s rename to src/kernel/libsyscall/mach/mach_traps.S diff --git a/src/kernel/mach_server/client/CMakeLists.txt b/src/kernel/mach_server/client/CMakeLists.txt index 02d035066..63d5420c3 100644 --- a/src/kernel/mach_server/client/CMakeLists.txt +++ b/src/kernel/mach_server/client/CMakeLists.txt @@ -10,6 +10,8 @@ set(mach_server_client_sources mach_traps.c mach_time.c lkm.c + darling_mach_syscall.S + mach_table.c ) add_library(mach_server_client OBJECT ${mach_server_client_sources}) diff --git a/src/kernel/mach_server/client/darling_mach_syscall.S b/src/kernel/mach_server/client/darling_mach_syscall.S new file mode 100644 index 000000000..2618fb03b --- /dev/null +++ b/src/kernel/mach_server/client/darling_mach_syscall.S @@ -0,0 +1,76 @@ +.text +.globl __darling_mach_syscall +.private_extern __darling_mach_syscall + +#if defined(__x86_64__) + +__darling_mach_syscall: + cmpl $0, %eax + jnl Lpositive + negl %eax +Lpositive: + movq ___mach_syscall_table@GOTPCREL(%rip), %r10 + movq (%r10,%rax,8), %r10 + test %r10, %r10 + jz .no_sys + # Re-push possible 7th and 8th arg + movq 24(%rsp), %r11 + pushq %r11 + movq 24(%rsp), %r11 + pushq %r11 + call *%r10 + addq $16, %rsp + ret +.no_sys: + movq %rax, %rdi + call ___unknown_mach_syscall + ret + +#elif defined(__i386__) + +#define copy_arg(off) \ + movl 8+off(%esp), %ecx ;\ + movl %ecx, -24+off(%esp) + +__darling_mach_syscall: + cmpl $0, %eax + jnl Lpositive + negl %eax +Lpositive: + calll 1f +1: + popl %ecx +2: + movl L___mach_syscall_table$non_lazy_ptr-1b(%ecx), %ecx + andl $0xffff, %eax // Because there is some extra stuff in upper bytes we don't need + movl (%ecx,%eax,4), %eax + test %eax, %eax + jz .no_sys + // Copy arguments + copy_arg(0) + copy_arg(4) + copy_arg(8) + copy_arg(12) + copy_arg(16) + copy_arg(20) + subl $24, %esp + call *%eax + addl $24, %esp + ret +.no_sys: + pushl %ecx + call ___unknown_mach_syscall + addl $4, %esp + ret + + .section __IMPORT,__pointers,non_lazy_symbol_pointers +L___mach_syscall_table$non_lazy_ptr: + .indirect_symbol ___mach_syscall_table + .long 0 + +.subsections_via_symbols + +#else +# error Missing assembly +#endif + diff --git a/src/kernel/mach_server/client/mach-syscall.S b/src/kernel/mach_server/client/mach-syscall.S new file mode 100644 index 000000000..c79bbbf0f --- /dev/null +++ b/src/kernel/mach_server/client/mach-syscall.S @@ -0,0 +1,77 @@ +.text +.globl _linux_syscall +.private_extern _linux_syscall + +_linux_syscall: + +#if defined(__x86_64__) + + movl 8(%rsp), %eax + movq %rcx, %r10 + syscall + ret + +#elif defined(__i386__) + + // With 32in64, we cannot use sysenter, because our process doesn't have a 32-bit VDSO mapped + // and sysenter needs that for returning to user space. + + // eax, ecx and edx are caller saved, the rest is calee saved + push %ebx + push %esi + push %edi + push %ebp + + mov 20(%esp), %ebx + mov 24(%esp), %ecx + mov 28(%esp), %edx + mov 32(%esp), %esi + mov 36(%esp), %edi + mov 40(%esp), %ebp + mov 44(%esp), %eax + + int $0x80 + + pop %ebp + pop %edi + pop %esi + pop %ebx + ret + +#elif 0 //defined(__i386__) + + push %ebp + push %ebx + push %esi + push %edi + call 1f +1: + pop %ebp + addl $(2f-1b), %ebp + push %ebp + push %ecx + push %edx + movl 28+28(%esp), %eax + movl 4+28(%esp), %ebx + movl 8+28(%esp), %ecx + movl 12+28(%esp), %edx + movl 16+28(%esp), %esi + movl 20+28(%esp), %edi + push %ebp + movl 24+28(%esp), %ebp + movl %ebp, -4(%esp) + movl %esp, %ebp + sysenter +2: + pop %edi + pop %esi + pop %ebx + pop %ebp + ret + +#else + +# error Missing assembly! + +#endif + diff --git a/src/kernel/mach_server/client/mach_table.c b/src/kernel/mach_server/client/mach_table.c new file mode 100644 index 000000000..83ed5fe4d --- /dev/null +++ b/src/kernel/mach_server/client/mach_table.c @@ -0,0 +1,63 @@ +#include "mach_time.h" +#include "mach_traps.h" +#include + +__attribute__((visibility("hidden"))) +void* __mach_syscall_table[128] = { + [10] = _kernelrpc_mach_vm_allocate_trap_impl, + [12] = _kernelrpc_mach_vm_deallocate_trap_impl, + [14] = _kernelrpc_mach_vm_protect_trap_impl, + [15] = _kernelrpc_mach_vm_map_trap_impl, + [16] = _kernelrpc_mach_port_allocate_trap_impl, + [17] = _kernelrpc_mach_port_destroy_trap_impl, + [18] = _kernelrpc_mach_port_deallocate_trap_impl, + [19] = _kernelrpc_mach_port_mod_refs_trap_impl, + [20] = _kernelrpc_mach_port_move_member_trap_impl, + [21] = _kernelrpc_mach_port_insert_right_trap_impl, + [22] = _kernelrpc_mach_port_insert_member_trap_impl, + [23] = _kernelrpc_mach_port_extract_member_trap_impl, + [24] = _kernelrpc_mach_port_construct_trap_impl, + [25] = _kernelrpc_mach_port_destruct_trap_impl, + [26] = mach_reply_port_impl, + [27] = thread_self_trap_impl, + [28] = task_self_trap_impl, + [29] = host_self_trap_impl, + [31] = mach_msg_trap_impl, + [32] = mach_msg_overwrite_trap_impl, + [33] = semaphore_signal_trap_impl, + [34] = semaphore_signal_all_trap_impl, + [35] = semaphore_signal_thread_trap_impl, + [36] = semaphore_wait_trap_impl, + [37] = semaphore_wait_signal_trap_impl, + [38] = semaphore_timedwait_trap_impl, + [39] = semaphore_timedwait_signal_trap_impl, + [41] = _kernelrpc_mach_port_guard_trap_impl, + [42] = _kernelrpc_mach_port_unguard_trap_impl, + [43] = mach_generate_activity_id_impl, + [44] = task_name_for_pid_impl, + [45] = task_for_pid_impl, + [46] = pid_for_task_impl, + [48] = macx_swapon_impl, + [49] = macx_swapoff_impl, + [51] = macx_triggers_impl, + [52] = macx_backing_store_suspend_impl, + [53] = macx_backing_store_recovery_impl, + [59] = swtch_pri_impl, + [60] = swtch_impl, + [61] = syscall_thread_switch_impl, + [62] = clock_sleep_trap_impl, + [89] = mach_timebase_info_trap_impl, + [90] = mach_wait_until_impl, + [91] = mk_timer_create_impl, + [92] = mk_timer_destroy_impl, + [93] = mk_timer_arm_impl, + [94] = mk_timer_cancel_impl, +}; + +extern void __simple_printf(const char* format, ...); +long __unknown_mach_syscall(int nr, ...) +{ + __simple_printf("Unimplemented mach trap (%d)\n", nr); + return KERN_FAILURE; +} + diff --git a/src/kernel/mach_server/client/mach_time.c b/src/kernel/mach_server/client/mach_time.c index 2e34514f8..18fa9b9a4 100644 --- a/src/kernel/mach_server/client/mach_time.c +++ b/src/kernel/mach_server/client/mach_time.c @@ -7,7 +7,7 @@ # define NSEC_PER_SEC 1000000000ull #endif -kern_return_t mach_timebase_info_trap( +kern_return_t mach_timebase_info_trap_impl( mach_timebase_info_t info) { info->numer = NSEC_PER_SEC; @@ -15,7 +15,7 @@ kern_return_t mach_timebase_info_trap( return KERN_SUCCESS; } -kern_return_t mach_wait_until( +kern_return_t mach_wait_until_impl( uint64_t deadline) { struct timespec ts = { deadline / NSEC_PER_SEC, deadline % NSEC_PER_SEC }; diff --git a/src/kernel/mach_server/client/mach_time.h b/src/kernel/mach_server/client/mach_time.h new file mode 100644 index 000000000..b34d5a60e --- /dev/null +++ b/src/kernel/mach_server/client/mach_time.h @@ -0,0 +1,12 @@ +#include +#include +#ifndef _MACH_TIME_H +#define _MACH_TIME_H + +kern_return_t mach_timebase_info_trap_impl( + mach_timebase_info_t info); +kern_return_t mach_wait_until_impl( + uint64_t deadline); + +#endif + diff --git a/src/kernel/mach_server/client/mach_traps.c b/src/kernel/mach_server/client/mach_traps.c index 88b606678..997d9834b 100644 --- a/src/kernel/mach_server/client/mach_traps.c +++ b/src/kernel/mach_server/client/mach_traps.c @@ -7,25 +7,26 @@ #include #include "../../lkm/api.h" #include "lkm.h" +#include "mach_traps.h" #define UNIMPLEMENTED_TRAP() { char msg[] = "Called unimplemented Mach trap: "; write(2, msg, sizeof(msg)-1); write(2, __FUNCTION__, sizeof(__FUNCTION__)-1); write(2, "\n", 1); } -mach_port_name_t mach_reply_port(void) +mach_port_name_t mach_reply_port_impl(void) { return ioctl(driver_fd, NR_mach_reply_port, 0); } -mach_port_name_t thread_self_trap(void) +mach_port_name_t thread_self_trap_impl(void) { return ioctl(driver_fd, NR_thread_self_trap, 0); } -mach_port_name_t host_self_trap(void) +mach_port_name_t host_self_trap_impl(void) { return ioctl(driver_fd, NR_host_self_trap, 0); } -mach_msg_return_t mach_msg_trap( +mach_msg_return_t mach_msg_trap_impl( mach_msg_header_t *msg, mach_msg_option_t option, mach_msg_size_t send_size, @@ -34,13 +35,13 @@ mach_msg_return_t mach_msg_trap( mach_msg_timeout_t timeout, mach_port_name_t notify) { - return mach_msg_overwrite_trap(msg, + return mach_msg_overwrite_trap_impl(msg, option, send_size, rcv_size, rcv_name, timeout, notify, msg, 0); } -mach_msg_return_t mach_msg_overwrite_trap( +mach_msg_return_t mach_msg_overwrite_trap_impl( mach_msg_header_t *msg, mach_msg_option_t option, mach_msg_size_t send_size, @@ -67,7 +68,7 @@ mach_msg_return_t mach_msg_overwrite_trap( &args); } -kern_return_t semaphore_signal_trap( +kern_return_t semaphore_signal_trap_impl( mach_port_name_t signal_name) { struct semaphore_signal_args args = { @@ -77,7 +78,7 @@ kern_return_t semaphore_signal_trap( return ioctl(driver_fd, NR_semaphore_signal_trap, &args); } -kern_return_t semaphore_signal_all_trap( +kern_return_t semaphore_signal_all_trap_impl( mach_port_name_t signal_name) { struct semaphore_signal_all_args args = { @@ -88,7 +89,7 @@ kern_return_t semaphore_signal_all_trap( &args); } -kern_return_t semaphore_signal_thread_trap( +kern_return_t semaphore_signal_thread_trap_impl( mach_port_name_t signal_name, mach_port_name_t thread_name) { @@ -96,7 +97,7 @@ kern_return_t semaphore_signal_thread_trap( return KERN_FAILURE; } -kern_return_t semaphore_wait_trap( +kern_return_t semaphore_wait_trap_impl( mach_port_name_t wait_name) { struct semaphore_wait_args args = { @@ -106,7 +107,7 @@ kern_return_t semaphore_wait_trap( return ioctl(driver_fd, NR_semaphore_wait_trap, &args); } -kern_return_t semaphore_wait_signal_trap( +kern_return_t semaphore_wait_signal_trap_impl( mach_port_name_t wait_name, mach_port_name_t signal_name) { @@ -119,7 +120,7 @@ kern_return_t semaphore_wait_signal_trap( &args); } -kern_return_t semaphore_timedwait_trap( +kern_return_t semaphore_timedwait_trap_impl( mach_port_name_t wait_name, unsigned int sec, clock_res_t nsec) @@ -134,7 +135,7 @@ kern_return_t semaphore_timedwait_trap( &args); } -kern_return_t semaphore_timedwait_signal_trap( +kern_return_t semaphore_timedwait_signal_trap_impl( mach_port_name_t wait_name, mach_port_name_t signal_name, unsigned int sec, @@ -151,7 +152,7 @@ kern_return_t semaphore_timedwait_signal_trap( &args); } -kern_return_t clock_sleep_trap( +kern_return_t clock_sleep_trap_impl( mach_port_name_t clock_name, sleep_type_t sleep_type, int sleep_sec, @@ -162,17 +163,17 @@ kern_return_t clock_sleep_trap( return KERN_FAILURE; } -kern_return_t _kernelrpc_mach_vm_allocate_trap( +kern_return_t _kernelrpc_mach_vm_allocate_trap_impl( mach_port_name_t target, mach_vm_offset_t *addr, mach_vm_size_t size, int flags) { - return _kernelrpc_mach_vm_map_trap(target, addr, + return _kernelrpc_mach_vm_map_trap_impl(target, addr, size, 0, flags, VM_PROT_READ | VM_PROT_WRITE); } -kern_return_t _kernelrpc_mach_vm_deallocate_trap( +kern_return_t _kernelrpc_mach_vm_deallocate_trap_impl( mach_port_name_t target, mach_vm_address_t address, mach_vm_size_t size @@ -191,7 +192,7 @@ kern_return_t _kernelrpc_mach_vm_deallocate_trap( return KERN_SUCCESS; } -kern_return_t _kernelrpc_mach_vm_protect_trap( +kern_return_t _kernelrpc_mach_vm_protect_trap_impl( mach_port_name_t target, mach_vm_address_t address, mach_vm_size_t size, @@ -219,7 +220,7 @@ kern_return_t _kernelrpc_mach_vm_protect_trap( return KERN_SUCCESS; } -kern_return_t _kernelrpc_mach_vm_map_trap( +kern_return_t _kernelrpc_mach_vm_map_trap_impl( mach_port_name_t target, mach_vm_offset_t *address, mach_vm_size_t size, @@ -284,7 +285,7 @@ kern_return_t _kernelrpc_mach_vm_map_trap( return KERN_SUCCESS; } -kern_return_t _kernelrpc_mach_port_allocate_trap( +kern_return_t _kernelrpc_mach_port_allocate_trap_impl( mach_port_name_t target, mach_port_right_t right, mach_port_name_t *name @@ -310,7 +311,7 @@ kern_return_t _kernelrpc_mach_port_allocate_trap( } -kern_return_t _kernelrpc_mach_port_destroy_trap( +kern_return_t _kernelrpc_mach_port_destroy_trap_impl( mach_port_name_t target, mach_port_name_t name ) @@ -324,7 +325,7 @@ kern_return_t _kernelrpc_mach_port_destroy_trap( &args); } -kern_return_t _kernelrpc_mach_port_deallocate_trap( +kern_return_t _kernelrpc_mach_port_deallocate_trap_impl( mach_port_name_t target, mach_port_name_t name ) @@ -338,7 +339,7 @@ kern_return_t _kernelrpc_mach_port_deallocate_trap( &args); } -kern_return_t _kernelrpc_mach_port_mod_refs_trap( +kern_return_t _kernelrpc_mach_port_mod_refs_trap_impl( mach_port_name_t target, mach_port_name_t name, mach_port_right_t right, @@ -355,7 +356,7 @@ kern_return_t _kernelrpc_mach_port_mod_refs_trap( return ioctl(driver_fd, NR__kernelrpc_mach_port_mod_refs, &args); } -kern_return_t _kernelrpc_mach_port_move_member_trap( +kern_return_t _kernelrpc_mach_port_move_member_trap_impl( mach_port_name_t target, mach_port_name_t member, mach_port_name_t after @@ -369,7 +370,7 @@ kern_return_t _kernelrpc_mach_port_move_member_trap( return ioctl(driver_fd, NR__kernelrpc_mach_port_move_member_trap, &args); } -kern_return_t _kernelrpc_mach_port_insert_right_trap( +kern_return_t _kernelrpc_mach_port_insert_right_trap_impl( mach_port_name_t target, mach_port_name_t name, mach_port_name_t poly, @@ -380,7 +381,7 @@ kern_return_t _kernelrpc_mach_port_insert_right_trap( return KERN_FAILURE; } -kern_return_t _kernelrpc_mach_port_insert_member_trap( +kern_return_t _kernelrpc_mach_port_insert_member_trap_impl( mach_port_name_t target, mach_port_name_t name, mach_port_name_t pset @@ -394,7 +395,7 @@ kern_return_t _kernelrpc_mach_port_insert_member_trap( return ioctl(driver_fd, NR__kernelrpc_mach_port_insert_member_trap, &args); } -kern_return_t _kernelrpc_mach_port_extract_member_trap( +kern_return_t _kernelrpc_mach_port_extract_member_trap_impl( mach_port_name_t target, mach_port_name_t name, mach_port_name_t pset @@ -408,7 +409,7 @@ kern_return_t _kernelrpc_mach_port_extract_member_trap( return ioctl(driver_fd, NR__kernelrpc_mach_port_extract_member_trap, &args); } -kern_return_t _kernelrpc_mach_port_construct_trap( +kern_return_t _kernelrpc_mach_port_construct_trap_impl( mach_port_name_t target, mach_port_options_t *options, uint64_t context, @@ -419,7 +420,7 @@ kern_return_t _kernelrpc_mach_port_construct_trap( return KERN_FAILURE; } -kern_return_t _kernelrpc_mach_port_destruct_trap( +kern_return_t _kernelrpc_mach_port_destruct_trap_impl( mach_port_name_t target, mach_port_name_t name, mach_port_delta_t srdelta, @@ -430,7 +431,7 @@ kern_return_t _kernelrpc_mach_port_destruct_trap( return KERN_FAILURE; } -kern_return_t _kernelrpc_mach_port_guard_trap( +kern_return_t _kernelrpc_mach_port_guard_trap_impl( mach_port_name_t target, mach_port_name_t name, uint64_t guard, @@ -441,7 +442,7 @@ kern_return_t _kernelrpc_mach_port_guard_trap( return KERN_FAILURE; } -kern_return_t _kernelrpc_mach_port_unguard_trap( +kern_return_t _kernelrpc_mach_port_unguard_trap_impl( mach_port_name_t target, mach_port_name_t name, uint64_t guard @@ -451,7 +452,7 @@ kern_return_t _kernelrpc_mach_port_unguard_trap( return KERN_FAILURE; } -kern_return_t macx_swapon( +kern_return_t macx_swapon_impl( uint64_t filename, int flags, int size, @@ -461,7 +462,7 @@ kern_return_t macx_swapon( return KERN_FAILURE; } -kern_return_t macx_swapoff( +kern_return_t macx_swapoff_impl( uint64_t filename, int flags) { @@ -469,7 +470,7 @@ kern_return_t macx_swapoff( return KERN_FAILURE; } -kern_return_t macx_triggers( +kern_return_t macx_triggers_impl( int hi_water, int low_water, int flags, @@ -479,14 +480,14 @@ kern_return_t macx_triggers( return KERN_FAILURE; } -kern_return_t macx_backing_store_suspend( +kern_return_t macx_backing_store_suspend_impl( boolean_t suspend) { UNIMPLEMENTED_TRAP(); return KERN_FAILURE; } -kern_return_t macx_backing_store_recovery( +kern_return_t macx_backing_store_recovery_impl( int pid) { UNIMPLEMENTED_TRAP(); @@ -494,19 +495,19 @@ kern_return_t macx_backing_store_recovery( } extern void __linux_sched_yield(); -boolean_t swtch_pri(int pri) +boolean_t swtch_pri_impl(int pri) { __linux_sched_yield(); return 0; } -boolean_t swtch(void) +boolean_t swtch_impl(void) { __linux_sched_yield(); return 0; } -kern_return_t syscall_thread_switch( +kern_return_t syscall_thread_switch_impl( mach_port_name_t thread_name, int option, mach_msg_timeout_t option_time) @@ -515,7 +516,7 @@ kern_return_t syscall_thread_switch( return KERN_FAILURE; } -mach_port_name_t task_self_trap(void) +mach_port_name_t task_self_trap_impl(void) { return ioctl(driver_fd, NR_task_self_trap, 0); } @@ -524,7 +525,7 @@ mach_port_name_t task_self_trap(void) * Obsolete interfaces. */ -kern_return_t task_for_pid( +kern_return_t task_for_pid_impl( mach_port_name_t target_tport, int pid, mach_port_name_t *t) @@ -533,7 +534,7 @@ kern_return_t task_for_pid( return KERN_FAILURE; } -kern_return_t task_name_for_pid( +kern_return_t task_name_for_pid_impl( mach_port_name_t target_tport, int pid, mach_port_name_t *tn) @@ -542,7 +543,7 @@ kern_return_t task_name_for_pid( return KERN_FAILURE; } -kern_return_t pid_for_task( +kern_return_t pid_for_task_impl( mach_port_name_t t, int *x) { @@ -550,7 +551,7 @@ kern_return_t pid_for_task( return KERN_FAILURE; } -kern_return_t bsdthread_terminate_trap( +kern_return_t bsdthread_terminate_trap_impl( uintptr_t stackaddr, unsigned long freesize, mach_port_name_t thread, @@ -566,7 +567,6 @@ kern_return_t bsdthread_terminate_trap( return ioctl(driver_fd, NR_bsdthread_terminate_trap, &args); } -typedef struct voucher_mach_msg_state_s *voucher_mach_msg_state_t; boolean_t voucher_mach_msg_set(mach_msg_header_t *msg) { @@ -585,18 +585,18 @@ voucher_mach_msg_state_t voucher_mach_msg_adopt(mach_msg_header_t *msg) return NULL; } -kern_return_t mach_generate_activity_id(mach_port_name_t task, int i, uint64_t* id) +kern_return_t mach_generate_activity_id_impl(mach_port_name_t task, int i, uint64_t* id) { UNIMPLEMENTED_TRAP(); return KERN_FAILURE; } -mach_port_name_t mk_timer_create(void) +mach_port_name_t mk_timer_create_impl(void) { return ioctl(driver_fd, NR_mk_timer_create_trap, NULL); } -kern_return_t mk_timer_destroy(mach_port_name_t name) +kern_return_t mk_timer_destroy_impl(mach_port_name_t name) { struct mk_timer_destroy_args args = { .timer_port = name @@ -605,7 +605,7 @@ kern_return_t mk_timer_destroy(mach_port_name_t name) return ioctl(driver_fd, NR_mk_timer_destroy_trap, &args); } -kern_return_t mk_timer_arm(mach_port_name_t name, uint64_t expire_time) +kern_return_t mk_timer_arm_impl(mach_port_name_t name, uint64_t expire_time) { struct mk_timer_arm_args args = { .timer_port = name, @@ -615,7 +615,7 @@ kern_return_t mk_timer_arm(mach_port_name_t name, uint64_t expire_time) return ioctl(driver_fd, NR_mk_timer_arm_trap, &args); } -kern_return_t mk_timer_cancel(mach_port_name_t name, uint64_t *result_time) +kern_return_t mk_timer_cancel_impl(mach_port_name_t name, uint64_t *result_time) { struct mk_timer_cancel_args args = { .timer_port = name, @@ -624,3 +624,4 @@ kern_return_t mk_timer_cancel(mach_port_name_t name, uint64_t *result_time) return ioctl(driver_fd, NR_mk_timer_cancel_trap, &args); } + diff --git a/src/kernel/mach_server/client/mach_traps.h b/src/kernel/mach_server/client/mach_traps.h new file mode 100644 index 000000000..b6cb101bd --- /dev/null +++ b/src/kernel/mach_server/client/mach_traps.h @@ -0,0 +1,196 @@ +#ifndef _MACH_TRAPS_H +#define _MACH_TRAPS_H + +#include +#include +#include + +typedef struct voucher_mach_msg_state_s *voucher_mach_msg_state_t; + +mach_port_name_t mach_reply_port_impl(void); +mach_port_name_t thread_self_trap_impl(void); +mach_port_name_t host_self_trap_impl(void); +mach_msg_return_t mach_msg_trap_impl( + mach_msg_header_t *msg, + mach_msg_option_t option, + mach_msg_size_t send_size, + mach_msg_size_t rcv_size, + mach_port_name_t rcv_name, + mach_msg_timeout_t timeout, + mach_port_name_t notify); +mach_msg_return_t mach_msg_overwrite_trap_impl( + mach_msg_header_t *msg, + mach_msg_option_t option, + mach_msg_size_t send_size, + mach_msg_size_t rcv_size, + mach_port_name_t rcv_name, + mach_msg_timeout_t timeout, + mach_port_name_t notify, + mach_msg_header_t *rcv_msg, + mach_msg_size_t rcv_limit); +kern_return_t semaphore_signal_trap_impl( + mach_port_name_t signal_name); +kern_return_t semaphore_signal_all_trap_impl( + mach_port_name_t signal_name); +kern_return_t semaphore_signal_thread_trap_impl( + mach_port_name_t signal_name, + mach_port_name_t thread_name); +kern_return_t semaphore_wait_trap_impl( + mach_port_name_t wait_name); +kern_return_t semaphore_wait_signal_trap_impl( + mach_port_name_t wait_name, + mach_port_name_t signal_name); +kern_return_t semaphore_timedwait_trap_impl( + mach_port_name_t wait_name, + unsigned int sec, + clock_res_t nsec); +kern_return_t semaphore_timedwait_signal_trap_impl( + mach_port_name_t wait_name, + mach_port_name_t signal_name, + unsigned int sec, + clock_res_t nsec); +kern_return_t clock_sleep_trap_impl( + mach_port_name_t clock_name, + sleep_type_t sleep_type, + int sleep_sec, + int sleep_nsec, + mach_timespec_t *wakeup_time); +kern_return_t _kernelrpc_mach_vm_allocate_trap_impl( + mach_port_name_t target, + mach_vm_offset_t *addr, + mach_vm_size_t size, + int flags); +kern_return_t _kernelrpc_mach_vm_deallocate_trap_impl( + mach_port_name_t target, + mach_vm_address_t address, + mach_vm_size_t size +); +kern_return_t _kernelrpc_mach_vm_protect_trap_impl( + mach_port_name_t target, + mach_vm_address_t address, + mach_vm_size_t size, + boolean_t set_maximum, + vm_prot_t new_protection +); +kern_return_t _kernelrpc_mach_vm_map_trap_impl( + mach_port_name_t target, + mach_vm_offset_t *address, + mach_vm_size_t size, + mach_vm_offset_t mask, + int flags, + vm_prot_t cur_protection +); +kern_return_t _kernelrpc_mach_port_allocate_trap_impl( + mach_port_name_t target, + mach_port_right_t right, + mach_port_name_t *name +); +kern_return_t _kernelrpc_mach_port_destroy_trap_impl( + mach_port_name_t target, + mach_port_name_t name +); +kern_return_t _kernelrpc_mach_port_deallocate_trap_impl( + mach_port_name_t target, + mach_port_name_t name +); +kern_return_t _kernelrpc_mach_port_mod_refs_trap_impl( + mach_port_name_t target, + mach_port_name_t name, + mach_port_right_t right, + mach_port_delta_t delta +); +kern_return_t _kernelrpc_mach_port_move_member_trap_impl( + mach_port_name_t target, + mach_port_name_t member, + mach_port_name_t after +); +kern_return_t _kernelrpc_mach_port_insert_right_trap_impl( + mach_port_name_t target, + mach_port_name_t name, + mach_port_name_t poly, + mach_msg_type_name_t polyPoly +); +kern_return_t _kernelrpc_mach_port_insert_member_trap_impl( + mach_port_name_t target, + mach_port_name_t name, + mach_port_name_t pset +); +kern_return_t _kernelrpc_mach_port_extract_member_trap_impl( + mach_port_name_t target, + mach_port_name_t name, + mach_port_name_t pset +); +kern_return_t _kernelrpc_mach_port_construct_trap_impl( + mach_port_name_t target, + mach_port_options_t *options, + uint64_t context, + mach_port_name_t *name +); +kern_return_t _kernelrpc_mach_port_destruct_trap_impl( + mach_port_name_t target, + mach_port_name_t name, + mach_port_delta_t srdelta, + uint64_t guard +); +kern_return_t _kernelrpc_mach_port_guard_trap_impl( + mach_port_name_t target, + mach_port_name_t name, + uint64_t guard, + boolean_t strict +); +kern_return_t _kernelrpc_mach_port_unguard_trap_impl( + mach_port_name_t target, + mach_port_name_t name, + uint64_t guard +); +kern_return_t macx_swapon_impl( + uint64_t filename, + int flags, + int size, + int priority); +kern_return_t macx_swapoff_impl( + uint64_t filename, + int flags); +kern_return_t macx_triggers_impl( + int hi_water, + int low_water, + int flags, + mach_port_t alert_port); +kern_return_t macx_backing_store_suspend_impl( + boolean_t suspend); +kern_return_t macx_backing_store_recovery_impl( + int pid); +boolean_t swtch_pri_impl(int pri); +boolean_t swtch_impl(void); +kern_return_t syscall_thread_switch_impl( + mach_port_name_t thread_name, + int option, + mach_msg_timeout_t option_time); +mach_port_name_t task_self_trap_impl(void); +kern_return_t task_for_pid_impl( + mach_port_name_t target_tport, + int pid, + mach_port_name_t *t); +kern_return_t task_name_for_pid_impl( + mach_port_name_t target_tport, + int pid, + mach_port_name_t *tn); +kern_return_t pid_for_task_impl( + mach_port_name_t t, + int *x); +kern_return_t bsdthread_terminate_trap_impl( + uintptr_t stackaddr, + unsigned long freesize, + mach_port_name_t thread, + mach_port_name_t sem); +boolean_t voucher_mach_msg_set(mach_msg_header_t *msg); +void voucher_mach_msg_revert(voucher_mach_msg_state_t state); +voucher_mach_msg_state_t voucher_mach_msg_adopt(mach_msg_header_t *msg); +kern_return_t mach_generate_activity_id_impl(mach_port_name_t task, int i, uint64_t* id); +mach_port_name_t mk_timer_create_impl(void); +kern_return_t mk_timer_destroy_impl(mach_port_name_t name); +kern_return_t mk_timer_arm_impl(mach_port_name_t name, uint64_t expire_time); +kern_return_t mk_timer_cancel_impl(mach_port_name_t name, uint64_t *result_time); + +#endif + -- 2.51.2