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