1 # SPDX-License-Identifier: GPL-2.0
6 .PHONY
: all all_32 all_64 warn_32bit_failure
clean
8 UNAME_M
:= $(shell uname
-m
)
9 CAN_BUILD_I386
:= $(shell .
/check_cc.sh
$(CC
) trivial_32bit_program.c
-m32
)
10 CAN_BUILD_X86_64
:= $(shell .
/check_cc.sh
$(CC
) trivial_64bit_program.c
)
11 CAN_BUILD_WITH_NOPIE
:= $(shell .
/check_cc.sh
$(CC
) trivial_program.c
-no-pie
)
13 TARGETS_C_BOTHBITS
:= single_step_syscall sysret_ss_attrs syscall_nt test_mremap_vdso \
14 check_initial_reg_state sigreturn iopl mpx-mini-test ioperm \
15 protection_keys test_vdso test_vsyscall mov_ss_trap
16 TARGETS_C_32BIT_ONLY
:= entry_from_vm86 syscall_arg_fault test_syscall_vdso unwind_vdso \
17 test_FCMOV test_FCOMI test_FISTTP \
19 TARGETS_C_64BIT_ONLY
:= fsgsbase sysret_rip
20 # Some selftests require 32bit support enabled also on 64bit systems
21 TARGETS_C_32BIT_NEEDED
:= ldt_gdt ptrace_syscall
23 TARGETS_C_32BIT_ALL
:= $(TARGETS_C_BOTHBITS
) $(TARGETS_C_32BIT_ONLY
) $(TARGETS_C_32BIT_NEEDED
)
24 TARGETS_C_64BIT_ALL
:= $(TARGETS_C_BOTHBITS
) $(TARGETS_C_64BIT_ONLY
)
25 ifeq ($(CAN_BUILD_I386
)$(CAN_BUILD_X86_64
),11)
26 TARGETS_C_64BIT_ALL
+= $(TARGETS_C_32BIT_NEEDED
)
29 BINARIES_32
:= $(TARGETS_C_32BIT_ALL
:%=%_32
)
30 BINARIES_64
:= $(TARGETS_C_64BIT_ALL
:%=%_64
)
32 BINARIES_32
:= $(patsubst %,$(OUTPUT
)/%,$(BINARIES_32
))
33 BINARIES_64
:= $(patsubst %,$(OUTPUT
)/%,$(BINARIES_64
))
35 CFLAGS
:= -O2
-g
-std
=gnu99
-pthread
-Wall
37 # call32_from_64 in thunks.S uses absolute addresses.
38 ifeq ($(CAN_BUILD_WITH_NOPIE
),1)
42 define gen-target-rule-32
43 $(1) $(1)_32
: $(OUTPUT
)/$(1)_32
47 define gen-target-rule-64
48 $(1) $(1)_64
: $(OUTPUT
)/$(1)_64
52 ifeq ($(CAN_BUILD_I386
),1)
54 TEST_PROGS
+= $(BINARIES_32
)
55 EXTRA_CFLAGS
+= -DCAN_BUILD_32
56 $(foreach t
,$(TARGETS_C_32BIT_ALL
),$(eval
$(call gen-target-rule-32
,$(t
))))
59 ifeq ($(CAN_BUILD_X86_64
),1)
61 TEST_PROGS
+= $(BINARIES_64
)
62 EXTRA_CFLAGS
+= -DCAN_BUILD_64
63 $(foreach t
,$(TARGETS_C_64BIT_ALL
),$(eval
$(call gen-target-rule-64
,$(t
))))
66 all_32
: $(BINARIES_32
)
68 all_64
: $(BINARIES_64
)
70 EXTRA_CLEAN
:= $(BINARIES_32
) $(BINARIES_64
)
72 $(BINARIES_32
): $(OUTPUT
)/%_32
: %.c
73 $(CC
) -m32
-o
$@
$(CFLAGS
) $(EXTRA_CFLAGS
) $^
-lrt
-ldl
-lm
75 $(BINARIES_64
): $(OUTPUT
)/%_64
: %.c
76 $(CC
) -m64
-o
$@
$(CFLAGS
) $(EXTRA_CFLAGS
) $^
-lrt
-ldl
78 # x86_64 users should be encouraged to install 32-bit libraries
79 ifeq ($(CAN_BUILD_I386
)$(CAN_BUILD_X86_64
),01)
80 all: warn_32bit_failure
83 @echo
"Warning: you seem to have a broken 32-bit build" 2>&1; \
84 echo
"environment. This will reduce test coverage of 64-bit" 2>&1; \
85 echo
"kernels. If you are using a Debian-like distribution," 2>&1; \
88 echo
" apt-get install gcc-multilib libc6-i386 libc6-dev-i386"; \
90 echo
"If you are using a Fedora-like distribution, try:"; \
92 echo
" yum install glibc-devel.*i686"; \
96 # Some tests have additional dependencies.
97 $(OUTPUT
)/sysret_ss_attrs_64
: thunks.S
98 $(OUTPUT
)/ptrace_syscall_32
: raw_syscall_helper_32.S
99 $(OUTPUT
)/test_syscall_vdso_32
: thunks_32.S
101 # check_initial_reg_state is special: it needs a custom entry, and it
102 # needs to be static so that its interpreter doesn't destroy its initial
104 $(OUTPUT
)/check_initial_reg_state_32
: CFLAGS
+= -Wl
,-ereal_start
-static
105 $(OUTPUT
)/check_initial_reg_state_64
: CFLAGS
+= -Wl
,-ereal_start
-static