Hi Thomas, Thomas Weißschuh <linux@xxxxxxxxxxxxxx> writes: > 32-bit s390 is very close to the existing 64-bit implementation. > > Some special handling is necessary as there is neither LLVM nor > QEMU support. Also the kernel itself can not build natively for 32-bit > s390, so instead the test program is executed with a 64-bit kernel. > > Signed-off-by: Thomas Weißschuh <linux@xxxxxxxxxxxxxx> > --- > tools/include/nolibc/arch-s390.h | 5 +++++ > tools/include/nolibc/arch.h | 2 +- > tools/testing/selftests/nolibc/Makefile | 5 +++++ > tools/testing/selftests/nolibc/run-tests.sh | 7 ++++++- > 4 files changed, 17 insertions(+), 2 deletions(-) > > diff --git a/tools/include/nolibc/arch-s390.h b/tools/include/nolibc/arch-s390.h > index f9ab83a219b8a2d5e53b0b303d8bf0bf78280d5f..3f2fb00ca101cc052f3b794b743e9e5734fe5a77 100644 > --- a/tools/include/nolibc/arch-s390.h > +++ b/tools/include/nolibc/arch-s390.h > @@ -143,8 +143,13 @@ > void __attribute__((weak, noreturn)) __nolibc_entrypoint __no_stack_protector _start(void) > { > __asm__ volatile ( > +#ifdef __s390x__ > "lgr %r2, %r15\n" /* save stack pointer to %r2, as arg1 of _start_c */ > "aghi %r15, -160\n" /* allocate new stackframe */ > +#else > + "lr %r2, %r15\n" > + "ahi %r15, -160\n" > +#endif compat mode is using a stack size of 96 bytes, so the ahi above needs to be adjusted. > "xc 0(8,%r15), 0(%r15)\n" /* clear backchain */ > "brasl %r14, _start_c\n" /* transfer to c runtime */ > ); > diff --git a/tools/include/nolibc/arch.h b/tools/include/nolibc/arch.h > index c8f4e5d3add9eb5b8a438900c084dc0449fcfbd6..8a2c143c0fba288147e5a7bf9db38ffb08367616 100644 > --- a/tools/include/nolibc/arch.h > +++ b/tools/include/nolibc/arch.h > @@ -29,7 +29,7 @@ > #include "arch-powerpc.h" > #elif defined(__riscv) > #include "arch-riscv.h" > -#elif defined(__s390x__) > +#elif defined(__s390x__) || defined(__s390__) > #include "arch-s390.h" > #elif defined(__loongarch__) > #include "arch-loongarch.h" > diff --git a/tools/testing/selftests/nolibc/Makefile b/tools/testing/selftests/nolibc/Makefile > index dad0d9fd7702f8dc9a9a552cda5305f8973c5469..dc5cf19dd74389336b619e15e07f1c635241b7d7 100644 > --- a/tools/testing/selftests/nolibc/Makefile > +++ b/tools/testing/selftests/nolibc/Makefile > @@ -72,6 +72,7 @@ IMAGE_riscv = arch/riscv/boot/Image > IMAGE_riscv32 = arch/riscv/boot/Image > IMAGE_riscv64 = arch/riscv/boot/Image > IMAGE_s390x = arch/s390/boot/bzImage > +IMAGE_s390 = arch/s390/boot/bzImage > IMAGE_loongarch = arch/loongarch/boot/vmlinuz.efi > IMAGE = $(objtree)/$(IMAGE_$(XARCH)) > IMAGE_NAME = $(notdir $(IMAGE)) > @@ -91,6 +92,7 @@ DEFCONFIG_riscv = defconfig > DEFCONFIG_riscv32 = rv32_defconfig > DEFCONFIG_riscv64 = defconfig > DEFCONFIG_s390x = defconfig > +DEFCONFIG_s390 = defconfig compat.config > DEFCONFIG_loongarch = defconfig > DEFCONFIG = $(DEFCONFIG_$(XARCH)) > > @@ -112,6 +114,7 @@ QEMU_ARCH_riscv = riscv64 > QEMU_ARCH_riscv32 = riscv32 > QEMU_ARCH_riscv64 = riscv64 > QEMU_ARCH_s390x = s390x > +QEMU_ARCH_s390 = s390x > QEMU_ARCH_loongarch = loongarch64 > QEMU_ARCH = $(QEMU_ARCH_$(XARCH)) > > @@ -140,6 +143,7 @@ QEMU_ARGS_riscv = -M virt -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_T > QEMU_ARGS_riscv32 = -M virt -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)" > QEMU_ARGS_riscv64 = -M virt -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)" > QEMU_ARGS_s390x = -M s390-ccw-virtio -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)" > +QEMU_ARGS_s390 = -M s390-ccw-virtio -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)" > QEMU_ARGS_loongarch = -M virt -append "console=ttyS0,115200 panic=-1 $(TEST:%=NOLIBC_TEST=%)" > QEMU_ARGS = -m 1G $(QEMU_ARGS_$(XARCH)) $(QEMU_ARGS_BIOS) $(QEMU_ARGS_EXTRA) > > @@ -158,6 +162,7 @@ CFLAGS_ppc = -m32 -mbig-endian -mno-vsx $(call cc-option,-mmultiple) > CFLAGS_ppc64 = -m64 -mbig-endian -mno-vsx $(call cc-option,-mmultiple) > CFLAGS_ppc64le = -m64 -mlittle-endian -mno-vsx $(call cc-option,-mabi=elfv2) > CFLAGS_s390x = -m64 > +CFLAGS_s390 = -m31 > CFLAGS_mips32le = -EL -mabi=32 -fPIC > CFLAGS_mips32be = -EB -mabi=32 > CFLAGS_STACKPROTECTOR ?= $(call cc-option,-mstack-protector-guard=global $(call cc-option,-fstack-protector-all)) > diff --git a/tools/testing/selftests/nolibc/run-tests.sh b/tools/testing/selftests/nolibc/run-tests.sh > index fe4d48cc054abb1e922b31aa7b6a2395aaf61f5f..79874f669b2a364ad1cb2399b4ebbab5ec6c9de9 100755 > --- a/tools/testing/selftests/nolibc/run-tests.sh > +++ b/tools/testing/selftests/nolibc/run-tests.sh > @@ -17,7 +17,7 @@ perform_download=0 > test_mode=system > werror=1 > llvm= > -archs="i386 x86_64 arm64 arm mips32le mips32be ppc ppc64 ppc64le riscv32 riscv64 s390x loongarch" > +archs="i386 x86_64 arm64 arm mips32le mips32be ppc ppc64 ppc64le riscv32 riscv64 s390x s390 loongarch" > > TEMP=$(getopt -o 'j:d:c:b:a:m:pelh' -n "$0" -- "$@") > > @@ -171,6 +171,11 @@ test_arch() { > exit 1 > esac > printf '%-15s' "$arch:" > + if [ "$arch" = "s390" ] && ([ "$llvm" = "1" ] || [ "$test_mode" = "user" ]); then > + echo "Unsupported configuration" > + return > + fi > + > swallow_output "${MAKE[@]}" CFLAGS_EXTRA="$CFLAGS_EXTRA" defconfig "$test_target" V=1 > cp run.out run.out."${arch}" > "${MAKE[@]}" report | grep passed