xref: /xnu-8796.101.5/README.md (revision aca3beaa3dfbd42498b42c5e5ce20a938e6554e5)
1*aca3beaaSApple OSS DistributionsWhat is XNU?
2*aca3beaaSApple OSS Distributions===========
3*aca3beaaSApple OSS Distributions
4*aca3beaaSApple OSS DistributionsXNU kernel is part of the Darwin operating system for use in macOS and iOS operating systems. XNU is an acronym for X is Not Unix.
5*aca3beaaSApple OSS DistributionsXNU is a hybrid kernel combining the Mach kernel developed at Carnegie Mellon University with components from FreeBSD and a C++ API for writing drivers called IOKit.
6*aca3beaaSApple OSS DistributionsXNU runs on x86_64 for both single processor and multi-processor configurations.
7*aca3beaaSApple OSS Distributions
8*aca3beaaSApple OSS DistributionsXNU Source Tree
9*aca3beaaSApple OSS Distributions===============
10*aca3beaaSApple OSS Distributions
11*aca3beaaSApple OSS Distributions  * `config` - configurations for exported apis for supported architecture and platform
12*aca3beaaSApple OSS Distributions  * `SETUP` - Basic set of tools used for configuring the kernel, versioning and kextsymbol management.
13*aca3beaaSApple OSS Distributions  * `EXTERNAL_HEADERS` - Headers sourced from other projects to avoid dependency cycles when building. These headers should be regularly synced when source is updated.
14*aca3beaaSApple OSS Distributions  * `libkern` - C++ IOKit library code for handling of drivers and kexts.
15*aca3beaaSApple OSS Distributions  * `libsa` -  kernel bootstrap code for startup
16*aca3beaaSApple OSS Distributions  * `libsyscall` - syscall library interface for userspace programs
17*aca3beaaSApple OSS Distributions  * `libkdd` - source for user library for parsing kernel data like kernel chunked data.
18*aca3beaaSApple OSS Distributions  * `makedefs` - top level rules and defines for kernel build.
19*aca3beaaSApple OSS Distributions  * `osfmk` - Mach kernel based subsystems
20*aca3beaaSApple OSS Distributions  * `pexpert` - Platform specific code like interrupt handling, atomics etc.
21*aca3beaaSApple OSS Distributions  * `security` - Mandatory Access Check policy interfaces and related implementation.
22*aca3beaaSApple OSS Distributions  * `bsd` - BSD subsystems code
23*aca3beaaSApple OSS Distributions  * `tools` - A set of utilities for testing, debugging and profiling kernel.
24*aca3beaaSApple OSS Distributions
25*aca3beaaSApple OSS DistributionsHow to build XNU
26*aca3beaaSApple OSS Distributions================
27*aca3beaaSApple OSS Distributions
28*aca3beaaSApple OSS DistributionsBuilding `DEVELOPMENT` kernel
29*aca3beaaSApple OSS Distributions-----------------------------
30*aca3beaaSApple OSS Distributions
31*aca3beaaSApple OSS DistributionsThe xnu make system can build kernel based on `KERNEL_CONFIGS` & `ARCH_CONFIGS` variables as arguments.
32*aca3beaaSApple OSS DistributionsHere is the syntax:
33*aca3beaaSApple OSS Distributions
34*aca3beaaSApple OSS Distributions    make SDKROOT=<sdkroot> ARCH_CONFIGS=<arch> KERNEL_CONFIGS=<variant>
35*aca3beaaSApple OSS Distributions
36*aca3beaaSApple OSS DistributionsWhere:
37*aca3beaaSApple OSS Distributions
38*aca3beaaSApple OSS Distributions  * \<sdkroot>: path to macOS SDK on disk. (defaults to `/`)
39*aca3beaaSApple OSS Distributions  * \<variant>: can be `debug`, `development`, `release`, `profile` and configures compilation flags and asserts throughout kernel code.
40*aca3beaaSApple OSS Distributions  * \<arch>   : can be valid arch to build for. (E.g. `X86_64`)
41*aca3beaaSApple OSS Distributions
42*aca3beaaSApple OSS DistributionsTo build a kernel for the same architecture as running OS, just type
43*aca3beaaSApple OSS Distributions
44*aca3beaaSApple OSS Distributions    $ make
45*aca3beaaSApple OSS Distributions    $ make SDKROOT=macosx.internal
46*aca3beaaSApple OSS Distributions
47*aca3beaaSApple OSS DistributionsAdditionally, there is support for configuring architectures through `ARCH_CONFIGS` and kernel configurations with `KERNEL_CONFIGS`.
48*aca3beaaSApple OSS Distributions
49*aca3beaaSApple OSS Distributions    $ make SDKROOT=macosx.internal ARCH_CONFIGS=X86_64 KERNEL_CONFIGS=DEVELOPMENT
50*aca3beaaSApple OSS Distributions    $ make SDKROOT=macosx.internal ARCH_CONFIGS=X86_64 KERNEL_CONFIGS="RELEASE DEVELOPMENT DEBUG"
51*aca3beaaSApple OSS Distributions
52*aca3beaaSApple OSS Distributions
53*aca3beaaSApple OSS DistributionsNote:
54*aca3beaaSApple OSS Distributions  * By default, architecture is set to the build machine architecture, and the default kernel
55*aca3beaaSApple OSS Distributions    config is set to build for DEVELOPMENT.
56*aca3beaaSApple OSS Distributions
57*aca3beaaSApple OSS Distributions
58*aca3beaaSApple OSS DistributionsThis will also create a bootable image, kernel.[config],  and a kernel binary
59*aca3beaaSApple OSS Distributionswith symbols, kernel.[config].unstripped.
60*aca3beaaSApple OSS Distributions
61*aca3beaaSApple OSS DistributionsTo intall the kernel into a DSTROOT, use the `install_kernels` target:
62*aca3beaaSApple OSS Distributions
63*aca3beaaSApple OSS Distributions    $ make install_kernels DSTROOT=/tmp/xnu-dst
64*aca3beaaSApple OSS Distributions
65*aca3beaaSApple OSS DistributionsHint:
66*aca3beaaSApple OSS DistributionsFor a more satisfying kernel debugging experience, with access to all
67*aca3beaaSApple OSS Distributionslocal variables and arguments, but without all the extra check of the
68*aca3beaaSApple OSS DistributionsDEBUG kernel, add something like:
69*aca3beaaSApple OSS Distributions	CFLAGS_DEVELOPMENTARM64="-O0 -g -DKERNEL_STACK_MULTIPLIER=2"
70*aca3beaaSApple OSS Distributions	CXXFLAGS_DEVELOPMENTARM64="-O0 -g -DKERNEL_STACK_MULTIPLIER=2"
71*aca3beaaSApple OSS Distributionsto your make command.
72*aca3beaaSApple OSS DistributionsReplace DEVELOPMENT and ARM64 with the appropriate build and platform.
73*aca3beaaSApple OSS Distributions
74*aca3beaaSApple OSS Distributions
75*aca3beaaSApple OSS Distributions  * To build with RELEASE kernel configuration
76*aca3beaaSApple OSS Distributions
77*aca3beaaSApple OSS Distributions        make KERNEL_CONFIGS=RELEASE SDKROOT=/path/to/SDK
78*aca3beaaSApple OSS Distributions
79*aca3beaaSApple OSS Distributions
80*aca3beaaSApple OSS DistributionsBuilding FAT kernel binary
81*aca3beaaSApple OSS Distributions--------------------------
82*aca3beaaSApple OSS Distributions
83*aca3beaaSApple OSS DistributionsDefine architectures in your environment or when running a make command.
84*aca3beaaSApple OSS Distributions
85*aca3beaaSApple OSS Distributions    $ make ARCH_CONFIGS="X86_64" exporthdrs all
86*aca3beaaSApple OSS Distributions
87*aca3beaaSApple OSS DistributionsOther makefile options
88*aca3beaaSApple OSS Distributions----------------------
89*aca3beaaSApple OSS Distributions
90*aca3beaaSApple OSS Distributions * $ make MAKEJOBS=-j8    # this will use 8 processes during the build. The default is 2x the number of active CPUS.
91*aca3beaaSApple OSS Distributions * $ make -j8             # the standard command-line option is also accepted
92*aca3beaaSApple OSS Distributions * $ make -w              # trace recursive make invocations. Useful in combination with VERBOSE=YES
93*aca3beaaSApple OSS Distributions * $ make BUILD_LTO=0     # build without LLVM Link Time Optimization
94*aca3beaaSApple OSS Distributions * $ make BOUND_CHECKS=0  # disable -fbound-attributes for this build
95*aca3beaaSApple OSS Distributions * $ make REMOTEBUILD=user@remotehost # perform build on remote host
96*aca3beaaSApple OSS Distributions * $ make BUILD_JSON_COMPILATION_DATABASE=1 # Build Clang JSON Compilation Database
97*aca3beaaSApple OSS Distributions
98*aca3beaaSApple OSS DistributionsThe XNU build system can optionally output color-formatted build output. To enable this, you can either
99*aca3beaaSApple OSS Distributionsset the `XNU_LOGCOLORS` environment variable to `y`, or you can pass `LOGCOLORS=y` to the make command.
100*aca3beaaSApple OSS Distributions
101*aca3beaaSApple OSS Distributions
102*aca3beaaSApple OSS DistributionsDebug information formats
103*aca3beaaSApple OSS Distributions=========================
104*aca3beaaSApple OSS Distributions
105*aca3beaaSApple OSS DistributionsBy default, a DWARF debug information repository is created during the install phase; this is a "bundle" named kernel.development.\<variant>.dSYM
106*aca3beaaSApple OSS DistributionsTo select the older STABS debug information format (where debug information is embedded in the kernel.development.unstripped image), set the BUILD_STABS environment variable.
107*aca3beaaSApple OSS Distributions
108*aca3beaaSApple OSS Distributions    $ export BUILD_STABS=1
109*aca3beaaSApple OSS Distributions    $ make
110*aca3beaaSApple OSS Distributions
111*aca3beaaSApple OSS Distributions
112*aca3beaaSApple OSS DistributionsBuilding KernelCaches
113*aca3beaaSApple OSS Distributions=====================
114*aca3beaaSApple OSS Distributions
115*aca3beaaSApple OSS DistributionsTo test the xnu kernel, you need to build a kernelcache that links the kexts and
116*aca3beaaSApple OSS Distributionskernel together into a single bootable image.
117*aca3beaaSApple OSS DistributionsTo build a kernelcache you can use the following mechanisms:
118*aca3beaaSApple OSS Distributions
119*aca3beaaSApple OSS Distributions  * Using automatic kernelcache generation with `kextd`.
120*aca3beaaSApple OSS Distributions    The kextd daemon keeps watching for changing in `/System/Library/Extensions` directory.
121*aca3beaaSApple OSS Distributions    So you can setup new kernel as
122*aca3beaaSApple OSS Distributions
123*aca3beaaSApple OSS Distributions        $ cp BUILD/obj/DEVELOPMENT/X86_64/kernel.development /System/Library/Kernels/
124*aca3beaaSApple OSS Distributions        $ touch /System/Library/Extensions
125*aca3beaaSApple OSS Distributions        $ ps -e | grep kextd
126*aca3beaaSApple OSS Distributions
127*aca3beaaSApple OSS Distributions  * Manually invoking `kextcache` to build new kernelcache.
128*aca3beaaSApple OSS Distributions
129*aca3beaaSApple OSS Distributions        $ kextcache -q -z -a x86_64 -l -n -c /var/tmp/kernelcache.test -K /var/tmp/kernel.test /System/Library/Extensions
130*aca3beaaSApple OSS Distributions
131*aca3beaaSApple OSS Distributions
132*aca3beaaSApple OSS Distributions
133*aca3beaaSApple OSS DistributionsRunning KernelCache on Target machine
134*aca3beaaSApple OSS Distributions=====================================
135*aca3beaaSApple OSS Distributions
136*aca3beaaSApple OSS DistributionsThe development kernel and iBoot supports configuring boot arguments so that we can safely boot into test kernel and, if things go wrong, safely fall back to previously used kernelcache.
137*aca3beaaSApple OSS DistributionsFollowing are the steps to get such a setup:
138*aca3beaaSApple OSS Distributions
139*aca3beaaSApple OSS Distributions  1. Create kernel cache using the kextcache command as `/kernelcache.test`
140*aca3beaaSApple OSS Distributions  2. Copy exiting boot configurations to alternate file
141*aca3beaaSApple OSS Distributions
142*aca3beaaSApple OSS Distributions         $ cp /Library/Preferences/SystemConfiguration/com.apple.Boot.plist /next_boot.plist
143*aca3beaaSApple OSS Distributions
144*aca3beaaSApple OSS Distributions  3. Update the kernelcache and boot-args for your setup
145*aca3beaaSApple OSS Distributions
146*aca3beaaSApple OSS Distributions         $ plutil -insert "Kernel Cache" -string "kernelcache.test" /next_boot.plist
147*aca3beaaSApple OSS Distributions         $ plutil -replace "Kernel Flags" -string "debug=0x144 -v kernelsuffix=test " /next_boot.plist
148*aca3beaaSApple OSS Distributions
149*aca3beaaSApple OSS Distributions  4. Copy the new config to `/Library/Preferences/SystemConfiguration/`
150*aca3beaaSApple OSS Distributions
151*aca3beaaSApple OSS Distributions         $ cp /next_boot.plist /Library/Preferences/SystemConfiguration/boot.plist
152*aca3beaaSApple OSS Distributions
153*aca3beaaSApple OSS Distributions  5. Bless the volume with new configs.
154*aca3beaaSApple OSS Distributions
155*aca3beaaSApple OSS Distributions         $ sudo -n bless  --mount / --setBoot --nextonly --options "config=boot"
156*aca3beaaSApple OSS Distributions
157*aca3beaaSApple OSS Distributions     The `--nextonly` flag specifies that use the `boot.plist` configs only for one boot.
158*aca3beaaSApple OSS Distributions     So if the kernel panic's you can easily power reboot and recover back to original kernel.
159*aca3beaaSApple OSS Distributions
160*aca3beaaSApple OSS Distributions
161*aca3beaaSApple OSS Distributions
162*aca3beaaSApple OSS Distributions
163*aca3beaaSApple OSS DistributionsCreating tags and cscope
164*aca3beaaSApple OSS Distributions========================
165*aca3beaaSApple OSS Distributions
166*aca3beaaSApple OSS DistributionsSet up your build environment and from the top directory, run:
167*aca3beaaSApple OSS Distributions
168*aca3beaaSApple OSS Distributions    $ make tags     # this will build ctags and etags on a case-sensitive volume, only ctags on case-insensitive
169*aca3beaaSApple OSS Distributions    $ make TAGS     # this will build etags
170*aca3beaaSApple OSS Distributions    $ make cscope   # this will build cscope database
171*aca3beaaSApple OSS Distributions
172*aca3beaaSApple OSS Distributions
173*aca3beaaSApple OSS DistributionsHow to install a new header file from XNU
174*aca3beaaSApple OSS Distributions=========================================
175*aca3beaaSApple OSS Distributions
176*aca3beaaSApple OSS DistributionsXNU installs header files at the following locations -
177*aca3beaaSApple OSS Distributions
178*aca3beaaSApple OSS Distributions    a. $(DSTROOT)/System/Library/Frameworks/Kernel.framework/Headers
179*aca3beaaSApple OSS Distributions    b. $(DSTROOT)/System/Library/Frameworks/Kernel.framework/PrivateHeaders
180*aca3beaaSApple OSS Distributions    c. $(DSTROOT)/usr/include/
181*aca3beaaSApple OSS Distributions    d. $(DSTROOT)/usr/local/include/
182*aca3beaaSApple OSS Distributions    e. $(DSTROOT)/System/DriverKit/usr/include/
183*aca3beaaSApple OSS Distributions    f. $(DSTROOT)/System/Library/Frameworks/IOKit.framework/Headers
184*aca3beaaSApple OSS Distributions    g. $(DSTROOT)/System/Library/Frameworks/IOKit.framework/PrivateHeaders
185*aca3beaaSApple OSS Distributions    h. $(DSTROOT)/System/Library/Frameworks/System.framework/PrivateHeaders
186*aca3beaaSApple OSS Distributions
187*aca3beaaSApple OSS Distributions`Kernel.framework` is used by kernel extensions.\
188*aca3beaaSApple OSS DistributionsThe `System.framework`, `/usr/include` and `/usr/local/include` are used by user level applications. \
189*aca3beaaSApple OSS Distributions`IOKit.framework` is used by IOKit userspace clients. \
190*aca3beaaSApple OSS Distributions`/System/DriverKit/usr/include` is used by userspace drivers. \
191*aca3beaaSApple OSS DistributionsThe header files in framework's `PrivateHeaders` are only available for ** Apple Internal Development **.
192*aca3beaaSApple OSS Distributions
193*aca3beaaSApple OSS DistributionsThe directory containing the header file should have a Makefile that
194*aca3beaaSApple OSS Distributionscreates the list of files that should be installed at different locations.
195*aca3beaaSApple OSS DistributionsIf you are adding the first header file in a directory, you will need to
196*aca3beaaSApple OSS Distributionscreate Makefile similar to `xnu/bsd/sys/Makefile`.
197*aca3beaaSApple OSS Distributions
198*aca3beaaSApple OSS DistributionsAdd your header file to the correct file list depending on where you want
199*aca3beaaSApple OSS Distributionsto install it. The default locations where the header files are installed
200*aca3beaaSApple OSS Distributionsfrom each file list are -
201*aca3beaaSApple OSS Distributions
202*aca3beaaSApple OSS Distributions    a. `DATAFILES` : To make header file available in user level -
203*aca3beaaSApple OSS Distributions       `$(DSTROOT)/usr/include`
204*aca3beaaSApple OSS Distributions       `$(DSTROOT)/System/Library/Frameworks/System.framework/PrivateHeaders`
205*aca3beaaSApple OSS Distributions
206*aca3beaaSApple OSS Distributions    b. `DRIVERKIT_DATAFILES` : To make header file available to DriverKit userspace drivers -
207*aca3beaaSApple OSS Distributions       `$(DSTROOT)/System/DriverKit/usr/include`
208*aca3beaaSApple OSS Distributions
209*aca3beaaSApple OSS Distributions    c. `PRIVATE_DATAFILES` : To make header file available to Apple internal in
210*aca3beaaSApple OSS Distributions       user level -
211*aca3beaaSApple OSS Distributions       `$(DSTROOT)/System/Library/Frameworks/System.framework/PrivateHeaders`
212*aca3beaaSApple OSS Distributions
213*aca3beaaSApple OSS Distributions    d. `EMBEDDED_PRIVATE_DATAFILES` : To make header file available in user
214*aca3beaaSApple OSS Distributions       level for macOS as `EXTRA_DATAFILES`, but Apple internal in user level
215*aca3beaaSApple OSS Distributions       for embedded OSes as `EXTRA_PRIVATE_DATAFILES` -
216*aca3beaaSApple OSS Distributions       `$(DSTROOT)/usr/include` (`EXTRA_DATAFILES`)
217*aca3beaaSApple OSS Distributions       `$(DSTROOT)/usr/local/include` (`EXTRA_PRIVATE_DATAFILES`)
218*aca3beaaSApple OSS Distributions
219*aca3beaaSApple OSS Distributions    d. `KERNELFILES` : To make header file available in kernel level -
220*aca3beaaSApple OSS Distributions       `$(DSTROOT)/System/Library/Frameworks/Kernel.framework/Headers`
221*aca3beaaSApple OSS Distributions       `$(DSTROOT)/System/Library/Frameworks/Kernel.framework/PrivateHeaders`
222*aca3beaaSApple OSS Distributions
223*aca3beaaSApple OSS Distributions    e. `PRIVATE_KERNELFILES` : To make header file available to Apple internal
224*aca3beaaSApple OSS Distributions       for kernel extensions -
225*aca3beaaSApple OSS Distributions       `$(DSTROOT)/System/Library/Frameworks/Kernel.framework/PrivateHeaders`
226*aca3beaaSApple OSS Distributions
227*aca3beaaSApple OSS Distributions    f. `MODULEMAPFILES` : To make module map file available in user level -
228*aca3beaaSApple OSS Distributions       `$(DSTROOT)/usr/include`
229*aca3beaaSApple OSS Distributions
230*aca3beaaSApple OSS Distributions    g. `PRIVATE_MODULEMAPFILES` : To make module map file available to Apple
231*aca3beaaSApple OSS Distributions       internal in user level -
232*aca3beaaSApple OSS Distributions       `$(DSTROOT)/usr/local/include`
233*aca3beaaSApple OSS Distributions
234*aca3beaaSApple OSS DistributionsThe Makefile combines the file lists mentioned above into different
235*aca3beaaSApple OSS Distributionsinstall lists which are used by build system to install the header files. There
236*aca3beaaSApple OSS Distributionsare two types of install lists: machine-dependent and machine-independent.
237*aca3beaaSApple OSS DistributionsThese lists are indicated by the presence of `MD` and `MI` in the build
238*aca3beaaSApple OSS Distributionssetting, respectively. If your header is architecture-specific, then you should
239*aca3beaaSApple OSS Distributionsuse a machine-dependent install list (e.g. `INSTALL_MD_LIST`). If your header
240*aca3beaaSApple OSS Distributionsshould be installed for all architectures, then you should use a
241*aca3beaaSApple OSS Distributionsmachine-independent install list (e.g. `INSTALL_MI_LIST`).
242*aca3beaaSApple OSS Distributions
243*aca3beaaSApple OSS DistributionsIf the install list that you are interested does not exist, create it
244*aca3beaaSApple OSS Distributionsby adding the appropriate file lists.  The default install lists, its
245*aca3beaaSApple OSS Distributionsmember file lists and their default location are described below -
246*aca3beaaSApple OSS Distributions
247*aca3beaaSApple OSS Distributions    a. `INSTALL_MI_LIST`, `INSTALL_MODULEMAP_MI_LIST` : Installs header and module map
248*aca3beaaSApple OSS Distributions       files to a location that is available to everyone in user level.
249*aca3beaaSApple OSS Distributions       Locations -
250*aca3beaaSApple OSS Distributions           $(DSTROOT)/usr/include
251*aca3beaaSApple OSS Distributions       Definition -
252*aca3beaaSApple OSS Distributions           INSTALL_MI_LIST = ${DATAFILES}
253*aca3beaaSApple OSS Distributions           INSTALL_MODULEMAP_MI_LIST = ${MODULEMAPFILES}
254*aca3beaaSApple OSS Distributions
255*aca3beaaSApple OSS Distributions    b. `INSTALL_DRIVERKIT_MI_LIST` : Installs header file to a location that is
256*aca3beaaSApple OSS Distributions        available to DriverKit userspace drivers.
257*aca3beaaSApple OSS Distributions        Locations -
258*aca3beaaSApple OSS Distributions           $(DSTROOT)/System/DriverKit/usr/include
259*aca3beaaSApple OSS Distributions       Definition -
260*aca3beaaSApple OSS Distributions           INSTALL_DRIVERKIT_MI_LIST = ${DRIVERKIT_DATAFILES}
261*aca3beaaSApple OSS Distributions
262*aca3beaaSApple OSS Distributions    c.  `INSTALL_MI_LCL_LIST`, `INSTALL_MODULEMAP_MI_LCL_LIST` : Installs header and
263*aca3beaaSApple OSS Distributions       module map files to a location that is available for Apple internal in user level.
264*aca3beaaSApple OSS Distributions       Locations -
265*aca3beaaSApple OSS Distributions           $(DSTROOT)/usr/local/include
266*aca3beaaSApple OSS Distributions       Definition -
267*aca3beaaSApple OSS Distributions           INSTALL_MI_LCL_LIST =
268*aca3beaaSApple OSS Distributions           INSTALL_MODULEMAP_MI_LCL_LIST = ${PRIVATE_MODULEMAPFILES}
269*aca3beaaSApple OSS Distributions
270*aca3beaaSApple OSS Distributions    d. `INSTALL_IF_MI_LIST` : Installs header file to location that is available
271*aca3beaaSApple OSS Distributions       to everyone for IOKit userspace clients.
272*aca3beaaSApple OSS Distributions       Locations -
273*aca3beaaSApple OSS Distributions            $(DSTROOT)/System/Library/Frameworks/IOKit.framework/Headers
274*aca3beaaSApple OSS Distributions       Definition -
275*aca3beaaSApple OSS Distributions            INSTALL_IF_MI_LIST = ${DATAFILES}
276*aca3beaaSApple OSS Distributions
277*aca3beaaSApple OSS Distributions    e. `INSTALL_IF_MI_LCL_LIST` : Installs header file to location that is
278*aca3beaaSApple OSS Distributions       available to Apple internal for IOKit userspace clients.
279*aca3beaaSApple OSS Distributions       Locations -
280*aca3beaaSApple OSS Distributions            $(DSTROOT)/System/Library/Frameworks/IOKit.framework/PrivateHeaders
281*aca3beaaSApple OSS Distributions       Definition -
282*aca3beaaSApple OSS Distributions            INSTALL_IF_MI_LCL_LIST = ${DATAFILES} ${PRIVATE_DATAFILES}
283*aca3beaaSApple OSS Distributions
284*aca3beaaSApple OSS Distributions    f.  `INSTALL_SF_MI_LCL_LIST` : Installs header file to a location that is available
285*aca3beaaSApple OSS Distributions       for Apple internal in user level.
286*aca3beaaSApple OSS Distributions       Locations -
287*aca3beaaSApple OSS Distributions           $(DSTROOT)/System/Library/Frameworks/System.framework/PrivateHeaders
288*aca3beaaSApple OSS Distributions       Definition -
289*aca3beaaSApple OSS Distributions           INSTALL_SF_MI_LCL_LIST = ${DATAFILES} ${PRIVATE_DATAFILES}
290*aca3beaaSApple OSS Distributions
291*aca3beaaSApple OSS Distributions    g. `INSTALL_KF_MI_LIST` : Installs header file to location that is available
292*aca3beaaSApple OSS Distributions       to everyone for kernel extensions.
293*aca3beaaSApple OSS Distributions       Locations -
294*aca3beaaSApple OSS Distributions            $(DSTROOT)/System/Library/Frameworks/Kernel.framework/Headers
295*aca3beaaSApple OSS Distributions       Definition -
296*aca3beaaSApple OSS Distributions            INSTALL_KF_MI_LIST = ${KERNELFILES}
297*aca3beaaSApple OSS Distributions
298*aca3beaaSApple OSS Distributions    h. `INSTALL_KF_MI_LCL_LIST` : Installs header file to location that is
299*aca3beaaSApple OSS Distributions       available for Apple internal for kernel extensions.
300*aca3beaaSApple OSS Distributions       Locations -
301*aca3beaaSApple OSS Distributions            $(DSTROOT)/System/Library/Frameworks/Kernel.framework/PrivateHeaders
302*aca3beaaSApple OSS Distributions       Definition -
303*aca3beaaSApple OSS Distributions            INSTALL_KF_MI_LCL_LIST = ${KERNELFILES} ${PRIVATE_KERNELFILES}
304*aca3beaaSApple OSS Distributions
305*aca3beaaSApple OSS Distributions    i. `EXPORT_MI_LIST` : Exports header file to all of xnu (bsd/, osfmk/, etc.)
306*aca3beaaSApple OSS Distributions       for compilation only. Does not install anything into the SDK.
307*aca3beaaSApple OSS Distributions       Definition -
308*aca3beaaSApple OSS Distributions            EXPORT_MI_LIST = ${KERNELFILES} ${PRIVATE_KERNELFILES}
309*aca3beaaSApple OSS Distributions
310*aca3beaaSApple OSS DistributionsIf you want to install the header file in a sub-directory of the paths
311*aca3beaaSApple OSS Distributionsdescribed in (1), specify the directory name using two variables
312*aca3beaaSApple OSS Distributions`INSTALL_MI_DIR` and `EXPORT_MI_DIR` as follows -
313*aca3beaaSApple OSS Distributions
314*aca3beaaSApple OSS Distributions    INSTALL_MI_DIR = dirname
315*aca3beaaSApple OSS Distributions    EXPORT_MI_DIR = dirname
316*aca3beaaSApple OSS Distributions
317*aca3beaaSApple OSS DistributionsIf you want to install the module map file in a sub-directory, specify the
318*aca3beaaSApple OSS Distributionsdirectory name using the variable `INSTALL_MODULEMAP_MI_DIR` as follows -
319*aca3beaaSApple OSS Distributions
320*aca3beaaSApple OSS Distributions    INSTALL_MODULEMAP_MI_DIR = dirname
321*aca3beaaSApple OSS Distributions
322*aca3beaaSApple OSS DistributionsA single header file can exist at different locations using the steps
323*aca3beaaSApple OSS Distributionsmentioned above.  However it might not be desirable to make all the code
324*aca3beaaSApple OSS Distributionsin the header file available at all the locations.  For example, you
325*aca3beaaSApple OSS Distributionswant to export a function only to kernel level but not user level.
326*aca3beaaSApple OSS Distributions
327*aca3beaaSApple OSS Distributions You can use C language's pre-processor directive (#ifdef, #endif, #ifndef)
328*aca3beaaSApple OSS Distributions to control the text generated before a header file is installed.  The kernel
329*aca3beaaSApple OSS Distributions only includes the code if the conditional macro is TRUE and strips out
330*aca3beaaSApple OSS Distributions code for FALSE conditions from the header file.
331*aca3beaaSApple OSS Distributions
332*aca3beaaSApple OSS Distributions Some pre-defined macros and their descriptions are -
333*aca3beaaSApple OSS Distributions
334*aca3beaaSApple OSS Distributions    a. `PRIVATE` : If defined, enclosed definitions are considered System
335*aca3beaaSApple OSS Distributions	Private Interfaces. These are visible within xnu and
336*aca3beaaSApple OSS Distributions	exposed in user/kernel headers installed within the AppleInternal
337*aca3beaaSApple OSS Distributions	"PrivateHeaders" sections of the System and Kernel frameworks.
338*aca3beaaSApple OSS Distributions    b. `KERNEL_PRIVATE` : If defined, enclosed code is available to all of xnu
339*aca3beaaSApple OSS Distributions	kernel and Apple internal kernel extensions and omitted from user
340*aca3beaaSApple OSS Distributions	headers.
341*aca3beaaSApple OSS Distributions    c. `BSD_KERNEL_PRIVATE` : If defined, enclosed code is visible exclusively
342*aca3beaaSApple OSS Distributions	within the xnu/bsd module.
343*aca3beaaSApple OSS Distributions    d. `MACH_KERNEL_PRIVATE`: If defined, enclosed code is visible exclusively
344*aca3beaaSApple OSS Distributions	within the xnu/osfmk module.
345*aca3beaaSApple OSS Distributions    e. `XNU_KERNEL_PRIVATE`: If defined, enclosed code is visible exclusively
346*aca3beaaSApple OSS Distributions	within xnu.
347*aca3beaaSApple OSS Distributions    f. `KERNEL` :  If defined, enclosed code is available within xnu and kernel
348*aca3beaaSApple OSS Distributions       extensions and is not visible in user level header files.  Only the
349*aca3beaaSApple OSS Distributions       header files installed in following paths will have the code -
350*aca3beaaSApple OSS Distributions
351*aca3beaaSApple OSS Distributions            $(DSTROOT)/System/Library/Frameworks/Kernel.framework/Headers
352*aca3beaaSApple OSS Distributions            $(DSTROOT)/System/Library/Frameworks/Kernel.framework/PrivateHeaders
353*aca3beaaSApple OSS Distributions    g. `DRIVERKIT`: If defined, enclosed code is visible exclusively in the
354*aca3beaaSApple OSS Distributions    DriverKit SDK headers used by userspace drivers.
355*aca3beaaSApple OSS Distributions
356*aca3beaaSApple OSS DistributionsModule map file name convention
357*aca3beaaSApple OSS Distributions===============================
358*aca3beaaSApple OSS Distributions
359*aca3beaaSApple OSS DistributionsIn the simple case, a subdirectory of `usr/include` or `usr/local/include`
360*aca3beaaSApple OSS Distributionscan be represented by a standalone module. Where this is the case, set
361*aca3beaaSApple OSS Distributions`INSTALL_MODULEMAP_MI_DIR` to `INSTALL_MI_DIR` and install a `module.modulemap`
362*aca3beaaSApple OSS Distributionsfile there. `module.modulemap` is used even for private modules in
363*aca3beaaSApple OSS Distributions`usr/local/include`; `module.private.modulemap` is not used. Caveat: in order
364*aca3beaaSApple OSS Distributionsto stay in the simple case, the module name needs to be exactly the same as
365*aca3beaaSApple OSS Distributionsthe directory name. If that's not possible, then the following method will
366*aca3beaaSApple OSS Distributionsneed to be applied.
367*aca3beaaSApple OSS Distributions
368*aca3beaaSApple OSS Distributions`xnu` contributes to the modules defined in CoreOSModuleMaps by installing
369*aca3beaaSApple OSS Distributionsmodule map files that are sourced from `usr/include/module.modulemap` and
370*aca3beaaSApple OSS Distributions`usr/local/include/module.modulemap`. The naming convention for the `xnu`
371*aca3beaaSApple OSS Distributionsmodule map files are as follows.
372*aca3beaaSApple OSS Distributions
373*aca3beaaSApple OSS Distributions    a. Ideally the module map file covers an entire directory. A module map
374*aca3beaaSApple OSS Distributions       file covering `usr/include/a/b/c` would be named `a_b_c.modulemap`.
375*aca3beaaSApple OSS Distributions       `usr/local/include/a/b/c` would be `a_b_c_private.modulemap`.
376*aca3beaaSApple OSS Distributions    b. Some headers are special and require their own module. In that case,
377*aca3beaaSApple OSS Distributions       the module map file would be named after the module it defines.
378*aca3beaaSApple OSS Distributions       A module map file defining the module `One.Two.Three` would be named
379*aca3beaaSApple OSS Distributions       `one_two_three.modulemap`.
380*aca3beaaSApple OSS Distributions
381*aca3beaaSApple OSS DistributionsConditional compilation
382*aca3beaaSApple OSS Distributions=======================
383*aca3beaaSApple OSS Distributions
384*aca3beaaSApple OSS Distributions`xnu` offers the following mechanisms for conditionally compiling code:
385*aca3beaaSApple OSS Distributions
386*aca3beaaSApple OSS Distributions    a. *CPU Characteristics* If the code you are guarding has specific
387*aca3beaaSApple OSS Distributions    characterstics that will vary only based on the CPU architecture being
388*aca3beaaSApple OSS Distributions    targeted, use this option. Prefer checking for features of the
389*aca3beaaSApple OSS Distributions    architecture (e.g. `__LP64__`, `__LITTLE_ENDIAN__`, etc.).
390*aca3beaaSApple OSS Distributions    b. *New Features* If the code you are guarding, when taken together,
391*aca3beaaSApple OSS Distributions    implements a feature, you should define a new feature in `config/MASTER`
392*aca3beaaSApple OSS Distributions    and use the resulting `CONFIG` preprocessor token (e.g. for a feature
393*aca3beaaSApple OSS Distributions    named `config_virtual_memory`, check for `#if CONFIG_VIRTUAL_MEMORY`).
394*aca3beaaSApple OSS Distributions    This practice ensures that existing features may be brought to other
395*aca3beaaSApple OSS Distributions    platforms by simply changing a feature switch.
396*aca3beaaSApple OSS Distributions    c. *Existing Features* You can use existing features if your code is
397*aca3beaaSApple OSS Distributions    strongly tied to them (e.g. use `SECURE_KERNEL` if your code implements
398*aca3beaaSApple OSS Distributions    new functionality that is exclusively relevant to the trusted kernel and
399*aca3beaaSApple OSS Distributions    updates the definition/understanding of what being a trusted kernel means).
400*aca3beaaSApple OSS Distributions
401*aca3beaaSApple OSS DistributionsIt is recommended that you avoid compiling based on the target platform. `xnu`
402*aca3beaaSApple OSS Distributionsdoes not define the platform macros from `TargetConditionals.h`
403*aca3beaaSApple OSS Distributions(`TARGET_OS_OSX`, `TARGET_OS_IOS`, etc.).
404*aca3beaaSApple OSS Distributions
405*aca3beaaSApple OSS Distributions
406*aca3beaaSApple OSS DistributionsDebugging xnu
407*aca3beaaSApple OSS Distributions=============
408*aca3beaaSApple OSS Distributions
409*aca3beaaSApple OSS DistributionsBy default, the kernel reboots in the event of a panic.
410*aca3beaaSApple OSS DistributionsThis behavior can be overriden by the `debug` boot-arg -- `debug=0x14e` will cause a panic to wait for a debugger to attach.
411*aca3beaaSApple OSS DistributionsTo boot a kernel so it can be debugged by an attached machine, override the `kdp_match_name` boot-arg with the appropriate `ifconfig` interface.
412*aca3beaaSApple OSS DistributionsEthernet, Thunderbolt, and serial debugging are supported, depending on the hardware.
413*aca3beaaSApple OSS Distributions
414*aca3beaaSApple OSS DistributionsUse LLDB to debug the kernel:
415*aca3beaaSApple OSS Distributions
416*aca3beaaSApple OSS Distributions    ; xcrun -sdk macosx lldb <path-to-unstripped-kernel>
417*aca3beaaSApple OSS Distributions    (lldb) gdb-remote [<host-ip>:]<port>
418*aca3beaaSApple OSS Distributions
419*aca3beaaSApple OSS DistributionsThe debug info for the kernel (dSYM) comes with a set of macros to support kernel debugging.
420*aca3beaaSApple OSS DistributionsTo load these macros automatically when attaching to the kernel, add the following to `~/.lldbinit`:
421*aca3beaaSApple OSS Distributions
422*aca3beaaSApple OSS Distributions    settings set target.load-script-from-symbol-file true
423*aca3beaaSApple OSS Distributions
424*aca3beaaSApple OSS Distributions`tools/lldbmacros` contains the source for these commands.
425*aca3beaaSApple OSS DistributionsSee the README in that directory for their usage, or use the built-in LLDB help with:
426*aca3beaaSApple OSS Distributions
427*aca3beaaSApple OSS Distributions    (lldb) help showcurrentstacks
428*aca3beaaSApple OSS Distributions
429