Message ID | 20241022105614.839199-14-alex.bennee@linaro.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | maintainer updates (testing, gdbstub, plugins) | expand |
On 10/22/24 03:56, Alex Bennée wrote: > We didn't notice breakage of aarch64_be because we don't have any TCG > tests for it. However while the existing aarch64 compiler can target > big-endian builds no one packages a BE libc. Instead we bang some > rocks together to do the most basic of hello world with a nostdlib > syscall test. > > Signed-off-by: Alex Bennée <alex.bennee@linaro.org> > > --- > v2 > - fix checkpatch complaints > --- > configure | 5 ++++ > tests/tcg/aarch64_be/hello.c | 35 ++++++++++++++++++++++++++++ > tests/tcg/Makefile.target | 7 +++++- > tests/tcg/aarch64_be/Makefile.target | 17 ++++++++++++++ > 4 files changed, 63 insertions(+), 1 deletion(-) > create mode 100644 tests/tcg/aarch64_be/hello.c > create mode 100644 tests/tcg/aarch64_be/Makefile.target > > diff --git a/configure b/configure > index 72d1a94225..7dd3400ccb 100755 > --- a/configure > +++ b/configure > @@ -1418,6 +1418,7 @@ probe_target_compiler() { > target_arch=${1%%-*} > case $target_arch in > aarch64) container_hosts="x86_64 aarch64" ;; > + aarch64_be) container_hosts="x86_64 aarch64" ;; > alpha) container_hosts=x86_64 ;; > arm) container_hosts="x86_64 aarch64" ;; > hexagon) container_hosts=x86_64 ;; > @@ -1447,6 +1448,10 @@ probe_target_compiler() { > case $target_arch in > # debian-all-test-cross architectures > > + aarch64_be) > + container_image=debian-all-test-cross > + container_cross_prefix=aarch64-linux-gnu- > + ;; > hppa|m68k|mips|riscv64|sparc64) > container_image=debian-all-test-cross > ;; > diff --git a/tests/tcg/aarch64_be/hello.c b/tests/tcg/aarch64_be/hello.c > new file mode 100644 > index 0000000000..a9b2ab45de > --- /dev/null > +++ b/tests/tcg/aarch64_be/hello.c > @@ -0,0 +1,35 @@ > +/* > + * Non-libc syscall hello world for Aarch64 BE > + * > + * SPDX-License-Identifier: GPL-2.0-or-later > + */ > + > +#define __NR_write 64 > +#define __NR_exit 93 > + > +int write(int fd, char *buf, int len) > +{ > + register int x0 __asm__("x0") = fd; > + register char *x1 __asm__("x1") = buf; > + register int x2 __asm__("x2") = len; > + register int x8 __asm__("x8") = __NR_write; > + > + asm volatile("svc #0" : : "r"(x0), "r"(x1), "r"(x2), "r"(x8)); > + > + return len; > +} > + > +void exit(int ret) > +{ > + register int x0 __asm__("x0") = ret; > + register int x8 __asm__("x8") = __NR_exit; > + > + asm volatile("svc #0" : : "r"(x0), "r"(x8)); > + __builtin_unreachable(); > +} > + > +void _start(void) > +{ > + write(1, "Hello World\n", 12); > + exit(0); > +} > diff --git a/tests/tcg/Makefile.target b/tests/tcg/Makefile.target > index 2da70b2fcf..9722145b97 100644 > --- a/tests/tcg/Makefile.target > +++ b/tests/tcg/Makefile.target > @@ -103,9 +103,14 @@ ifeq ($(filter %-softmmu, $(TARGET)),) > # then the target. If there are common tests shared between > # sub-targets (e.g. ARM & AArch64) then it is up to > # $(TARGET_NAME)/Makefile.target to include the common parent > -# architecture in its VPATH. > +# architecture in its VPATH. However some targets are so minimal we > +# can't even build the multiarch tests. > +ifneq ($(filter $(TARGET_NAME),aarch64_be),) > +-include $(SRC_PATH)/tests/tcg/$(TARGET_NAME)/Makefile.target > +else > -include $(SRC_PATH)/tests/tcg/multiarch/Makefile.target > -include $(SRC_PATH)/tests/tcg/$(TARGET_NAME)/Makefile.target > +endif > > # Add the common build options > CFLAGS+=-Wall -Werror -O0 -g -fno-strict-aliasing > diff --git a/tests/tcg/aarch64_be/Makefile.target b/tests/tcg/aarch64_be/Makefile.target > new file mode 100644 > index 0000000000..297d2cf71c > --- /dev/null > +++ b/tests/tcg/aarch64_be/Makefile.target > @@ -0,0 +1,17 @@ > +# -*- Mode: makefile -*- > +# > +# A super basic AArch64 BE makefile. As we don't have any big-endian > +#l ibc available the best we can do is a basic Hello World. > + s/l ibc/ libc/ > +AARCH64BE_SRC=$(SRC_PATH)/tests/tcg/aarch64_be > +VPATH += $(AARCH64BE_SRC) > + > +AARCH64BE_TEST_SRCS=$(notdir $(wildcard $(AARCH64BE_SRC)/*.c)) > +AARCH64BE_TESTS=$(AARCH64BE_TEST_SRCS:.c=) > +#MULTIARCH_TESTS = $(MULTIARCH_SRCS:.c=) > + > +# We need to specify big-endian cflags > +CFLAGS +=-mbig-endian -ffreestanding > +LDFLAGS +=-nostdlib > + > +TESTS += $(AARCH64BE_TESTS) Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
On 22/10/24 07:56, Alex Bennée wrote: > We didn't notice breakage of aarch64_be because we don't have any TCG > tests for it. However while the existing aarch64 compiler can target > big-endian builds no one packages a BE libc. Instead we bang some > rocks together to do the most basic of hello world with a nostdlib > syscall test. > > Signed-off-by: Alex Bennée <alex.bennee@linaro.org> > > --- > v2 > - fix checkpatch complaints > --- > configure | 5 ++++ > tests/tcg/aarch64_be/hello.c | 35 ++++++++++++++++++++++++++++ > tests/tcg/Makefile.target | 7 +++++- > tests/tcg/aarch64_be/Makefile.target | 17 ++++++++++++++ > 4 files changed, 63 insertions(+), 1 deletion(-) > create mode 100644 tests/tcg/aarch64_be/hello.c > create mode 100644 tests/tcg/aarch64_be/Makefile.target > diff --git a/tests/tcg/Makefile.target b/tests/tcg/Makefile.target > index 2da70b2fcf..9722145b97 100644 > --- a/tests/tcg/Makefile.target > +++ b/tests/tcg/Makefile.target > @@ -103,9 +103,14 @@ ifeq ($(filter %-softmmu, $(TARGET)),) > # then the target. If there are common tests shared between > # sub-targets (e.g. ARM & AArch64) then it is up to > # $(TARGET_NAME)/Makefile.target to include the common parent > -# architecture in its VPATH. > +# architecture in its VPATH. However some targets are so minimal we > +# can't even build the multiarch tests. > +ifneq ($(filter $(TARGET_NAME),aarch64_be),) > +-include $(SRC_PATH)/tests/tcg/$(TARGET_NAME)/Makefile.target ifeq and include once? Anyhow, Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> > +else > -include $(SRC_PATH)/tests/tcg/multiarch/Makefile.target > -include $(SRC_PATH)/tests/tcg/$(TARGET_NAME)/Makefile.target > +endif
diff --git a/configure b/configure index 72d1a94225..7dd3400ccb 100755 --- a/configure +++ b/configure @@ -1418,6 +1418,7 @@ probe_target_compiler() { target_arch=${1%%-*} case $target_arch in aarch64) container_hosts="x86_64 aarch64" ;; + aarch64_be) container_hosts="x86_64 aarch64" ;; alpha) container_hosts=x86_64 ;; arm) container_hosts="x86_64 aarch64" ;; hexagon) container_hosts=x86_64 ;; @@ -1447,6 +1448,10 @@ probe_target_compiler() { case $target_arch in # debian-all-test-cross architectures + aarch64_be) + container_image=debian-all-test-cross + container_cross_prefix=aarch64-linux-gnu- + ;; hppa|m68k|mips|riscv64|sparc64) container_image=debian-all-test-cross ;; diff --git a/tests/tcg/aarch64_be/hello.c b/tests/tcg/aarch64_be/hello.c new file mode 100644 index 0000000000..a9b2ab45de --- /dev/null +++ b/tests/tcg/aarch64_be/hello.c @@ -0,0 +1,35 @@ +/* + * Non-libc syscall hello world for Aarch64 BE + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#define __NR_write 64 +#define __NR_exit 93 + +int write(int fd, char *buf, int len) +{ + register int x0 __asm__("x0") = fd; + register char *x1 __asm__("x1") = buf; + register int x2 __asm__("x2") = len; + register int x8 __asm__("x8") = __NR_write; + + asm volatile("svc #0" : : "r"(x0), "r"(x1), "r"(x2), "r"(x8)); + + return len; +} + +void exit(int ret) +{ + register int x0 __asm__("x0") = ret; + register int x8 __asm__("x8") = __NR_exit; + + asm volatile("svc #0" : : "r"(x0), "r"(x8)); + __builtin_unreachable(); +} + +void _start(void) +{ + write(1, "Hello World\n", 12); + exit(0); +} diff --git a/tests/tcg/Makefile.target b/tests/tcg/Makefile.target index 2da70b2fcf..9722145b97 100644 --- a/tests/tcg/Makefile.target +++ b/tests/tcg/Makefile.target @@ -103,9 +103,14 @@ ifeq ($(filter %-softmmu, $(TARGET)),) # then the target. If there are common tests shared between # sub-targets (e.g. ARM & AArch64) then it is up to # $(TARGET_NAME)/Makefile.target to include the common parent -# architecture in its VPATH. +# architecture in its VPATH. However some targets are so minimal we +# can't even build the multiarch tests. +ifneq ($(filter $(TARGET_NAME),aarch64_be),) +-include $(SRC_PATH)/tests/tcg/$(TARGET_NAME)/Makefile.target +else -include $(SRC_PATH)/tests/tcg/multiarch/Makefile.target -include $(SRC_PATH)/tests/tcg/$(TARGET_NAME)/Makefile.target +endif # Add the common build options CFLAGS+=-Wall -Werror -O0 -g -fno-strict-aliasing diff --git a/tests/tcg/aarch64_be/Makefile.target b/tests/tcg/aarch64_be/Makefile.target new file mode 100644 index 0000000000..297d2cf71c --- /dev/null +++ b/tests/tcg/aarch64_be/Makefile.target @@ -0,0 +1,17 @@ +# -*- Mode: makefile -*- +# +# A super basic AArch64 BE makefile. As we don't have any big-endian +#l ibc available the best we can do is a basic Hello World. + +AARCH64BE_SRC=$(SRC_PATH)/tests/tcg/aarch64_be +VPATH += $(AARCH64BE_SRC) + +AARCH64BE_TEST_SRCS=$(notdir $(wildcard $(AARCH64BE_SRC)/*.c)) +AARCH64BE_TESTS=$(AARCH64BE_TEST_SRCS:.c=) +#MULTIARCH_TESTS = $(MULTIARCH_SRCS:.c=) + +# We need to specify big-endian cflags +CFLAGS +=-mbig-endian -ffreestanding +LDFLAGS +=-nostdlib + +TESTS += $(AARCH64BE_TESTS)
We didn't notice breakage of aarch64_be because we don't have any TCG tests for it. However while the existing aarch64 compiler can target big-endian builds no one packages a BE libc. Instead we bang some rocks together to do the most basic of hello world with a nostdlib syscall test. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> --- v2 - fix checkpatch complaints --- configure | 5 ++++ tests/tcg/aarch64_be/hello.c | 35 ++++++++++++++++++++++++++++ tests/tcg/Makefile.target | 7 +++++- tests/tcg/aarch64_be/Makefile.target | 17 ++++++++++++++ 4 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 tests/tcg/aarch64_be/hello.c create mode 100644 tests/tcg/aarch64_be/Makefile.target