* [PATCH 1/2] target/s390x: Use a 16-bit immediate in VREP @ 2023-08-07 16:34 Ilya Leoshkevich 2023-08-07 16:34 ` [PATCH 2/2] tests/tcg/s390x: Test VREP Ilya Leoshkevich 2023-08-07 17:00 ` [PATCH 1/2] target/s390x: Use a 16-bit immediate in VREP David Hildenbrand 0 siblings, 2 replies; 7+ messages in thread From: Ilya Leoshkevich @ 2023-08-07 16:34 UTC (permalink / raw) To: Richard Henderson, David Hildenbrand, Thomas Huth Cc: qemu-s390x, qemu-devel, Ilya Leoshkevich, qemu-stable Unlike most other instructions that contain an immediate element index, VREP's one is 16-bit, and not 4-bit. The code uses only 8 bits, so using, e.g., 0x101 does not lead to a specification exception. Fix by checking all 16 bits. Cc: qemu-stable@nongnu.org Fixes: 28d08731b1d8 ("s390x/tcg: Implement VECTOR REPLICATE") Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> --- target/s390x/tcg/translate_vx.c.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/target/s390x/tcg/translate_vx.c.inc b/target/s390x/tcg/translate_vx.c.inc index f8df121d3d3..a6d840d4065 100644 --- a/target/s390x/tcg/translate_vx.c.inc +++ b/target/s390x/tcg/translate_vx.c.inc @@ -57,7 +57,7 @@ #define FPF_LONG 3 #define FPF_EXT 4 -static inline bool valid_vec_element(uint8_t enr, MemOp es) +static inline bool valid_vec_element(uint16_t enr, MemOp es) { return !(enr & ~(NUM_VEC_ELEMENTS(es) - 1)); } @@ -964,7 +964,7 @@ static DisasJumpType op_vpdi(DisasContext *s, DisasOps *o) static DisasJumpType op_vrep(DisasContext *s, DisasOps *o) { - const uint8_t enr = get_field(s, i2); + const uint16_t enr = get_field(s, i2); const uint8_t es = get_field(s, m4); if (es > ES_64 || !valid_vec_element(enr, es)) { -- 2.41.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/2] tests/tcg/s390x: Test VREP 2023-08-07 16:34 [PATCH 1/2] target/s390x: Use a 16-bit immediate in VREP Ilya Leoshkevich @ 2023-08-07 16:34 ` Ilya Leoshkevich 2023-08-07 17:00 ` [PATCH 1/2] target/s390x: Use a 16-bit immediate in VREP David Hildenbrand 1 sibling, 0 replies; 7+ messages in thread From: Ilya Leoshkevich @ 2023-08-07 16:34 UTC (permalink / raw) To: Richard Henderson, David Hildenbrand, Thomas Huth Cc: qemu-s390x, qemu-devel, Ilya Leoshkevich Add a small test to prevent regressions. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> --- tests/tcg/s390x/Makefile.target | 1 + tests/tcg/s390x/vrep.c | 81 +++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 tests/tcg/s390x/vrep.c diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target index 1fc98099070..9548b6d4f51 100644 --- a/tests/tcg/s390x/Makefile.target +++ b/tests/tcg/s390x/Makefile.target @@ -59,6 +59,7 @@ Z13_TESTS=vistr Z13_TESTS+=lcbb Z13_TESTS+=locfhr Z13_TESTS+=vcksm +Z13_TESTS+=vrep $(Z13_TESTS): CFLAGS+=-march=z13 -O2 TESTS+=$(Z13_TESTS) diff --git a/tests/tcg/s390x/vrep.c b/tests/tcg/s390x/vrep.c new file mode 100644 index 00000000000..d5a3bd8eb20 --- /dev/null +++ b/tests/tcg/s390x/vrep.c @@ -0,0 +1,81 @@ +/* + * Test the VREP instruction. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#include <assert.h> +#include <signal.h> +#include <stdbool.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include "vx.h" + +static void handle_sigill(int sig, siginfo_t *info, void *ucontext) +{ + mcontext_t *mcontext = &((ucontext_t *)ucontext)->uc_mcontext; + char *insn = (char *)info->si_addr; + + if (insn[0] != 0xe7 || insn[5] != 0x4d) { + _exit(EXIT_FAILURE); + } + + mcontext->gregs[2] = SIGILL; +} + +static inline __attribute__((__always_inline__)) unsigned long +vrep(S390Vector *v1, const S390Vector *v3, const uint16_t i2, const uint8_t m4) +{ + register unsigned long sig asm("r2") = -1; + + asm("vrep %[v1],%[v3],%[i2],%[m4]\n" + : [v1] "=v" (v1->v) + , [sig] "+r" (sig) + : [v3] "v" (v3->v) + , [i2] "i" (i2) + , [m4] "i" (m4)); + + return sig; +} + +int main(int argc, char *argv[]) +{ + S390Vector v3 = {.d[0] = 1, .d[1] = 2}; + struct sigaction act; + S390Vector v1; + int err; + + memset(&act, 0, sizeof(act)); + act.sa_sigaction = handle_sigill; + act.sa_flags = SA_SIGINFO; + err = sigaction(SIGILL, &act, NULL); + assert(err == 0); + + assert(vrep(&v1, &v3, 7, 0) == -1); + assert(v1.d[0] == 0x0101010101010101ULL); + assert(v1.d[1] == 0x0101010101010101ULL); + + assert(vrep(&v1, &v3, 7, 1) == -1); + assert(v1.d[0] == 0x0002000200020002ULL); + assert(v1.d[1] == 0x0002000200020002ULL); + + assert(vrep(&v1, &v3, 1, 2) == -1); + assert(v1.d[0] == 0x0000000100000001ULL); + assert(v1.d[1] == 0x0000000100000001ULL); + + assert(vrep(&v1, &v3, 1, 3) == -1); + assert(v1.d[0] == 2); + assert(v1.d[1] == 2); + + assert(vrep(&v1, &v3, 0x10, 0) == SIGILL); + assert(vrep(&v1, &v3, 0x101, 0) == SIGILL); + assert(vrep(&v1, &v3, 0x8, 1) == SIGILL); + assert(vrep(&v1, &v3, 0x108, 1) == SIGILL); + assert(vrep(&v1, &v3, 0x4, 2) == SIGILL); + assert(vrep(&v1, &v3, 0x104, 2) == SIGILL); + assert(vrep(&v1, &v3, 0x2, 3) == SIGILL); + assert(vrep(&v1, &v3, 0x102, 3) == SIGILL); + + return EXIT_SUCCESS; +} -- 2.41.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] target/s390x: Use a 16-bit immediate in VREP 2023-08-07 16:34 [PATCH 1/2] target/s390x: Use a 16-bit immediate in VREP Ilya Leoshkevich 2023-08-07 16:34 ` [PATCH 2/2] tests/tcg/s390x: Test VREP Ilya Leoshkevich @ 2023-08-07 17:00 ` David Hildenbrand 2023-08-07 17:02 ` Ilya Leoshkevich 1 sibling, 1 reply; 7+ messages in thread From: David Hildenbrand @ 2023-08-07 17:00 UTC (permalink / raw) To: Ilya Leoshkevich, Richard Henderson, Thomas Huth Cc: qemu-s390x, qemu-devel, qemu-stable On 07.08.23 18:34, Ilya Leoshkevich wrote: > Unlike most other instructions that contain an immediate element index, > VREP's one is 16-bit, and not 4-bit. The code uses only 8 bits, so > using, e.g., 0x101 does not lead to a specification exception. > > Fix by checking all 16 bits. > > Cc: qemu-stable@nongnu.org Just curious, why stable? Are there valid programs that set invalid element size and they are fixed by this? LGTM Reviewed-by: David Hildenbrand <david@redhat.com> > Fixes: 28d08731b1d8 ("s390x/tcg: Implement VECTOR REPLICATE") > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> > --- > target/s390x/tcg/translate_vx.c.inc | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/target/s390x/tcg/translate_vx.c.inc b/target/s390x/tcg/translate_vx.c.inc > index f8df121d3d3..a6d840d4065 100644 > --- a/target/s390x/tcg/translate_vx.c.inc > +++ b/target/s390x/tcg/translate_vx.c.inc > @@ -57,7 +57,7 @@ > #define FPF_LONG 3 > #define FPF_EXT 4 > > -static inline bool valid_vec_element(uint8_t enr, MemOp es) > +static inline bool valid_vec_element(uint16_t enr, MemOp es) > { > return !(enr & ~(NUM_VEC_ELEMENTS(es) - 1)); > } > @@ -964,7 +964,7 @@ static DisasJumpType op_vpdi(DisasContext *s, DisasOps *o) > > static DisasJumpType op_vrep(DisasContext *s, DisasOps *o) > { > - const uint8_t enr = get_field(s, i2); > + const uint16_t enr = get_field(s, i2); > const uint8_t es = get_field(s, m4); > > if (es > ES_64 || !valid_vec_element(enr, es)) { -- Cheers, David / dhildenb ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] target/s390x: Use a 16-bit immediate in VREP 2023-08-07 17:00 ` [PATCH 1/2] target/s390x: Use a 16-bit immediate in VREP David Hildenbrand @ 2023-08-07 17:02 ` Ilya Leoshkevich 2023-08-07 17:04 ` David Hildenbrand 0 siblings, 1 reply; 7+ messages in thread From: Ilya Leoshkevich @ 2023-08-07 17:02 UTC (permalink / raw) To: David Hildenbrand, Richard Henderson, Thomas Huth Cc: qemu-s390x, qemu-devel, qemu-stable On Mon, 2023-08-07 at 19:00 +0200, David Hildenbrand wrote: > On 07.08.23 18:34, Ilya Leoshkevich wrote: > > Unlike most other instructions that contain an immediate element > > index, > > VREP's one is 16-bit, and not 4-bit. The code uses only 8 bits, so > > using, e.g., 0x101 does not lead to a specification exception. > > > > Fix by checking all 16 bits. > > > > Cc: qemu-stable@nongnu.org > > Just curious, why stable? Are there valid programs that set invalid > element size and they are fixed by this? None that I know of, but I thought this was still nice to have, and at the same time small enough to not cause any trouble. > LGTM > > Reviewed-by: David Hildenbrand <david@redhat.com> [...] > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] target/s390x: Use a 16-bit immediate in VREP 2023-08-07 17:02 ` Ilya Leoshkevich @ 2023-08-07 17:04 ` David Hildenbrand 2023-08-07 17:27 ` Michael Tokarev 0 siblings, 1 reply; 7+ messages in thread From: David Hildenbrand @ 2023-08-07 17:04 UTC (permalink / raw) To: Ilya Leoshkevich, Richard Henderson, Thomas Huth Cc: qemu-s390x, qemu-devel, qemu-stable On 07.08.23 19:02, Ilya Leoshkevich wrote: > On Mon, 2023-08-07 at 19:00 +0200, David Hildenbrand wrote: >> On 07.08.23 18:34, Ilya Leoshkevich wrote: >>> Unlike most other instructions that contain an immediate element >>> index, >>> VREP's one is 16-bit, and not 4-bit. The code uses only 8 bits, so >>> using, e.g., 0x101 does not lead to a specification exception. >>> >>> Fix by checking all 16 bits. >>> >>> Cc: qemu-stable@nongnu.org >> >> Just curious, why stable? Are there valid programs that set invalid >> element size and they are fixed by this? > > None that I know of, but I thought this was still nice to have, and at > the same time small enough to not cause any trouble. Yes, I was just curious. From my recollection, we didn't backport all specification exception checks. -- Cheers, David / dhildenb ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] target/s390x: Use a 16-bit immediate in VREP 2023-08-07 17:04 ` David Hildenbrand @ 2023-08-07 17:27 ` Michael Tokarev 2023-08-08 10:01 ` Ilya Leoshkevich 0 siblings, 1 reply; 7+ messages in thread From: Michael Tokarev @ 2023-08-07 17:27 UTC (permalink / raw) To: Ilya Leoshkevich; +Cc: qemu-s390x, qemu-devel, qemu-stable > On 07.08.23 19:02, Ilya Leoshkevich wrote: ..>> None that I know of, but I thought this was still nice to have, and at >> the same time small enough to not cause any trouble. Ilya, do you have an idea why your messages don't reach qemu-stable@? I see e.g. David's replies to yuor messages in qemu-stable@ - this way I know you sent something, and copy that message from qemu-devel@. For example, this thread is shown in the archive with your messages unavailable: https://mail.gnu.org/archive/html/qemu-stable/2023-08/threads.html#00118 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] target/s390x: Use a 16-bit immediate in VREP 2023-08-07 17:27 ` Michael Tokarev @ 2023-08-08 10:01 ` Ilya Leoshkevich 0 siblings, 0 replies; 7+ messages in thread From: Ilya Leoshkevich @ 2023-08-08 10:01 UTC (permalink / raw) To: Michael Tokarev; +Cc: qemu-s390x, qemu-devel, qemu-stable On Mon, 2023-08-07 at 20:27 +0300, Michael Tokarev wrote: > > On 07.08.23 19:02, Ilya Leoshkevich wrote: > ..>> None that I know of, but I thought this was still nice to have, > and at > > > the same time small enough to not cause any trouble. > > Ilya, do you have an idea why your messages don't reach qemu-stable@? > > I see e.g. David's replies to yuor messages in qemu-stable@ - this > way > I know you sent something, and copy that message from qemu-devel@. > > For example, this thread is shown in the archive with your messages > unavailable: > > https://mail.gnu.org/archive/html/qemu-stable/2023-08/threads.html#00118 No, unfortunately I don't know. Everything looks normal on my end, qemu-stable@ is properly Cc:ed and I don't see any typos. I've sent a question about this to the mailing list owner. ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2023-08-08 10:03 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-08-07 16:34 [PATCH 1/2] target/s390x: Use a 16-bit immediate in VREP Ilya Leoshkevich 2023-08-07 16:34 ` [PATCH 2/2] tests/tcg/s390x: Test VREP Ilya Leoshkevich 2023-08-07 17:00 ` [PATCH 1/2] target/s390x: Use a 16-bit immediate in VREP David Hildenbrand 2023-08-07 17:02 ` Ilya Leoshkevich 2023-08-07 17:04 ` David Hildenbrand 2023-08-07 17:27 ` Michael Tokarev 2023-08-08 10:01 ` 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).