]> git.saurik.com Git - apple/xnu.git/blobdiff - libsyscall/mach/host.c
xnu-6153.81.5.tar.gz
[apple/xnu.git] / libsyscall / mach / host.c
index a781a09ad999760d06af6437bb498967a2156683..6a7ec639e935069ae6da5dd549eac6d3d678a1f1 100644 (file)
@@ -35,7 +35,7 @@
 
 kern_return_t
 host_get_atm_diagnostic_flag(host_t host __unused,
 
 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;
 {
        volatile uint32_t *diagnostic_flag_address = (volatile uint32_t *)(uintptr_t)(_COMM_PAGE_ATM_DIAGNOSTIC_CONFIG);
        *diagnostic_flag = *diagnostic_flag_address;
@@ -44,31 +44,49 @@ host_get_atm_diagnostic_flag(host_t host __unused,
 
 kern_return_t
 host_get_multiuser_config_flags(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;
        (void)multiuser_flags;
        return KERN_NOT_SUPPORTED;
+#endif
 }
 
 kern_return_t
 host_check_multiuser_mode(host_t host __unused,
 }
 
 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;
        (void)multiuser_mode;
        return KERN_NOT_SUPPORTED;
+#endif
 }
 
 extern kern_return_t
 _kernelrpc_host_create_mach_voucher(mach_port_name_t host,
 }
 
 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);
+    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,
 
 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)
+    mach_voucher_attr_raw_recipe_array_t recipes,
+    mach_voucher_attr_recipe_size_t recipesCnt,
+    mach_port_name_t *voucher)
 {
        kern_return_t rv;
 
 {
        kern_return_t rv;
 
@@ -76,16 +94,19 @@ host_create_mach_voucher(mach_port_name_t host,
 
 #ifdef __x86_64__
        /* REMOVE once XBS kernel has new trap */
 
 #ifdef __x86_64__
        /* REMOVE once XBS kernel has new trap */
-       if (rv == ((1 << 24) | 70)) /* see mach/i386/syscall_sw.h */
+       if (rv == ((1 << 24) | 70)) /* see mach/i386/syscall_sw.h */
                rv = MACH_SEND_INVALID_DEST;
                rv = MACH_SEND_INVALID_DEST;
+       }
 #elif defined(__i386__)
        /* REMOVE once XBS kernel has new trap */
 #elif defined(__i386__)
        /* REMOVE once XBS kernel has new trap */
-       if (rv == (kern_return_t)(-70))
+       if (rv == (kern_return_t)(-70)) {
                rv = MACH_SEND_INVALID_DEST;
                rv = MACH_SEND_INVALID_DEST;
+       }
 #endif
 
 #endif
 
-       if (rv == MACH_SEND_INVALID_DEST)
+       if (rv == MACH_SEND_INVALID_DEST) {
                rv = _kernelrpc_host_create_mach_voucher(host, recipes, recipesCnt, voucher);
                rv = _kernelrpc_host_create_mach_voucher(host, recipes, recipesCnt, voucher);
+       }
 
        return rv;
 }
 
        return rv;
 }