Commit | Line | Data |
---|---|---|
362aecb2 WT |
1 | # SPDX-License-Identifier: GPL-2.0 |
2 | # Makefile for nolibc tests | |
3 | include ../../../scripts/Makefile.include | |
4 | ||
5 | # we're in ".../tools/testing/selftests/nolibc" | |
6 | ifeq ($(srctree),) | |
7 | srctree := $(patsubst %/tools/testing/selftests/,%,$(dir $(CURDIR))) | |
8 | endif | |
9 | ||
10 | ifeq ($(ARCH),) | |
11 | include $(srctree)/scripts/subarch.include | |
12 | ARCH = $(SUBARCH) | |
13 | endif | |
14 | ||
d248cabf WT |
15 | # kernel image names by architecture |
16 | IMAGE_i386 = arch/x86/boot/bzImage | |
f9b06695 | 17 | IMAGE_x86_64 = arch/x86/boot/bzImage |
d248cabf WT |
18 | IMAGE_x86 = arch/x86/boot/bzImage |
19 | IMAGE_arm64 = arch/arm64/boot/Image | |
20 | IMAGE_arm = arch/arm/boot/zImage | |
21 | IMAGE_mips = vmlinuz | |
22 | IMAGE_riscv = arch/riscv/boot/Image | |
0043e6f2 | 23 | IMAGE_s390 = arch/s390/boot/bzImage |
d248cabf WT |
24 | IMAGE = $(IMAGE_$(ARCH)) |
25 | IMAGE_NAME = $(notdir $(IMAGE)) | |
26 | ||
5c43fd79 WT |
27 | # default kernel configurations that appear to be usable |
28 | DEFCONFIG_i386 = defconfig | |
f9b06695 | 29 | DEFCONFIG_x86_64 = defconfig |
5c43fd79 WT |
30 | DEFCONFIG_x86 = defconfig |
31 | DEFCONFIG_arm64 = defconfig | |
32 | DEFCONFIG_arm = multi_v7_defconfig | |
33 | DEFCONFIG_mips = malta_defconfig | |
34 | DEFCONFIG_riscv = defconfig | |
0043e6f2 | 35 | DEFCONFIG_s390 = defconfig |
5c43fd79 WT |
36 | DEFCONFIG = $(DEFCONFIG_$(ARCH)) |
37 | ||
662ea60e WT |
38 | # optional tests to run (default = all) |
39 | TEST = | |
40 | ||
41 | # QEMU_ARCH: arch names used by qemu | |
42 | QEMU_ARCH_i386 = i386 | |
f9b06695 | 43 | QEMU_ARCH_x86_64 = x86_64 |
662ea60e WT |
44 | QEMU_ARCH_x86 = x86_64 |
45 | QEMU_ARCH_arm64 = aarch64 | |
46 | QEMU_ARCH_arm = arm | |
47 | QEMU_ARCH_mips = mipsel # works with malta_defconfig | |
48 | QEMU_ARCH_riscv = riscv64 | |
0043e6f2 | 49 | QEMU_ARCH_s390 = s390x |
662ea60e WT |
50 | QEMU_ARCH = $(QEMU_ARCH_$(ARCH)) |
51 | ||
52 | # QEMU_ARGS : some arch-specific args to pass to qemu | |
53 | QEMU_ARGS_i386 = -M pc -append "console=ttyS0,9600 i8042.noaux panic=-1 $(TEST:%=NOLIBC_TEST=%)" | |
f9b06695 | 54 | QEMU_ARGS_x86_64 = -M pc -append "console=ttyS0,9600 i8042.noaux panic=-1 $(TEST:%=NOLIBC_TEST=%)" |
662ea60e WT |
55 | QEMU_ARGS_x86 = -M pc -append "console=ttyS0,9600 i8042.noaux panic=-1 $(TEST:%=NOLIBC_TEST=%)" |
56 | QEMU_ARGS_arm64 = -M virt -cpu cortex-a53 -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)" | |
57 | QEMU_ARGS_arm = -M virt -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)" | |
58 | QEMU_ARGS_mips = -M malta -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)" | |
59 | QEMU_ARGS_riscv = -M virt -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)" | |
0043e6f2 | 60 | QEMU_ARGS_s390 = -M s390-ccw-virtio -m 1G -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)" |
662ea60e WT |
61 | QEMU_ARGS = $(QEMU_ARGS_$(ARCH)) |
62 | ||
362aecb2 WT |
63 | # OUTPUT is only set when run from the main makefile, otherwise |
64 | # it defaults to this nolibc directory. | |
65 | OUTPUT ?= $(CURDIR)/ | |
66 | ||
67 | ifeq ($(V),1) | |
68 | Q= | |
69 | else | |
70 | Q=@ | |
71 | endif | |
72 | ||
0043e6f2 SS |
73 | CFLAGS_s390 = -m64 |
74 | CFLAGS ?= -Os -fno-ident -fno-asynchronous-unwind-tables $(CFLAGS_$(ARCH)) | |
362aecb2 WT |
75 | LDFLAGS := -s |
76 | ||
ffc297fe WT |
77 | help: |
78 | @echo "Supported targets under selftests/nolibc:" | |
79 | @echo " all call the \"run\" target below" | |
80 | @echo " help this help" | |
81 | @echo " sysroot create the nolibc sysroot here (uses \$$ARCH)" | |
82 | @echo " nolibc-test build the executable (uses \$$CC and \$$CROSS_COMPILE)" | |
83 | @echo " initramfs prepare the initramfs with nolibc-test" | |
84 | @echo " defconfig create a fresh new default config (uses \$$ARCH)" | |
85 | @echo " kernel (re)build the kernel with the initramfs (uses \$$ARCH)" | |
86 | @echo " run runs the kernel in QEMU after building it (uses \$$ARCH, \$$TEST)" | |
87 | @echo " rerun runs a previously prebuilt kernel in QEMU (uses \$$ARCH, \$$TEST)" | |
88 | @echo " clean clean the sysroot, initramfs, build and output files" | |
89 | @echo "" | |
90 | @echo "The output file is \"run.out\". Test ranges may be passed using \$$TEST." | |
91 | @echo "" | |
92 | @echo "Currently using the following variables:" | |
93 | @echo " ARCH = $(ARCH)" | |
94 | @echo " CROSS_COMPILE = $(CROSS_COMPILE)" | |
95 | @echo " CC = $(CC)" | |
96 | @echo " OUTPUT = $(OUTPUT)" | |
97 | @echo " TEST = $(TEST)" | |
98 | @echo " QEMU_ARCH = $(if $(QEMU_ARCH),$(QEMU_ARCH),UNKNOWN_ARCH) [determined from \$$ARCH]" | |
99 | @echo " IMAGE_NAME = $(if $(IMAGE_NAME),$(IMAGE_NAME),UNKNOWN_ARCH) [determined from \$$ARCH]" | |
100 | @echo "" | |
101 | ||
102 | all: run | |
362aecb2 | 103 | |
b25c5284 WT |
104 | sysroot: sysroot/$(ARCH)/include |
105 | ||
106 | sysroot/$(ARCH)/include: | |
4a95be7e | 107 | $(Q)rm -rf sysroot/$(ARCH) sysroot/sysroot |
b25c5284 WT |
108 | $(QUIET_MKDIR)mkdir -p sysroot |
109 | $(Q)$(MAKE) -C ../../../include/nolibc ARCH=$(ARCH) OUTPUT=$(CURDIR)/sysroot/ headers_standalone | |
110 | $(Q)mv sysroot/sysroot sysroot/$(ARCH) | |
111 | ||
112 | nolibc-test: nolibc-test.c sysroot/$(ARCH)/include | |
362aecb2 | 113 | $(QUIET_CC)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ \ |
b25c5284 | 114 | -nostdlib -static -Isysroot/$(ARCH)/include $< -lgcc |
362aecb2 WT |
115 | |
116 | initramfs: nolibc-test | |
117 | $(QUIET_MKDIR)mkdir -p initramfs | |
118 | $(call QUIET_INSTALL, initramfs/init) | |
119 | $(Q)cp nolibc-test initramfs/init | |
120 | ||
5c43fd79 WT |
121 | defconfig: |
122 | $(Q)$(MAKE) -C $(srctree) ARCH=$(ARCH) CC=$(CC) CROSS_COMPILE=$(CROSS_COMPILE) mrproper $(DEFCONFIG) prepare | |
123 | ||
d248cabf WT |
124 | kernel: initramfs |
125 | $(Q)$(MAKE) -C $(srctree) ARCH=$(ARCH) CC=$(CC) CROSS_COMPILE=$(CROSS_COMPILE) $(IMAGE_NAME) CONFIG_INITRAMFS_SOURCE=$(CURDIR)/initramfs | |
126 | ||
662ea60e WT |
127 | # run the tests after building the kernel |
128 | run: kernel | |
129 | $(Q)qemu-system-$(QEMU_ARCH) -display none -no-reboot -kernel "$(srctree)/$(IMAGE)" -serial stdio $(QEMU_ARGS) > "$(CURDIR)/run.out" | |
130 | $(Q)grep -w FAIL "$(CURDIR)/run.out" && echo "See all results in $(CURDIR)/run.out" || echo "$$(grep -c ^[0-9].*OK $(CURDIR)/run.out) test(s) passed." | |
131 | ||
132 | # re-run the tests from an existing kernel | |
133 | rerun: | |
134 | $(Q)qemu-system-$(QEMU_ARCH) -display none -no-reboot -kernel "$(srctree)/$(IMAGE)" -serial stdio $(QEMU_ARGS) > "$(CURDIR)/run.out" | |
135 | $(Q)grep -w FAIL "$(CURDIR)/run.out" && echo "See all results in $(CURDIR)/run.out" || echo "$$(grep -c ^[0-9].*OK $(CURDIR)/run.out) test(s) passed." | |
136 | ||
362aecb2 | 137 | clean: |
b25c5284 WT |
138 | $(call QUIET_CLEAN, sysroot) |
139 | $(Q)rm -rf sysroot | |
362aecb2 WT |
140 | $(call QUIET_CLEAN, nolibc-test) |
141 | $(Q)rm -f nolibc-test | |
142 | $(call QUIET_CLEAN, initramfs) | |
143 | $(Q)rm -rf initramfs | |
662ea60e WT |
144 | $(call QUIET_CLEAN, run.out) |
145 | $(Q)rm -rf run.out | |
4a95be7e WT |
146 | |
147 | .PHONY: sysroot/$(ARCH)/include |