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