* [PATCH 0/2] tests/tcg/s390x: Enable the multiarch system tests
@ 2023-04-22 0:58 Ilya Leoshkevich
2023-04-22 0:58 ` [PATCH 1/2] tests/tcg/multiarch: Make the system memory test work on big-endian Ilya Leoshkevich
2023-04-22 0:58 ` [PATCH 2/2] tests/tcg/s390x: Enable the multiarch system tests Ilya Leoshkevich
0 siblings, 2 replies; 5+ messages in thread
From: Ilya Leoshkevich @ 2023-04-22 0:58 UTC (permalink / raw)
To: Alex Bennée, Richard Henderson, David Hildenbrand
Cc: qemu-devel, qemu-s390x, Ilya Leoshkevich
Hi,
I noticed that Alex added "undefine MULTIARCH_TESTS" to
tests/tcg/s390x/Makefile.softmmu-target in the plugin patch, and
thought that it may better to just enable them, which this series
does.
Patch 1 fixes an endianness issue in the memory test.
Patch 2 enables the multiarch system test. The main difficulty is
outputting characters via SCLP, which is sidestepped by reusing the
pc-bios/s390-ccw implementation.
Best regards,
Ilya
Ilya Leoshkevich (2):
tests/tcg/multiarch: Make the system memory test work on big-endian
tests/tcg/s390x: Enable the multiarch system tests
tests/tcg/multiarch/system/memory.c | 24 ++++++++++++++++
tests/tcg/s390x/Makefile.softmmu-target | 37 +++++++++++++++++--------
tests/tcg/s390x/console.c | 12 ++++++++
tests/tcg/s390x/head64.S | 31 +++++++++++++++++++++
4 files changed, 93 insertions(+), 11 deletions(-)
create mode 100644 tests/tcg/s390x/console.c
create mode 100644 tests/tcg/s390x/head64.S
--
2.39.2
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/2] tests/tcg/multiarch: Make the system memory test work on big-endian
2023-04-22 0:58 [PATCH 0/2] tests/tcg/s390x: Enable the multiarch system tests Ilya Leoshkevich
@ 2023-04-22 0:58 ` Ilya Leoshkevich
2023-04-22 11:02 ` Thomas Weißschuh
2023-04-22 0:58 ` [PATCH 2/2] tests/tcg/s390x: Enable the multiarch system tests Ilya Leoshkevich
1 sibling, 1 reply; 5+ messages in thread
From: Ilya Leoshkevich @ 2023-04-22 0:58 UTC (permalink / raw)
To: Alex Bennée, Richard Henderson, David Hildenbrand
Cc: qemu-devel, qemu-s390x, Ilya Leoshkevich
Make sure values are stored in memory as little-endian regardless of
the host endianness.
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
---
tests/tcg/multiarch/system/memory.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/tests/tcg/multiarch/system/memory.c b/tests/tcg/multiarch/system/memory.c
index 214f7d4f54b..8ef6666b440 100644
--- a/tests/tcg/multiarch/system/memory.c
+++ b/tests/tcg/multiarch/system/memory.c
@@ -121,6 +121,9 @@ static void init_test_data_u16(int offset)
for (i = 0; i < max; i++) {
uint8_t low = count++, high = count++;
word = BYTE_SHIFT(high, 1) | BYTE_SHIFT(low, 0);
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+ word = __builtin_bswap16(word);
+#endif
*ptr++ = word;
pdot(i);
}
@@ -142,6 +145,9 @@ static void init_test_data_u32(int offset)
uint8_t b4 = count++, b3 = count++;
uint8_t b2 = count++, b1 = count++;
word = BYTE_SHIFT(b1, 3) | BYTE_SHIFT(b2, 2) | BYTE_SHIFT(b3, 1) | b4;
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+ word = __builtin_bswap32(word);
+#endif
*ptr++ = word;
pdot(i);
}
@@ -167,6 +173,9 @@ static void init_test_data_u64(int offset)
word = BYTE_SHIFT(b1, 7) | BYTE_SHIFT(b2, 6) | BYTE_SHIFT(b3, 5) |
BYTE_SHIFT(b4, 4) | BYTE_SHIFT(b5, 3) | BYTE_SHIFT(b6, 2) |
BYTE_SHIFT(b7, 1) | b8;
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+ word = __builtin_bswap64(word);
+#endif
*ptr++ = word;
pdot(i);
}
@@ -184,6 +193,9 @@ static bool read_test_data_u16(int offset)
for (i = 0; i < max; i++) {
uint8_t high, low;
word = *ptr++;
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+ word = __builtin_bswap16(word);
+#endif
high = (word >> 8) & 0xff;
low = word & 0xff;
if (high < low && high != 0) {
@@ -210,6 +222,9 @@ static bool read_test_data_u32(int offset)
uint8_t b1, b2, b3, b4;
int zeros = 0;
word = *ptr++;
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+ word = __builtin_bswap32(word);
+#endif
b1 = word >> 24 & 0xff;
b2 = word >> 16 & 0xff;
@@ -251,6 +266,9 @@ static bool read_test_data_u64(int offset)
uint8_t b1, b2, b3, b4, b5, b6, b7, b8;
int zeros = 0;
word = *ptr++;
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+ word = __builtin_bswap64(word);
+#endif
b1 = ((uint64_t) (word >> 56)) & 0xff;
b2 = ((uint64_t) (word >> 48)) & 0xff;
@@ -376,6 +394,9 @@ static bool read_test_data_s16(int offset, bool neg_first)
for (i = 0; i < max; i++) {
int32_t data = *ptr++;
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+ data = __builtin_bswap16(data);
+#endif
if (neg_first && data < 0) {
pdot(i);
@@ -401,6 +422,9 @@ static bool read_test_data_s32(int offset, bool neg_first)
for (i = 0; i < max; i++) {
int64_t data = *ptr++;
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+ data = __builtin_bswap32(data);
+#endif
if (neg_first && data < 0) {
pdot(i);
--
2.39.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] tests/tcg/s390x: Enable the multiarch system tests
2023-04-22 0:58 [PATCH 0/2] tests/tcg/s390x: Enable the multiarch system tests Ilya Leoshkevich
2023-04-22 0:58 ` [PATCH 1/2] tests/tcg/multiarch: Make the system memory test work on big-endian Ilya Leoshkevich
@ 2023-04-22 0:58 ` Ilya Leoshkevich
1 sibling, 0 replies; 5+ messages in thread
From: Ilya Leoshkevich @ 2023-04-22 0:58 UTC (permalink / raw)
To: Alex Bennée, Richard Henderson, David Hildenbrand
Cc: qemu-devel, qemu-s390x, Ilya Leoshkevich
Multiarch tests are written in C and need support for printing
characters. Instead of implementing the runtime from scratch, just
reuse the pc-bios/s390-ccw one.
Run tests with -nographic in order to enable SCLP (enable this for
the existing tests as well, since it does not hurt).
Use the default linker script for the new tests.
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
---
tests/tcg/s390x/Makefile.softmmu-target | 37 +++++++++++++++++--------
tests/tcg/s390x/console.c | 12 ++++++++
tests/tcg/s390x/head64.S | 31 +++++++++++++++++++++
3 files changed, 69 insertions(+), 11 deletions(-)
create mode 100644 tests/tcg/s390x/console.c
create mode 100644 tests/tcg/s390x/head64.S
diff --git a/tests/tcg/s390x/Makefile.softmmu-target b/tests/tcg/s390x/Makefile.softmmu-target
index 3e7f72abcdc..2c42526e9cd 100644
--- a/tests/tcg/s390x/Makefile.softmmu-target
+++ b/tests/tcg/s390x/Makefile.softmmu-target
@@ -1,25 +1,40 @@
S390X_SRC=$(SRC_PATH)/tests/tcg/s390x
VPATH+=$(S390X_SRC)
-QEMU_OPTS=-action panic=exit-failure -kernel
+QEMU_OPTS=-action panic=exit-failure -nographic -kernel
LINK_SCRIPT=$(S390X_SRC)/softmmu.ld
-LDFLAGS=-nostdlib -static -Wl,-T$(LINK_SCRIPT) -Wl,--build-id=none
+CFLAGS+=-ggdb -O0
+LDFLAGS=-nostdlib -static
%.o: %.S
$(CC) -march=z13 -m64 -c $< -o $@
+%.o: %.c
+ $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -march=z13 -m64 -c $< -o $@
+
%: %.o $(LINK_SCRIPT)
$(CC) $< -o $@ $(LDFLAGS)
-TESTS += unaligned-lowcore
-TESTS += bal
-TESTS += sam
-TESTS += lpsw
-TESTS += lpswe-early
-TESTS += ssm-early
-TESTS += stosm-early
-TESTS += exrl-ssm-early
+ASM_TESTS = \
+ bal \
+ exrl-ssm-early \
+ sam \
+ lpsw \
+ lpswe-early \
+ ssm-early \
+ stosm-early \
+ unaligned-lowcore
include $(S390X_SRC)/pgm-specification.mak
$(PGM_SPECIFICATION_TESTS): pgm-specification-softmmu.o
$(PGM_SPECIFICATION_TESTS): LDFLAGS+=pgm-specification-softmmu.o
-TESTS += $(PGM_SPECIFICATION_TESTS)
+ASM_TESTS += $(PGM_SPECIFICATION_TESTS)
+
+$(ASM_TESTS): LDFLAGS += -Wl,-T$(LINK_SCRIPT) -Wl,--build-id=none
+TESTS += $(ASM_TESTS)
+
+S390X_MULTIARCH_RUNTIME_OBJS = head64.o console.o $(MINILIB_OBJS)
+$(MULTIARCH_TESTS): $(S390X_MULTIARCH_RUNTIME_OBJS)
+$(MULTIARCH_TESTS): LDFLAGS += $(S390X_MULTIARCH_RUNTIME_OBJS)
+$(MULTIARCH_TESTS): CFLAGS += $(MINILIB_INC)
+memory: CFLAGS += -DCHECK_UNALIGNED=0
+TESTS += $(MULTIARCH_TESTS)
diff --git a/tests/tcg/s390x/console.c b/tests/tcg/s390x/console.c
new file mode 100644
index 00000000000..d43ce3f44b4
--- /dev/null
+++ b/tests/tcg/s390x/console.c
@@ -0,0 +1,12 @@
+/*
+ * Console code for multiarch tests.
+ * Reuses the pc-bios/s390-ccw implementation.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+#include "../../../pc-bios/s390-ccw/sclp.c"
+
+void __sys_outc(char c)
+{
+ write(1, &c, sizeof(c));
+}
diff --git a/tests/tcg/s390x/head64.S b/tests/tcg/s390x/head64.S
new file mode 100644
index 00000000000..c6f36dfea4b
--- /dev/null
+++ b/tests/tcg/s390x/head64.S
@@ -0,0 +1,31 @@
+/*
+ * Startup code for multiarch tests.
+ * Reuses the pc-bios/s390-ccw implementation.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+#define main main_pre
+#include "../../../pc-bios/s390-ccw/start.S"
+#undef main
+
+main_pre:
+ aghi %r15,-160 /* reserve stack for C code */
+ brasl %r14,sclp_setup
+ brasl %r14,main
+ larl %r1,success_psw /* check main() return code */
+ ltgr %r2,%r2
+ je 0f
+ larl %r1,failure_psw
+0:
+ lpswe 0(%r1)
+
+ .align 8
+success_psw:
+ .quad 0x2000180000000,0xfff /* see is_special_wait_psw() */
+failure_psw:
+ .quad 0x2000180000000,0 /* disabled wait */
+
+ .section .bss
+ .align 0x1000
+stack:
+ .skip 0x8000
--
2.39.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] tests/tcg/multiarch: Make the system memory test work on big-endian
2023-04-22 0:58 ` [PATCH 1/2] tests/tcg/multiarch: Make the system memory test work on big-endian Ilya Leoshkevich
@ 2023-04-22 11:02 ` Thomas Weißschuh
2023-04-22 12:18 ` Peter Maydell
0 siblings, 1 reply; 5+ messages in thread
From: Thomas Weißschuh @ 2023-04-22 11:02 UTC (permalink / raw)
To: Ilya Leoshkevich
Cc: Alex Bennée, Richard Henderson, David Hildenbrand,
qemu-devel, qemu-s390x
On 2023-04-22 02:58:07+0200, Ilya Leoshkevich wrote:
> Make sure values are stored in memory as little-endian regardless of
> the host endianness.
>
> Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
> ---
> tests/tcg/multiarch/system/memory.c | 24 ++++++++++++++++++++++++
> 1 file changed, 24 insertions(+)
>
> diff --git a/tests/tcg/multiarch/system/memory.c b/tests/tcg/multiarch/system/memory.c
> index 214f7d4f54b..8ef6666b440 100644
> --- a/tests/tcg/multiarch/system/memory.c
> +++ b/tests/tcg/multiarch/system/memory.c
> @@ -121,6 +121,9 @@ static void init_test_data_u16(int offset)
> for (i = 0; i < max; i++) {
> uint8_t low = count++, high = count++;
> word = BYTE_SHIFT(high, 1) | BYTE_SHIFT(low, 0);
> +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
> + word = __builtin_bswap16(word);
> +#endif
These looks like a usecase for cpu_to_le16() and friends.
> *ptr++ = word;
> pdot(i);
> }
> @@ -142,6 +145,9 @@ static void init_test_data_u32(int offset)
> uint8_t b4 = count++, b3 = count++;
> uint8_t b2 = count++, b1 = count++;
> word = BYTE_SHIFT(b1, 3) | BYTE_SHIFT(b2, 2) | BYTE_SHIFT(b3, 1) | b4;
> +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
> + word = __builtin_bswap32(word);
> +#endif
> *ptr++ = word;
> pdot(i);
> }
> [..]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] tests/tcg/multiarch: Make the system memory test work on big-endian
2023-04-22 11:02 ` Thomas Weißschuh
@ 2023-04-22 12:18 ` Peter Maydell
0 siblings, 0 replies; 5+ messages in thread
From: Peter Maydell @ 2023-04-22 12:18 UTC (permalink / raw)
To: Thomas Weißschuh
Cc: Ilya Leoshkevich, Alex Bennée, Richard Henderson,
David Hildenbrand, qemu-devel, qemu-s390x
On Sat, 22 Apr 2023 at 12:03, Thomas Weißschuh <thomas@t-8ch.de> wrote:
>
> On 2023-04-22 02:58:07+0200, Ilya Leoshkevich wrote:
> > Make sure values are stored in memory as little-endian regardless of
> > the host endianness.
> >
> > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
> > ---
> > tests/tcg/multiarch/system/memory.c | 24 ++++++++++++++++++++++++
> > 1 file changed, 24 insertions(+)
> >
> > diff --git a/tests/tcg/multiarch/system/memory.c b/tests/tcg/multiarch/system/memory.c
> > index 214f7d4f54b..8ef6666b440 100644
> > --- a/tests/tcg/multiarch/system/memory.c
> > +++ b/tests/tcg/multiarch/system/memory.c
> > @@ -121,6 +121,9 @@ static void init_test_data_u16(int offset)
> > for (i = 0; i < max; i++) {
> > uint8_t low = count++, high = count++;
> > word = BYTE_SHIFT(high, 1) | BYTE_SHIFT(low, 0);
> > +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
> > + word = __builtin_bswap16(word);
> > +#endif
>
> These looks like a usecase for cpu_to_le16() and friends.
I'm not sure this test code has direct access to those, but
the general principle is right.
It is particularly odd that we carefully manually put
together a word by shifting-and-ORing together the
various bytes in it, and then separately do a byteswap.
thanks
-- PMM
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-04-22 12:19 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-04-22 0:58 [PATCH 0/2] tests/tcg/s390x: Enable the multiarch system tests Ilya Leoshkevich
2023-04-22 0:58 ` [PATCH 1/2] tests/tcg/multiarch: Make the system memory test work on big-endian Ilya Leoshkevich
2023-04-22 11:02 ` Thomas Weißschuh
2023-04-22 12:18 ` Peter Maydell
2023-04-22 0:58 ` [PATCH 2/2] tests/tcg/s390x: Enable the multiarch system tests Ilya Leoshkevich
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).