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