]> git.saurik.com Git - apple/xnu.git/blobdiff - libsyscall/mach/host.c
xnu-6153.141.1.tar.gz
[apple/xnu.git] / libsyscall / mach / host.c
index c6587951f02529fd3bcdf19515a6ed4fcb16b9c3..6a7ec639e935069ae6da5dd549eac6d3d678a1f1 100644 (file)
 #include <mach/kern_return.h>
 #include <mach/mach_host.h>
 #include <mach/host_priv.h>
+#include <sys/types.h>
 
 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;
 }