X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/490019cf9519204c5fb36b2fba54ceb983bb6b72..eb6b6ca394357805f2bdba989abae309f718b4d8:/libsyscall/mach/host.c diff --git a/libsyscall/mach/host.c b/libsyscall/mach/host.c index c6587951f..6a7ec639e 100644 --- a/libsyscall/mach/host.c +++ b/libsyscall/mach/host.c @@ -31,10 +31,11 @@ #include #include #include +#include kern_return_t host_get_atm_diagnostic_flag(host_t host __unused, - uint32_t *diagnostic_flag) + uint32_t *diagnostic_flag) { volatile uint32_t *diagnostic_flag_address = (volatile uint32_t *)(uintptr_t)(_COMM_PAGE_ATM_DIAGNOSTIC_CONFIG); *diagnostic_flag = *diagnostic_flag_address; @@ -43,16 +44,69 @@ host_get_atm_diagnostic_flag(host_t host __unused, kern_return_t host_get_multiuser_config_flags(host_t host __unused, - uint32_t *multiuser_flags) + uint32_t *multiuser_flags) { +#if (TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR) + volatile uint32_t *multiuser_flag_address = (volatile uint32_t *)(uintptr_t)(_COMM_PAGE_MULTIUSER_CONFIG); + *multiuser_flags = *multiuser_flag_address; + return KERN_SUCCESS; +#else (void)multiuser_flags; return KERN_NOT_SUPPORTED; +#endif } kern_return_t host_check_multiuser_mode(host_t host __unused, - uint32_t *multiuser_mode) + uint32_t *multiuser_mode) { +#if (TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR) + uint32_t multiuser_flags; + kern_return_t kr; + + kr = host_get_multiuser_config_flags(host, &multiuser_flags); + if (kr != KERN_SUCCESS) { + return kr; + } + *multiuser_mode = (multiuser_flags & kIsMultiUserDevice) == kIsMultiUserDevice; + return KERN_SUCCESS; +#else (void)multiuser_mode; return KERN_NOT_SUPPORTED; +#endif +} + +extern kern_return_t +_kernelrpc_host_create_mach_voucher(mach_port_name_t host, + mach_voucher_attr_raw_recipe_array_t recipes, + mach_voucher_attr_recipe_size_t recipesCnt, + mach_port_name_t *voucher); + +kern_return_t +host_create_mach_voucher(mach_port_name_t host, + mach_voucher_attr_raw_recipe_array_t recipes, + mach_voucher_attr_recipe_size_t recipesCnt, + mach_port_name_t *voucher) +{ + kern_return_t rv; + + rv = host_create_mach_voucher_trap(host, recipes, recipesCnt, voucher); + +#ifdef __x86_64__ + /* REMOVE once XBS kernel has new trap */ + if (rv == ((1 << 24) | 70)) { /* see mach/i386/syscall_sw.h */ + rv = MACH_SEND_INVALID_DEST; + } +#elif defined(__i386__) + /* REMOVE once XBS kernel has new trap */ + if (rv == (kern_return_t)(-70)) { + rv = MACH_SEND_INVALID_DEST; + } +#endif + + if (rv == MACH_SEND_INVALID_DEST) { + rv = _kernelrpc_host_create_mach_voucher(host, recipes, recipesCnt, voucher); + } + + return rv; }