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