xref: /xnu-10002.61.3/doc/startup.md (revision 0f4c859e951fba394238ab619495c4e1d54d0f34)
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