1*0f4c859eSApple OSS DistributionsXNU startup sequence 2*0f4c859eSApple OSS Distributions==================== 3*0f4c859eSApple OSS Distributions 4*0f4c859eSApple OSS Distributions### General Principles 5*0f4c859eSApple OSS Distributions 6*0f4c859eSApple OSS DistributionsXNU Startup sequence is driven by the `<kern/startup.h>` module. 7*0f4c859eSApple OSS Distributions 8*0f4c859eSApple OSS DistributionsThe startup sequence is made of individual subsystems (the `STARTUP_SUB_*` 9*0f4c859eSApple OSS Distributionsvalues of the `startup_subsystem_id_t` type) that get initialized in sequence. 10*0f4c859eSApple OSS Distributions 11*0f4c859eSApple OSS DistributionsA subsystem can use ranks to order the various initializers that make up its 12*0f4c859eSApple OSS Distributionsinitialization sequence. Usage of ranks is custom to each subsystem and must be 13*0f4c859eSApple OSS Distributionsdocumented in this file. 14*0f4c859eSApple OSS Distributions 15*0f4c859eSApple OSS DistributionsThe subsystem module will basically run hooks in that order: 16*0f4c859eSApple OSS Distributions 17*0f4c859eSApple OSS Distributions``` 18*0f4c859eSApple OSS Distributionsfor (subsystem 0 -> N) { 19*0f4c859eSApple OSS Distributions for (rank 0 -> N) { 20*0f4c859eSApple OSS Distributions // run in no particular order for a given rank in the given subsystem 21*0f4c859eSApple OSS Distributions init(subsystem, rank); 22*0f4c859eSApple OSS Distributions } 23*0f4c859eSApple OSS Distributions} 24*0f4c859eSApple OSS Distributions``` 25*0f4c859eSApple OSS Distributions 26*0f4c859eSApple OSS Distributions### Extending the startup sequence 27*0f4c859eSApple OSS Distributions 28*0f4c859eSApple OSS DistributionsWhen extending the startup sequence: 29*0f4c859eSApple OSS Distributions 30*0f4c859eSApple OSS Distributions1. add a new value to the `startup_subsystem_id_t` enum in the right order 31*0f4c859eSApple OSS Distributions2. document what services this phase provides, and how it uses ranks in this 32*0f4c859eSApple OSS Distributions file. 33*0f4c859eSApple OSS Distributions 34*0f4c859eSApple OSS Distributions 35*0f4c859eSApple OSS DistributionsWhen hooking with a given subsystem, consult this documentation to use the 36*0f4c859eSApple OSS Distributionsproper rank for your callback. 37*0f4c859eSApple OSS Distributions 38*0f4c859eSApple OSS DistributionsIf a new rank needs to be used, update this documentation in the proper section. 39*0f4c859eSApple OSS Distributions 40*0f4c859eSApple OSS Distributions--------------------------------------------------------------------------------- 41*0f4c859eSApple OSS Distributions 42*0f4c859eSApple OSS Distributions 43*0f4c859eSApple OSS Distributions`STARTUP_SUB_TUNABLES` 44*0f4c859eSApple OSS Distributions---------------------- 45*0f4c859eSApple OSS Distributions 46*0f4c859eSApple OSS Distributions### Description 47*0f4c859eSApple OSS Distributions 48*0f4c859eSApple OSS DistributionsInitializes various globals that alter the behavior of the kernel, lookup 49*0f4c859eSApple OSS Distributionstables, ... Available hooks are: 50*0f4c859eSApple OSS Distributions 51*0f4c859eSApple OSS Distributions- `TUNABLES`: parses a boot arg into a global that will become read-only at 52*0f4c859eSApple OSS Distributions lockdown time, 53*0f4c859eSApple OSS Distributions- `TUNABLE_WRITEABLE`: same as `TUNABLE` but the global will not be locked down. 54*0f4c859eSApple OSS Distributions 55*0f4c859eSApple OSS Distributions### Rank usage 56*0f4c859eSApple OSS Distributions 57*0f4c859eSApple OSS Distributions- Rank 1: `TUNABLE`, `TUNABLE_WRITEABLE` 58*0f4c859eSApple OSS Distributions- Middle: globals that require complex initialization (e.g. SFI classes). 59*0f4c859eSApple OSS Distributions 60*0f4c859eSApple OSS Distributions 61*0f4c859eSApple OSS Distributions`STARTUP_SUB_TIMEOUTS` 62*0f4c859eSApple OSS Distributions---------------------- 63*0f4c859eSApple OSS Distributions 64*0f4c859eSApple OSS Distributions## Description 65*0f4c859eSApple OSS Distributions 66*0f4c859eSApple OSS DistributionsInitializes machine timeouts, which are device-tree/boot-args 67*0f4c859eSApple OSS Distributionsconfigurable timeouts for low level machine code. 68*0f4c859eSApple OSS Distributions 69*0f4c859eSApple OSS DistributionsSee the comments for the MACHINE_TIMEOUT macro on how they are used in 70*0f4c859eSApple OSS Distributionsdetail. 71*0f4c859eSApple OSS Distributions 72*0f4c859eSApple OSS Distributions- Rank 1: `MACHINE_TIMEOUT` 73*0f4c859eSApple OSS Distributions- Middle: global lock timeouts that are derived from machine timeouts. 74*0f4c859eSApple OSS Distributions 75*0f4c859eSApple OSS Distributions`STARTUP_SUB_LOCKS` 76*0f4c859eSApple OSS Distributions------------------- 77*0f4c859eSApple OSS Distributions 78*0f4c859eSApple OSS Distributions### Description 79*0f4c859eSApple OSS Distributions 80*0f4c859eSApple OSS DistributionsInitializes early locks that do not require any memory allocations to be 81*0f4c859eSApple OSS Distributionsinitialized. Available hooks are: 82*0f4c859eSApple OSS Distributions 83*0f4c859eSApple OSS Distributions- `LCK_GRP_DECLARE*`: automatically initialized lock groups, 84*0f4c859eSApple OSS Distributions- `LCK_ATTR_DECLARE`: automatically initialized lock attributes, 85*0f4c859eSApple OSS Distributions- `LCK_SPIN_DECLARE*`: automatically initialized spinlocks, 86*0f4c859eSApple OSS Distributions- `LCK_RW_DECLARE`: automatically initialized reader/writer lock, 87*0f4c859eSApple OSS Distributions- `LCK_MTX_DECLARE`: automatically initialized mutex, 88*0f4c859eSApple OSS Distributions- `SIMPLE_LOCK_DECLARE*`: automatically initialized simple locks. 89*0f4c859eSApple OSS Distributions 90*0f4c859eSApple OSS Distributions### Rank usage 91*0f4c859eSApple OSS Distributions 92*0f4c859eSApple OSS Distributions- Rank 1: Initializes the module (`lck_mod_init`), 93*0f4c859eSApple OSS Distributions- Rank 2: `LCK_ATTR_DECLARE`, `LCK_GRP_DECLARE*` 94*0f4c859eSApple OSS Distributions- Rank 3: compact lock group table init 95*0f4c859eSApple OSS Distributions- Rank 4: `LCK_SPIN_DECLARE*`, `LCK_MTX_DECLARE*`, 96*0f4c859eSApple OSS Distributions `LCK_RW_DECLARE`, `SIMPLE_LOCK_DECLARE*`. 97*0f4c859eSApple OSS Distributions 98*0f4c859eSApple OSS Distributions 99*0f4c859eSApple OSS Distributions`STARTUP_SUB_KPRINTF` 100*0f4c859eSApple OSS Distributions--------------------- 101*0f4c859eSApple OSS Distributions 102*0f4c859eSApple OSS Distributions### Description 103*0f4c859eSApple OSS Distributions 104*0f4c859eSApple OSS DistributionsInitializes the kprintf subsystem. 105*0f4c859eSApple OSS Distributions 106*0f4c859eSApple OSS Distributions### Rank usage 107*0f4c859eSApple OSS Distributions 108*0f4c859eSApple OSS Distributions- Rank 1: calls the module initializer (`PE_init_kprintf`). 109*0f4c859eSApple OSS Distributions 110*0f4c859eSApple OSS Distributions 111*0f4c859eSApple OSS Distributions`STARTUP_SUB_PMAP_STEAL` 112*0f4c859eSApple OSS Distributions------------------------ 113*0f4c859eSApple OSS Distributions 114*0f4c859eSApple OSS Distributions### Description 115*0f4c859eSApple OSS Distributions 116*0f4c859eSApple OSS DistributionsAllows for subsystems to steal early memory. 117*0f4c859eSApple OSS Distributions 118*0f4c859eSApple OSS Distributions### Rank usage 119*0f4c859eSApple OSS Distributions 120*0f4c859eSApple OSS DistributionsN/A. 121*0f4c859eSApple OSS Distributions 122*0f4c859eSApple OSS Distributions 123*0f4c859eSApple OSS Distributions`STARTUP_SUB_KMEM` 124*0f4c859eSApple OSS Distributions------------------ 125*0f4c859eSApple OSS Distributions 126*0f4c859eSApple OSS Distributions### Description 127*0f4c859eSApple OSS Distributions 128*0f4c859eSApple OSS DistributionsDenotes that `kmem_alloc` is now usable. 129*0f4c859eSApple OSS Distributions 130*0f4c859eSApple OSS Distributions### Rank usage 131*0f4c859eSApple OSS Distributions 132*0f4c859eSApple OSS DistributionsN/A. 133*0f4c859eSApple OSS Distributions 134*0f4c859eSApple OSS Distributions`STARTUP_SUB_ZALLOC` 135*0f4c859eSApple OSS Distributions-------------------- 136*0f4c859eSApple OSS Distributions 137*0f4c859eSApple OSS Distributions### Description 138*0f4c859eSApple OSS Distributions 139*0f4c859eSApple OSS DistributionsInitializes the zone allocator. 140*0f4c859eSApple OSS Distributions 141*0f4c859eSApple OSS Distributions- `ZONE_DEFINE`, `ZONE_INIT`: automatically initialized permanent zones. 142*0f4c859eSApple OSS Distributions- `ZONE_VIEW_DEFINE`, `KALLOC_HEAP_DEFINE`: zone and kalloc heap views. 143*0f4c859eSApple OSS Distributions 144*0f4c859eSApple OSS Distributions 145*0f4c859eSApple OSS Distributions### Rank usage 146*0f4c859eSApple OSS Distributions 147*0f4c859eSApple OSS Distributions- Rank 1: `zone_init`: setup the zone subsystem, this allows for the already 148*0f4c859eSApple OSS Distributions created VM/pmap zones to become dynamic. 149*0f4c859eSApple OSS Distributions 150*0f4c859eSApple OSS Distributions- Rank 2: `vm_page_module_init`: create the "vm pages" zone. 151*0f4c859eSApple OSS Distributions The `vm_page_zone` must be created prior to `kalloc_init`; that routine can 152*0f4c859eSApple OSS Distributions trigger `zalloc()`s (for e.g. mutex statistic structure initialization). 153*0f4c859eSApple OSS Distributions 154*0f4c859eSApple OSS Distributions The `vm_page_zone` must exist to satisfy fictitious page allocations 155*0f4c859eSApple OSS Distributions (which are used for guard pages by the guard mode zone allocator). 156*0f4c859eSApple OSS Distributions 157*0f4c859eSApple OSS Distributions- Rank 3: Initialize kalloc. 158*0f4c859eSApple OSS Distributions 159*0f4c859eSApple OSS Distributions- Rank 4: Handle `ZONE_DEFINE` and `ZONE_INIT`. 160*0f4c859eSApple OSS Distributions 161*0f4c859eSApple OSS Distributions- Middle: zone and kalloc heaps (`ZONE_VIEW_DEFINE`, `KALLOC_HEAP_DEFINE`). 162*0f4c859eSApple OSS Distributions 163*0f4c859eSApple OSS Distributions`STARTUP_SUB_KTRACE` 164*0f4c859eSApple OSS Distributions-------------------- 165*0f4c859eSApple OSS Distributions 166*0f4c859eSApple OSS Distributions### Description 167*0f4c859eSApple OSS Distributions 168*0f4c859eSApple OSS DistributionsInitializes kdebug and kperf and starts tracing if requested with boot-args. 169*0f4c859eSApple OSS Distributions 170*0f4c859eSApple OSS Distributions### Rank usage 171*0f4c859eSApple OSS Distributions 172*0f4c859eSApple OSS DistributionsN/A. 173*0f4c859eSApple OSS Distributions 174*0f4c859eSApple OSS Distributions`STARTUP_SUB_PERCPU` 175*0f4c859eSApple OSS Distributions-------------------- 176*0f4c859eSApple OSS Distributions 177*0f4c859eSApple OSS Distributions### Description 178*0f4c859eSApple OSS Distributions 179*0f4c859eSApple OSS DistributionsInitializes the percpu subsystem. 180*0f4c859eSApple OSS Distributions 181*0f4c859eSApple OSS Distributions### Rank usage 182*0f4c859eSApple OSS Distributions 183*0f4c859eSApple OSS DistributionsRank 1: allocates the percpu memory, `percpu_foreach_base` and `percpu_foreach` 184*0f4c859eSApple OSS Distributions become usable. 185*0f4c859eSApple OSS Distributions 186*0f4c859eSApple OSS DistributionsRank 2: sets up static percpu counters. 187*0f4c859eSApple OSS Distributions 188*0f4c859eSApple OSS Distributions 189*0f4c859eSApple OSS Distributions### Rank usage 190*0f4c859eSApple OSS Distributions 191*0f4c859eSApple OSS Distributions- Rank 1: `LCK_MTX_DECLARE`. 192*0f4c859eSApple OSS Distributions 193*0f4c859eSApple OSS Distributions`STARTUP_SUB_CODESIGNING` 194*0f4c859eSApple OSS Distributions------------------------- 195*0f4c859eSApple OSS Distributions 196*0f4c859eSApple OSS Distributions### Description 197*0f4c859eSApple OSS Distributions 198*0f4c859eSApple OSS DistributionsInitializes the codesigning subsystem. 199*0f4c859eSApple OSS Distributions 200*0f4c859eSApple OSS Distributions### Rank usage 201*0f4c859eSApple OSS Distributions 202*0f4c859eSApple OSS Distributions- Rank 1: calls the module initializer (`cs_init`). 203*0f4c859eSApple OSS Distributions 204*0f4c859eSApple OSS Distributions`STARTUP_SUB_OSLOG` 205*0f4c859eSApple OSS Distributions------------------- 206*0f4c859eSApple OSS Distributions 207*0f4c859eSApple OSS Distributions### Description 208*0f4c859eSApple OSS Distributions 209*0f4c859eSApple OSS DistributionsInitializes the `os_log` facilities. 210*0f4c859eSApple OSS Distributions 211*0f4c859eSApple OSS Distributions### Rank usage 212*0f4c859eSApple OSS Distributions 213*0f4c859eSApple OSS Distributions- Rank 1: Calls the module initializer (`oslog_init`). 214*0f4c859eSApple OSS Distributions 215*0f4c859eSApple OSS Distributions 216*0f4c859eSApple OSS Distributions`STARTUP_SUB_MACH_IPC` 217*0f4c859eSApple OSS Distributions---------------------- 218*0f4c859eSApple OSS Distributions 219*0f4c859eSApple OSS Distributions### Description 220*0f4c859eSApple OSS Distributions 221*0f4c859eSApple OSS DistributionsInitializes the Mach IPC subsystem. 222*0f4c859eSApple OSS Distributions 223*0f4c859eSApple OSS Distributions### Rank usage 224*0f4c859eSApple OSS Distributions 225*0f4c859eSApple OSS Distributions- Rank 1: Initializes IPC submodule globals (ipc tables, voucher hashes, ...) 226*0f4c859eSApple OSS Distributions- Rank last: Final IPC initialization. 227*0f4c859eSApple OSS Distributions 228*0f4c859eSApple OSS Distributions 229*0f4c859eSApple OSS Distributions`STARTUP_SUB_THREAD_CALL` 230*0f4c859eSApple OSS Distributions------------------------- 231*0f4c859eSApple OSS Distributions 232*0f4c859eSApple OSS Distributions### Description 233*0f4c859eSApple OSS Distributions 234*0f4c859eSApple OSS DistributionsInitializes the Thread call subsystem (and dependent subsystems). 235*0f4c859eSApple OSS Distributions 236*0f4c859eSApple OSS Distributions### Rank usage 237*0f4c859eSApple OSS Distributions 238*0f4c859eSApple OSS Distributions- Rank 1: Initiailizes the thread call subsystem 239*0f4c859eSApple OSS Distributions- Rank Middle: Initialize modules needing thread calls 240*0f4c859eSApple OSS Distributions 241*0f4c859eSApple OSS Distributions 242*0f4c859eSApple OSS Distributions`STARTUP_SUB_SYSCTL` 243*0f4c859eSApple OSS Distributions-------------------- 244*0f4c859eSApple OSS Distributions 245*0f4c859eSApple OSS Distributions### Description 246*0f4c859eSApple OSS Distributions 247*0f4c859eSApple OSS DistributionsInitializes the sysctl kernel subsystem 248*0f4c859eSApple OSS Distributions 249*0f4c859eSApple OSS Distributions### Rank usage 250*0f4c859eSApple OSS Distributions 251*0f4c859eSApple OSS Distributions- Rank 1: automatic `SYSCTL_NODE` registration. 252*0f4c859eSApple OSS Distributions- Rank 2: automatic `SYSCTL_OID` registration. 253*0f4c859eSApple OSS Distributions- Middle: other manual early registrations. 254*0f4c859eSApple OSS Distributions- Last: registrations of dummy nodes in the constant nodes to allow extension. 255*0f4c859eSApple OSS Distributions 256*0f4c859eSApple OSS Distributions 257*0f4c859eSApple OSS Distributions`STARTUP_SUB_EARLY_BOOT` 258*0f4c859eSApple OSS Distributions------------------------ 259*0f4c859eSApple OSS Distributions 260*0f4c859eSApple OSS Distributions### Description 261*0f4c859eSApple OSS Distributions 262*0f4c859eSApple OSS DistributionsDenotes that subsystems that expect to operate with 263*0f4c859eSApple OSS Distributionsinterrupts or preemption enabled may begin enforcement. 264*0f4c859eSApple OSS Distributions 265*0f4c859eSApple OSS Distributions### Rank usage 266*0f4c859eSApple OSS Distributions 267*0f4c859eSApple OSS Distributions- Rank 1: Initialize some BSD globals 268*0f4c859eSApple OSS Distributions- Middle: Initialize some early BSD subsystems 269*0f4c859eSApple OSS Distributions 270*0f4c859eSApple OSS Distributions 271*0f4c859eSApple OSS Distributions`STARTUP_SUB_LOCKDOWN` 272*0f4c859eSApple OSS Distributions---------------------- 273*0f4c859eSApple OSS Distributions 274*0f4c859eSApple OSS Distributions### Description 275*0f4c859eSApple OSS Distributions 276*0f4c859eSApple OSS DistributionsDenotes that the kernel is locking down, this phase should never be hooked. 277*0f4c859eSApple OSS DistributionsWhen the kernel locks down: 278*0f4c859eSApple OSS Distributions 279*0f4c859eSApple OSS Distributions- data marked `__startup_data` and code marked `__startup_func` is unmapped, 280*0f4c859eSApple OSS Distributions- data marked `__security_const_late` or `SECURITY_READ_ONLY_LATE` becomes 281*0f4c859eSApple OSS Distributions read-only. 282*0f4c859eSApple OSS Distributions 283*0f4c859eSApple OSS Distributions### Rank usage 284*0f4c859eSApple OSS Distributions 285*0f4c859eSApple OSS DistributionsN/A. 286