xref: /xnu-10063.141.1/makedefs/MakeInc.def (revision d8b80295118ef25ac3a784134bcf95cd8e88109f)
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
893
894#
895# DTrace support
896#
897ifndef DO_CTFMERGE
898DO_CTFMERGE := 1
899ifeq ($(CURRENT_KERNEL_CONFIG),RELEASE)
900ifneq ($(PLATFORM),MacOSX)
901DO_CTFMERGE := 0
902endif
903endif
904endif # DO_CTFMERGE
905
906
907#
908# Default INCFLAGS
909#
910INCFLAGS_IMPORT	= $(patsubst %, -I$(OBJROOT)/EXPORT_HDRS/%, $(COMPONENT_IMPORT_LIST))
911INCFLAGS_EXTERN	= -I$(SRCROOT)/EXTERNAL_HEADERS
912INCFLAGS_GEN	= -I$(SRCROOT)/$(COMPONENT) -I$(OBJROOT)/EXPORT_HDRS/$(COMPONENT)
913INCFLAGS_LOCAL	= -I.
914INCFLAGS_SDK	= -I$(SDKROOT)/usr/local/include/kernel
915INCFLAGS_PLATFORM = -I$(SDKROOT)/$(KPINCDIR)/platform
916
917INCFLAGS	= $(INCFLAGS_LOCAL) $(INCFLAGS_GEN) $(INCFLAGS_IMPORT) $(INCFLAGS_EXTERN) $(INCFLAGS_MAKEFILE) $(INCFLAGS_SDK) $(INCFLAGS_PLATFORM)
918
919#
920# Default MIGFLAGS
921#
922MIGFLAGS	= $(DEFINES) $(INCFLAGS) -novouchers $($(addsuffix $(CURRENT_ARCH_CONFIG),CFLAGS_)) $($(addsuffix $(CURRENT_ARCH_CONFIG),ARCH_FLAGS_)) \
923		$(DEPLOYMENT_TARGET_FLAGS)
924
925#
926# Default MIG Kernel Server flags
927#
928MIGKSFLAGS = \
929	-DMACH_KERNEL_PRIVATE \
930	-DKERNEL_SERVER=1 \
931	-mach_msg2
932
933#
934# Default MIG KernelUser flags
935#
936MIGKUFLAGS = \
937	-DMACH_KERNEL_PRIVATE \
938	-DKERNEL_USER=1 \
939	-maxonstack 1024
940
941# Support for LLVM Profile Guided Optimization (PGO)
942
943ifeq ($(BUILD_PROFILE),1)
944CFLAGS_GEN += -fprofile-instr-generate -DPROFILE
945CXXFLAGS_GEN += -fprofile-instr-generate -DPROFILE
946endif
947
948ifdef USE_PROFILE
949CFLAGS_GEN += -fprofile-instr-use=$(USE_PROFILE)
950CXXFLAGS_GEN += -fprofile-instr-use=$(USE_PROFILE)
951LDFLAGS_KERNEL_GEN += -fprofile-instr-use=$(USE_PROFILE)
952
953CFLAGS_GEN += -Wno-error=profile-instr-out-of-date
954endif
955
956#
957# Support for LLVM Link Time Optimization (LTO)
958#
959# LTO can be explicitly enabled or disabled with BUILD_LTO=1|0
960# and defaults to enabled except for DEBUG kernels
961#
962# CFLAGS_NOLTO_FLAG is needed on a per-file basis (for files
963# that deal poorly with LTO, or files that must be machine
964# code *.o files for xnu to build (i.e, setsegname runs on
965# them).
966#
967# LDFLAGS_NOSTRIP_FLAG is used to support configurations that
968# do not utilize an export list.  For these configs to build,
969# we need to prevent the LTO logic from dead stripping them.
970
971LTO_ENABLED_RELEASE = 1
972LTO_ENABLED_DEVELOPMENT = 1
973LTO_ENABLED_DEBUG = 0
974LTO_ENABLED_KASAN = 0
975
976ifneq ($(BUILD_LTO),)
977USE_LTO = $(BUILD_LTO)
978else
979USE_LTO = $(LTO_ENABLED_$(CURRENT_KERNEL_CONFIG))
980endif
981
982ifeq ($(USE_LTO),1)
983CFLAGS_GEN	+= -flto -DBUILT_LTO=1
984CXXFLAGS_GEN	+= -flto -DBUILT_LTO=1
985LDFLAGS_KERNEL_LTO	= -Wl,-mllvm,-inline-threshold=100
986LDFLAGS_KERNEL_GEN	+= $(LDFLAGS_KERNEL_LTO) -Wl,-object_path_lto,$(TARGET)/lto.o
987LDFLAGS_NOSTRIP_FLAG = -rdynamic
988LDFLAGS_KERNEL_STRIP_LTO = -Wl,-dead_strip,-no_dead_strip_inits_and_terms
989
990CFLAGS_NOLTO_FLAG = -fno-lto
991else
992LDFLAGS_KERNEL_LTO =
993LDFLAGS_NOSTRIP_FLAG =
994LDFLAGS_KERNEL_STRIP_LTO =
995CFLAGS_NOLTO_FLAG =
996endif
997
998#
999# Default VPATH
1000#
1001export VPATH = .:$(SOURCE)
1002
1003
1004
1005#
1006# Macros that control installation of kernel and its header files
1007#
1008# install flags for header files
1009#
1010INSTALL_FLAGS = -c -S -m 0444
1011DATA_INSTALL_FLAGS = -c -S -m 0644
1012DATA_INSTALL_FLAGS_RO = -c -S -m 0444
1013EXEC_INSTALL_FLAGS = -c -S -m 0755
1014
1015#
1016# Header file destinations
1017#
1018
1019ifeq ($(DRIVERKIT),1)
1020    SDKHEADERSROOT=$(DRIVERKITRUNTIMEROOT)
1021    # only whitelisted headers install outside of the DriverKit Runtime hierarchy
1022    DRIVERKITSDKHEADERSROOT=$(DRIVERKITROOT)
1023    DRIVERKITFRAMEDIR = $(DRIVERKITROOT)/System/Library/Frameworks
1024endif
1025
1026ifeq ($(EXCLAVEKIT),1)
1027    EXCLAVEKITSDKHEADERSROOT=$(EXCLAVEKITROOT)
1028    EXCLAVEKITFRAMEDIR = $(EXCLAVEKITROOT)/System/Library/Frameworks
1029endif
1030
1031ifeq ($(EXCLAVECORE),1)
1032    EXCLAVECORESDKHEADERSROOT=$(EXCLAVECOREROOT)
1033    EXCLAVECOREFRAMEDIR = $(EXCLAVECOREROOT)/System/Library/Frameworks
1034endif
1035
1036FRAMEDIR = $(SDKHEADERSROOT)/System/Library/Frameworks
1037
1038IINCVERS = A
1039IINCFRAME = $(FRAMEDIR)/IOKit.framework
1040IINCDIR = $(IINCFRAME)/Versions/$(IINCVERS)/Headers
1041IPINCDIR = $(IINCFRAME)/Versions/$(IINCVERS)/PrivateHeaders
1042IRESDIR = $(IINCFRAME)/Versions/$(IINCVERS)/Resources
1043
1044SINCVERS = B
1045SINCFRAME = $(FRAMEDIR)/System.framework
1046SINCDIR = $(SINCFRAME)/Versions/$(SINCVERS)/Headers
1047SPINCDIR = $(SINCFRAME)/Versions/$(SINCVERS)/PrivateHeaders
1048SRESDIR = $(SINCFRAME)/Versions/$(SINCVERS)/Resources
1049
1050ifndef INCDIR
1051    INCDIR = $(SDKHEADERSROOT)/usr/include
1052endif
1053ifndef DRIVERKITINCDIR
1054    DRIVERKITINCDIR = $(DRIVERKITSDKHEADERSROOT)/usr/include
1055endif
1056ifndef EXCLAVEKITINCDIR
1057    EXCLAVEKITINCDIR = $(EXCLAVEKITSDKHEADERSROOT)/usr/include
1058endif
1059ifndef EXCLAVECOREINCDIR
1060    EXCLAVECOREINCDIR = $(EXCLAVECORESDKHEADERSROOT)/usr/include
1061endif
1062ifndef LCLDIR
1063	LCLDIR = $(SDKHEADERSROOT)/usr/local/include
1064endif
1065ifndef DRIVERKITLCLDIR
1066    DRIVERKITLCLDIR = $(DRIVERKITSDKHEADERSROOT)/usr/local/include
1067endif
1068
1069KINCVERS = A
1070KINCFRAME = $(FRAMEDIR)/Kernel.framework
1071KINCDIR = $(KINCFRAME)/Versions/$(KINCVERS)/Headers
1072KPINCDIR = $(KINCFRAME)/Versions/$(KINCVERS)/PrivateHeaders
1073KRESDIR = $(KINCFRAME)/Versions/$(KINCVERS)/Resources
1074
1075KLIBCXXDIR = $(KPINCDIR)/kernel_sdkroot
1076KLIBCXXINCDIR = $(KLIBCXXDIR)/usr/include
1077
1078DKIT_INCFRAME = DriverKit.framework
1079
1080ifeq ($(PLATFORM),MacOSX)
1081DKIT_INCVERS = A
1082DKIT_INCDIR = $(DKIT_INCFRAME)/Versions/$(DKIT_INCVERS)/Headers
1083DKIT_PINCDIR = $(DKIT_INCFRAME)/Versions/$(DKIT_INCVERS)/PrivateHeaders
1084else
1085# non-macOS SDK frameworks use shallow bundle structure
1086DKIT_INCDIR = $(DKIT_INCFRAME)/Headers
1087DKIT_PINCDIR = $(DKIT_INCFRAME)/PrivateHeaders
1088endif
1089
1090# DriverKit SDK frameworks use shallow bundle structure
1091DRIVERKIT_DKIT_INCDIR = $(DKIT_INCFRAME)/Headers
1092DRIVERKIT_DKIT_PINCDIR = $(DKIT_INCFRAME)/PrivateHeaders
1093
1094XNU_PRIVATE_UNIFDEF ?=
1095XNU_PRIVATE_UNIFDEF += -UMACH_KERNEL_PRIVATE
1096XNU_PRIVATE_UNIFDEF += -UBSD_KERNEL_PRIVATE
1097XNU_PRIVATE_UNIFDEF += -UIOKIT_KERNEL_PRIVATE
1098XNU_PRIVATE_UNIFDEF += -ULIBKERN_KERNEL_PRIVATE
1099XNU_PRIVATE_UNIFDEF += -ULIBSA_KERNEL_PRIVATE
1100XNU_PRIVATE_UNIFDEF += -UPEXPERT_KERNEL_PRIVATE
1101XNU_PRIVATE_UNIFDEF += -UXNU_KERNEL_PRIVATE
1102
1103
1104PLATFORM_UNIFDEF = $(foreach x,$(SUPPORTED_PLATFORMS),$(if $(filter $(PLATFORM),$(x)),-DXNU_PLATFORM_$(x) $(foreach token,$(PLATFORM_UNIFDEF_BLACKLIST_TOKENS_$(x)),-U$(token)),-UXNU_PLATFORM_$(x)))
1105
1106
1107# Some header guards need to be present and checked in kernel headers but removed from userspace headers
1108KERNEL_ONLY_GUARDS_UNIFDEF =
1109
1110SPINCFRAME_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)
1111SINCFRAME_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)
1112DKPINCFRAME_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)
1113DKINCFRAME_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)
1114EKPINCFRAME_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)
1115EKINCFRAME_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)
1116ECPINCFRAME_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)
1117ECINCFRAME_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)
1118KPINCFRAME_UNIFDEF  = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -DKERNEL_PRIVATE -DKERNEL -DPRIVATE -UDRIVERKIT -UXNU_LIBCXX_SDKROOT -UEXCLAVEKIT -UEXCLAVECORE -U_OPEN_SOURCE_ -U__OPEN_SOURCE__
1119LIBCXXINCFRAME_UNIFDEF = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -DKERNEL_PRIVATE -DKERNEL -DPRIVATE -UDRIVERKIT -DXNU_LIBCXX_SDKROOT -UEXCLAVEKIT -UEXCLAVECORE  -U_OPEN_SOURCE_ -U__OPEN_SOURCE__
1120KINCFRAME_UNIFDEF   = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UKERNEL_PRIVATE -DKERNEL -UPRIVATE -UDRIVERKIT -UEXCLAVEKIT -UEXCLAVECORE -D_OPEN_SOURCE_ -D__OPEN_SOURCE__
1121PDATA_UNIFDEF       = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -DPRIVATE -U_OPEN_SOURCE_ -U__OPEN_SOURCE__
1122DATA_UNIFDEF        = $(PLATFORM_UNIFDEF) $(XNU_PRIVATE_UNIFDEF) $(SEED_DEFINES) -UPRIVATE -D_OPEN_SOURCE_ -D__OPEN_SOURCE__
1123
1124#
1125# Compononent Header file destinations
1126#
1127EXPDIR = EXPORT_HDRS/$(COMPONENT)
1128
1129#
1130# Strip Flags
1131#
1132STRIP_FLAGS_RELEASE	= -S -x
1133STRIP_FLAGS_DEVELOPMENT	= -S
1134STRIP_FLAGS_KASAN = $(STRIP_FLAGS_DEVELOPMENT)
1135STRIP_FLAGS_DEBUG	= -S
1136STRIP_FLAGS_PROFILE	= -S -x
1137
1138STRIP_FLAGS	= $($(addsuffix $(CURRENT_KERNEL_CONFIG),STRIP_FLAGS_))
1139
1140#
1141# dsymutil flags
1142#
1143DSYMUTIL_FLAGS_GEN	= --minimize
1144
1145DSYMUTIL_FLAGS_X86_64	= --arch=x86_64
1146DSYMUTIL_FLAGS_X86_64H	= --arch=x86_64h
1147DSYMUTIL_FLAGS_ARM64	=
1148
1149DSYMUTIL_FLAGS = $(DSYMUTIL_FLAGS_GEN) \
1150	$($(addsuffix $(CURRENT_ARCH_CONFIG),DSYMUTIL_FLAGS_))
1151
1152
1153
1154
1155#
1156# Man Page destination
1157#
1158MANDIR = /usr/share/man
1159
1160#
1161# DEBUG alias location
1162#
1163DEVELOPER_EXTRAS_DIR = /AppleInternal/CoreOS/xnu_$(CURRENT_KERNEL_CONFIG_LC)
1164
1165#
1166# mach_kernel install location
1167#
1168INSTALL_KERNEL_DIR = /
1169
1170#
1171# new OS X install location
1172#
1173SYSTEM_LIBRARY_KERNELS_DIR = /System/Library/Kernels
1174
1175#
1176# File names in DSTROOT
1177#
1178
1179ifeq ($(PLATFORM),MacOSX)
1180KERNEL_FILE_NAME_PREFIX = kernel
1181else
1182KERNEL_FILE_NAME_PREFIX = mach
1183endif
1184
1185ifeq ($(CURRENT_MACHINE_CONFIG),NONE)
1186ifeq ($(CURRENT_KERNEL_CONFIG),RELEASE)
1187KERNEL_FILE_NAME = $(KERNEL_FILE_NAME_PREFIX)
1188KERNEL_LLDBBOOTSTRAP_NAME = $(KERNEL_FILE_NAME_PREFIX).py
1189else
1190KERNEL_FILE_NAME = $(KERNEL_FILE_NAME_PREFIX).$(CURRENT_KERNEL_CONFIG_LC)
1191KERNEL_LLDBBOOTSTRAP_NAME = $(KERNEL_FILE_NAME_PREFIX).py
1192endif
1193else
1194KERNEL_FILE_NAME = $(KERNEL_FILE_NAME_PREFIX).$(CURRENT_KERNEL_CONFIG_LC).$(CURRENT_MACHINE_CONFIG_LC)
1195KERNEL_LLDBBOOTSTRAP_NAME = $(KERNEL_FILE_NAME_PREFIX)_$(CURRENT_KERNEL_CONFIG_LC).py
1196endif
1197
1198CURRENT_ALIAS_MACHINE_CONFIG = $(word 4,$(subst ^, ,$(CURRENT_BUILD_CONFIG)))
1199CURRENT_ALIAS_MACHINE_CONFIG_LC = $(shell printf "%s" "$(CURRENT_ALIAS_MACHINE_CONFIG)" | $(TR) A-Z a-z)
1200ifneq ($(CURRENT_ALIAS_MACHINE_CONFIG),)
1201ALIAS_FILE_NAME = $(KERNEL_FILE_NAME_PREFIX).$(CURRENT_KERNEL_CONFIG_LC).$(CURRENT_ALIAS_MACHINE_CONFIG_LC)
1202endif
1203
1204#
1205# System.kext pseudo-kext install location
1206#
1207INSTALL_EXTENSIONS_DIR = /System/Library/Extensions
1208SYSTEM_KEXT_INFO_PLIST = $(addprefix $(INSTALL_EXTENSIONS_DIR),/System.kext/Info.plist)
1209
1210#
1211# System.kext PlugIns install location
1212#
1213DSTROOT_SYSTEM_KEXT_PATH = $(addprefix $(DSTROOT)$(INSTALL_EXTENSIONS_DIR),/System.kext/PlugIns)
1214SYMROOT_SYSTEM_KEXT_PATH = $(addprefix $(SYMROOT),/System.kext/PlugIns)
1215
1216#
1217# KDK location
1218#
1219INSTALL_KERNEL_SYM_DIR = /System/Library/Extensions/KDK
1220
1221#
1222# Misc. Etc.
1223#
1224INSTALL_SHARE_MISC_DIR = /usr/share/misc
1225INSTALL_DTRACE_SCRIPTS_DIR = /usr/lib/dtrace
1226INSTALL_DTRACE_LIBEXEC_DIR = /usr/libexec/dtrace
1227
1228#
1229# Generated xnu version file
1230#
1231XNU_VERSION = $(OBJROOT)/xnuVersion
1232
1233#
1234# Overrides for XBS build aliases
1235#
1236ifneq ($(filter $(RC_ProjectName),xnu_headers_driverkit),)
1237USE_BINARY_PLIST = 1
1238else ifneq ($(filter $(RC_ProjectName),xnu_debug),)
1239INSTALL_KERNEL_DIR := $(DEVELOPER_EXTRAS_DIR)
1240INSTALL_KERNEL_SYM_DIR := $(DEVELOPER_EXTRAS_DIR)
1241INSTALL_KERNEL_SYM_TO_KDK = 1
1242INSTALL_XNU_DEBUG_FILES = 1
1243else ifneq ($(filter $(SUPPORTED_EMBEDDED_PLATFORMS),$(PLATFORM)),)
1244INSTALL_KERNEL_SYM_TO_KDK = 1
1245USE_BINARY_PLIST = 1
1246else ifneq ($(filter $(SUPPORTED_SIMULATOR_PLATFORMS),$(PLATFORM)),)
1247USE_BINARY_PLIST = 1
1248else ifeq ($(PLATFORM),MacOSX)
1249INSTALL_KERNEL_DIR := $(SYSTEM_LIBRARY_KERNELS_DIR)
1250INSTALL_KERNEL_SYM_DIR := $(SYSTEM_LIBRARY_KERNELS_DIR)
1251INSTALL_KERNEL_SYM_TO_KDK = $(if $(filter YES,$(DWARF_DSYM_FILE_SHOULD_ACCOMPANY_PRODUCT)),1,0)
1252endif
1253
1254ifneq ($(filter $(RC_ProjectName),xnu_kasan),)
1255INSTALL_KASAN_ONLY = 1
1256endif
1257
1258# vim: set ft=make:
1259