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