selftests/nolibc: add test support for ppc

Kernel uses ARCH=powerpc for both 32-bit and 64-bit PowerPC, here adds a
ppc variant for 32-bit PowerPC and uses it as the default variant of
powerpc architecture.

Users can pass XARCH=ppc (or ARCH=powerpc) to test 32-bit PowerPC.

The default qemu-system-ppc g3beige machine [1] is used to run 32-bit
powerpc kernel with pmac32_defconfig. The missing PMACZILOG serial tty
and console are enabled in another patch [2].

Note,

- zImage doesn't boot due to "qemu-system-ppc: Some ROM regions are
  overlapping" error, so, vmlinux is used instead.

- since the VSX support may be disabled in kernel side, to avoid
  "illegal instruction" errors due to missing VSX kernel support, let's
  simply let compiler not generate vector/scalar (VSX) instructions via
  the '-mno-vsx' option.

- as 'man gcc' shows, '-mmultiple' is used to generate code that uses
  the load multiple word instructions and the store multiple word
  instructions. Those instructions do not work when the processor is in
  little-endian mode (except PPC740/PPC750), so, we only enable it
  for big endian powerpc.

[1]: https://qemu.readthedocs.io/en/latest/system/ppc/powermac.html
[2]: https://lore.kernel.org/lkml/bb7b5f9958b3e3a20f6573ff7ce7c5dc566e7e32.1690982937.git.tanyuan@tinylab.org/

Suggested-by: Willy Tarreau <w@1wt.eu>
Link: https://lore.kernel.org/lkml/ZL9leVOI25S2+0+g@1wt.eu/
Reviewed-by: Thomas Weißschuh <linux@weissschuh.net>
Signed-off-by: Zhangjin Wu <falcon@tinylab.org>
Signed-off-by: Willy Tarreau <w@1wt.eu>
This commit is contained in:
Zhangjin Wu 2023-08-06 02:42:43 +08:00 committed by Willy Tarreau
parent c6c3734fb6
commit 587e984591

View File

@ -30,9 +30,11 @@ endif
# architectures where both are equal. # architectures where both are equal.
# configure default variants for target kernel supported architectures # configure default variants for target kernel supported architectures
XARCH_powerpc = ppc
XARCH = $(or $(XARCH_$(ARCH)),$(ARCH)) XARCH = $(or $(XARCH_$(ARCH)),$(ARCH))
# map from user input variants to their kernel supported architectures # map from user input variants to their kernel supported architectures
ARCH_ppc = powerpc
ARCH := $(or $(ARCH_$(XARCH)),$(XARCH)) ARCH := $(or $(ARCH_$(XARCH)),$(XARCH))
# kernel image names by architecture # kernel image names by architecture
@ -42,6 +44,7 @@ IMAGE_x86 = arch/x86/boot/bzImage
IMAGE_arm64 = arch/arm64/boot/Image IMAGE_arm64 = arch/arm64/boot/Image
IMAGE_arm = arch/arm/boot/zImage IMAGE_arm = arch/arm/boot/zImage
IMAGE_mips = vmlinuz IMAGE_mips = vmlinuz
IMAGE_ppc = vmlinux
IMAGE_riscv = arch/riscv/boot/Image IMAGE_riscv = arch/riscv/boot/Image
IMAGE_s390 = arch/s390/boot/bzImage IMAGE_s390 = arch/s390/boot/bzImage
IMAGE_loongarch = arch/loongarch/boot/vmlinuz.efi IMAGE_loongarch = arch/loongarch/boot/vmlinuz.efi
@ -55,6 +58,7 @@ DEFCONFIG_x86 = defconfig
DEFCONFIG_arm64 = defconfig DEFCONFIG_arm64 = defconfig
DEFCONFIG_arm = multi_v7_defconfig DEFCONFIG_arm = multi_v7_defconfig
DEFCONFIG_mips = malta_defconfig DEFCONFIG_mips = malta_defconfig
DEFCONFIG_ppc = pmac32_defconfig
DEFCONFIG_riscv = defconfig DEFCONFIG_riscv = defconfig
DEFCONFIG_s390 = defconfig DEFCONFIG_s390 = defconfig
DEFCONFIG_loongarch = defconfig DEFCONFIG_loongarch = defconfig
@ -70,6 +74,7 @@ QEMU_ARCH_x86 = x86_64
QEMU_ARCH_arm64 = aarch64 QEMU_ARCH_arm64 = aarch64
QEMU_ARCH_arm = arm QEMU_ARCH_arm = arm
QEMU_ARCH_mips = mipsel # works with malta_defconfig QEMU_ARCH_mips = mipsel # works with malta_defconfig
QEMU_ARCH_ppc = ppc
QEMU_ARCH_riscv = riscv64 QEMU_ARCH_riscv = riscv64
QEMU_ARCH_s390 = s390x QEMU_ARCH_s390 = s390x
QEMU_ARCH_loongarch = loongarch64 QEMU_ARCH_loongarch = loongarch64
@ -82,6 +87,7 @@ QEMU_ARGS_x86 = -M pc -append "console=ttyS0,9600 i8042.noaux panic=-1 $(
QEMU_ARGS_arm64 = -M virt -cpu cortex-a53 -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)" QEMU_ARGS_arm64 = -M virt -cpu cortex-a53 -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)"
QEMU_ARGS_arm = -M virt -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)" QEMU_ARGS_arm = -M virt -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)"
QEMU_ARGS_mips = -M malta -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)" QEMU_ARGS_mips = -M malta -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)"
QEMU_ARGS_ppc = -M g3beige -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
QEMU_ARGS_riscv = -M virt -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)" QEMU_ARGS_riscv = -M virt -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
QEMU_ARGS_s390 = -M s390-ccw-virtio -m 1G -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)" QEMU_ARGS_s390 = -M s390-ccw-virtio -m 1G -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
QEMU_ARGS_loongarch = -M virt -append "console=ttyS0,115200 panic=-1 $(TEST:%=NOLIBC_TEST=%)" QEMU_ARGS_loongarch = -M virt -append "console=ttyS0,115200 panic=-1 $(TEST:%=NOLIBC_TEST=%)"
@ -97,6 +103,7 @@ else
Q=@ Q=@
endif endif
CFLAGS_ppc = -m32 -mbig-endian -mno-vsx $(call cc-option,-mmultiple)
CFLAGS_s390 = -m64 CFLAGS_s390 = -m64
CFLAGS_mips = -EL CFLAGS_mips = -EL
CFLAGS_STACKPROTECTOR ?= $(call cc-option,-mstack-protector-guard=global $(call cc-option,-fstack-protector-all)) CFLAGS_STACKPROTECTOR ?= $(call cc-option,-mstack-protector-guard=global $(call cc-option,-fstack-protector-all))