On 11/28/24 5:55 AM, Sean Christopherson wrote: > Provide empty targets for KVM selftests if the target architecture is > unsupported to make it obvious which architectures are supported, and so > that various side effects don't fail and/or do weird things, e.g. as is, > "mkdir -p $(sort $(dir $(TEST_GEN_PROGS)))" fails due to a missing operand, > and conversely, "$(shell mkdir -p $(sort $(OUTPUT)/$(ARCH_DIR) ..." will > create an empty, useless directory for the unsupported architecture. > > Move the guts of the Makefile to Makefile.kvm so that it's easier to see > that the if-statement effectively guards all of KVM selftests. > > Reported-by: Muhammad Usama Anjum <usama.anjum@xxxxxxxxxxxxx> > Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> Acked-by: Muhammad Usama Anjum <usama.anjum@xxxxxxxxxxxxx> > --- > tools/testing/selftests/kvm/.gitignore | 1 + > tools/testing/selftests/kvm/Makefile | 336 +---------------------- > tools/testing/selftests/kvm/Makefile.kvm | 334 ++++++++++++++++++++++ > 3 files changed, 340 insertions(+), 331 deletions(-) > create mode 100644 tools/testing/selftests/kvm/Makefile.kvm > > diff --git a/tools/testing/selftests/kvm/.gitignore b/tools/testing/selftests/kvm/.gitignore > index 7f57abf936e7..1d41a046a7bf 100644 > --- a/tools/testing/selftests/kvm/.gitignore > +++ b/tools/testing/selftests/kvm/.gitignore > @@ -9,3 +9,4 @@ > !config > !settings > !Makefile > +!Makefile.kvm > \ No newline at end of file > diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile > index c59a337cd4da..7b33464bf8cc 100644 > --- a/tools/testing/selftests/kvm/Makefile > +++ b/tools/testing/selftests/kvm/Makefile > @@ -1,12 +1,9 @@ > # SPDX-License-Identifier: GPL-2.0-only > -include ../../../build/Build.include > - > -all: > - > top_srcdir = ../../../.. > include $(top_srcdir)/scripts/subarch.include > ARCH ?= $(SUBARCH) > > +ifeq ($(ARCH),$(filter $(ARCH),arm64 s390 riscv x86 x86_64)) > ifeq ($(ARCH),x86) > ARCH_DIR := x86_64 > else ifeq ($(ARCH),arm64) > @@ -17,332 +14,9 @@ else > ARCH_DIR := $(ARCH) > endif > > -LIBKVM += lib/assert.c > -LIBKVM += lib/elf.c > -LIBKVM += lib/guest_modes.c > -LIBKVM += lib/io.c > -LIBKVM += lib/kvm_util.c > -LIBKVM += lib/memstress.c > -LIBKVM += lib/guest_sprintf.c > -LIBKVM += lib/rbtree.c > -LIBKVM += lib/sparsebit.c > -LIBKVM += lib/test_util.c > -LIBKVM += lib/ucall_common.c > -LIBKVM += lib/userfaultfd_util.c > - > -LIBKVM_STRING += lib/string_override.c > - > -LIBKVM_x86_64 += lib/x86_64/apic.c > -LIBKVM_x86_64 += lib/x86_64/handlers.S > -LIBKVM_x86_64 += lib/x86_64/hyperv.c > -LIBKVM_x86_64 += lib/x86_64/memstress.c > -LIBKVM_x86_64 += lib/x86_64/pmu.c > -LIBKVM_x86_64 += lib/x86_64/processor.c > -LIBKVM_x86_64 += lib/x86_64/sev.c > -LIBKVM_x86_64 += lib/x86_64/svm.c > -LIBKVM_x86_64 += lib/x86_64/ucall.c > -LIBKVM_x86_64 += lib/x86_64/vmx.c > - > -LIBKVM_aarch64 += lib/aarch64/gic.c > -LIBKVM_aarch64 += lib/aarch64/gic_v3.c > -LIBKVM_aarch64 += lib/aarch64/gic_v3_its.c > -LIBKVM_aarch64 += lib/aarch64/handlers.S > -LIBKVM_aarch64 += lib/aarch64/processor.c > -LIBKVM_aarch64 += lib/aarch64/spinlock.c > -LIBKVM_aarch64 += lib/aarch64/ucall.c > -LIBKVM_aarch64 += lib/aarch64/vgic.c > - > -LIBKVM_s390x += lib/s390x/diag318_test_handler.c > -LIBKVM_s390x += lib/s390x/processor.c > -LIBKVM_s390x += lib/s390x/ucall.c > -LIBKVM_s390x += lib/s390x/facility.c > - > -LIBKVM_riscv += lib/riscv/handlers.S > -LIBKVM_riscv += lib/riscv/processor.c > -LIBKVM_riscv += lib/riscv/ucall.c > - > -# Non-compiled test targets > -TEST_PROGS_x86_64 += x86_64/nx_huge_pages_test.sh > - > -# Compiled test targets > -TEST_GEN_PROGS_x86_64 = x86_64/cpuid_test > -TEST_GEN_PROGS_x86_64 += x86_64/cr4_cpuid_sync_test > -TEST_GEN_PROGS_x86_64 += x86_64/dirty_log_page_splitting_test > -TEST_GEN_PROGS_x86_64 += x86_64/feature_msrs_test > -TEST_GEN_PROGS_x86_64 += x86_64/exit_on_emulation_failure_test > -TEST_GEN_PROGS_x86_64 += x86_64/fix_hypercall_test > -TEST_GEN_PROGS_x86_64 += x86_64/hwcr_msr_test > -TEST_GEN_PROGS_x86_64 += x86_64/hyperv_clock > -TEST_GEN_PROGS_x86_64 += x86_64/hyperv_cpuid > -TEST_GEN_PROGS_x86_64 += x86_64/hyperv_evmcs > -TEST_GEN_PROGS_x86_64 += x86_64/hyperv_extended_hypercalls > -TEST_GEN_PROGS_x86_64 += x86_64/hyperv_features > -TEST_GEN_PROGS_x86_64 += x86_64/hyperv_ipi > -TEST_GEN_PROGS_x86_64 += x86_64/hyperv_svm_test > -TEST_GEN_PROGS_x86_64 += x86_64/hyperv_tlb_flush > -TEST_GEN_PROGS_x86_64 += x86_64/kvm_clock_test > -TEST_GEN_PROGS_x86_64 += x86_64/kvm_pv_test > -TEST_GEN_PROGS_x86_64 += x86_64/monitor_mwait_test > -TEST_GEN_PROGS_x86_64 += x86_64/nested_exceptions_test > -TEST_GEN_PROGS_x86_64 += x86_64/platform_info_test > -TEST_GEN_PROGS_x86_64 += x86_64/pmu_counters_test > -TEST_GEN_PROGS_x86_64 += x86_64/pmu_event_filter_test > -TEST_GEN_PROGS_x86_64 += x86_64/private_mem_conversions_test > -TEST_GEN_PROGS_x86_64 += x86_64/private_mem_kvm_exits_test > -TEST_GEN_PROGS_x86_64 += x86_64/set_boot_cpu_id > -TEST_GEN_PROGS_x86_64 += x86_64/set_sregs_test > -TEST_GEN_PROGS_x86_64 += x86_64/smaller_maxphyaddr_emulation_test > -TEST_GEN_PROGS_x86_64 += x86_64/smm_test > -TEST_GEN_PROGS_x86_64 += x86_64/state_test > -TEST_GEN_PROGS_x86_64 += x86_64/vmx_preemption_timer_test > -TEST_GEN_PROGS_x86_64 += x86_64/svm_vmcall_test > -TEST_GEN_PROGS_x86_64 += x86_64/svm_int_ctl_test > -TEST_GEN_PROGS_x86_64 += x86_64/svm_nested_shutdown_test > -TEST_GEN_PROGS_x86_64 += x86_64/svm_nested_soft_inject_test > -TEST_GEN_PROGS_x86_64 += x86_64/tsc_scaling_sync > -TEST_GEN_PROGS_x86_64 += x86_64/sync_regs_test > -TEST_GEN_PROGS_x86_64 += x86_64/ucna_injection_test > -TEST_GEN_PROGS_x86_64 += x86_64/userspace_io_test > -TEST_GEN_PROGS_x86_64 += x86_64/userspace_msr_exit_test > -TEST_GEN_PROGS_x86_64 += x86_64/vmx_apic_access_test > -TEST_GEN_PROGS_x86_64 += x86_64/vmx_close_while_nested_test > -TEST_GEN_PROGS_x86_64 += x86_64/vmx_dirty_log_test > -TEST_GEN_PROGS_x86_64 += x86_64/vmx_exception_with_invalid_guest_state > -TEST_GEN_PROGS_x86_64 += x86_64/vmx_msrs_test > -TEST_GEN_PROGS_x86_64 += x86_64/vmx_invalid_nested_guest_state > -TEST_GEN_PROGS_x86_64 += x86_64/vmx_set_nested_state_test > -TEST_GEN_PROGS_x86_64 += x86_64/vmx_tsc_adjust_test > -TEST_GEN_PROGS_x86_64 += x86_64/vmx_nested_tsc_scaling_test > -TEST_GEN_PROGS_x86_64 += x86_64/apic_bus_clock_test > -TEST_GEN_PROGS_x86_64 += x86_64/xapic_ipi_test > -TEST_GEN_PROGS_x86_64 += x86_64/xapic_state_test > -TEST_GEN_PROGS_x86_64 += x86_64/xcr0_cpuid_test > -TEST_GEN_PROGS_x86_64 += x86_64/xss_msr_test > -TEST_GEN_PROGS_x86_64 += x86_64/debug_regs > -TEST_GEN_PROGS_x86_64 += x86_64/tsc_msrs_test > -TEST_GEN_PROGS_x86_64 += x86_64/vmx_pmu_caps_test > -TEST_GEN_PROGS_x86_64 += x86_64/xen_shinfo_test > -TEST_GEN_PROGS_x86_64 += x86_64/xen_vmcall_test > -TEST_GEN_PROGS_x86_64 += x86_64/sev_init2_tests > -TEST_GEN_PROGS_x86_64 += x86_64/sev_migrate_tests > -TEST_GEN_PROGS_x86_64 += x86_64/sev_smoke_test > -TEST_GEN_PROGS_x86_64 += x86_64/amx_test > -TEST_GEN_PROGS_x86_64 += x86_64/max_vcpuid_cap_test > -TEST_GEN_PROGS_x86_64 += x86_64/triple_fault_event_test > -TEST_GEN_PROGS_x86_64 += x86_64/recalc_apic_map_test > -TEST_GEN_PROGS_x86_64 += access_tracking_perf_test > -TEST_GEN_PROGS_x86_64 += coalesced_io_test > -TEST_GEN_PROGS_x86_64 += demand_paging_test > -TEST_GEN_PROGS_x86_64 += dirty_log_test > -TEST_GEN_PROGS_x86_64 += dirty_log_perf_test > -TEST_GEN_PROGS_x86_64 += guest_memfd_test > -TEST_GEN_PROGS_x86_64 += guest_print_test > -TEST_GEN_PROGS_x86_64 += hardware_disable_test > -TEST_GEN_PROGS_x86_64 += kvm_create_max_vcpus > -TEST_GEN_PROGS_x86_64 += kvm_page_table_test > -TEST_GEN_PROGS_x86_64 += mmu_stress_test > -TEST_GEN_PROGS_x86_64 += memslot_modification_stress_test > -TEST_GEN_PROGS_x86_64 += memslot_perf_test > -TEST_GEN_PROGS_x86_64 += rseq_test > -TEST_GEN_PROGS_x86_64 += set_memory_region_test > -TEST_GEN_PROGS_x86_64 += steal_time > -TEST_GEN_PROGS_x86_64 += kvm_binary_stats_test > -TEST_GEN_PROGS_x86_64 += system_counter_offset_test > -TEST_GEN_PROGS_x86_64 += pre_fault_memory_test > - > -# Compiled outputs used by test targets > -TEST_GEN_PROGS_EXTENDED_x86_64 += x86_64/nx_huge_pages_test > - > -TEST_GEN_PROGS_aarch64 += aarch64/aarch32_id_regs > -TEST_GEN_PROGS_aarch64 += aarch64/arch_timer_edge_cases > -TEST_GEN_PROGS_aarch64 += aarch64/debug-exceptions > -TEST_GEN_PROGS_aarch64 += aarch64/hypercalls > -TEST_GEN_PROGS_aarch64 += aarch64/mmio_abort > -TEST_GEN_PROGS_aarch64 += aarch64/page_fault_test > -TEST_GEN_PROGS_aarch64 += aarch64/psci_test > -TEST_GEN_PROGS_aarch64 += aarch64/set_id_regs > -TEST_GEN_PROGS_aarch64 += aarch64/smccc_filter > -TEST_GEN_PROGS_aarch64 += aarch64/vcpu_width_config > -TEST_GEN_PROGS_aarch64 += aarch64/vgic_init > -TEST_GEN_PROGS_aarch64 += aarch64/vgic_irq > -TEST_GEN_PROGS_aarch64 += aarch64/vgic_lpi_stress > -TEST_GEN_PROGS_aarch64 += aarch64/vpmu_counter_access > -TEST_GEN_PROGS_aarch64 += aarch64/no-vgic-v3 > -TEST_GEN_PROGS_aarch64 += access_tracking_perf_test > -TEST_GEN_PROGS_aarch64 += arch_timer > -TEST_GEN_PROGS_aarch64 += coalesced_io_test > -TEST_GEN_PROGS_aarch64 += demand_paging_test > -TEST_GEN_PROGS_aarch64 += dirty_log_test > -TEST_GEN_PROGS_aarch64 += dirty_log_perf_test > -TEST_GEN_PROGS_aarch64 += guest_print_test > -TEST_GEN_PROGS_aarch64 += get-reg-list > -TEST_GEN_PROGS_aarch64 += kvm_create_max_vcpus > -TEST_GEN_PROGS_aarch64 += kvm_page_table_test > -TEST_GEN_PROGS_aarch64 += memslot_modification_stress_test > -TEST_GEN_PROGS_aarch64 += memslot_perf_test > -TEST_GEN_PROGS_aarch64 += mmu_stress_test > -TEST_GEN_PROGS_aarch64 += rseq_test > -TEST_GEN_PROGS_aarch64 += set_memory_region_test > -TEST_GEN_PROGS_aarch64 += steal_time > -TEST_GEN_PROGS_aarch64 += kvm_binary_stats_test > - > -TEST_GEN_PROGS_s390x = s390x/memop > -TEST_GEN_PROGS_s390x += s390x/resets > -TEST_GEN_PROGS_s390x += s390x/sync_regs_test > -TEST_GEN_PROGS_s390x += s390x/tprot > -TEST_GEN_PROGS_s390x += s390x/cmma_test > -TEST_GEN_PROGS_s390x += s390x/debug_test > -TEST_GEN_PROGS_s390x += s390x/cpumodel_subfuncs_test > -TEST_GEN_PROGS_s390x += s390x/shared_zeropage_test > -TEST_GEN_PROGS_s390x += s390x/ucontrol_test > -TEST_GEN_PROGS_s390x += demand_paging_test > -TEST_GEN_PROGS_s390x += dirty_log_test > -TEST_GEN_PROGS_s390x += guest_print_test > -TEST_GEN_PROGS_s390x += kvm_create_max_vcpus > -TEST_GEN_PROGS_s390x += kvm_page_table_test > -TEST_GEN_PROGS_s390x += rseq_test > -TEST_GEN_PROGS_s390x += set_memory_region_test > -TEST_GEN_PROGS_s390x += kvm_binary_stats_test > - > -TEST_GEN_PROGS_riscv += riscv/sbi_pmu_test > -TEST_GEN_PROGS_riscv += riscv/ebreak_test > -TEST_GEN_PROGS_riscv += arch_timer > -TEST_GEN_PROGS_riscv += coalesced_io_test > -TEST_GEN_PROGS_riscv += demand_paging_test > -TEST_GEN_PROGS_riscv += dirty_log_test > -TEST_GEN_PROGS_riscv += get-reg-list > -TEST_GEN_PROGS_riscv += guest_print_test > -TEST_GEN_PROGS_riscv += kvm_binary_stats_test > -TEST_GEN_PROGS_riscv += kvm_create_max_vcpus > -TEST_GEN_PROGS_riscv += kvm_page_table_test > -TEST_GEN_PROGS_riscv += set_memory_region_test > -TEST_GEN_PROGS_riscv += steal_time > - > -SPLIT_TESTS += arch_timer > -SPLIT_TESTS += get-reg-list > - > -TEST_PROGS += $(TEST_PROGS_$(ARCH_DIR)) > -TEST_GEN_PROGS += $(TEST_GEN_PROGS_$(ARCH_DIR)) > -TEST_GEN_PROGS_EXTENDED += $(TEST_GEN_PROGS_EXTENDED_$(ARCH_DIR)) > -LIBKVM += $(LIBKVM_$(ARCH_DIR)) > - > -OVERRIDE_TARGETS = 1 > - > -# lib.mak defines $(OUTPUT), prepends $(OUTPUT)/ to $(TEST_GEN_PROGS), and most > -# importantly defines, i.e. overwrites, $(CC) (unless `make -e` or `make CC=`, > -# which causes the environment variable to override the makefile). > -include ../lib.mk > - > -INSTALL_HDR_PATH = $(top_srcdir)/usr > -LINUX_HDR_PATH = $(INSTALL_HDR_PATH)/include/ > -LINUX_TOOL_INCLUDE = $(top_srcdir)/tools/include > -ifeq ($(ARCH),x86_64) > -LINUX_TOOL_ARCH_INCLUDE = $(top_srcdir)/tools/arch/x86/include > +include Makefile.kvm > else > -LINUX_TOOL_ARCH_INCLUDE = $(top_srcdir)/tools/arch/$(ARCH)/include > +# Empty targets for unsupported architectures > +all: > +clean: > endif > -CFLAGS += -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99 \ > - -Wno-gnu-variable-sized-type-not-at-end -MD -MP -DCONFIG_64BIT \ > - -fno-builtin-memcmp -fno-builtin-memcpy \ > - -fno-builtin-memset -fno-builtin-strnlen \ > - -fno-stack-protector -fno-PIE -fno-strict-aliasing \ > - -I$(LINUX_TOOL_INCLUDE) -I$(LINUX_TOOL_ARCH_INCLUDE) \ > - -I$(LINUX_HDR_PATH) -Iinclude -I$(<D) -Iinclude/$(ARCH_DIR) \ > - -I ../rseq -I.. $(EXTRA_CFLAGS) $(KHDR_INCLUDES) > -ifeq ($(ARCH),s390) > - CFLAGS += -march=z10 > -endif > -ifeq ($(ARCH),x86) > -ifeq ($(shell echo "void foo(void) { }" | $(CC) -march=x86-64-v2 -x c - -c -o /dev/null 2>/dev/null; echo "$$?"),0) > - CFLAGS += -march=x86-64-v2 > -endif > -endif > -ifeq ($(ARCH),arm64) > -tools_dir := $(top_srcdir)/tools > -arm64_tools_dir := $(tools_dir)/arch/arm64/tools/ > - > -ifneq ($(abs_objdir),) > -arm64_hdr_outdir := $(abs_objdir)/tools/ > -else > -arm64_hdr_outdir := $(tools_dir)/ > -endif > - > -GEN_HDRS := $(arm64_hdr_outdir)arch/arm64/include/generated/ > -CFLAGS += -I$(GEN_HDRS) > - > -$(GEN_HDRS): $(wildcard $(arm64_tools_dir)/*) > - $(MAKE) -C $(arm64_tools_dir) OUTPUT=$(arm64_hdr_outdir) > -endif > - > -no-pie-option := $(call try-run, echo 'int main(void) { return 0; }' | \ > - $(CC) -Werror $(CFLAGS) -no-pie -x c - -o "$$TMP", -no-pie) > - > -# On s390, build the testcases KVM-enabled > -pgste-option = $(call try-run, echo 'int main(void) { return 0; }' | \ > - $(CC) -Werror -Wl$(comma)--s390-pgste -x c - -o "$$TMP",-Wl$(comma)--s390-pgste) > - > -LDLIBS += -ldl > -LDFLAGS += -pthread $(no-pie-option) $(pgste-option) > - > -LIBKVM_C := $(filter %.c,$(LIBKVM)) > -LIBKVM_S := $(filter %.S,$(LIBKVM)) > -LIBKVM_C_OBJ := $(patsubst %.c, $(OUTPUT)/%.o, $(LIBKVM_C)) > -LIBKVM_S_OBJ := $(patsubst %.S, $(OUTPUT)/%.o, $(LIBKVM_S)) > -LIBKVM_STRING_OBJ := $(patsubst %.c, $(OUTPUT)/%.o, $(LIBKVM_STRING)) > -LIBKVM_OBJS = $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ) $(LIBKVM_STRING_OBJ) > -SPLIT_TEST_GEN_PROGS := $(patsubst %, $(OUTPUT)/%, $(SPLIT_TESTS)) > -SPLIT_TEST_GEN_OBJ := $(patsubst %, $(OUTPUT)/$(ARCH_DIR)/%.o, $(SPLIT_TESTS)) > - > -TEST_GEN_OBJ = $(patsubst %, %.o, $(TEST_GEN_PROGS)) > -TEST_GEN_OBJ += $(patsubst %, %.o, $(TEST_GEN_PROGS_EXTENDED)) > -TEST_DEP_FILES = $(patsubst %.o, %.d, $(TEST_GEN_OBJ)) > -TEST_DEP_FILES += $(patsubst %.o, %.d, $(LIBKVM_OBJS)) > -TEST_DEP_FILES += $(patsubst %.o, %.d, $(SPLIT_TEST_GEN_OBJ)) > --include $(TEST_DEP_FILES) > - > -$(shell mkdir -p $(sort $(OUTPUT)/$(ARCH_DIR) $(dir $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ)))) > - > -$(filter-out $(SPLIT_TEST_GEN_PROGS), $(TEST_GEN_PROGS)) \ > -$(TEST_GEN_PROGS_EXTENDED): %: %.o > - $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LIBKVM_OBJS) $(LDLIBS) -o $@ > -$(TEST_GEN_OBJ): $(OUTPUT)/%.o: %.c > - $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@ > - > -$(SPLIT_TEST_GEN_PROGS): $(OUTPUT)/%: $(OUTPUT)/%.o $(OUTPUT)/$(ARCH_DIR)/%.o > - $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ > -$(SPLIT_TEST_GEN_OBJ): $(OUTPUT)/$(ARCH_DIR)/%.o: $(ARCH_DIR)/%.c > - $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@ > - > -EXTRA_CLEAN += $(GEN_HDRS) \ > - $(LIBKVM_OBJS) \ > - $(SPLIT_TEST_GEN_OBJ) \ > - $(TEST_DEP_FILES) \ > - $(TEST_GEN_OBJ) \ > - cscope.* > - > -$(LIBKVM_C_OBJ): $(OUTPUT)/%.o: %.c $(GEN_HDRS) > - $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@ > - > -$(LIBKVM_S_OBJ): $(OUTPUT)/%.o: %.S $(GEN_HDRS) > - $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@ > - > -# Compile the string overrides as freestanding to prevent the compiler from > -# generating self-referential code, e.g. without "freestanding" the compiler may > -# "optimize" memcmp() by invoking memcmp(), thus causing infinite recursion. > -$(LIBKVM_STRING_OBJ): $(OUTPUT)/%.o: %.c > - $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -ffreestanding $< -o $@ > - > -$(shell mkdir -p $(sort $(dir $(TEST_GEN_PROGS)))) > -$(SPLIT_TEST_GEN_OBJ): $(GEN_HDRS) > -$(TEST_GEN_PROGS): $(LIBKVM_OBJS) > -$(TEST_GEN_PROGS_EXTENDED): $(LIBKVM_OBJS) > -$(TEST_GEN_OBJ): $(GEN_HDRS) > - > -cscope: include_paths = $(LINUX_TOOL_INCLUDE) $(LINUX_HDR_PATH) include lib .. > -cscope: > - $(RM) cscope.* > - (find $(include_paths) -name '*.h' \ > - -exec realpath --relative-base=$(PWD) {} \;; \ > - find . -name '*.c' \ > - -exec realpath --relative-base=$(PWD) {} \;) | sort -u > cscope.files > - cscope -b > diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selftests/kvm/Makefile.kvm > new file mode 100644 > index 000000000000..e988a72f8c20 > --- /dev/null > +++ b/tools/testing/selftests/kvm/Makefile.kvm > @@ -0,0 +1,334 @@ > +# SPDX-License-Identifier: GPL-2.0-only > +include ../../../build/Build.include > + > +all: > + > +LIBKVM += lib/assert.c > +LIBKVM += lib/elf.c > +LIBKVM += lib/guest_modes.c > +LIBKVM += lib/io.c > +LIBKVM += lib/kvm_util.c > +LIBKVM += lib/memstress.c > +LIBKVM += lib/guest_sprintf.c > +LIBKVM += lib/rbtree.c > +LIBKVM += lib/sparsebit.c > +LIBKVM += lib/test_util.c > +LIBKVM += lib/ucall_common.c > +LIBKVM += lib/userfaultfd_util.c > + > +LIBKVM_STRING += lib/string_override.c > + > +LIBKVM_x86_64 += lib/x86_64/apic.c > +LIBKVM_x86_64 += lib/x86_64/handlers.S > +LIBKVM_x86_64 += lib/x86_64/hyperv.c > +LIBKVM_x86_64 += lib/x86_64/memstress.c > +LIBKVM_x86_64 += lib/x86_64/pmu.c > +LIBKVM_x86_64 += lib/x86_64/processor.c > +LIBKVM_x86_64 += lib/x86_64/sev.c > +LIBKVM_x86_64 += lib/x86_64/svm.c > +LIBKVM_x86_64 += lib/x86_64/ucall.c > +LIBKVM_x86_64 += lib/x86_64/vmx.c > + > +LIBKVM_aarch64 += lib/aarch64/gic.c > +LIBKVM_aarch64 += lib/aarch64/gic_v3.c > +LIBKVM_aarch64 += lib/aarch64/gic_v3_its.c > +LIBKVM_aarch64 += lib/aarch64/handlers.S > +LIBKVM_aarch64 += lib/aarch64/processor.c > +LIBKVM_aarch64 += lib/aarch64/spinlock.c > +LIBKVM_aarch64 += lib/aarch64/ucall.c > +LIBKVM_aarch64 += lib/aarch64/vgic.c > + > +LIBKVM_s390x += lib/s390x/diag318_test_handler.c > +LIBKVM_s390x += lib/s390x/processor.c > +LIBKVM_s390x += lib/s390x/ucall.c > +LIBKVM_s390x += lib/s390x/facility.c > + > +LIBKVM_riscv += lib/riscv/handlers.S > +LIBKVM_riscv += lib/riscv/processor.c > +LIBKVM_riscv += lib/riscv/ucall.c > + > +# Non-compiled test targets > +TEST_PROGS_x86_64 += x86_64/nx_huge_pages_test.sh > + > +# Compiled test targets > +TEST_GEN_PROGS_x86_64 = x86_64/cpuid_test > +TEST_GEN_PROGS_x86_64 += x86_64/cr4_cpuid_sync_test > +TEST_GEN_PROGS_x86_64 += x86_64/dirty_log_page_splitting_test > +TEST_GEN_PROGS_x86_64 += x86_64/feature_msrs_test > +TEST_GEN_PROGS_x86_64 += x86_64/exit_on_emulation_failure_test > +TEST_GEN_PROGS_x86_64 += x86_64/fix_hypercall_test > +TEST_GEN_PROGS_x86_64 += x86_64/hwcr_msr_test > +TEST_GEN_PROGS_x86_64 += x86_64/hyperv_clock > +TEST_GEN_PROGS_x86_64 += x86_64/hyperv_cpuid > +TEST_GEN_PROGS_x86_64 += x86_64/hyperv_evmcs > +TEST_GEN_PROGS_x86_64 += x86_64/hyperv_extended_hypercalls > +TEST_GEN_PROGS_x86_64 += x86_64/hyperv_features > +TEST_GEN_PROGS_x86_64 += x86_64/hyperv_ipi > +TEST_GEN_PROGS_x86_64 += x86_64/hyperv_svm_test > +TEST_GEN_PROGS_x86_64 += x86_64/hyperv_tlb_flush > +TEST_GEN_PROGS_x86_64 += x86_64/kvm_clock_test > +TEST_GEN_PROGS_x86_64 += x86_64/kvm_pv_test > +TEST_GEN_PROGS_x86_64 += x86_64/monitor_mwait_test > +TEST_GEN_PROGS_x86_64 += x86_64/nested_exceptions_test > +TEST_GEN_PROGS_x86_64 += x86_64/platform_info_test > +TEST_GEN_PROGS_x86_64 += x86_64/pmu_counters_test > +TEST_GEN_PROGS_x86_64 += x86_64/pmu_event_filter_test > +TEST_GEN_PROGS_x86_64 += x86_64/private_mem_conversions_test > +TEST_GEN_PROGS_x86_64 += x86_64/private_mem_kvm_exits_test > +TEST_GEN_PROGS_x86_64 += x86_64/set_boot_cpu_id > +TEST_GEN_PROGS_x86_64 += x86_64/set_sregs_test > +TEST_GEN_PROGS_x86_64 += x86_64/smaller_maxphyaddr_emulation_test > +TEST_GEN_PROGS_x86_64 += x86_64/smm_test > +TEST_GEN_PROGS_x86_64 += x86_64/state_test > +TEST_GEN_PROGS_x86_64 += x86_64/vmx_preemption_timer_test > +TEST_GEN_PROGS_x86_64 += x86_64/svm_vmcall_test > +TEST_GEN_PROGS_x86_64 += x86_64/svm_int_ctl_test > +TEST_GEN_PROGS_x86_64 += x86_64/svm_nested_shutdown_test > +TEST_GEN_PROGS_x86_64 += x86_64/svm_nested_soft_inject_test > +TEST_GEN_PROGS_x86_64 += x86_64/tsc_scaling_sync > +TEST_GEN_PROGS_x86_64 += x86_64/sync_regs_test > +TEST_GEN_PROGS_x86_64 += x86_64/ucna_injection_test > +TEST_GEN_PROGS_x86_64 += x86_64/userspace_io_test > +TEST_GEN_PROGS_x86_64 += x86_64/userspace_msr_exit_test > +TEST_GEN_PROGS_x86_64 += x86_64/vmx_apic_access_test > +TEST_GEN_PROGS_x86_64 += x86_64/vmx_close_while_nested_test > +TEST_GEN_PROGS_x86_64 += x86_64/vmx_dirty_log_test > +TEST_GEN_PROGS_x86_64 += x86_64/vmx_exception_with_invalid_guest_state > +TEST_GEN_PROGS_x86_64 += x86_64/vmx_msrs_test > +TEST_GEN_PROGS_x86_64 += x86_64/vmx_invalid_nested_guest_state > +TEST_GEN_PROGS_x86_64 += x86_64/vmx_set_nested_state_test > +TEST_GEN_PROGS_x86_64 += x86_64/vmx_tsc_adjust_test > +TEST_GEN_PROGS_x86_64 += x86_64/vmx_nested_tsc_scaling_test > +TEST_GEN_PROGS_x86_64 += x86_64/apic_bus_clock_test > +TEST_GEN_PROGS_x86_64 += x86_64/xapic_ipi_test > +TEST_GEN_PROGS_x86_64 += x86_64/xapic_state_test > +TEST_GEN_PROGS_x86_64 += x86_64/xcr0_cpuid_test > +TEST_GEN_PROGS_x86_64 += x86_64/xss_msr_test > +TEST_GEN_PROGS_x86_64 += x86_64/debug_regs > +TEST_GEN_PROGS_x86_64 += x86_64/tsc_msrs_test > +TEST_GEN_PROGS_x86_64 += x86_64/vmx_pmu_caps_test > +TEST_GEN_PROGS_x86_64 += x86_64/xen_shinfo_test > +TEST_GEN_PROGS_x86_64 += x86_64/xen_vmcall_test > +TEST_GEN_PROGS_x86_64 += x86_64/sev_init2_tests > +TEST_GEN_PROGS_x86_64 += x86_64/sev_migrate_tests > +TEST_GEN_PROGS_x86_64 += x86_64/sev_smoke_test > +TEST_GEN_PROGS_x86_64 += x86_64/amx_test > +TEST_GEN_PROGS_x86_64 += x86_64/max_vcpuid_cap_test > +TEST_GEN_PROGS_x86_64 += x86_64/triple_fault_event_test > +TEST_GEN_PROGS_x86_64 += x86_64/recalc_apic_map_test > +TEST_GEN_PROGS_x86_64 += access_tracking_perf_test > +TEST_GEN_PROGS_x86_64 += coalesced_io_test > +TEST_GEN_PROGS_x86_64 += demand_paging_test > +TEST_GEN_PROGS_x86_64 += dirty_log_test > +TEST_GEN_PROGS_x86_64 += dirty_log_perf_test > +TEST_GEN_PROGS_x86_64 += guest_memfd_test > +TEST_GEN_PROGS_x86_64 += guest_print_test > +TEST_GEN_PROGS_x86_64 += hardware_disable_test > +TEST_GEN_PROGS_x86_64 += kvm_create_max_vcpus > +TEST_GEN_PROGS_x86_64 += kvm_page_table_test > +TEST_GEN_PROGS_x86_64 += mmu_stress_test > +TEST_GEN_PROGS_x86_64 += memslot_modification_stress_test > +TEST_GEN_PROGS_x86_64 += memslot_perf_test > +TEST_GEN_PROGS_x86_64 += rseq_test > +TEST_GEN_PROGS_x86_64 += set_memory_region_test > +TEST_GEN_PROGS_x86_64 += steal_time > +TEST_GEN_PROGS_x86_64 += kvm_binary_stats_test > +TEST_GEN_PROGS_x86_64 += system_counter_offset_test > +TEST_GEN_PROGS_x86_64 += pre_fault_memory_test > + > +# Compiled outputs used by test targets > +TEST_GEN_PROGS_EXTENDED_x86_64 += x86_64/nx_huge_pages_test > + > +TEST_GEN_PROGS_aarch64 += aarch64/aarch32_id_regs > +TEST_GEN_PROGS_aarch64 += aarch64/arch_timer_edge_cases > +TEST_GEN_PROGS_aarch64 += aarch64/debug-exceptions > +TEST_GEN_PROGS_aarch64 += aarch64/hypercalls > +TEST_GEN_PROGS_aarch64 += aarch64/mmio_abort > +TEST_GEN_PROGS_aarch64 += aarch64/page_fault_test > +TEST_GEN_PROGS_aarch64 += aarch64/psci_test > +TEST_GEN_PROGS_aarch64 += aarch64/set_id_regs > +TEST_GEN_PROGS_aarch64 += aarch64/smccc_filter > +TEST_GEN_PROGS_aarch64 += aarch64/vcpu_width_config > +TEST_GEN_PROGS_aarch64 += aarch64/vgic_init > +TEST_GEN_PROGS_aarch64 += aarch64/vgic_irq > +TEST_GEN_PROGS_aarch64 += aarch64/vgic_lpi_stress > +TEST_GEN_PROGS_aarch64 += aarch64/vpmu_counter_access > +TEST_GEN_PROGS_aarch64 += aarch64/no-vgic-v3 > +TEST_GEN_PROGS_aarch64 += access_tracking_perf_test > +TEST_GEN_PROGS_aarch64 += arch_timer > +TEST_GEN_PROGS_aarch64 += coalesced_io_test > +TEST_GEN_PROGS_aarch64 += demand_paging_test > +TEST_GEN_PROGS_aarch64 += dirty_log_test > +TEST_GEN_PROGS_aarch64 += dirty_log_perf_test > +TEST_GEN_PROGS_aarch64 += guest_print_test > +TEST_GEN_PROGS_aarch64 += get-reg-list > +TEST_GEN_PROGS_aarch64 += kvm_create_max_vcpus > +TEST_GEN_PROGS_aarch64 += kvm_page_table_test > +TEST_GEN_PROGS_aarch64 += memslot_modification_stress_test > +TEST_GEN_PROGS_aarch64 += memslot_perf_test > +TEST_GEN_PROGS_aarch64 += mmu_stress_test > +TEST_GEN_PROGS_aarch64 += rseq_test > +TEST_GEN_PROGS_aarch64 += set_memory_region_test > +TEST_GEN_PROGS_aarch64 += steal_time > +TEST_GEN_PROGS_aarch64 += kvm_binary_stats_test > + > +TEST_GEN_PROGS_s390x = s390x/memop > +TEST_GEN_PROGS_s390x += s390x/resets > +TEST_GEN_PROGS_s390x += s390x/sync_regs_test > +TEST_GEN_PROGS_s390x += s390x/tprot > +TEST_GEN_PROGS_s390x += s390x/cmma_test > +TEST_GEN_PROGS_s390x += s390x/debug_test > +TEST_GEN_PROGS_s390x += s390x/cpumodel_subfuncs_test > +TEST_GEN_PROGS_s390x += s390x/shared_zeropage_test > +TEST_GEN_PROGS_s390x += s390x/ucontrol_test > +TEST_GEN_PROGS_s390x += demand_paging_test > +TEST_GEN_PROGS_s390x += dirty_log_test > +TEST_GEN_PROGS_s390x += guest_print_test > +TEST_GEN_PROGS_s390x += kvm_create_max_vcpus > +TEST_GEN_PROGS_s390x += kvm_page_table_test > +TEST_GEN_PROGS_s390x += rseq_test > +TEST_GEN_PROGS_s390x += set_memory_region_test > +TEST_GEN_PROGS_s390x += kvm_binary_stats_test > + > +TEST_GEN_PROGS_riscv += riscv/sbi_pmu_test > +TEST_GEN_PROGS_riscv += riscv/ebreak_test > +TEST_GEN_PROGS_riscv += arch_timer > +TEST_GEN_PROGS_riscv += coalesced_io_test > +TEST_GEN_PROGS_riscv += demand_paging_test > +TEST_GEN_PROGS_riscv += dirty_log_test > +TEST_GEN_PROGS_riscv += get-reg-list > +TEST_GEN_PROGS_riscv += guest_print_test > +TEST_GEN_PROGS_riscv += kvm_binary_stats_test > +TEST_GEN_PROGS_riscv += kvm_create_max_vcpus > +TEST_GEN_PROGS_riscv += kvm_page_table_test > +TEST_GEN_PROGS_riscv += set_memory_region_test > +TEST_GEN_PROGS_riscv += steal_time > + > +SPLIT_TESTS += arch_timer > +SPLIT_TESTS += get-reg-list > + > +TEST_PROGS += $(TEST_PROGS_$(ARCH_DIR)) > +TEST_GEN_PROGS += $(TEST_GEN_PROGS_$(ARCH_DIR)) > +TEST_GEN_PROGS_EXTENDED += $(TEST_GEN_PROGS_EXTENDED_$(ARCH_DIR)) > +LIBKVM += $(LIBKVM_$(ARCH_DIR)) > + > +OVERRIDE_TARGETS = 1 > + > +# lib.mak defines $(OUTPUT), prepends $(OUTPUT)/ to $(TEST_GEN_PROGS), and most > +# importantly defines, i.e. overwrites, $(CC) (unless `make -e` or `make CC=`, > +# which causes the environment variable to override the makefile). > +include ../lib.mk > + > +INSTALL_HDR_PATH = $(top_srcdir)/usr > +LINUX_HDR_PATH = $(INSTALL_HDR_PATH)/include/ > +LINUX_TOOL_INCLUDE = $(top_srcdir)/tools/include > +ifeq ($(ARCH),x86_64) > +LINUX_TOOL_ARCH_INCLUDE = $(top_srcdir)/tools/arch/x86/include > +else > +LINUX_TOOL_ARCH_INCLUDE = $(top_srcdir)/tools/arch/$(ARCH)/include > +endif > +CFLAGS += -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99 \ > + -Wno-gnu-variable-sized-type-not-at-end -MD -MP -DCONFIG_64BIT \ > + -fno-builtin-memcmp -fno-builtin-memcpy \ > + -fno-builtin-memset -fno-builtin-strnlen \ > + -fno-stack-protector -fno-PIE -fno-strict-aliasing \ > + -I$(LINUX_TOOL_INCLUDE) -I$(LINUX_TOOL_ARCH_INCLUDE) \ > + -I$(LINUX_HDR_PATH) -Iinclude -I$(<D) -Iinclude/$(ARCH_DIR) \ > + -I ../rseq -I.. $(EXTRA_CFLAGS) $(KHDR_INCLUDES) > +ifeq ($(ARCH),s390) > + CFLAGS += -march=z10 > +endif > +ifeq ($(ARCH),x86) > +ifeq ($(shell echo "void foo(void) { }" | $(CC) -march=x86-64-v2 -x c - -c -o /dev/null 2>/dev/null; echo "$$?"),0) > + CFLAGS += -march=x86-64-v2 > +endif > +endif > +ifeq ($(ARCH),arm64) > +tools_dir := $(top_srcdir)/tools > +arm64_tools_dir := $(tools_dir)/arch/arm64/tools/ > + > +ifneq ($(abs_objdir),) > +arm64_hdr_outdir := $(abs_objdir)/tools/ > +else > +arm64_hdr_outdir := $(tools_dir)/ > +endif > + > +GEN_HDRS := $(arm64_hdr_outdir)arch/arm64/include/generated/ > +CFLAGS += -I$(GEN_HDRS) > + > +$(GEN_HDRS): $(wildcard $(arm64_tools_dir)/*) > + $(MAKE) -C $(arm64_tools_dir) OUTPUT=$(arm64_hdr_outdir) > +endif > + > +no-pie-option := $(call try-run, echo 'int main(void) { return 0; }' | \ > + $(CC) -Werror $(CFLAGS) -no-pie -x c - -o "$$TMP", -no-pie) > + > +# On s390, build the testcases KVM-enabled > +pgste-option = $(call try-run, echo 'int main(void) { return 0; }' | \ > + $(CC) -Werror -Wl$(comma)--s390-pgste -x c - -o "$$TMP",-Wl$(comma)--s390-pgste) > + > +LDLIBS += -ldl > +LDFLAGS += -pthread $(no-pie-option) $(pgste-option) > + > +LIBKVM_C := $(filter %.c,$(LIBKVM)) > +LIBKVM_S := $(filter %.S,$(LIBKVM)) > +LIBKVM_C_OBJ := $(patsubst %.c, $(OUTPUT)/%.o, $(LIBKVM_C)) > +LIBKVM_S_OBJ := $(patsubst %.S, $(OUTPUT)/%.o, $(LIBKVM_S)) > +LIBKVM_STRING_OBJ := $(patsubst %.c, $(OUTPUT)/%.o, $(LIBKVM_STRING)) > +LIBKVM_OBJS = $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ) $(LIBKVM_STRING_OBJ) > +SPLIT_TEST_GEN_PROGS := $(patsubst %, $(OUTPUT)/%, $(SPLIT_TESTS)) > +SPLIT_TEST_GEN_OBJ := $(patsubst %, $(OUTPUT)/$(ARCH_DIR)/%.o, $(SPLIT_TESTS)) > + > +TEST_GEN_OBJ = $(patsubst %, %.o, $(TEST_GEN_PROGS)) > +TEST_GEN_OBJ += $(patsubst %, %.o, $(TEST_GEN_PROGS_EXTENDED)) > +TEST_DEP_FILES = $(patsubst %.o, %.d, $(TEST_GEN_OBJ)) > +TEST_DEP_FILES += $(patsubst %.o, %.d, $(LIBKVM_OBJS)) > +TEST_DEP_FILES += $(patsubst %.o, %.d, $(SPLIT_TEST_GEN_OBJ)) > +-include $(TEST_DEP_FILES) > + > +$(shell mkdir -p $(sort $(OUTPUT)/$(ARCH_DIR) $(dir $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ)))) > + > +$(filter-out $(SPLIT_TEST_GEN_PROGS), $(TEST_GEN_PROGS)) \ > +$(TEST_GEN_PROGS_EXTENDED): %: %.o > + $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LIBKVM_OBJS) $(LDLIBS) -o $@ > +$(TEST_GEN_OBJ): $(OUTPUT)/%.o: %.c > + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@ > + > +$(SPLIT_TEST_GEN_PROGS): $(OUTPUT)/%: $(OUTPUT)/%.o $(OUTPUT)/$(ARCH_DIR)/%.o > + $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@ > +$(SPLIT_TEST_GEN_OBJ): $(OUTPUT)/$(ARCH_DIR)/%.o: $(ARCH_DIR)/%.c > + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@ > + > +EXTRA_CLEAN += $(GEN_HDRS) \ > + $(LIBKVM_OBJS) \ > + $(SPLIT_TEST_GEN_OBJ) \ > + $(TEST_DEP_FILES) \ > + $(TEST_GEN_OBJ) \ > + cscope.* > + > +$(LIBKVM_C_OBJ): $(OUTPUT)/%.o: %.c $(GEN_HDRS) > + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@ > + > +$(LIBKVM_S_OBJ): $(OUTPUT)/%.o: %.S $(GEN_HDRS) > + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@ > + > +# Compile the string overrides as freestanding to prevent the compiler from > +# generating self-referential code, e.g. without "freestanding" the compiler may > +# "optimize" memcmp() by invoking memcmp(), thus causing infinite recursion. > +$(LIBKVM_STRING_OBJ): $(OUTPUT)/%.o: %.c > + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -ffreestanding $< -o $@ > + > +$(shell mkdir -p $(sort $(dir $(TEST_GEN_PROGS)))) > +$(SPLIT_TEST_GEN_OBJ): $(GEN_HDRS) > +$(TEST_GEN_PROGS): $(LIBKVM_OBJS) > +$(TEST_GEN_PROGS_EXTENDED): $(LIBKVM_OBJS) > +$(TEST_GEN_OBJ): $(GEN_HDRS) > + > +cscope: include_paths = $(LINUX_TOOL_INCLUDE) $(LINUX_HDR_PATH) include lib .. > +cscope: > + $(RM) cscope.* > + (find $(include_paths) -name '*.h' \ > + -exec realpath --relative-base=$(PWD) {} \;; \ > + find . -name '*.c' \ > + -exec realpath --relative-base=$(PWD) {} \;) | sort -u > cscope.files > + cscope -b -- BR, Muhammad Usama Anjum