1 # SPDX-License-Identifier: GPL-2.0
2 # Makefile for nolibc tests
3 # we're in ".../tools/testing/selftests/nolibc"
5 srctree
:= $(patsubst %/tools
/testing
/selftests
/,%,$(dir $(CURDIR
)))
8 include $(srctree
)/tools
/scripts
/utilities.mak
9 # We need this for the "__cc-option" macro.
10 include $(srctree
)/scripts
/Makefile.compiler
13 ifneq ($(call is-absolute
,$(O
)),y
)
14 $(error Only absolute O
= parameters are supported
)
22 include $(srctree
)/scripts
/subarch.
include
26 cc-option
= $(call __cc-option
, $(CC
),$(CLANG_CROSS_FLAGS
),$(1),$(2))
28 # XARCH extends the kernel's ARCH with a few variants of the same
29 # architecture that only differ by the configuration, the toolchain
30 # and the Qemu program used. It is copied as-is into ARCH except for
31 # a few specific values which are mapped like this:
33 # XARCH | ARCH | config
34 # -------------|-----------|-------------------------
35 # ppc | powerpc | 32 bits
36 # ppc64 | powerpc | 64 bits big endian
37 # ppc64le | powerpc | 64 bits little endian
39 # It is recommended to only use XARCH, though it does not harm if
40 # ARCH is already set. For simplicity, ARCH is sufficient for all
41 # architectures where both are equal.
43 # configure default variants for target kernel supported architectures
46 XARCH
= $(or
$(XARCH_
$(ARCH
)),$(ARCH
))
48 # map from user input variants to their kernel supported architectures
51 ARCH_ppc64le
= powerpc
54 ARCH
:= $(or
$(ARCH_
$(XARCH
)),$(XARCH
))
56 # kernel image names by architecture
57 IMAGE_i386
= arch
/x86
/boot
/bzImage
58 IMAGE_x86_64
= arch
/x86
/boot
/bzImage
59 IMAGE_x86
= arch
/x86
/boot
/bzImage
60 IMAGE_arm64
= arch
/arm64
/boot
/Image
61 IMAGE_arm
= arch
/arm
/boot
/zImage
62 IMAGE_mips32le
= vmlinuz
63 IMAGE_mips32be
= vmlinuz
66 IMAGE_ppc64le
= arch
/powerpc
/boot
/zImage
67 IMAGE_riscv
= arch
/riscv
/boot
/Image
68 IMAGE_s390
= arch
/s390
/boot
/bzImage
69 IMAGE_loongarch
= arch
/loongarch
/boot
/vmlinuz.efi
70 IMAGE
= $(objtree
)/$(IMAGE_
$(XARCH
))
71 IMAGE_NAME
= $(notdir $(IMAGE
))
73 # default kernel configurations that appear to be usable
74 DEFCONFIG_i386
= defconfig
75 DEFCONFIG_x86_64
= defconfig
76 DEFCONFIG_x86
= defconfig
77 DEFCONFIG_arm64
= defconfig
78 DEFCONFIG_arm
= multi_v7_defconfig
79 DEFCONFIG_mips32le
= malta_defconfig
80 DEFCONFIG_mips32be
= malta_defconfig
81 DEFCONFIG_ppc
= pmac32_defconfig
82 DEFCONFIG_ppc64
= powernv_be_defconfig
83 DEFCONFIG_ppc64le
= powernv_defconfig
84 DEFCONFIG_riscv
= defconfig
85 DEFCONFIG_s390
= defconfig
86 DEFCONFIG_loongarch
= defconfig
87 DEFCONFIG
= $(DEFCONFIG_
$(XARCH
))
89 EXTRACONFIG_mips32be
= -d CONFIG_CPU_LITTLE_ENDIAN
-e CONFIG_CPU_BIG_ENDIAN
90 EXTRACONFIG
= $(EXTRACONFIG_
$(XARCH
))
92 # optional tests to run (default = all)
95 # QEMU_ARCH: arch names used by qemu
97 QEMU_ARCH_x86_64
= x86_64
98 QEMU_ARCH_x86
= x86_64
99 QEMU_ARCH_arm64
= aarch64
101 QEMU_ARCH_mips32le
= mipsel
# works with malta_defconfig
102 QEMU_ARCH_mips32be
= mips
104 QEMU_ARCH_ppc64
= ppc64
105 QEMU_ARCH_ppc64le
= ppc64
106 QEMU_ARCH_riscv
= riscv64
107 QEMU_ARCH_s390
= s390x
108 QEMU_ARCH_loongarch
= loongarch64
109 QEMU_ARCH
= $(QEMU_ARCH_
$(XARCH
))
111 QEMU_ARCH_USER_ppc64le
= ppc64le
112 QEMU_ARCH_USER
= $(or
$(QEMU_ARCH_USER_
$(XARCH
)),$(QEMU_ARCH_
$(XARCH
)))
114 QEMU_BIOS_DIR
= /usr
/share
/edk2
/
115 QEMU_BIOS_loongarch
= $(QEMU_BIOS_DIR
)/loongarch64
/OVMF_CODE.fd
117 ifneq ($(QEMU_BIOS_
$(XARCH
)),)
118 QEMU_ARGS_BIOS
= -bios
$(QEMU_BIOS_
$(XARCH
))
121 # QEMU_ARGS : some arch-specific args to pass to qemu
122 QEMU_ARGS_i386
= -M
pc -append
"console=ttyS0,9600 i8042.noaux panic=-1 $(TEST:%=NOLIBC_TEST=%)"
123 QEMU_ARGS_x86_64
= -M
pc -append
"console=ttyS0,9600 i8042.noaux panic=-1 $(TEST:%=NOLIBC_TEST=%)"
124 QEMU_ARGS_x86
= -M
pc -append
"console=ttyS0,9600 i8042.noaux panic=-1 $(TEST:%=NOLIBC_TEST=%)"
125 QEMU_ARGS_arm64
= -M virt
-cpu cortex-a53
-append
"panic=-1 $(TEST:%=NOLIBC_TEST=%)"
126 QEMU_ARGS_arm
= -M virt
-append
"panic=-1 $(TEST:%=NOLIBC_TEST=%)"
127 QEMU_ARGS_mips32le
= -M malta
-append
"panic=-1 $(TEST:%=NOLIBC_TEST=%)"
128 QEMU_ARGS_mips32be
= -M malta
-append
"panic=-1 $(TEST:%=NOLIBC_TEST=%)"
129 QEMU_ARGS_ppc
= -M g3beige
-append
"console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
130 QEMU_ARGS_ppc64
= -M powernv
-append
"console=hvc0 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
131 QEMU_ARGS_ppc64le
= -M powernv
-append
"console=hvc0 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
132 QEMU_ARGS_riscv
= -M virt
-append
"console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
133 QEMU_ARGS_s390
= -M s390-ccw-virtio
-append
"console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
134 QEMU_ARGS_loongarch
= -M virt
-append
"console=ttyS0,115200 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
135 QEMU_ARGS
= -m
1G
$(QEMU_ARGS_
$(XARCH
)) $(QEMU_ARGS_BIOS
) $(QEMU_ARGS_EXTRA
)
137 # OUTPUT is only set when run from the main makefile, otherwise
138 # it defaults to this nolibc directory.
147 CFLAGS_i386
= $(call cc-option
,-m32
)
148 CFLAGS_ppc
= -m32
-mbig-endian
-mno-vsx
$(call cc-option
,-mmultiple
)
149 CFLAGS_ppc64
= -m64
-mbig-endian
-mno-vsx
$(call cc-option
,-mmultiple
)
150 CFLAGS_ppc64le
= -m64
-mlittle-endian
-mno-vsx
$(call cc-option
,-mabi
=elfv2
)
152 CFLAGS_mips32le
= -EL
-mabi
=32 -fPIC
153 CFLAGS_mips32be
= -EB
-mabi
=32
154 CFLAGS_STACKPROTECTOR ?
= $(call cc-option
,-mstack-protector-guard
=global
$(call cc-option
,-fstack-protector-all
))
155 CFLAGS ?
= -Os
-fno-ident
-fno-asynchronous-unwind-tables
-std
=c89
-W
-Wall
-Wextra \
156 $(call cc-option
,-fno-stack-protector
) \
157 $(CFLAGS_
$(XARCH
)) $(CFLAGS_STACKPROTECTOR
) $(CFLAGS_EXTRA
)
163 # Not needed for clang
167 # Modify CFLAGS based on LLVM=
168 include $(srctree
)/tools
/scripts
/Makefile.
include
170 # GCC uses "s390", clang "systemz"
171 CLANG_CROSS_FLAGS
:= $(subst --target
=s390-linux
,--target
=systemz-linux
,$(CLANG_CROSS_FLAGS
))
173 REPORT ?
= awk
'/\[OK\][\r]*$$/{p++} /\[FAIL\][\r]*$$/{if (!f) printf("\n"); f++; print;} /\[SKIPPED\][\r]*$$/{s++} \
174 END{ printf("\n%3d test(s): %3d passed, %3d skipped, %3d failed => status: ", p+s+f, p, s, f); \
175 if (f || !p) printf("failure\n"); else if (s) printf("warning\n"); else printf("success\n");; \
176 printf("\nSee all results in %s\n", ARGV[1]); }'
179 @echo
"Supported targets under selftests/nolibc:"
180 @echo
" all call the \"run\" target below"
181 @echo
" help this help"
182 @echo
" sysroot create the nolibc sysroot here (uses \$$ARCH)"
183 @echo
" nolibc-test build the executable (uses \$$CC and \$$CROSS_COMPILE)"
184 @echo
" libc-test build an executable using the compiler's default libc instead"
185 @echo
" run-user runs the executable under QEMU (uses \$$XARCH, \$$TEST)"
186 @echo
" initramfs.cpio prepare the initramfs archive with nolibc-test"
187 @echo
" initramfs prepare the initramfs tree with nolibc-test"
188 @echo
" defconfig create a fresh new default config (uses \$$XARCH)"
189 @echo
" kernel (re)build the kernel (uses \$$XARCH)"
190 @echo
" kernel-standalone (re)build the kernel with the initramfs (uses \$$XARCH)"
191 @echo
" run runs the kernel in QEMU after building it (uses \$$XARCH, \$$TEST)"
192 @echo
" rerun runs a previously prebuilt kernel in QEMU (uses \$$XARCH, \$$TEST)"
193 @echo
" clean clean the sysroot, initramfs, build and output files"
195 @echo
"The output file is \"run.out\". Test ranges may be passed using \$$TEST."
197 @echo
"Currently using the following variables:"
198 @echo
" ARCH = $(ARCH)"
199 @echo
" XARCH = $(XARCH)"
200 @echo
" CROSS_COMPILE = $(CROSS_COMPILE)"
202 @echo
" OUTPUT = $(OUTPUT)"
203 @echo
" TEST = $(TEST)"
204 @echo
" QEMU_ARCH = $(if $(QEMU_ARCH),$(QEMU_ARCH),UNKNOWN_ARCH) [determined from \$$XARCH]"
205 @echo
" IMAGE_NAME = $(if $(IMAGE_NAME),$(IMAGE_NAME),UNKNOWN_ARCH) [determined from \$$XARCH]"
210 sysroot
: sysroot
/$(ARCH
)/include
212 sysroot
/$(ARCH
)/include:
213 $(Q
)rm -rf sysroot
/$(ARCH
) sysroot
/sysroot
214 $(QUIET_MKDIR
)mkdir
-p sysroot
215 $(Q
)$(MAKE
) -C
$(srctree
) outputmakefile
216 $(Q
)$(MAKE
) -C
$(srctree
)/tools
/include/nolibc ARCH
=$(ARCH
) OUTPUT
=$(CURDIR
)/sysroot
/ headers_standalone
217 $(Q
)mv sysroot
/sysroot sysroot
/$(ARCH
)
219 ifneq ($(NOLIBC_SYSROOT
),0)
220 nolibc-test
: nolibc-test.c nolibc-test-linkage.c sysroot
/$(ARCH
)/include
221 $(QUIET_CC
)$(CC
) $(CFLAGS
) $(LDFLAGS
) -o
$@ \
222 -nostdlib
-nostdinc
-static
-Isysroot
/$(ARCH
)/include nolibc-test.c nolibc-test-linkage.c
$(LIBGCC
)
224 nolibc-test
: nolibc-test.c nolibc-test-linkage.c
225 $(QUIET_CC
)$(CC
) $(CFLAGS
) $(LDFLAGS
) -o
$@ \
226 -nostdlib
-static
-include $(srctree
)/tools
/include/nolibc
/nolibc.h nolibc-test.c nolibc-test-linkage.c
$(LIBGCC
)
229 libc-test
: nolibc-test.c nolibc-test-linkage.c
230 $(QUIET_CC
)$(HOSTCC
) -o
$@ nolibc-test.c nolibc-test-linkage.c
233 run-libc-test
: libc-test
234 $(Q
).
/libc-test
> "$(CURDIR)/run.out" ||
:
235 $(Q
)$(REPORT
) $(CURDIR
)/run.out
238 run-nolibc-test
: nolibc-test
239 $(Q
).
/nolibc-test
> "$(CURDIR)/run.out" ||
:
240 $(Q
)$(REPORT
) $(CURDIR
)/run.out
242 # qemu user-land test
243 run-user
: nolibc-test
244 $(Q
)qemu-
$(QEMU_ARCH_USER
) .
/nolibc-test
> "$(CURDIR)/run.out" ||
:
245 $(Q
)$(REPORT
) $(CURDIR
)/run.out
247 initramfs.cpio
: kernel nolibc-test
248 $(QUIET_GEN
)echo
'file /init nolibc-test 755 0 0' |
$(objtree
)/usr
/gen_init_cpio
- > initramfs.cpio
250 initramfs
: nolibc-test
251 $(QUIET_MKDIR
)mkdir
-p initramfs
252 $(call QUIET_INSTALL
, initramfs
/init
)
253 $(Q
)cp nolibc-test initramfs
/init
256 $(Q
)$(MAKE
) -C
$(srctree
) ARCH
=$(ARCH
) CC
=$(CC
) CROSS_COMPILE
=$(CROSS_COMPILE
) mrproper
$(DEFCONFIG
) prepare
257 $(Q
)if
[ -n
"$(EXTRACONFIG)" ]; then \
258 $(srctree
)/scripts
/config
--file
$(objtree
)/.config
$(EXTRACONFIG
); \
259 $(MAKE
) -C
$(srctree
) ARCH
=$(ARCH
) CC
=$(CC
) CROSS_COMPILE
=$(CROSS_COMPILE
) olddefconfig
< /dev
/null
; \
263 $(Q
)$(MAKE
) -C
$(srctree
) ARCH
=$(ARCH
) CC
=$(CC
) CROSS_COMPILE
=$(CROSS_COMPILE
) $(IMAGE_NAME
) < /dev
/null
265 kernel-standalone
: initramfs
266 $(Q
)$(MAKE
) -C
$(srctree
) ARCH
=$(ARCH
) CC
=$(CC
) CROSS_COMPILE
=$(CROSS_COMPILE
) $(IMAGE_NAME
) CONFIG_INITRAMFS_SOURCE
=$(CURDIR
)/initramfs
< /dev
/null
268 # run the tests after building the kernel
269 run
: kernel initramfs.cpio
270 $(Q
)qemu-system-
$(QEMU_ARCH
) -display none
-no-reboot
-kernel
"$(IMAGE)" -initrd initramfs.cpio
-serial stdio
$(QEMU_ARGS
) > "$(CURDIR)/run.out"
271 $(Q
)$(REPORT
) $(CURDIR
)/run.out
273 # re-run the tests from an existing kernel
275 $(Q
)qemu-system-
$(QEMU_ARCH
) -display none
-no-reboot
-kernel
"$(IMAGE)" -initrd initramfs.cpio
-serial stdio
$(QEMU_ARGS
) > "$(CURDIR)/run.out"
276 $(Q
)$(REPORT
) $(CURDIR
)/run.out
278 # report with existing test log
280 $(Q
)$(REPORT
) $(CURDIR
)/run.out
283 $(call QUIET_CLEAN
, sysroot
)
285 $(call QUIET_CLEAN
, nolibc-test
)
286 $(Q
)rm -f nolibc-test
287 $(call QUIET_CLEAN
, libc-test
)
289 $(call QUIET_CLEAN
, initramfs.cpio
)
290 $(Q
)rm -rf initramfs.cpio
291 $(call QUIET_CLEAN
, initramfs
)
293 $(call QUIET_CLEAN
, run.out
)
296 .PHONY
: sysroot
/$(ARCH
)/include