hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/tools/testing/selftests/vm/Makefile
....@@ -1,26 +1,77 @@
11 # SPDX-License-Identifier: GPL-2.0
22 # Makefile for vm selftests
3
+uname_M := $(shell uname -m 2>/dev/null || echo not)
4
+MACHINE ?= $(shell echo $(uname_M) | sed -e 's/aarch64.*/arm64/' -e 's/ppc64.*/ppc64/')
35
4
-ifndef OUTPUT
5
- OUTPUT := $(shell pwd)
6
-endif
6
+# Without this, failed build products remain, with up-to-date timestamps,
7
+# thus tricking Make (and you!) into believing that All Is Well, in subsequent
8
+# make invocations:
9
+.DELETE_ON_ERROR:
10
+
11
+# Avoid accidental wrong builds, due to built-in rules working just a little
12
+# bit too well--but not quite as well as required for our situation here.
13
+#
14
+# In other words, "make userfaultfd" is supposed to fail to build at all,
15
+# because this Makefile only supports either "make" (all), or "make /full/path".
16
+# However, the built-in rules, if not suppressed, will pick up CFLAGS and the
17
+# initial LDLIBS (but not the target-specific LDLIBS, because those are only
18
+# set for the full path target!). This causes it to get pretty far into building
19
+# things despite using incorrect values such as an *occasionally* incomplete
20
+# LDLIBS.
21
+MAKEFLAGS += --no-builtin-rules
722
823 CFLAGS = -Wall -I ../../../../usr/include $(EXTRA_CFLAGS)
924 LDLIBS = -lrt
1025 TEST_GEN_FILES = compaction_test
1126 TEST_GEN_FILES += gup_benchmark
27
+TEST_GEN_FILES += hmm-tests
1228 TEST_GEN_FILES += hugepage-mmap
1329 TEST_GEN_FILES += hugepage-shm
1430 TEST_GEN_FILES += map_hugetlb
31
+TEST_GEN_FILES += map_fixed_noreplace
1532 TEST_GEN_FILES += map_populate
1633 TEST_GEN_FILES += mlock-random-test
1734 TEST_GEN_FILES += mlock2-tests
35
+TEST_GEN_FILES += mremap_dontunmap
1836 TEST_GEN_FILES += on-fault-limit
1937 TEST_GEN_FILES += thuge-gen
2038 TEST_GEN_FILES += transhuge-stress
2139 TEST_GEN_FILES += userfaultfd
40
+TEST_GEN_FILES += khugepaged
41
+
42
+ifeq ($(MACHINE),x86_64)
43
+CAN_BUILD_I386 := $(shell ./../x86/check_cc.sh "$(CC)" ../x86/trivial_32bit_program.c -m32)
44
+CAN_BUILD_X86_64 := $(shell ./../x86/check_cc.sh "$(CC)" ../x86/trivial_64bit_program.c)
45
+CAN_BUILD_WITH_NOPIE := $(shell ./../x86/check_cc.sh "$(CC)" ../x86/trivial_program.c -no-pie)
46
+
47
+VMTARGETS := protection_keys
48
+BINARIES_32 := $(VMTARGETS:%=%_32)
49
+BINARIES_64 := $(VMTARGETS:%=%_64)
50
+
51
+ifeq ($(CAN_BUILD_WITH_NOPIE),1)
52
+CFLAGS += -no-pie
53
+endif
54
+
55
+ifeq ($(CAN_BUILD_I386),1)
56
+TEST_GEN_FILES += $(BINARIES_32)
57
+endif
58
+
59
+ifeq ($(CAN_BUILD_X86_64),1)
60
+TEST_GEN_FILES += $(BINARIES_64)
61
+endif
62
+else
63
+
64
+ifneq (,$(findstring $(MACHINE),ppc64))
65
+TEST_GEN_FILES += protection_keys
66
+endif
67
+
68
+endif
69
+
70
+ifneq (,$(filter $(MACHINE),arm64 ia64 mips64 parisc64 ppc64 riscv64 s390x sh64 sparc64 x86_64))
2271 TEST_GEN_FILES += va_128TBswitch
2372 TEST_GEN_FILES += virtual_address_range
73
+TEST_GEN_FILES += write_to_hugetlbfs
74
+endif
2475
2576 TEST_PROGS := run_vmtests
2677
....@@ -29,6 +80,57 @@
2980 KSFT_KHDR_INSTALL := 1
3081 include ../lib.mk
3182
83
+$(OUTPUT)/hmm-tests: LDLIBS += -lhugetlbfs -lpthread
84
+
85
+ifeq ($(MACHINE),x86_64)
86
+BINARIES_32 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_32))
87
+BINARIES_64 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_64))
88
+
89
+define gen-target-rule-32
90
+$(1) $(1)_32: $(OUTPUT)/$(1)_32
91
+.PHONY: $(1) $(1)_32
92
+endef
93
+
94
+define gen-target-rule-64
95
+$(1) $(1)_64: $(OUTPUT)/$(1)_64
96
+.PHONY: $(1) $(1)_64
97
+endef
98
+
99
+ifeq ($(CAN_BUILD_I386),1)
100
+$(BINARIES_32): CFLAGS += -m32
101
+$(BINARIES_32): LDLIBS += -lrt -ldl -lm
102
+$(BINARIES_32): $(OUTPUT)/%_32: %.c
103
+ $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(notdir $^) $(LDLIBS) -o $@
104
+$(foreach t,$(VMTARGETS),$(eval $(call gen-target-rule-32,$(t))))
105
+endif
106
+
107
+ifeq ($(CAN_BUILD_X86_64),1)
108
+$(BINARIES_64): CFLAGS += -m64
109
+$(BINARIES_64): LDLIBS += -lrt -ldl
110
+$(BINARIES_64): $(OUTPUT)/%_64: %.c
111
+ $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(notdir $^) $(LDLIBS) -o $@
112
+$(foreach t,$(VMTARGETS),$(eval $(call gen-target-rule-64,$(t))))
113
+endif
114
+
115
+# x86_64 users should be encouraged to install 32-bit libraries
116
+ifeq ($(CAN_BUILD_I386)$(CAN_BUILD_X86_64),01)
117
+all: warn_32bit_failure
118
+
119
+warn_32bit_failure:
120
+ @echo "Warning: you seem to have a broken 32-bit build" 2>&1; \
121
+ echo "environment. This will reduce test coverage of 64-bit" 2>&1; \
122
+ echo "kernels. If you are using a Debian-like distribution," 2>&1; \
123
+ echo "try:"; 2>&1; \
124
+ echo ""; \
125
+ echo " apt-get install gcc-multilib libc6-i386 libc6-dev-i386"; \
126
+ echo ""; \
127
+ echo "If you are using a Fedora-like distribution, try:"; \
128
+ echo ""; \
129
+ echo " yum install glibc-devel.*i686"; \
130
+ exit 0;
131
+endif
132
+endif
133
+
32134 $(OUTPUT)/userfaultfd: LDLIBS += -lpthread
33135
34136 $(OUTPUT)/mlock-random-test: LDLIBS += -lcap