xref: /xnu-8020.101.4/doc/startup.md (revision e7776783b89a353188416a9a346c6cdb4928faad)
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