xref: /xnu-11215.41.3/doc/lifecycle/startup.md (revision 33de042d024d46de5ff4e89f2471de6608e37fa4)
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