xref: /xnu-10063.121.3/makedefs/MakeInc.def (revision 2c2f96dc2b9a4408a43d3150ae9c105355ca3daa)
1# -*- mode: makefile;-*-
2#
3# Copyright (C) 1999-2023 Apple Inc. All rights reserved.
4#
5# MakeInc.def contains global definitions for building,
6# linking, and installing files.
7#
8
9#
10# Architecture Configuration options
11#
12SUPPORTED_ARCH_CONFIGS := X86_64 X86_64H ARM64
13
14#
15# Kernel Configuration options
16#
17SUPPORTED_KERNEL_CONFIGS = RELEASE DEVELOPMENT DEBUG PROFILE KASAN
18
19
20#
21# Machine Configuration options
22#
23
24SUPPORTED_X86_64_MACHINE_CONFIGS = NONE
25SUPPORTED_X86_64H_MACHINE_CONFIGS = NONE
26
27ifneq ($(findstring _Sim,$(RC_ProjectName)),)
28SUPPORTED_ARM64_MACHINE_CONFIGS = NONE
29else ifneq ($(findstring _host,$(RC_ProjectName)),)
30SUPPORTED_ARM64_MACHINE_CONFIGS = NONE
31else
32SUPPORTED_ARM64_MACHINE_CONFIGS = BCM2837 T6000 T6020 T8101 T8103 T8112 VMAPPLE
33
34endif
35
36#
37# Setup up *_LC variables during recursive invocations
38#
39
40ifndef CURRENT_ARCH_CONFIG_LC
41	export CURRENT_ARCH_CONFIG_LC	:= $(shell printf "%s" "$(CURRENT_ARCH_CONFIG)" | $(TR) A-Z a-z)
42endif
43
44ifndef CURRENT_KERNEL_CONFIG_LC
45	export CURRENT_KERNEL_CONFIG_LC := $(shell printf "%s" "$(CURRENT_KERNEL_CONFIG)" | $(TR) A-Z a-z)
46endif
47
48ifndef CURRENT_MACHINE_CONFIG_LC
49	export CURRENT_MACHINE_CONFIG_LC := $(shell printf "%s" "$(CURRENT_MACHINE_CONFIG)" | $(TR) A-Z a-z)
50endif
51
52#
53# Component List
54#
55COMPONENT_LIST	= osfmk bsd libkern iokit pexpert libsa security san
56COMPONENT	= $(if $(word 2,$(subst /, ,$(RELATIVE_SOURCE_PATH))),$(word 2,$(subst /, ,$(RELATIVE_SOURCE_PATH))),$(firstword $(subst /, ,$(RELATIVE_SOURCE_PATH))))
57COMPONENT_IMPORT_LIST = $(filter-out $(COMPONENT),$(COMPONENT_LIST))
58
59MACHINE_FLAGS_ARM64_T8101 = -DARM64_BOARD_CONFIG_T8101			-mcpu=apple-a14
60MACHINE_FLAGS_ARM64_T8103 = -DARM64_BOARD_CONFIG_T8103                  -mcpu=apple-a14
61MACHINE_FLAGS_ARM64_T8112 = -DARM64_BOARD_CONFIG_T8112 			-mcpu=apple-a15
62MACHINE_FLAGS_ARM64_T6000 = -DARM64_BOARD_CONFIG_T6000			-mcpu=apple-a14
63MACHINE_FLAGS_ARM64_T6020 = -DARM64_BOARD_CONFIG_T6020 			-mcpu=apple-a15
64MACHINE_FLAGS_ARM64_VMAPPLE = -DARM64_BOARD_CONFIG_VMAPPLE              -march=armv8.5a
65MACHINE_FLAGS_ARM64_BCM2837 = -DARM64_BOARD_CONFIG_BCM2837
66
67
68#
69# Deployment target flag
70#
71ifeq ($(PLATFORM),MacOSX)
72    DEPLOYMENT_TARGET_FLAGS = -mmacosx-version-min=$(SDKVERSION) -DXNU_TARGET_OS_OSX
73    DEPLOYMENT_LINKER_FLAGS = -Wl,-macosx_version_min,$(SDKVERSION)
74else ifeq ($(PLATFORM),DriverKit)
75    DEPLOYMENT_TARGET_FLAGS = -target apple-driverkit$(SDKVERSION) -DXNU_TARGET_OS_OSX
76    DEPLOYMENT_LINKER_FLAGS = -Wl,-target,apple-driverkit$(SDKVERSION)
77else ifeq ($(PLATFORM),WatchOS)
78    DEPLOYMENT_TARGET_FLAGS = -mwatchos-version-min=$(SDKVERSION) -DXNU_TARGET_OS_WATCH
79    DEPLOYMENT_LINKER_FLAGS =
80else ifeq ($(PLATFORM),tvOS)
81    DEPLOYMENT_TARGET_FLAGS = -mtvos-version-min=$(SDKVERSION) -DXNU_TARGET_OS_TV
82    DEPLOYMENT_LINKER_FLAGS =
83else ifeq ($(PLATFORM),AppleTVOS)
84    DEPLOYMENT_TARGET_FLAGS = -mtvos-version-min=$(SDKVERSION) -DXNU_TARGET_OS_TV
85else ifeq ($(PLATFORM),BridgeOS)
86    DEPLOYMENT_TARGET_FLAGS = -mbridgeos-version-min=$(SDKVERSION) -DXNU_TARGET_OS_BRIDGE
87    DEPLOYMENT_LINKER_FLAGS =
88else ifneq ($(filter $(SUPPORTED_EMBEDDED_PLATFORMS),$(PLATFORM)),)
89    DEPLOYMENT_TARGET_FLAGS = -miphoneos-version-min=$(SDKVERSION) -DXNU_TARGET_OS_IOS
90    DEPLOYMENT_LINKER_FLAGS = -Wl,-ios_version_min,$(SDKVERSION)
91else ifneq ($(filter $(SUPPORTED_SIMULATOR_PLATFORMS),$(PLATFORM)),)
92    DEPLOYMENT_TARGET_FLAGS =
93    DEPLOYMENT_LINKER_FLAGS =
94else
95    DEPLOYMENT_TARGET_FLAGS =
96    DEPLOYMENT_LINKER_FLAGS =
97endif
98
99
100DEPLOYMENT_TARGET_DEFINES = -DXNU_PLATFORM_$(PLATFORM)
101
102
103#
104# Standard defines list
105#
106DEFINES = -DAPPLE -DKERNEL -DKERNEL_PRIVATE -DXNU_KERNEL_PRIVATE \
107	-DPRIVATE -D__MACHO__=1 -Dvolatile=__volatile -DXNU_KERN_EVENT_DATA_IS_VLA \
108	-DCURRENT_MACHINE_CONFIG_LC=$(CURRENT_MACHINE_CONFIG_LC) \
109	$(CONFIG_DEFINES) $(SEED_DEFINES)
110
111# Enable caching with `make CCACHE=ccache`
112# This intentionally does not override $(CC) because that will confuse
113# utilities like mig.
114CCACHE ?=
115
116#
117# Compiler command
118#
119KCC  = $(CCACHE) $(CC)
120KC++ = $(CCACHE) $(CXX)
121
122GENASSYM_KCC = $(CCACHE) $(CC)
123
124#
125# Compiler warning flags
126#
127
128USE_WERROR := 1
129ifneq ($(BUILD_WERROR),)
130USE_WERROR := $(BUILD_WERROR)
131endif
132
133ifeq ($(USE_WERROR),1)
134WERROR := -Werror
135endif
136
137# Shared C/C++ warning flags
138# NOTE: order matters here.  -Wno-xxx goes before opt-in of ones we want
139WARNFLAGS_STD := \
140	-Weverything \
141	-Wundef-prefix=TARGET_OS_ \
142	-Wundef-prefix=LCK_GRP_USE_ARG \
143	-Wno-pedantic \
144	$(WERROR) \
145	-Wno-bad-function-cast \
146	-Wno-bitwise-instead-of-logical \
147	-Wno-c++-compat \
148	-Wno-c++98-compat \
149	-Wno-conditional-uninitialized \
150	-Wno-covered-switch-default \
151	-Wno-disabled-macro-expansion \
152	-Wno-documentation-unknown-command \
153	-Wno-extra-semi-stmt \
154	-Wno-format-non-iso \
155	-Wno-language-extension-token \
156	-Wno-missing-variable-declarations \
157	-Wno-packed \
158	-Wno-padded \
159	-Wno-partial-availability \
160	-Wno-reserved-id-macro \
161	-Wno-shift-sign-overflow \
162	-Wno-switch-enum \
163	-Wno-unaligned-access \
164	-Wno-undef \
165	-Wno-unused-macros \
166	-Wno-used-but-marked-unused \
167	-Wno-variadic-macros \
168	-Wno-vla \
169	-Wno-zero-length-array \
170	-Wno-packed
171
172# When a new clang has new warnings disable them here until the kernel is fixed.
173WARNFLAGS_STD := $(WARNFLAGS_STD) \
174	-Wno-unknown-warning-option \
175	-Wno-anon-enum-enum-conversion \
176	-Wno-error=enum-enum-conversion \
177	-Wno-error=c99-designator \
178	-Wno-error=reorder-init-list \
179	-Wno-deprecated-volatile \
180	-Wno-error=incompatible-function-pointer-types-strict \
181	-Wno-error=cast-function-type-strict
182
183WARNFLAGS_STD := $(WARNFLAGS_STD) \
184	-Wno-declaration-after-statement
185
186# Hand-written sign conversion diagnostics are resolved, but the
187# auto-generated ones need mig and iig to be updated to fix.  Disable the
188# diagnostic here until we've completed that:
189WARNFLAGS_STD := $(WARNFLAGS_STD) \
190	-Wno-sign-compare \
191	-Wno-sign-conversion
192
193# Opt-ins:
194WARNFLAGS_STD := $(WARNFLAGS_STD) \
195	-Wpointer-arith \
196	-Wxnu-typed-allocators
197
198CWARNFLAGS_STD = \
199	$(WARNFLAGS_STD)
200
201
202
203# Can be overridden in Makefile.template or Makefile.$arch
204export CWARNFLAGS ?= $(CWARNFLAGS_STD)
205
206define add_perfile_cflags
207$(1)_CWARNFLAGS_ADD += $2
208endef
209
210define rm_perfile_cflags
211$(1)_CFLAGS_RM += $2
212endef
213
214CXXWARNFLAGS_STD = \
215	$(WARNFLAGS_STD) \
216	-Wno-c++98-compat-pedantic \
217	-Wno-exit-time-destructors \
218	-Wno-global-constructors \
219	-Wno-old-style-cast
220
221# Can be overridden in Makefile.template or Makefile.$arch
222export CXXWARNFLAGS ?= $(CXXWARNFLAGS_STD)
223
224define add_perfile_cxxflags
225$(1)_CXXWARNFLAGS_ADD += $2
226endef
227
228#
229# Default ARCH_FLAGS, for use with compiler/linker/assembler/mig drivers
230
231ARCH_FLAGS_X86_64	  = -arch x86_64
232ARCH_FLAGS_X86_64H	  = -arch x86_64h
233
234ifeq ($(RC_ProjectName),xnu_libraries)
235BUILD_STATIC_LINK := 1
236BUILD_XNU_LIBRARY := 1
237RC_NONARCH_CFLAGS += -D__BUILDING_XNU_LIBRARY__=1
238endif
239
240ifneq ($(filter ARM ARM64,$(CURRENT_ARCH_CONFIG)),)
241
242ifneq ($(findstring _Sim,$(RC_ProjectName)),)
243ARCH_FLAGS_ARM64          = -arch arm64e
244else ifneq ($(findstring _host,$(RC_ProjectName)),)
245ARCH_FLAGS_ARM64          = -arch arm64e
246else
247
248ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG ?=
249
250ifeq ($(ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG),)
251
252ifneq ($(EMBEDDED_DEVICE_MAP),)
253export ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG := $(shell $(EMBEDDED_DEVICE_MAP) -db $(EDM_DBPATH) -list -query SELECT DISTINCT KernelMachOArchitecture FROM Targets WHERE KernelPlatform IS \"$(CURRENT_MACHINE_CONFIG_LC)\" LIMIT 1 || echo UNKNOWN )
254ifeq ($(ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG),)
255ifeq ($(filter $(EXTRA_TARGET_CONFIGS_$(CURRENT_KERNEL_CONFIG)),$(CURRENT_MACHINE_CONFIG)),)
256$(error Machine config $(CURRENT_MACHINE_CONFIG_LC) not found in EmbeddedDeviceMap)
257endif
258endif
259endif
260
261endif
262
263ifeq ($(ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG),)
264
265# Without embdedded device map, use a default arch string
266export ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG := $(shell echo $(CURRENT_ARCH_CONFIG) | tr A-Z a-z)
267ifneq ($(filter arm64,$(ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG)),)
268export ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG := arm64e
269endif
270
271endif
272
273
274BUILD_STATIC_LINK := 1
275
276ARCH_FLAGS_ARM64	  = -arch $(ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG)
277
278endif
279
280else
281# non arm machine config string
282ifndef ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG
283export ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG := $(shell echo $(CURRENT_ARCH_CONFIG) | tr A-Z a-z)
284endif
285
286endif
287
288#
289# Default CFLAGS
290#
291ifdef RC_NONARCH_CFLAGS
292OTHER_CFLAGS = $(RC_NONARCH_CFLAGS)
293endif
294
295#
296# Debug info
297#
298DSYMINFODIR	= Contents
299DSYMKGMACROSDIR	= Contents/Resources
300DSYMLLDBMACROSDIR = Contents/Resources/Python
301DSYMDWARFDIR	= Contents/Resources/DWARF
302
303DEBUG_CFLAGS := -g
304BUILD_DSYM := 1
305
306#
307# We must not use -fno-keep-inline-functions, or it will remove the dtrace
308# probes from the kernel.
309#
310CFLAGS_GEN = $(DEBUG_CFLAGS) -nostdlibinc \
311	-ferror-limit=10000 \
312	-fno-builtin \
313	-fno-common \
314	-ftrivial-auto-var-init=zero \
315	-fsigned-bitfields \
316	-fmerge-all-constants \
317	-fno-c++-static-destructors \
318	$(OTHER_CFLAGS)
319
320CFLAGS_RELEASE	=
321CFLAGS_DEVELOPMENT	=
322CFLAGS_DEBUG	=
323CFLAGS_KASAN = $(CFLAGS_DEVELOPMENT)
324CFLAGS_PROFILE	=  -pg
325
326CFLAGS_X86_64	= -Dx86_64 -DX86_64 -D__X86_64__ -DLP64 \
327				-DPAGE_SIZE_FIXED -mkernel -msoft-float
328
329CFLAGS_X86_64H = $(CFLAGS_X86_64)
330
331LARGE_MEMORY_DEFINE=-UARM_LARGE_MEMORY
332ARM64_PLKSEG_ADDR  =0xfffffff004004000
333ARM64_LINK_ADDR    =0xfffffff007004000
334
335# Use ARM_LARGE_MEMORY config for all MacOSX targets.
336ifneq ($(filter $(PLATFORM),MacOSX),)
337LARGE_MEMORY_DEFINE=-DARM_LARGE_MEMORY=1
338ARM64_PLKSEG_ADDR  =0xfffffe0004004000
339ARM64_LINK_ADDR    =0xfffffe0007004000
340endif
341
342
343CFLAGS_ARM64	= -Darm64 -DARM64 -D__ARM64__ -DLP64 -DPAGE_SIZE_FIXED -DVM_KERNEL_LINK_ADDRESS=$(ARM64_LINK_ADDR) \
344			$(LARGE_MEMORY_DEFINE) -momit-leaf-frame-pointer -fno-strict-aliasing -D__API__=v4 -mkernel
345
346CFLAGS_RELEASEX86_64 = -O2
347CFLAGS_DEVELOPMENTX86_64 = -O2
348CFLAGS_KASANX86_64 = $(CFLAGS_DEVELOPMENTX86_64)
349# No space optimization for the DEBUG kernel for the benefit of gdb:
350CFLAGS_DEBUGX86_64 = -O0
351CFLAGS_PROFILEX86_64 = -O2
352
353CFLAGS_RELEASEX86_64H = -O2
354CFLAGS_DEVELOPMENTX86_64H = -O2
355CFLAGS_KASANX86_64H = $(CFLAGS_DEVELOPMENTX86_64H)
356# No space optimization for the DEBUG kernel for the benefit of gdb:
357CFLAGS_DEBUGX86_64H = -O0
358CFLAGS_PROFILEX86_64H = -O2
359
360CFLAGS_RELEASEARM = -O2
361CFLAGS_DEVELOPMENTARM = -O2
362CFLAGS_DEBUGARM = -O0
363CFLAGS_PROFILEARM = -O2
364
365CFLAGS_RELEASEARM64 = -O2
366CFLAGS_DEVELOPMENTARM64 = -O2
367CFLAGS_KASANARM64 = $(CFLAGS_DEVELOPMENTARM64)
368CFLAGS_DEBUGARM64 = -O0
369CFLAGS_PROFILEARM64 = -O2
370
371#
372# bound-checking support
373#
374# BOUND_CHECKS=0 disables, else support is dynamically detected
375#
376ifndef BOUND_CHECKS
377ifeq ($(shell $(CC) -E -fbounds-attributes /dev/null 2>/dev/null && echo 1),1)
378    export BOUND_CHECKS := 1
379else
380    export BOUND_CHECKS := 0
381endif
382endif # ifndef BOUND_CHECKS
383ifeq ($(BOUND_CHECKS),1)
384CFLAGS_BOUND_CHECKS = -fbounds-attributes
385else
386CFLAGS_BOUND_CHECKS =
387endif
388
389# Check whether soft trap is supported
390ifndef BOUND_CHECKS_SOFT
391ifeq ($(shell $(CC) -E -ftrap-function-returns /dev/null 2>/dev/null && echo 1),1)
392    export BOUND_CHECKS_SOFT := 1
393else
394    export BOUND_CHECKS_SOFT := 0
395endif
396endif # ifndef BOUND_CHECKS_SOFT
397ifeq ($(BOUND_CHECKS_SOFT),1)
398CFLAGS_BOUND_CHECKS_SOFT =  -fbounds-attributes -ftrap-function=ml_bound_chk_soft_trap -ftrap-function-returns
399CFLAGS_BOUND_CHECKS_DEBUG =	$(CFLAGS_BOUND_CHECKS_SOFT) -DBOUND_CHECKS_DEBUG=1
400else
401CFLAGS_BOUND_CHECKS_SOFT =
402CFLAGS_BOUND_CHECKS_DEBUG =
403endif
404
405#
406# Sanitizers Support (KASan, UBSan)
407#
408
409# Which kernel configurations are built with KCOV enabled.
410KCOV_RUNTIME := KASAN
411
412ifneq ($(filter RELEASE, $(KCOV_RUNTIME)),)
413$(error "Sanitizer runtime should not be enabled for RELEASE kernel.")
414endif
415
416
417SAN=0
418
419# KASan support
420#
421
422ifeq ($(CURRENT_KERNEL_CONFIG),KASAN)
423# KASan kernel config implicitly enables the KASan instrumentation.
424# Instrumentation for other sanitizers is enabled explicitly at build time.
425KASAN = 1
426endif
427
428ifeq ($(KASAN),1)
429SAN=1
430BUILD_LTO=0
431
432# KASan Light support
433#
434# Light mode omits the HWASAN stack instrumentation.
435# Not supported by KASan Classic at this moment.
436
437KASAN_LIGHT_PLATFORM := WatchOS
438
439ifneq ($(filter $(PLATFORM), $(KASAN_LIGHT_PLATFORM)),)
440KASAN_LIGHT=1
441HWASAN_INSTRUMENT_STACK=0
442else
443KASAN_LIGHT=0
444HWASAN_INSTRUMENT_STACK=1
445endif
446
447KASAN_BLACKLIST=$(OBJROOT)/san/kasan-blacklist-$(CURRENT_ARCH_CONFIG_LC)
448
449# To calculate the kasan offset, subtract the lowest KVA to sanitize, shifted right by KASAN_SCALE_$INSTRUMENTATION bits,
450# from the base address of the kasan shadow area, (e.g. for x86_64 solve the following equation:
451# OFFSET = {VA mapped by the first KASAN PML4 [Currently #494]} - (LOWEST_KVA >> 3)
452# OFFSET = (0ULL - (512GiB * (512 - 494))) - (LOWEST_SAN_KVA >> 3)
453# OFFSET = FFFFF70000000000 - ((0ULL - (512GiB * (512 - 496))) >> 3) [PML4 #496 is the first possible KVA]
454# OFFSET = FFFFF70000000000 - (FFFFF80000000000 >> 3)
455# OFFSET = DFFFF80000000000
456# ).
457KASAN_OFFSET_X86_64=0xdffff80000000000
458KASAN_OFFSET_X86_64H=$(KASAN_OFFSET_X86_64)
459KASAN_OFFSET_ARM64=0xf000000000000000
460
461KASAN_OFFSET=$($(addsuffix $(CURRENT_ARCH_CONFIG),KASAN_OFFSET_))
462
463# CLANG HWASAN/KHWASAN instrumentation powers KASAN_TBI. HWASAN traditional prefixing
464# is replaced by __asan_ to commonize exports across models.
465KASAN_SCALE_TBI=4
466CFLAGS_KASAN_INSTRUMENTATION_TBI = -DKASAN_TBI=1 -DKASAN_SCALE=$(KASAN_SCALE_TBI) \
467	-fsanitize=kernel-hwaddress \
468	-fsanitize-ignorelist=$(KASAN_BLACKLIST) \
469	-mllvm -hwasan-recover=0 \
470	-mllvm -hwasan-mapping-offset=$(KASAN_OFFSET) \
471	-mllvm -hwasan-instrument-atomics=1 \
472	-mllvm -hwasan-instrument-stack=$(HWASAN_INSTRUMENT_STACK) \
473	-mllvm -hwasan-generate-tags-with-calls=1 \
474	-mllvm -hwasan-instrument-with-calls=0 \
475	-mllvm -hwasan-use-short-granules=0 \
476	-mllvm -hwasan-memory-access-callback-prefix="__asan_"
477
478
479KASAN_SCALE_CLASSIC=3
480CFLAGS_KASAN_INSTRUMENTATION_CLASSIC = -DKASAN_CLASSIC=1 -DKASAN_SCALE=$(KASAN_SCALE_CLASSIC) \
481	-fsanitize=address \
482	-mllvm -asan-globals-live-support \
483	-mllvm -asan-mapping-offset=$(KASAN_OFFSET) \
484	-fsanitize-ignorelist=$(KASAN_BLACKLIST)
485
486CFLAGS_KASANARM64 += $(CFLAGS_KASAN_INSTRUMENTATION_TBI)
487CFLAGS_KASANX86_64 += $(CFLAGS_KASAN_INSTRUMENTATION_CLASSIC)
488CFLAGS_KASANX86_64H += $(CFLAGS_KASAN_INSTRUMENTATION_CLASSIC)
489CFLAGS_GEN += -DKASAN=1 -DKASAN_OFFSET=$(KASAN_OFFSET) -DKASAN_LIGHT=$(KASAN_LIGHT)
490
491SFLAGS_KASANARM64 += $(CFLAGS_KASAN_INSTRUMENTATION_TBI)
492SFLAGS_KASANX86_64 += $(CFLAGS_KASAN_INSTRUMENTATION_CLASSIC)
493SFLAGS_KASANX86_64H += $(CFLAGS_KASAN_INSTRUMENTATION_CLASSIC)
494SFLAGS_GEN += -DKASAN=1 -DKASAN_OFFSET=$(KASAN_OFFSET) -DKASAN_LIGHT=$(KASAN_LIGHT)
495
496endif
497
498# UBSan
499#
500# The Undefined Behavior sanitizer runtime is always built as part of, and only for,
501# KASAN variants. UBSan instrumentation is disabled by default and only enabled explicitly
502# when building with UBSAN=1.
503#
504# On iOS RELEASE and DEVELOPMENT kernels, a subset of UBSan checks is enabled along with a minimal
505# runtime that emulates trap mode (but makes it recoverable).
506
507ifeq ($(KASAN), 1)
508
509ifeq ($(UBSAN),1)
510SAN=1
511
512UBSAN_RUNTIME =
513UBSAN_CHECKS += signed-integer-overflow shift pointer-overflow bounds object-size # non-fatal (calls runtime, can return)
514# UBSAN_CHECKS = undefined nullability unsigned-integer-overflow # everything
515UBSAN_CHECKS_FATAL =                                           # fatal (calls runtime, must not return)
516UBSAN_CHECKS_TRAP = vla-bound builtin                          # emit a trap instruction (no runtime support)
517UBSAN_DISABLED += vptr function     # requires unsupported C++ runtime
518
519# UBSan alignment + KASan code size is too large
520# UBSan unreachable doesn't play nice with ASan (40723397)
521UBSAN_DISABLED += alignment unreachable
522
523endif
524
525else
526
527# DEVELOPMENT and RELEASE variants
528ifeq ($(PLATFORM),iPhoneOS)
529
530# Currently we have to keep alive two separated UBSAN runtimes (minimal for DEVELOPMENT,
531# full for KASAN). This implies that we cannot use CFLAGS_$(CURRENT_KERNEL_CONFIG), because
532# CFLAGS_DEVELOPMENT is folded into CFLAGS_KASAN. For the time being we leave this check here,
533# as we work (independently) to both break the CFLAGS direct dependency and commonize the
534# sanitizer runtimes.
535UBSAN_MINIMAL_RUNTIME := DEVELOPMENT DEBUG
536ifneq ($(filter $(CURRENT_KERNEL_CONFIG), $(UBSAN_MINIMAL_RUNTIME)),)
537
538# This is (unfortunately) intentional. Currently the "kasan" blacklist, which folds both
539# ubsan and kasan specific files, is generated for all builds during the
540# setup phase. The blacklist file itself is divided per-sanitizer, so won't
541# affect the UBSAN build outside of the entries that are legitimately
542# intended for it.
543UBSAN_BLACKLIST=$(OBJROOT)/san/kasan-blacklist-$(CURRENT_ARCH_CONFIG_LC)
544
545UBSAN_CHECKS = signed-integer-overflow
546UBSAN_RUNTIME = -fsanitize-minimal-runtime -fsanitize-ignorelist=$(UBSAN_BLACKLIST)
547UBSAN_CHECKS_TRAP =
548UBSAN_CHECKS_FATAL =
549UBSAN_DISABLED =
550endif
551endif
552
553endif
554
555CFLAGS_GEN += $(UBSAN_RUNTIME)
556CFLAGS_GEN += $(foreach x,$(UBSAN_CHECKS) $(UBSAN_CHECKS_FATAL) $(UBSAN_CHECKS_TRAP),-fsanitize=$(x))
557CFLAGS_GEN += $(foreach x,$(UBSAN_CHECKS_FATAL),-fno-sanitize-recover=$(x))
558CFLAGS_GEN += $(foreach x,$(UBSAN_CHECKS_TRAP),-fsanitize-trap=$(x))
559CFLAGS_GEN += $(foreach x,$(UBSAN_DISABLED),-fno-sanitize=$(x))
560
561ifeq ($(KSANCOV),1)
562# Enable SanitizerCoverage instrumentation in xnu
563SAN = 1
564KCOV_BLACKLIST := $(OBJROOT)/san/kcov-blacklist-$(CURRENT_ARCH_CONFIG_LC)
565KCOV_CFLAGS := -fsanitize-coverage=trace-pc-guard -fsanitize-coverage-ignorelist=$(KCOV_BLACKLIST)
566CFLAGS_GEN += $(KCOV_CFLAGS) -DKSANCOV=1
567endif
568
569ifeq ($(SAN),1)
570CFLAGS_GEN += -fsanitize-ignorelist=$(OBJROOT)/san/kasan-blacklist-$(CURRENT_ARCH_CONFIG_LC)
571endif
572
573# Any extra flags that get passed at the command line during build.
574ifeq ($(CFLAGS_EXTRA),)
575CFLAGS_EXTRA =
576endif
577
578CFLAGS	= $(CFLAGS_GEN) \
579		  $($(addsuffix $(CURRENT_MACHINE_CONFIG),MACHINE_FLAGS_$(CURRENT_ARCH_CONFIG)_)) \
580		  $($(addsuffix $(CURRENT_ARCH_CONFIG),ARCH_FLAGS_)) \
581		  $($(addsuffix $(CURRENT_ARCH_CONFIG),CFLAGS_)) \
582		  $($(addsuffix $(CURRENT_KERNEL_CONFIG),CFLAGS_)) \
583		  $($(addsuffix $(CURRENT_ARCH_CONFIG), $(addsuffix $(CURRENT_KERNEL_CONFIG),CFLAGS_))) \
584		  $(DEPLOYMENT_TARGET_FLAGS) \
585		  $(DEPLOYMENT_TARGET_DEFINES) \
586		  $(BOUND_CHECKS_DEFINES) \
587		  $(DEFINES) \
588		  $(CFLAGS_EXTRA)
589
590#
591# Default C++ flags
592#
593
594OTHER_CXXFLAGS	=
595
596CXXFLAGS_GEN  = -std=gnu++2b -fsized-deallocation -fapple-kext $(OTHER_CXXFLAGS)
597
598CXXFLAGS      = $(CXXFLAGS_GEN) \
599		  $($(addsuffix $(CURRENT_ARCH_CONFIG),CXXFLAGS_)) \
600		  $($(addsuffix $(CURRENT_KERNEL_CONFIG),CXXFLAGS_))
601
602#
603# Assembler command
604#
605AS	= $(CCACHE) $(CC)
606S_KCC	= $(CC)
607
608#
609# Default SFLAGS
610#
611SFLAGS_GEN = -D__ASSEMBLER__ -DASSEMBLER $(OTHER_CFLAGS)
612
613SFLAGS_RELEASE	=
614SFLAGS_DEVELOPMENT	=
615
616# When making non-compatible changes to the XNU runtime, it can be useful to build
617# a KASAN kernel + runtime, but linked against a DEVELOPMENT kernel cache.
618# Uncomment the lines below to be able to build development, but passing KASAN=1.
619# #_ifeq ($(KASAN),1)
620# SFLAGS_DEVELOPMENT += -DKASAN=1
621# #_endif
622
623SFLAGS_KASAN = $(SFLAGS_DEVELOPMENT) -DKASAN=1
624SFLAGS_DEBUG	=
625SFLAGS_PROFILE	=
626
627SFLAGS_X86_64	= $(CFLAGS_X86_64)
628SFLAGS_X86_64H	= $(CFLAGS_X86_64H)
629SFLAGS_ARM64	= $(CFLAGS_ARM64)
630
631SFLAGS	= $(SFLAGS_GEN) \
632		  $($(addsuffix $(CURRENT_MACHINE_CONFIG),MACHINE_FLAGS_$(CURRENT_ARCH_CONFIG)_)) \
633		  $($(addsuffix $(CURRENT_ARCH_CONFIG),ARCH_FLAGS_)) \
634		  $($(addsuffix $(CURRENT_ARCH_CONFIG),SFLAGS_)) \
635		  $($(addsuffix $(CURRENT_KERNEL_CONFIG),SFLAGS_)) \
636		  $($(addsuffix $(CURRENT_ARCH_CONFIG), $(addsuffix $(CURRENT_KERNEL_CONFIG),SFLAGS_))) \
637		  $(DEPLOYMENT_TARGET_FLAGS) \
638		  $(DEPLOYMENT_TARGET_DEFINES) \
639		  $(DEFINES)
640
641#
642# Linker command
643#
644LD	= $(KC++) -nostdlib
645
646#
647# Default LDFLAGS
648#
649# Availability of DWARF allows DTrace CTF (compressed type format) to be constructed.
650# ctf_insert creates the CTF section.  It needs reserved padding in the
651# headers for the load command segment and the CTF section structures.
652#
653LDFLAGS_KERNEL_GEN = \
654	-nostdlib \
655	-fapple-kext \
656	-Wl,-e,__start \
657	-Wl,-sectalign,__TEXT,__text,0x1000 \
658	-Wl,-sectalign,__DATA,__common,0x1000 \
659	-Wl,-sectalign,__DATA,__bss,0x1000 \
660	-Wl,-sectcreate,__PRELINK_TEXT,__text,/dev/null \
661	-Wl,-segprot,__PRELINK_TEXT,r-x,r-x \
662	-Wl,-sectcreate,__PRELINK_INFO,__info,/dev/null \
663	-Wl,-new_linker \
664	-Wl,-pagezero_size,0x0 \
665	-Wl,-version_load_command \
666	-Wl,-function_starts \
667	-Wl,-headerpad,152
668
669# LDFLAGS_KERNEL_SDK	= -L$(SDKROOT)/usr/local/lib/kernel -lfirehose_kernel
670LDFLAGS_KERNEL_SDK	= -L$(SDKROOT)/usr/local/lib/kernel -L$(SDKROOT)/usr/local/lib/kernel/platform
671
672LDFLAGS_KERNEL_RELEASE	=
673LDFLAGS_KERNEL_DEVELOPMENT =
674LDFLAGS_KERNEL_KASAN = $(LDFLAGS_KERNEL_DEVELOPMENT)
675LDFLAGS_KERNEL_DEBUG	=
676LDFLAGS_KERNEL_PROFILE	=
677
678# Tightbeam finds modules in the "tightbeam" subdirectory.
679TIGHTBEAM_MODULE_DIR       = $(SDKROOT)/usr/local/lib/kernel/tightbeam
680
681# KASLR static slide config:
682ifndef SLIDE
683SLIDE=0x00
684endif
685KERNEL_MIN_ADDRESS      = 0xffffff8000000000
686KERNEL_BASE_OFFSET      = 0x100000
687# POSIX shells use signed long for their arithmetic expressions. However,
688# we're dealing with uintptr_t values here, so explicitly use bash which
689# is known to be able to handle such larger values. ksh also works; dash
690# and zsh both fail with different results (zsh even warns you).
691KERNEL_STATIC_SLIDE     = $(shell $(BASH) -c 'printf "0x%016x" \
692			  $$(( $(SLIDE) << 21 ))')
693KERNEL_STATIC_BASE      = $(shell $(BASH) -c 'printf "0x%016x" \
694			  $$(( $(KERNEL_MIN_ADDRESS) + $(KERNEL_BASE_OFFSET) ))')
695KERNEL_HIB_SECTION_BASE = $(shell $(BASH) -c 'printf "0x%016x" \
696			  $$(( $(KERNEL_STATIC_BASE) + $(KERNEL_STATIC_SLIDE) ))')
697KERNEL_TEXT_BASE        = $(shell $(BASH) -c 'printf "0x%016x" \
698			  $$(( $(KERNEL_HIB_SECTION_BASE) + 0x100000 ))')
699
700LDFLAGS_KERNEL_RELEASEX86_64 = \
701	-Wl,-pie \
702	-Wl,-segaddr,__HIB,$(KERNEL_HIB_SECTION_BASE) \
703	-Wl,-image_base,$(KERNEL_TEXT_BASE) \
704	-Wl,-seg_page_size,__TEXT,0x200000 \
705	-Wl,-sectalign,__HIB,__bootPT,0x1000 \
706	-Wl,-sectalign,__HIB,__desc,0x1000 \
707	-Wl,-sectalign,__HIB,__data,0x1000 \
708	-Wl,-sectalign,__HIB,__text,0x1000 \
709	-Wl,-sectalign,__HIB,__const,0x1000 \
710	-Wl,-sectalign,__HIB,__bss,0x1000 \
711	-Wl,-sectalign,__HIB,__common,0x1000 \
712	-Wl,-sectalign,__HIB,__llvm_prf_cnts,0x1000 \
713	-Wl,-sectalign,__HIB,__llvm_prf_names,0x1000 \
714	-Wl,-sectalign,__HIB,__llvm_prf_data,0x1000 \
715	-Wl,-sectalign,__HIB,__textcoal_nt,0x1000 \
716	-Wl,-sectalign,__HIB,__cstring,0x1000 \
717	-Wl,-sectalign,__DATA,__percpu,0x1000 \
718	-Wl,-rename_section,__DATA,__const,__DATA_CONST,__const \
719	-Wl,-segprot,__DATA_CONST,r--,r-- \
720	-Wl,-rename_section,__KLD,__const,__KLDDATA,__const \
721	-Wl,-rename_section,__KLD,__cstring,__KLDDATA,__cstring \
722	-Wl,-segprot,__KLDDATA,rw-,rw- \
723	-Wl,-segprot,__KLD,r-x,r-x \
724	-Wl,-no_zero_fill_sections \
725	$(LDFLAGS_NOSTRIP_FLAG)
726
727ifeq ($(SAN),1)
728LDFLAGS_KERNEL_RELEASEX86_64 += \
729	-Wl,-sectalign,__HIB,__cstring,0x1000
730endif
731
732ifeq ($(KSANCOV),1)
733LDFLAGS_KERNEL_RELEASEX86_64 += \
734	-Wl,-sectalign,__HIB,__sancov_guards,0x1000 \
735	-Wl,-sectalign,__HIB,__sancov_pcs,0x1000
736endif
737
738# Define KERNEL_BASE_OFFSET so known at compile time:
739CFLAGS_X86_64 += -DKERNEL_BASE_OFFSET=$(KERNEL_BASE_OFFSET)
740CFLAGS_X86_64H += -DKERNEL_BASE_OFFSET=$(KERNEL_BASE_OFFSET)
741
742LDFLAGS_KERNEL_DEBUGX86_64 = $(LDFLAGS_KERNEL_RELEASEX86_64)
743LDFLAGS_KERNEL_DEVELOPMENTX86_64 = $(LDFLAGS_KERNEL_RELEASEX86_64)
744LDFLAGS_KERNEL_KASANX86_64 = $(LDFLAGS_KERNEL_DEVELOPMENTX86_64) \
745	-Wl,-sectalign,__HIB,__asan_globals,0x1000 \
746	-Wl,-sectalign,__HIB,__asan_liveness,0x1000 \
747	-Wl,-sectalign,__HIB,__mod_term_func,0x1000 \
748	-Wl,-rename_section,__HIB,__mod_init_func,__NULL,__mod_init_func \
749	-Wl,-rename_section,__HIB,__eh_frame,__NULL,__eh_frame
750LDFLAGS_KERNEL_PROFILEX86_64 = $(LDFLAGS_KERNEL_RELEASEX86_64)
751
752LDFLAGS_KERNEL_RELEASEX86_64H = $(LDFLAGS_KERNEL_RELEASEX86_64)
753LDFLAGS_KERNEL_DEBUGX86_64H = $(LDFLAGS_KERNEL_RELEASEX86_64H)
754LDFLAGS_KERNEL_DEVELOPMENTX86_64H = $(LDFLAGS_KERNEL_RELEASEX86_64H)
755LDFLAGS_KERNEL_KASANX86_64H = $(LDFLAGS_KERNEL_KASANX86_64)
756LDFLAGS_KERNEL_PROFILEX86_64H = $(LDFLAGS_KERNEL_RELEASEX86_64H)
757
758# Offset image base by page to have iBoot load kernel TEXT correctly.
759# First page is used for various purposes : sleep token, reset vector.
760# We also need a 32MB offset, as this is the minimum block mapping size
761# for a 16KB page runtime, and we wish to use the first virtual block
762# to map the low globals page.  We also need another 4MB to account for
763# the address space reserved by L4 (because the reservation is not a
764# multiple of the block size in alignment/length, we will implictly map
765# it with our block mapping, and we therefore must reflect that the
766# first 4MB of the block mapping for xnu do not belong to xnu).
767# For the moment, kaliber has a unique memory layout (monitor at the top
768# of memory).  Support this by breaking 16KB on other platforms and
769# mandating 32MB alignment. Image base (i.e. __TEXT) must be 16KB
770# aligned since ld64 will link with 16KB alignment for ARM64.
771#
772# We currently offset by an additional 32MB in order to reclaim memory.
773# We need a dedicated virtual page for the low globals.  Our bootloader
774# may have a significant chunk of memory (up to an L2 entry in size)
775# that lies before the kernel.  The addition 32MB of virtual padding
776# ensures that we have enough virtual address space to map all of that
777# memory as part of the V-to-P mapping.
778# 23355738 - put __PRELINK_TEXT first. We reserve enough room
779# for 0x0000000003000000 = 48MB of kexts
780#
781# 0xfffffff000000000 (32MB range for low globals)
782# 0xfffffff002000000 (32MB range to allow for large page physical slide)
783# 0xfffffff004000000 (16KB range to reserve the first available page)
784# 0xfffffff004004000 (48MB range for kexts)
785# 0xfffffff007004000 (Start of xnu proper).
786LDFLAGS_KERNEL_GENARM64 = \
787	-Wl,-pie \
788	-Wl,-static \
789	-Wl,-segaddr,__PRELINK_TEXT,$(ARM64_PLKSEG_ADDR) \
790	-Wl,-image_base,$(ARM64_LINK_ADDR) \
791	\
792	-Wl,-rename_section,__HIB,__text,__TEXT_EXEC,__hib_text \
793	\
794	-Wl,-rename_section,__HIB,__const,__DATA_CONST,__hib_const \
795	-Wl,-rename_section,__HIB,__cstring,__DATA_CONST,__hib_const \
796	-Wl,-rename_section,__HIB,__literal8,__DATA_CONST,__hib_const \
797	-Wl,-rename_section,__HIB,__literal16,__DATA_CONST,__hib_const \
798	\
799	-Wl,-rename_segment,__HIB,__HIBDATA \
800	\
801	-Wl,-sectalign,__DATA,__const,0x4000 \
802	-Wl,-sectalign,__DATA,__percpu,0x4000 \
803	-Wl,-sectalign,__DATA,__data,0x4000 \
804	-Wl,-rename_section,__DATA,__mod_init_func,__DATA_CONST,__mod_init_func \
805	-Wl,-rename_section,__DATA,__mod_term_func,__DATA_CONST,__mod_term_func \
806	-Wl,-rename_section,__DATA,__auth_ptr,__DATA_CONST,__auth_ptr \
807	-Wl,-rename_section,__DATA,__auth_got,__DATA_CONST,__auth_got \
808	-Wl,-rename_section,__DATA,__const,__DATA_CONST,__const \
809	-Wl,-segprot,__DATA_CONST,r--,r-- \
810	-Wl,-rename_section,__KLD,__const,__KLDDATA,__const \
811	-Wl,-rename_section,__KLD,__cstring,__KLDDATA,__cstring \
812	-Wl,-segprot,__KLDDATA,rw-,rw- \
813	-Wl,-segprot,__KLD,r-x,r-x \
814	-Wl,-rename_section,__TEXT,__text,__TEXT_EXEC,__text \
815	-Wl,-rename_section,__TEXT,__stubs,__TEXT_EXEC,__stubs \
816	-Wl,-sectcreate,"__PLK_TEXT_EXEC",__text,/dev/null \
817	-Wl,-sectcreate,__PRELINK_DATA,__data,/dev/null \
818	-Wl,-sectcreate,"__PLK_DATA_CONST",__data,/dev/null \
819	-Wl,-sectcreate,"__PLK_LLVM_COV",__llvm_covmap,/dev/null \
820	-Wl,-sectcreate,"__PLK_LINKEDIT",__data,/dev/null
821
822LDFLAGS_KERNEL_SEGARM64_SEG_ORDER = \
823	__TEXT:__DATA_CONST:__DATA_SPTM:__LINKEDIT:__TEXT_EXEC:__TEXT_BOOT_EXEC:__KLD:__PPLTEXT:__PPLTRAMP:__PPLDATA_CONST:__LASTDATA_CONST:__LAST:__PPLDATA:__KLDDATA:__DATA:__HIBDATA:__BOOTDATA
824
825LDFLAGS_KERNEL_SEGARM64 = \
826	-Wl,-rename_section,__PPLDATA,__const,__PPLDATA_CONST,__const \
827	-Wl,-segment_order,$(LDFLAGS_KERNEL_SEGARM64_SEG_ORDER) \
828	-Wl,-segprot,__TEXT,r--,r-- \
829	-Wl,-segprot,__TEXT_EXEC,r-x,r-x \
830	-Wl,-segprot,__TEXT_BOOT_EXEC,r-x,r-x \
831	-Wl,-segprot,__PPLTEXT,r-x,r-x \
832	-Wl,-segprot,__PPLTRAMP,r-x,r-x \
833	-Wl,-segprot,__PPLDATA_CONST,r--,r-- \
834	-Wl,-segprot,__LASTDATA_CONST,r--,r-- \
835	-Wl,-segprot,__LAST,r-x,r-x \
836
837LDFLAGS_KERNEL_RELEASEARM64     = \
838	$(LDFLAGS_KERNEL_GENARM64) \
839	$(LDFLAGS_KERNEL_SEGARM64) \
840	$(LDFLAGS_KERNEL_STRIP_LTO)
841
842LDFLAGS_KERNEL_ONLY_CONFIG_RELEASEARM64     = \
843	-Wl,-exported_symbols_list,$(TARGET)/all-kpi.exp
844
845LDFLAGS_KERNEL_DEVELOPMENTARM64     = \
846	$(LDFLAGS_KERNEL_GENARM64) \
847	$(LDFLAGS_KERNEL_SEGARM64) \
848	$(LDFLAGS_NOSTRIP_FLAG)
849
850LDFLAGS_KERNEL_ONLY_CONFIG_DEVELOPMENTARM64 =
851
852LDFLAGS_KERNEL_KASANARM64 = $(LDFLAGS_KERNEL_DEVELOPMENTARM64)
853LDFLAGS_KERNEL_DEBUGARM64 = $(LDFLAGS_KERNEL_DEVELOPMENTARM64)
854
855LDFLAGS_KERNEL_ONLY_CONFIG_KASANARM64 = $(LDFLAGS_KERNEL_ONLY_CONFIG_DEVELOPMENTARM64)
856LDFLAGS_KERNEL_ONLY_CONFIG_DEBUGARM64 = $(LDFLAGS_KERNEL_ONLY_CONFIG_DEVELOPMENTARM64)
857
858#
859# arm64e specific linker flags that should be used only when linking the kernel
860# (and not the static kernel cache / kcgen)
861#
862LDFLAGS_KERNEL_ONLY_SUBARCH_arm64e = \
863	-Wl,-add_split_seg_info \
864	-Wl,-kernel
865
866LDFLAGS_KERNEL_ONLY_SUBARCH_x86_64 = \
867	-Wl,-add_split_seg_info \
868	-Wl,-kernel
869LDFLAGS_KERNEL_ONLY_SUBARCH_x86_64h = $(LDFLAGS_KERNEL_ONLY_SUBARCH_x86_64)
870
871LDFLAGS_KERNEL	= $(LDFLAGS_KERNEL_GEN) \
872		  $(LDFLAGS_KERNEL_SDK) \
873		  $($(addsuffix $(CURRENT_ARCH_CONFIG),ARCH_FLAGS_)) \
874		  $($(addsuffix $(CURRENT_ARCH_CONFIG),LDFLAGS_KERNEL_)) \
875		  $($(addsuffix $(CURRENT_KERNEL_CONFIG),LDFLAGS_KERNEL_)) \
876		  $($(addsuffix $(CURRENT_ARCH_CONFIG), $(addsuffix $(CURRENT_KERNEL_CONFIG),LDFLAGS_KERNEL_))) \
877		  $(DEPLOYMENT_TARGET_FLAGS)
878
879LDFLAGS_KERNEL_ONLY  +=   \
880		  $($(addsuffix $(CURRENT_ARCH_CONFIG), $(addsuffix $(CURRENT_KERNEL_CONFIG),LDFLAGS_KERNEL_ONLY_CONFIG_))) \
881		  $($(addsuffix $(ARCH_STRING_FOR_CURRENT_MACHINE_CONFIG),LDFLAGS_KERNEL_ONLY_SUBARCH_)) \
882		  -Wl,-alias_list,$(TARGET)/all-alias.exp \
883		  -Wl,-sectcreate,__LINKINFO,__symbolsets,$(TARGET)/symbolsets.plist -Wl,-segprot,__LINKINFO,r--,r--
884
885LDFILES_KERNEL_ONLY = $(TARGET)/all-kpi.exp $(TARGET)/all-alias.exp $(TARGET)/symbolsets.plist
886
887#
888# Default runtime libraries to be linked with the kernel
889#
890LD_KERNEL_LIBS	   = -lcc_kext
891LD_KERNEL_ARCHIVES = $(LDFLAGS_KERNEL_SDK) -lfirehose_kernel
892# Link opensource binary library
893ifneq ($(filter T6000 T6020 T8101 T8103 T8112 VMAPPLE T6000 T6020 T8101 T8103 T8112 VMAPPLE,$(CURRENT_MACHINE_CONFIG)),)
894	LDFLAGS_KERNEL_ONLY += -rdynamic -Wl,-force_load,$(KDKROOT)/System/Library/KernelSupport/lib$(CURRENT_MACHINE_CONFIG).os.$(CURRENT_KERNEL_CONFIG).a
895endif
896
897
898#
899# DTrace support
900#
901ifndef DO_CTFMERGE
902DO_CTFMERGE := 1
903ifeq ($(CURRENT_KERNEL_CONFIG),RELEASE)
904ifneq ($(PLATFORM),MacOSX)
905DO_CTFMERGE := 0
906endif
907endif
908endif # DO_CTFMERGE
909
910
911#
912# Default INCFLAGS
913#
914INCFLAGS_IMPORT	= $(patsubst %, -I$(OBJROOT)/EXPORT_HDRS/%, $(COMPONENT_IMPORT_LIST))
915INCFLAGS_EXTERN	= -I$(SRCROOT)/EXTERNAL_HEADERS
916INCFLAGS_GEN	= -I$(SRCROOT)/$(COMPONENT) -I$(OBJROOT)/EXPORT_HDRS/$(COMPONENT)
917INCFLAGS_LOCAL	= -I.
918INCFLAGS_SDK	= -I$(SDKROOT)/usr/local/include/kernel
919INCFLAGS_PLATFORM = -I$(SDKROOT)/$(KPINCDIR)/platform
920
921INCFLAGS	= $(INCFLAGS_LOCAL) $(INCFLAGS_GEN) $(INCFLAGS_IMPORT) $(INCFLAGS_EXTERN) $(INCFLAGS_MAKEFILE) $(INCFLAGS_SDK) $(INCFLAGS_PLATFORM)
922
923#
924# Default MIGFLAGS
925#
926MIGFLAGS	= $(DEFINES) $(INCFLAGS) -novouchers $($(addsuffix $(CURRENT_ARCH_CONFIG),CFLAGS_)) $($(addsuffix $(CURRENT_ARCH_CONFIG),ARCH_FLAGS_)) \
927		$(DEPLOYMENT_TARGET_FLAGS)
928
929# Support for LLVM Profile Guided Optimization (PGO)
930
931ifeq ($(BUILD_PROFILE),1)
932CFLAGS_GEN += -fprofile-instr-generate -DPROFILE
933CXXFLAGS_GEN += -fprofile-instr-generate -DPROFILE
934endif
935
936ifdef USE_PROFILE
937CFLAGS_GEN += -fprofile-instr-use=$(USE_PROFILE)
938CXXFLAGS_GEN += -fprofile-instr-use=$(USE_PROFILE)
939LDFLAGS_KERNEL_GEN += -fprofile-instr-use=$(USE_PROFILE)
940
941CFLAGS_GEN += -Wno-error=profile-instr-out-of-date
942endif
943
944#
945# Support for LLVM Link Time Optimization (LTO)
946#
947# LTO can be explicitly enabled or disabled with BUILD_LTO=1|0
948# and defaults to enabled except for DEBUG kernels
949#
950# CFLAGS_NOLTO_FLAG is needed on a per-file basis (for files
951# that deal poorly with LTO, or files that must be machine
952# code *.o files for xnu to build (i.e, setsegname runs on
953# them).
954#
955# LDFLAGS_NOSTRIP_FLAG is used to support configurations that
956# do not utilize an export list.  For these configs to build,
957# we need to prevent the LTO logic from dead stripping them.
958
959LTO_ENABLED_RELEASE = 1
960LTO_ENABLED_DEVELOPMENT = 1
961LTO_ENABLED_DEBUG = 0
962LTO_ENABLED_KASAN = 0
963
964ifneq ($(BUILD_LTO),)
965USE_LTO = $(BUILD_LTO)
966else
967USE_LTO = $(LTO_ENABLED_$(CURRENT_KERNEL_CONFIG))
968endif
969
970ifeq ($(USE_LTO),1)
971CFLAGS_GEN	+= -flto -DBUILT_LTO=1
972CXXFLAGS_GEN	+= -flto -DBUILT_LTO=1
973LDFLAGS_KERNEL_LTO	= -Wl,-mllvm,-inline-threshold=100
974LDFLAGS_KERNEL_GEN	+= $(LDFLAGS_KERNEL_LTO) -Wl,-object_path_lto,$(TARGET)/lto.o
975LDFLAGS_NOSTRIP_FLAG = -rdynamic
976LDFLAGS_KERNEL_STRIP_LTO = -Wl,-dead_strip,-no_dead_strip_inits_and_terms
977
978CFLAGS_NOLTO_FLAG = -fno-lto
979else
980LDFLAGS_KERNEL_LTO =
981LDFLAGS_NOSTRIP_FLAG =
982LDFLAGS_KERNEL_STRIP_LTO =
983CFLAGS_NOLTO_FLAG =
984endif
985
986#
987# Default VPATH
988#
989export VPATH = .:$(SOURCE)
990
991
992
993#
994# Macros that control installation of kernel and its header files
995#
996# install flags for header files
997#
998INSTALL_FLAGS = -c -S -m 0444
999DATA_INSTALL_FLAGS = -c -S -m 0644
1000DATA_INSTALL_FLAGS_RO = -c -S -m 0444
1001EXEC_INSTALL_FLAGS = -c -S -m 0755
1002
1003#
1004# Header file destinations
1005#
1006
1007ifeq ($(DRIVERKIT),1)
1008    SDKHEADERSROOT=$(DRIVERKITRUNTIMEROOT)
1009    # only whitelisted headers install outside of the DriverKit Runtime hierarchy
1010    DRIVERKITSDKHEADERSROOT=$(DRIVERKITROOT)
1011    DRIVERKITFRAMEDIR = $(DRIVERKITROOT)/System/Library/Frameworks
1012endif
1013
1014ifeq ($(EXCLAVEKIT),1)
1015    EXCLAVEKITSDKHEADERSROOT=$(EXCLAVEKITROOT)
1016    EXCLAVEKITFRAMEDIR = $(EXCLAVEKITROOT)/System/Library/Frameworks
1017endif
1018
1019ifeq ($(EXCLAVECORE),1)
1020    EXCLAVECORESDKHEADERSROOT=$(EXCLAVECOREROOT)
1021    EXCLAVECOREFRAMEDIR = $(EXCLAVECOREROOT)/System/Library/Frameworks
1022endif
1023
1024FRAMEDIR = $(SDKHEADERSROOT)/System/Library/Frameworks
1025
1026IINCVERS = A
1027IINCFRAME = $(FRAMEDIR)/IOKit.framework
1028IINCDIR = $(IINCFRAME)/Versions/$(IINCVERS)/Headers
1029IPINCDIR = $(IINCFRAME)/Versions/$(IINCVERS)/PrivateHeaders
1030IRESDIR = $(IINCFRAME)/Versions/$(IINCVERS)/Resources
1031
1032SINCVERS = B
1033SINCFRAME = $(FRAMEDIR)/System.framework
1034SINCDIR = $(SINCFRAME)/Versions/$(SINCVERS)/Headers
1035SPINCDIR = $(SINCFRAME)/Versions/$(SINCVERS)/PrivateHeaders
1036SRESDIR = $(SINCFRAME)/Versions/$(SINCVERS)/Resources
1037
1038ifndef INCDIR
1039    INCDIR = $(SDKHEADERSROOT)/usr/include
1040endif
1041ifndef DRIVERKITINCDIR
1042    DRIVERKITINCDIR = $(DRIVERKITSDKHEADERSROOT)/usr/include
1043endif
1044ifndef EXCLAVEKITINCDIR
1045    EXCLAVEKITINCDIR = $(EXCLAVEKITSDKHEADERSROOT)/usr/include
1046endif
1047ifndef EXCLAVECOREINCDIR
1048    EXCLAVECOREINCDIR = $(EXCLAVECORESDKHEADERSROOT)/usr/include
1049endif
1050ifndef LCLDIR
1051	LCLDIR = $(SDKHEADERSROOT)/usr/local/include
1052endif
1053ifndef DRIVERKITLCLDIR
1054    DRIVERKITLCLDIR = $(DRIVERKITSDKHEADERSROOT)/usr/local/include
1055endif
1056
1057KINCVERS = A
1058KINCFRAME = $(FRAMEDIR)/Kernel.framework
1059KINCDIR = $(KINCFRAME)/Versions/$(KINCVERS)/Headers
1060KPINCDIR = $(KINCFRAME)/Versions/$(KINCVERS)/PrivateHeaders
1061KRESDIR = $(KINCFRAME)/Versions/$(KINCVERS)/Resources
1062
1063KLIBCXXDIR = $(KPINCDIR)/kernel_sdkroot
1064KLIBCXXINCDIR = $(KLIBCXXDIR)/usr/include
1065
1066DKIT_INCFRAME = DriverKit.framework
1067
1068ifeq ($(PLATFORM),MacOSX)
1069DKIT_INCVERS = A
1070DKIT_INCDIR = $(DKIT_INCFRAME)/Versions/$(DKIT_INCVERS)/Headers
1071DKIT_PINCDIR = $(DKIT_INCFRAME)/Versions/$(DKIT_INCVERS)/PrivateHeaders
1072else
1073# non-macOS SDK frameworks use shallow bundle structure
1074DKIT_INCDIR = $(DKIT_INCFRAME)/Headers
1075DKIT_PINCDIR = $(DKIT_INCFRAME)/PrivateHeaders
1076endif
1077
1078# DriverKit SDK frameworks use shallow bundle structure
1079DRIVERKIT_DKIT_INCDIR = $(DKIT_INCFRAME)/Headers
1080DRIVERKIT_DKIT_PINCDIR = $(DKIT_INCFRAME)/PrivateHeaders
1081
1082XNU_PRIVATE_UNIFDEF ?=
1083XNU_PRIVATE_UNIFDEF += -UMACH_KERNEL_PRIVATE
1084XNU_PRIVATE_UNIFDEF += -UBSD_KERNEL_PRIVATE
1085XNU_PRIVATE_UNIFDEF += -UIOKIT_KERNEL_PRIVATE
1086XNU_PRIVATE_UNIFDEF += -ULIBKERN_KERNEL_PRIVATE
1087XNU_PRIVATE_UNIFDEF += -ULIBSA_KERNEL_PRIVATE
1088XNU_PRIVATE_UNIFDEF += -UPEXPERT_KERNEL_PRIVATE
1089XNU_PRIVATE_UNIFDEF += -UXNU_KERNEL_PRIVATE
1090
1091
1092PLATFORM_UNIFDEF = $(foreach x,$(SUPPORTED_PLATFORMS),$(if $(filter $(PLATFORM),$(x)),-DXNU_PLATFORM_$(x) $(foreach token,$(PLATFORM_UNIFDEF_BLACKLIST_TOKENS_$(x)),-U$(token)),-UXNU_PLATFORM_$(x)))
1093
1094
1095# Some header guards need to be present and checked in kernel headers but removed from userspace headers
1096KERNEL_ONLY_GUARDS_UNIFDEF =
1097
1098SPINCFRAME_UNIFDEF  = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UKERNEL_PRIVATE -UKERNEL -DPRIVATE -UDRIVERKIT -UEXCLAVEKIT -UEXCLAVECORE -U_OPEN_SOURCE_ -U__OPEN_SOURCE__ $(KERNEL_ONLY_GUARDS_UNIFDEF)
1099SINCFRAME_UNIFDEF   = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UKERNEL_PRIVATE -UKERNEL -UPRIVATE -UDRIVERKIT -UEXCLAVEKIT -UEXCLAVECORE -D_OPEN_SOURCE_ -D__OPEN_SOURCE__ $(KERNEL_ONLY_GUARDS_UNIFDEF)
1100DKPINCFRAME_UNIFDEF = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UKERNEL_PRIVATE -UKERNEL -DPRIVATE -DDRIVERKIT -UEXCLAVEKIT -UEXCLAVECORE -U_OPEN_SOURCE_ -U__OPEN_SOURCE__ $(KERNEL_ONLY_GUARDS_UNIFDEF)
1101DKINCFRAME_UNIFDEF  = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UKERNEL_PRIVATE -UKERNEL -UPRIVATE -DDRIVERKIT -UEXCLAVEKIT -UEXCLAVECORE -D_OPEN_SOURCE_ -D__OPEN_SOURCE__ $(KERNEL_ONLY_GUARDS_UNIFDEF)
1102EKPINCFRAME_UNIFDEF = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UKERNEL_PRIVATE -UKERNEL -DPRIVATE -UDRIVERKIT -DEXCLAVEKIT -UEXCLAVECORE -U_OPEN_SOURCE_ -U__OPEN_SOURCE__ $(KERNEL_ONLY_GUARDS_UNIFDEF)
1103EKINCFRAME_UNIFDEF  = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UKERNEL_PRIVATE -UKERNEL -UPRIVATE -UDRIVERKIT -DEXCLAVEKIT -UEXCLAVECORE -D_OPEN_SOURCE_ -D__OPEN_SOURCE__ $(KERNEL_ONLY_GUARDS_UNIFDEF)
1104ECPINCFRAME_UNIFDEF = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UKERNEL_PRIVATE -UKERNEL -DPRIVATE -UDRIVERKIT -UEXCLAVEKIT -DEXCLAVECORE -U_OPEN_SOURCE_ -U__OPEN_SOURCE__ $(KERNEL_ONLY_GUARDS_UNIFDEF)
1105ECINCFRAME_UNIFDEF  = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UKERNEL_PRIVATE -UKERNEL -UPRIVATE -UDRIVERKIT -UEXCLAVEKIT -DEXCLAVECORE -D_OPEN_SOURCE_ -D__OPEN_SOURCE__ $(KERNEL_ONLY_GUARDS_UNIFDEF)
1106KPINCFRAME_UNIFDEF  = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -DKERNEL_PRIVATE -DKERNEL -DPRIVATE -UDRIVERKIT -UXNU_LIBCXX_SDKROOT -UEXCLAVEKIT -UEXCLAVECORE -U_OPEN_SOURCE_ -U__OPEN_SOURCE__
1107LIBCXXINCFRAME_UNIFDEF = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -DKERNEL_PRIVATE -DKERNEL -DPRIVATE -UDRIVERKIT -DXNU_LIBCXX_SDKROOT -UEXCLAVEKIT -UEXCLAVECORE  -U_OPEN_SOURCE_ -U__OPEN_SOURCE__
1108KINCFRAME_UNIFDEF   = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UKERNEL_PRIVATE -DKERNEL -UPRIVATE -UDRIVERKIT -UEXCLAVEKIT -UEXCLAVECORE -D_OPEN_SOURCE_ -D__OPEN_SOURCE__
1109PDATA_UNIFDEF       = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -DPRIVATE -U_OPEN_SOURCE_ -U__OPEN_SOURCE__
1110DATA_UNIFDEF        = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UPRIVATE -D_OPEN_SOURCE_ -D__OPEN_SOURCE__
1111
1112#
1113# Compononent Header file destinations
1114#
1115EXPDIR = EXPORT_HDRS/$(COMPONENT)
1116
1117#
1118# Strip Flags
1119#
1120STRIP_FLAGS_RELEASE	= -S -x
1121STRIP_FLAGS_DEVELOPMENT	= -S
1122STRIP_FLAGS_KASAN = $(STRIP_FLAGS_DEVELOPMENT)
1123STRIP_FLAGS_DEBUG	= -S
1124STRIP_FLAGS_PROFILE	= -S -x
1125
1126STRIP_FLAGS	= $($(addsuffix $(CURRENT_KERNEL_CONFIG),STRIP_FLAGS_))
1127
1128#
1129# dsymutil flags
1130#
1131DSYMUTIL_FLAGS_GEN	= --minimize
1132
1133DSYMUTIL_FLAGS_X86_64	= --arch=x86_64
1134DSYMUTIL_FLAGS_X86_64H	= --arch=x86_64h
1135DSYMUTIL_FLAGS_ARM64	=
1136
1137DSYMUTIL_FLAGS = $(DSYMUTIL_FLAGS_GEN) \
1138	$($(addsuffix $(CURRENT_ARCH_CONFIG),DSYMUTIL_FLAGS_))
1139
1140
1141
1142
1143#
1144# Man Page destination
1145#
1146MANDIR = /usr/share/man
1147
1148#
1149# DEBUG alias location
1150#
1151DEVELOPER_EXTRAS_DIR = /AppleInternal/CoreOS/xnu_$(CURRENT_KERNEL_CONFIG_LC)
1152
1153#
1154# mach_kernel install location
1155#
1156INSTALL_KERNEL_DIR = /
1157
1158#
1159# new OS X install location
1160#
1161SYSTEM_LIBRARY_KERNELS_DIR = /System/Library/Kernels
1162
1163#
1164# File names in DSTROOT
1165#
1166
1167ifeq ($(PLATFORM),MacOSX)
1168KERNEL_FILE_NAME_PREFIX = kernel
1169else
1170KERNEL_FILE_NAME_PREFIX = mach
1171endif
1172
1173ifeq ($(CURRENT_MACHINE_CONFIG),NONE)
1174ifeq ($(CURRENT_KERNEL_CONFIG),RELEASE)
1175KERNEL_FILE_NAME = $(KERNEL_FILE_NAME_PREFIX)
1176KERNEL_LLDBBOOTSTRAP_NAME = $(KERNEL_FILE_NAME_PREFIX).py
1177else
1178KERNEL_FILE_NAME = $(KERNEL_FILE_NAME_PREFIX).$(CURRENT_KERNEL_CONFIG_LC)
1179KERNEL_LLDBBOOTSTRAP_NAME = $(KERNEL_FILE_NAME_PREFIX).py
1180endif
1181else
1182KERNEL_FILE_NAME = $(KERNEL_FILE_NAME_PREFIX).$(CURRENT_KERNEL_CONFIG_LC).$(CURRENT_MACHINE_CONFIG_LC)
1183KERNEL_LLDBBOOTSTRAP_NAME = $(KERNEL_FILE_NAME_PREFIX)_$(CURRENT_KERNEL_CONFIG_LC).py
1184endif
1185
1186CURRENT_ALIAS_MACHINE_CONFIG = $(word 4,$(subst ^, ,$(CURRENT_BUILD_CONFIG)))
1187CURRENT_ALIAS_MACHINE_CONFIG_LC = $(shell printf "%s" "$(CURRENT_ALIAS_MACHINE_CONFIG)" | $(TR) A-Z a-z)
1188ifneq ($(CURRENT_ALIAS_MACHINE_CONFIG),)
1189ALIAS_FILE_NAME = $(KERNEL_FILE_NAME_PREFIX).$(CURRENT_KERNEL_CONFIG_LC).$(CURRENT_ALIAS_MACHINE_CONFIG_LC)
1190endif
1191
1192#
1193# System.kext pseudo-kext install location
1194#
1195INSTALL_EXTENSIONS_DIR = /System/Library/Extensions
1196SYSTEM_KEXT_INFO_PLIST = $(addprefix $(INSTALL_EXTENSIONS_DIR),/System.kext/Info.plist)
1197
1198#
1199# System.kext PlugIns install location
1200#
1201DSTROOT_SYSTEM_KEXT_PATH = $(addprefix $(DSTROOT)$(INSTALL_EXTENSIONS_DIR),/System.kext/PlugIns)
1202SYMROOT_SYSTEM_KEXT_PATH = $(addprefix $(SYMROOT),/System.kext/PlugIns)
1203
1204#
1205# KDK location
1206#
1207INSTALL_KERNEL_SYM_DIR = /System/Library/Extensions/KDK
1208
1209#
1210# Misc. Etc.
1211#
1212INSTALL_SHARE_MISC_DIR = /usr/share/misc
1213INSTALL_DTRACE_SCRIPTS_DIR = /usr/lib/dtrace
1214INSTALL_DTRACE_LIBEXEC_DIR = /usr/libexec/dtrace
1215
1216#
1217# Generated xnu version file
1218#
1219XNU_VERSION = $(OBJROOT)/xnuVersion
1220
1221#
1222# Overrides for XBS build aliases
1223#
1224ifneq ($(filter $(RC_ProjectName),xnu_headers_driverkit),)
1225USE_BINARY_PLIST = 1
1226else ifneq ($(filter $(RC_ProjectName),xnu_debug),)
1227INSTALL_KERNEL_DIR := $(DEVELOPER_EXTRAS_DIR)
1228INSTALL_KERNEL_SYM_DIR := $(DEVELOPER_EXTRAS_DIR)
1229INSTALL_KERNEL_SYM_TO_KDK = 1
1230INSTALL_XNU_DEBUG_FILES = 1
1231else ifneq ($(filter $(SUPPORTED_EMBEDDED_PLATFORMS),$(PLATFORM)),)
1232INSTALL_KERNEL_SYM_TO_KDK = 1
1233USE_BINARY_PLIST = 1
1234else ifneq ($(filter $(SUPPORTED_SIMULATOR_PLATFORMS),$(PLATFORM)),)
1235USE_BINARY_PLIST = 1
1236else ifeq ($(PLATFORM),MacOSX)
1237INSTALL_KERNEL_DIR := $(SYSTEM_LIBRARY_KERNELS_DIR)
1238INSTALL_KERNEL_SYM_DIR := $(SYSTEM_LIBRARY_KERNELS_DIR)
1239INSTALL_KERNEL_SYM_TO_KDK = $(if $(filter YES,$(DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT)),1,0)
1240endif
1241
1242ifneq ($(filter $(RC_ProjectName),xnu_kasan),)
1243INSTALL_KASAN_ONLY = 1
1244endif
1245
1246# vim: set ft=make:
1247