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