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