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 ioperm \
15 test_vsyscall mov_ss_trap \
16 syscall_arg_fault fsgsbase_restore sigaltstack
17 TARGETS_C_BOTHBITS
+= nx_stack
18 TARGETS_C_32BIT_ONLY
:= entry_from_vm86 test_syscall_vdso unwind_vdso \
19 test_FCMOV test_FCOMI test_FISTTP \
21 TARGETS_C_64BIT_ONLY
:= fsgsbase sysret_rip syscall_numbering \
22 corrupt_xstate_header amx lam test_shadow_stack
23 # Some selftests require 32bit support enabled also on 64bit systems
24 TARGETS_C_32BIT_NEEDED
:= ldt_gdt ptrace_syscall
26 TARGETS_C_32BIT_ALL
:= $(TARGETS_C_BOTHBITS
) $(TARGETS_C_32BIT_ONLY
) $(TARGETS_C_32BIT_NEEDED
)
27 TARGETS_C_64BIT_ALL
:= $(TARGETS_C_BOTHBITS
) $(TARGETS_C_64BIT_ONLY
)
28 ifeq ($(CAN_BUILD_I386
)$(CAN_BUILD_X86_64
),11)
29 TARGETS_C_64BIT_ALL
+= $(TARGETS_C_32BIT_NEEDED
)
32 BINARIES_32
:= $(TARGETS_C_32BIT_ALL
:%=%_32
)
33 BINARIES_64
:= $(TARGETS_C_64BIT_ALL
:%=%_64
)
35 BINARIES_32
:= $(patsubst %,$(OUTPUT
)/%,$(BINARIES_32
))
36 BINARIES_64
:= $(patsubst %,$(OUTPUT
)/%,$(BINARIES_64
))
38 CFLAGS
:= -O2
-g
-std
=gnu99
-pthread
-Wall
$(KHDR_INCLUDES
)
40 # call32_from_64 in thunks.S uses absolute addresses.
41 ifeq ($(CAN_BUILD_WITH_NOPIE
),1)
45 # clang only wants to see -no-pie during linking. Here, we don't have a separate
46 # linking stage, so a compiler warning is unavoidable without (wastefully)
47 # restructuring the Makefile. Avoid this by simply disabling that warning.
48 CFLAGS
+= -Wno-unused-command-line-argument
52 define gen-target-rule-32
53 $(1) $(1)_32
: $(OUTPUT
)/$(1)_32
57 define gen-target-rule-64
58 $(1) $(1)_64
: $(OUTPUT
)/$(1)_64
62 ifeq ($(CAN_BUILD_I386
),1)
64 TEST_PROGS
+= $(BINARIES_32
)
65 EXTRA_CFLAGS
+= -DCAN_BUILD_32
66 $(foreach t
,$(TARGETS_C_32BIT_ALL
),$(eval
$(call gen-target-rule-32
,$(t
))))
69 ifeq ($(CAN_BUILD_X86_64
),1)
71 TEST_PROGS
+= $(BINARIES_64
)
72 EXTRA_CFLAGS
+= -DCAN_BUILD_64
73 $(foreach t
,$(TARGETS_C_64BIT_ALL
),$(eval
$(call gen-target-rule-64
,$(t
))))
76 all_32
: $(BINARIES_32
)
78 all_64
: $(BINARIES_64
)
80 EXTRA_CLEAN
:= $(BINARIES_32
) $(BINARIES_64
) srso
82 $(BINARIES_32
): $(OUTPUT
)/%_32
: %.c helpers.h
83 $(CC
) -m32
-o
$@
$(CFLAGS
) $(EXTRA_CFLAGS
) $< $(EXTRA_FILES
) -lrt
-ldl
-lm
85 $(BINARIES_64
): $(OUTPUT
)/%_64
: %.c helpers.h
86 $(CC
) -m64
-o
$@
$(CFLAGS
) $(EXTRA_CFLAGS
) $< $(EXTRA_FILES
) -lrt
-ldl
88 # x86_64 users should be encouraged to install 32-bit libraries
89 ifeq ($(CAN_BUILD_I386
)$(CAN_BUILD_X86_64
),01)
90 all: warn_32bit_failure
93 @echo
"Warning: you seem to have a broken 32-bit build" 2>&1; \
94 echo
"environment. This will reduce test coverage of 64-bit" 2>&1; \
95 echo
"kernels. If you are using a Debian-like distribution," 2>&1; \
98 echo
" apt-get install gcc-multilib libc6-i386 libc6-dev-i386"; \
100 echo
"If you are using a Fedora-like distribution, try:"; \
102 echo
" yum install glibc-devel.*i686"; \
104 echo
"If you are using a SUSE-like distribution, try:"; \
106 echo
" zypper install gcc-32bit glibc-devel-static-32bit"; \
110 # Add an additional file to the source file list for a given target, and also
111 # add a Makefile dependency on that same file. However, do these separately, so
112 # that the compiler invocation ("$(CC) file1.c file2.S") is not combined with
113 # the dependencies ("header3.h"), because clang, unlike gcc, will not accept
114 # header files as an input to the compiler invocation.
116 $(OUTPUT
)/$(1): EXTRA_FILES
:= $(2)
120 $(eval
$(call extra-files
,sysret_ss_attrs_64
,thunks.S
))
121 $(eval
$(call extra-files
,ptrace_syscall_32
,raw_syscall_helper_32.S
))
122 $(eval
$(call extra-files
,test_syscall_vdso_32
,thunks_32.S
))
123 $(eval
$(call extra-files
,fsgsbase_restore_64
,clang_helpers_64.S
))
124 $(eval
$(call extra-files
,fsgsbase_restore_32
,clang_helpers_32.S
))
125 $(eval
$(call extra-files
,sysret_rip_64
,clang_helpers_64.S
))
127 # check_initial_reg_state is special: it needs a custom entry, and it
128 # needs to be static so that its interpreter doesn't destroy its initial
130 $(OUTPUT
)/check_initial_reg_state_32
: CFLAGS
+= -Wl
,-ereal_start
-static
131 $(OUTPUT
)/check_initial_reg_state_64
: CFLAGS
+= -Wl
,-ereal_start
-static
133 $(OUTPUT
)/nx_stack_32
: CFLAGS
+= -Wl
,-z
,noexecstack
134 $(OUTPUT
)/nx_stack_64
: CFLAGS
+= -Wl
,-z
,noexecstack