qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [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).