^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) # SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) all:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) include ../lib.mk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) .PHONY: all all_32 all_64 warn_32bit_failure clean
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) UNAME_M := $(shell uname -m)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) CAN_BUILD_I386 := $(shell ./check_cc.sh "$(CC)" trivial_32bit_program.c -m32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) CAN_BUILD_X86_64 := $(shell ./check_cc.sh "$(CC)" trivial_64bit_program.c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) CAN_BUILD_WITH_NOPIE := $(shell ./check_cc.sh "$(CC)" trivial_program.c -no-pie)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) TARGETS_C_BOTHBITS := single_step_syscall sysret_ss_attrs syscall_nt test_mremap_vdso \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) check_initial_reg_state sigreturn iopl ioperm \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) test_vdso test_vsyscall mov_ss_trap \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) syscall_arg_fault fsgsbase_restore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) TARGETS_C_32BIT_ONLY := entry_from_vm86 test_syscall_vdso unwind_vdso \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) test_FCMOV test_FCOMI test_FISTTP \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) vdso_restorer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) TARGETS_C_64BIT_ONLY := fsgsbase sysret_rip syscall_numbering
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) # Some selftests require 32bit support enabled also on 64bit systems
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) TARGETS_C_32BIT_NEEDED := ldt_gdt ptrace_syscall
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) TARGETS_C_32BIT_ALL := $(TARGETS_C_BOTHBITS) $(TARGETS_C_32BIT_ONLY) $(TARGETS_C_32BIT_NEEDED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) TARGETS_C_64BIT_ALL := $(TARGETS_C_BOTHBITS) $(TARGETS_C_64BIT_ONLY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) ifeq ($(CAN_BUILD_I386)$(CAN_BUILD_X86_64),11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) TARGETS_C_64BIT_ALL += $(TARGETS_C_32BIT_NEEDED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) BINARIES_32 := $(TARGETS_C_32BIT_ALL:%=%_32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) BINARIES_64 := $(TARGETS_C_64BIT_ALL:%=%_64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) BINARIES_32 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_32))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) BINARIES_64 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_64))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) CFLAGS := -O2 -g -std=gnu99 -pthread -Wall
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) # call32_from_64 in thunks.S uses absolute addresses.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) ifeq ($(CAN_BUILD_WITH_NOPIE),1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) CFLAGS += -no-pie
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) define gen-target-rule-32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) $(1) $(1)_32: $(OUTPUT)/$(1)_32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) .PHONY: $(1) $(1)_32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) endef
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) define gen-target-rule-64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) $(1) $(1)_64: $(OUTPUT)/$(1)_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) .PHONY: $(1) $(1)_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) endef
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) ifeq ($(CAN_BUILD_I386),1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) all: all_32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) TEST_PROGS += $(BINARIES_32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) EXTRA_CFLAGS += -DCAN_BUILD_32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) $(foreach t,$(TARGETS_C_32BIT_ALL),$(eval $(call gen-target-rule-32,$(t))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) ifeq ($(CAN_BUILD_X86_64),1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) all: all_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) TEST_PROGS += $(BINARIES_64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) EXTRA_CFLAGS += -DCAN_BUILD_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) $(foreach t,$(TARGETS_C_64BIT_ALL),$(eval $(call gen-target-rule-64,$(t))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) all_32: $(BINARIES_32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) all_64: $(BINARIES_64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) EXTRA_CLEAN := $(BINARIES_32) $(BINARIES_64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) $(BINARIES_32): $(OUTPUT)/%_32: %.c helpers.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) $(CC) -m32 -o $@ $(CFLAGS) $(EXTRA_CFLAGS) $^ -lrt -ldl -lm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) $(BINARIES_64): $(OUTPUT)/%_64: %.c helpers.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) $(CC) -m64 -o $@ $(CFLAGS) $(EXTRA_CFLAGS) $^ -lrt -ldl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) # x86_64 users should be encouraged to install 32-bit libraries
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) ifeq ($(CAN_BUILD_I386)$(CAN_BUILD_X86_64),01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) all: warn_32bit_failure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) warn_32bit_failure:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) @echo "Warning: you seem to have a broken 32-bit build" 2>&1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) echo "environment. This will reduce test coverage of 64-bit" 2>&1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) echo "kernels. If you are using a Debian-like distribution," 2>&1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) echo "try:"; 2>&1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) echo ""; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) echo " apt-get install gcc-multilib libc6-i386 libc6-dev-i386"; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) echo ""; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) echo "If you are using a Fedora-like distribution, try:"; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) echo ""; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) echo " yum install glibc-devel.*i686"; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) exit 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) # Some tests have additional dependencies.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) $(OUTPUT)/sysret_ss_attrs_64: thunks.S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) $(OUTPUT)/ptrace_syscall_32: raw_syscall_helper_32.S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) $(OUTPUT)/test_syscall_vdso_32: thunks_32.S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) # check_initial_reg_state is special: it needs a custom entry, and it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) # needs to be static so that its interpreter doesn't destroy its initial
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) # state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) $(OUTPUT)/check_initial_reg_state_32: CFLAGS += -Wl,-ereal_start -static
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) $(OUTPUT)/check_initial_reg_state_64: CFLAGS += -Wl,-ereal_start -static