X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/6d2010ae8f7a6078e10b361c6962983bab233e0f..4d15aeb193b2c68f1d38666c317f8d3734f5f083:/libsyscall/wrappers/_libc_funcptr.c diff --git a/libsyscall/wrappers/_libc_funcptr.c b/libsyscall/wrappers/_libc_funcptr.c index 60fd52142..63eb09ca6 100644 --- a/libsyscall/wrappers/_libc_funcptr.c +++ b/libsyscall/wrappers/_libc_funcptr.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010 Apple Inc. All rights reserved. + * Copyright (c) 2010-2014 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -26,47 +26,109 @@ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ -#include -#include +#include "_libkernel_init.h" +extern _libkernel_functions_t _libkernel_functions; +extern void mig_os_release(void* ptr); -extern void (*_libc_set_errno)(int); - -static mach_port_t (*_libc_get_reply_port)(void); -static void (*_libc_set_reply_port)(mach_port_t); +__attribute__((visibility("hidden"))) +void * +malloc(size_t size) +{ + return _libkernel_functions->malloc(size); +} -/* - * Called at Libsystem initialise time, sets up callbacks we - * need to get at thread variables inside of Libc - */ +__attribute__((visibility("hidden"))) void -_mig_reply_port_callbacks(mach_port_t (*get)(void), void (*set)(mach_port_t)) +free(void *ptr) +{ + return _libkernel_functions->free(ptr); +} + +__attribute__((visibility("hidden"))) +void * +realloc(void *ptr, size_t size) { - _libc_get_reply_port = get; - _libc_set_reply_port = set; + return _libkernel_functions->realloc(ptr, size); } -mach_port_t _mig_get_reply_port(void) __attribute__((visibility("hidden"))); -mach_port_t -_mig_get_reply_port() +__attribute__((visibility("hidden"))) +void * +reallocf(void *ptr, size_t size) { - return _libc_get_reply_port(); + void *nptr = realloc(ptr, size); + if (!nptr && ptr) + free(ptr); + return (nptr); } -void _mig_set_reply_port(mach_port_t port) __attribute__((visibility("hidden"))); +__attribute__((visibility("hidden"))) void -_mig_set_reply_port(mach_port_t port) +_pthread_exit_if_canceled(int error) +{ + return _libkernel_functions->_pthread_exit_if_canceled(error); +} + +__attribute__((visibility("hidden"))) +void +_pthread_set_self(void *ptr __attribute__((__unused__))) {} + +__attribute__((visibility("hidden"))) +void +_pthread_clear_qos_tsd(mach_port_t thread_port) +{ + if (_libkernel_functions->version >= 3 && + _libkernel_functions->pthread_clear_qos_tsd) { + return _libkernel_functions->pthread_clear_qos_tsd(thread_port); + } +} + +/* + * mach/mach.h voucher_mach_msg API + */ + +static const struct _libkernel_voucher_functions + _libkernel_voucher_functions_empty; +static _libkernel_voucher_functions_t _libkernel_voucher_functions = + &_libkernel_voucher_functions_empty; + +kern_return_t +__libkernel_voucher_init(_libkernel_voucher_functions_t fns) +{ + _libkernel_voucher_functions = fns; + return KERN_SUCCESS; +} + +boolean_t +voucher_mach_msg_set(mach_msg_header_t *msg) { - _libc_set_reply_port(port); + if (_libkernel_voucher_functions->voucher_mach_msg_set) { + return _libkernel_voucher_functions->voucher_mach_msg_set(msg); + } + return 0; } -void cthread_set_errno_self(int errno) __attribute__((visibility("hidden"))); void -cthread_set_errno_self(int errno) +voucher_mach_msg_clear(mach_msg_header_t *msg) { - _libc_set_errno(errno); + if (_libkernel_voucher_functions->voucher_mach_msg_clear) { + return _libkernel_voucher_functions->voucher_mach_msg_clear(msg); + } } +voucher_mach_msg_state_t +voucher_mach_msg_adopt(mach_msg_header_t *msg) +{ + if (_libkernel_voucher_functions->voucher_mach_msg_adopt) { + return _libkernel_voucher_functions->voucher_mach_msg_adopt(msg); + } + return VOUCHER_MACH_MSG_STATE_UNCHANGED; +} -void _pthread_set_self(void* ptr) __attribute__((visibility("hidden"))); void -_pthread_set_self(void* ptr) {} +voucher_mach_msg_revert(voucher_mach_msg_state_t state) +{ + if (_libkernel_voucher_functions->voucher_mach_msg_revert) { + return _libkernel_voucher_functions->voucher_mach_msg_revert(state); + } +} +