1ifneq ($(PLATFORM),MacOSX) 2# Exclude building for any platform except MacOSX, due to arch/target incompatibility 3EXCLUDED_SOURCES += sched/clutch_runqueue.c sched/edge_runqueue.c sched/edge_migration.c 4else 5 6SCHED_HARNESS := sched/sched_test_harness 7SCHED_HARNESS_SHADOW := $(SCHED_HARNESS)/shadow_headers 8SCHED_CLUTCH_DISABLED_WARNINGS := -Wno-declaration-after-statement -Wno-nullability-completeness -Wno-missing-prototypes -Wno-gnu-statement-expression-from-macro-expansion -Wno-implicit-int-conversion -Wno-sign-conversion -Wno-c++98-compat -Wno-language-extension-token -Wno-c2x-extensions -Wno-format-nonliteral -Wno-unused-function 9SCHED_TEST_DISABLED_WARNINGS := -Wno-gnu-binary-literal -Wno-format-nonliteral -Wno-language-extension-token -Wno-sign-conversion 10SCHED_HARNESS_DEFINES := -DSCHED_TEST_HARNESS=1 -DCONFIG_SCHED_CLUTCH=1 -DCONFIG_SCHED_TIMESHARE_CORE=1 -DCONFIG_THREAD_GROUPS=1 11# Configure osmfk/kern/queue.h to define symbol __queue_element_linkage_invalid() 12SCHED_HARNESS_DEFINES += -DDRIVERKIT_FRAMEWORK_INCLUDE=1 13SCHED_EDGE_DEFINES := -DCONFIG_SCHED_EDGE=1 -D__AMP__=1 14 15# Enable some ASan/UBSan in the test binary for MacOS target 16SCHED_HARNESS_DEBUG_FLAGS := -fsanitize=bounds -fsanitize=null -fsanitize=address -gfull 17 18XNU_SRC := .. 19# List the shadow_headers directory first before ../osfmk/ so that headers present in the 20# harness directory override the versions in xnu source proper 21SCHED_HARNESS_COMPILER_SEARCH_ORDER := -I $(SCHED_HARNESS_SHADOW)/ -I $(XNU_SRC)/osfmk/ 22 23# Track file modifications correctly in the recipe 24SCHED_HARNESS_DEPS := $(shell find $(SCHED_HARNESS) -name "*.c" -o -name "*.h") 25SCHED_CLUTCH_DEPS := $(XNU_SRC)/osfmk/kern/sched_clutch.c $(XNU_SRC)/osfmk/kern/sched_clutch.h $(XNU_SRC)/osfmk/kern/queue.h $(XNU_SRC)/osfmk/kern/circle_queue.h $(XNU_SRC)/osfmk/kern/bits.h $(XNU_SRC)/osfmk/kern/sched.h 26 27# Guard-out some unwanted includes without needing to modify the original header files 28SCHED_CLUTCH_UNWANTED_HDRS := mach/policy.h kern/smp.h kern/timer_call.h kern/macro_help.h kern/spl.h kern/misc_protos.h kern/thread.h 29clutch_setup_placehold_hdrs: 30 mkdir -p $(SCHED_HARNESS_SHADOW)/kern 31 mkdir -p $(SCHED_HARNESS_SHADOW)/mach 32 for hdr in $(SCHED_CLUTCH_UNWANTED_HDRS); do \ 33 echo "/* Empty file used as a placeholder for " $$hdr " that we don't want to import */" > $(SCHED_HARNESS_SHADOW)/$$hdr; \ 34 done 35 # Replace osfmk/mach/mach_types.h with smaller set of dependencies combined in misc_needed_defines.h, 36 # ultimately satisfying dependencies needed by osfmk/kern/sched.h 37 echo '#include "misc_needed_defines.h"' > $(SCHED_HARNESS_SHADOW)/mach/mach_types.h 38 39# Make it convenient to build all of the tests in one go 40SCHED_USERSPACE_UNIT_TESTS = sched/clutch_runqueue sched/edge_runqueue sched/edge_migration 41.PHONY: sched/userspace_unit_tests 42sched/userspace_unit_tests: $(SCHED_USERSPACE_UNIT_TESTS) 43SCHED_TARGETS += $(SCHED_USERSPACE_UNIT_TESTS) 44 45# Link together all the object files (built below) with the unit tests into a final binary 46sched/clutch_runqueue: INVALID_ARCHS = $(filter-out arm64e%,$(ARCH_CONFIGS)) 47sched/clutch_runqueue: OTHER_CFLAGS += $(SCHED_HARNESS_DEFINES) $(SCHED_HARNESS_DEBUG_FLAGS) $(SCHED_HARNESS_COMPILER_SEARCH_ORDER) $(SCHED_TEST_DISABLED_WARNINGS) -DTEST_RUNQ_POLICY="clutch" 48sched/clutch_runqueue: OTHER_LDFLAGS += -ldarwintest_utils $(SCHED_HARNESS_DEBUG_FLAGS) $(OBJROOT)/sched_clutch_harness.o $(OBJROOT)/priority_queue.o $(OBJROOT)/sched_runqueue_harness.o 49sched/clutch_runqueue: $(OBJROOT)/sched_clutch_harness.o $(OBJROOT)/priority_queue.o $(OBJROOT)/sched_runqueue_harness.o 50sched/clutch_runqueue: CONFIG_FLAGS := $(filter-out -O%,$(CONFIG_FLAGS)) -O0 -gfull 51 52sched/edge_runqueue: INVALID_ARCHS = $(filter-out arm64e%,$(ARCH_CONFIGS)) 53sched/edge_runqueue: OTHER_CFLAGS += $(SCHED_HARNESS_DEFINES) $(SCHED_EDGE_DEFINES) $(SCHED_HARNESS_DEBUG_FLAGS) $(SCHED_HARNESS_COMPILER_SEARCH_ORDER) $(SCHED_TEST_DISABLED_WARNINGS) -DTEST_RUNQ_POLICY="edge" 54sched/edge_runqueue: OTHER_LDFLAGS += -ldarwintest_utils $(SCHED_HARNESS_DEBUG_FLAGS) $(OBJROOT)/sched_edge_harness.o $(OBJROOT)/priority_queue.o $(OBJROOT)/sched_runqueue_harness.o $(OBJROOT)/sched_migration_harness.o 55sched/edge_runqueue: $(OBJROOT)/sched_edge_harness.o $(OBJROOT)/priority_queue.o $(OBJROOT)/sched_runqueue_harness.o $(OBJROOT)/sched_migration_harness.o 56sched/edge_runqueue: CONFIG_FLAGS := $(filter-out -O%,$(CONFIG_FLAGS)) -O0 -gfull 57 58sched/edge_migration: INVALID_ARCHS = $(filter-out arm64e%,$(ARCH_CONFIGS)) 59sched/edge_migration: OTHER_CFLAGS += $(SCHED_HARNESS_DEFINES) $(SCHED_EDGE_DEFINES) $(SCHED_HARNESS_DEBUG_FLAGS) $(SCHED_HARNESS_COMPILER_SEARCH_ORDER) $(SCHED_TEST_DISABLED_WARNINGS) -DTEST_RUNQ_POLICY="edge" 60sched/edge_migration: OTHER_LDFLAGS += -ldarwintest_utils $(SCHED_HARNESS_DEBUG_FLAGS) $(OBJROOT)/sched_edge_harness.o $(OBJROOT)/priority_queue.o $(OBJROOT)/sched_runqueue_harness.o $(OBJROOT)/sched_migration_harness.o 61sched/edge_migration: $(OBJROOT)/sched_edge_harness.o $(OBJROOT)/priority_queue.o $(OBJROOT)/sched_runqueue_harness.o $(OBJROOT)/sched_migration_harness.o 62sched/edge_migration: CONFIG_FLAGS := $(filter-out -O%,$(CONFIG_FLAGS)) -O0 -gfull 63 64# Runqueue harness 65$(OBJROOT)/sched_runqueue_harness.o: OTHER_CFLAGS += $(SCHED_HARNESS_DEBUG_FLAGS) 66$(OBJROOT)/sched_runqueue_harness.o: $(SCHED_HARNESS)/sched_runqueue_harness.c 67 $(MAKE) clutch_setup_placehold_hdrs 68 $(CC) $(OTHER_CFLAGS) $(CFLAGS) -c $< -o $@ 69 70# Migration harness 71$(OBJROOT)/sched_migration_harness.o: OTHER_CFLAGS += $(SCHED_HARNESS_DEBUG_FLAGS) 72$(OBJROOT)/sched_migration_harness.o: $(SCHED_HARNESS)/sched_migration_harness.c 73 $(MAKE) clutch_setup_placehold_hdrs 74 $(CC) $(OTHER_CFLAGS) $(CFLAGS) -c $< -o $@ 75 76# Clutch harness 77$(OBJROOT)/sched_clutch_harness.o: OTHER_CFLAGS += -DRUNQUEUE_HARNESS_IMPLEMENTATION=1 $(SCHED_HARNESS_DEFINES) $(SCHED_HARNESS_DEBUG_FLAGS) $(SCHED_CLUTCH_DISABLED_WARNINGS) $(SCHED_HARNESS_COMPILER_SEARCH_ORDER) 78$(OBJROOT)/sched_clutch_harness.o: $(SCHED_HARNESS)/sched_clutch_harness.c $(SCHED_HARNESS_DEPS) $(SCHED_CLUTCH_DEPS) 79 $(MAKE) clutch_setup_placehold_hdrs 80 $(CC) $(OTHER_CFLAGS) $(CFLAGS) -c $< -o $@ 81 82# Edge harness 83$(OBJROOT)/sched_edge_harness.o: OTHER_CFLAGS += $(SCHED_HARNESS_DEFINES) $(SCHED_EDGE_DEFINES) $(SCHED_HARNESS_DEBUG_FLAGS) $(SCHED_CLUTCH_DISABLED_WARNINGS) $(SCHED_HARNESS_COMPILER_SEARCH_ORDER) 84$(OBJROOT)/sched_edge_harness.o: $(SCHED_HARNESS)/sched_edge_harness.c $(SCHED_HARNESS)/sched_clutch_harness_impl.c $(SCHED_HARNESS_DEPS) $(SCHED_CLUTCH_DEPS) 85 $(MAKE) clutch_setup_placehold_hdrs 86 $(CC) $(OTHER_CFLAGS) $(CFLAGS) -c $< -o $@ 87 88# Priority queue C++ dependency 89$(OBJROOT)/priority_queue.o: OTHER_CXXFLAGS += -std=c++11 $(SCHED_HARNESS_DEFINES) $(SCHED_HARNESS_DEBUG_FLAGS) $(SCHED_HARNESS_COMPILER_SEARCH_ORDER) 90$(OBJROOT)/priority_queue.o: $(SCHED_HARNESS_SHADOW)/priority_queue.cpp 91 $(CXX) $(OTHER_CXXFLAGS) $(CXXFLAGS) -c $< -o $@ 92 93endif 94