2  * Copyright (c) 1999-2012 Apple Inc. All rights reserved. 
   4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 
   6  * This file contains Original Code and/or Modifications of Original Code 
   7  * as defined in and that are subject to the Apple Public Source License 
   8  * Version 2.0 (the 'License'). You may not use this file except in 
   9  * compliance with the License. The rights granted to you under the License 
  10  * may not be used to create, or enable the creation or redistribution of, 
  11  * unlawful or unlicensed copies of an Apple operating system, or to 
  12  * circumvent, violate, or enable the circumvention or violation of, any 
  13  * terms of an Apple operating system software license agreement. 
  15  * Please obtain a copy of the License at 
  16  * http://www.opensource.apple.com/apsl/ and read it before using this file. 
  18  * The Original Code and all software distributed under the License are 
  19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  23  * Please see the License for the specific language governing rights and 
  24  * limitations under the License. 
  26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 
  29  * Mach Operating System 
  30  * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University 
  31  * All Rights Reserved. 
  33  * Permission to use, copy, modify and distribute this software and its 
  34  * documentation is hereby granted, provided that both the copyright 
  35  * notice and this permission notice appear in all copies of the 
  36  * software, derivative works or modified versions, and any portions 
  37  * thereof, and that both notices appear in supporting documentation. 
  39  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 
  40  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 
  41  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 
  43  * Carnegie Mellon requests users of this software to return to 
  45  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU 
  46  *  School of Computer Science 
  47  *  Carnegie Mellon University 
  48  *  Pittsburgh PA 15213-3890 
  50  * any improvements or extensions that they make and grant Carnegie Mellon 
  51  * the rights to redistribute these changes. 
  54 #include <mach/mach.h> 
  55 #include <mach/boolean.h> 
  56 #include <mach/machine/ndr_def.h> 
  57 #include <mach/mach_traps.h> 
  58 #include <mach/mach_host.h> 
  59 #include <mach/mach_init.h> 
  60 #include <mach/vm_param.h> 
  61 #include <machine/cpu_capabilities.h> 
  65 mach_port_t bootstrap_port 
= MACH_PORT_NULL
; 
  66 mach_port_t mach_task_self_ 
= MACH_PORT_NULL
; 
  68 mach_port_t mach_host_self_ 
= MACH_PORT_NULL
; 
  70 extern mach_port_t _task_reply_port
; 
  72 vm_size_t vm_kernel_page_size 
= 0; 
  73 vm_size_t vm_kernel_page_mask 
= 0; 
  74 int vm_kernel_page_shift 
= 0; 
  76 vm_size_t vm_page_size 
= 0; 
  77 vm_size_t vm_page_mask 
= 0; 
  78 int vm_page_shift 
= 0; 
  81 int _mach_fork_child(void); 
  83 static void mach_init_doit(void); 
  85 extern void _pthread_set_self(void *); 
  86 extern void _init_cpu_capabilities(void); 
  89 host_page_size(__unused host_t host
, vm_size_t 
*out_page_size
) 
  91         *out_page_size 
= vm_kernel_page_size
; 
  96  * mach_init() must be called explicitly in static executables (including dyld). 
  97  * called by libSystem_initializer() in dynamic executables 
 102         static bool mach_init_inited 
= false; 
 103         if (!mach_init_inited
) { 
 105                 mach_init_inited 
= true; 
 110 // called by libSystem_atfork_child() 
 112 _mach_fork_child(void) 
 118 #if defined(__arm__) || defined(__arm64__) 
 119 #if !defined(_COMM_PAGE_USER_PAGE_SHIFT_64) && defined(_COMM_PAGE_UNUSED0) 
 120 #define _COMM_PAGE_USER_PAGE_SHIFT_32 (_COMM_PAGE_UNUSED0) 
 121 #define _COMM_PAGE_USER_PAGE_SHIFT_64 (_COMM_PAGE_UNUSED0+1) 
 128         // Initialize cached mach ports defined in mach_init.h 
 129         mach_task_self_ 
= task_self_trap(); 
 130         _task_reply_port 
= mach_reply_port(); 
 132         if (vm_kernel_page_shift 
== 0) { 
 133 #ifdef  _COMM_PAGE_KERNEL_PAGE_SHIFT 
 134                 vm_kernel_page_shift 
= *(uint8_t*) _COMM_PAGE_KERNEL_PAGE_SHIFT
; 
 135                 vm_kernel_page_size 
= 1 << vm_kernel_page_shift
; 
 136                 vm_kernel_page_mask 
= vm_kernel_page_size 
- 1; 
 138                 vm_kernel_page_size 
= PAGE_SIZE
; 
 139                 vm_kernel_page_mask 
= PAGE_MASK
; 
 140                 vm_kernel_page_shift 
= PAGE_SHIFT
; 
 141 #endif /* _COMM_PAGE_KERNEL_PAGE_SHIFT */ 
 144         if (vm_page_shift 
== 0) { 
 145 #if defined(__arm64__) 
 146                 vm_page_shift 
= *(uint8_t*) _COMM_PAGE_USER_PAGE_SHIFT_64
; 
 147 #elif defined(__arm__) 
 148                 vm_page_shift 
= *(uint8_t*) _COMM_PAGE_USER_PAGE_SHIFT_32
; 
 150                 vm_page_shift 
= vm_kernel_page_shift
; 
 152                 vm_page_size 
= 1 << vm_page_shift
; 
 153                 vm_page_mask 
= vm_page_size 
- 1; 
 156         _init_cpu_capabilities(); 
 157         _pthread_set_self(0);