Message ID | 20240109232319.600102-3-iii@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | target/s390x: Fix LAE setting a wrong access register | expand |
On 10/01/2024 00.22, Ilya Leoshkevich wrote: > Add a small test to prevent regressions. Userspace runs in primary > mode, so LAE should always set the access register to 0. > > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> > --- > tests/tcg/s390x/Makefile.target | 1 + > tests/tcg/s390x/lae.c | 25 +++++++++++++++++++++++++ > 2 files changed, 26 insertions(+) > create mode 100644 tests/tcg/s390x/lae.c Reviewed-by: Thomas Huth <thuth@redhat.com>
On 10/01/2024 00.22, Ilya Leoshkevich wrote: > Add a small test to prevent regressions. Userspace runs in primary > mode, so LAE should always set the access register to 0. > > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> > --- > tests/tcg/s390x/Makefile.target | 1 + > tests/tcg/s390x/lae.c | 25 +++++++++++++++++++++++++ > 2 files changed, 26 insertions(+) > create mode 100644 tests/tcg/s390x/lae.c > > diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target > index 0e670f3f8b9..30994dcf9c2 100644 > --- a/tests/tcg/s390x/Makefile.target > +++ b/tests/tcg/s390x/Makefile.target > @@ -44,6 +44,7 @@ TESTS+=clgebr > TESTS+=clc > TESTS+=laalg > TESTS+=add-logical-with-carry > +TESTS+=lae > > cdsg: CFLAGS+=-pthread > cdsg: LDFLAGS+=-pthread > diff --git a/tests/tcg/s390x/lae.c b/tests/tcg/s390x/lae.c > new file mode 100644 > index 00000000000..661e95f9978 > --- /dev/null > +++ b/tests/tcg/s390x/lae.c > @@ -0,0 +1,25 @@ > +/* > + * Test the LOAD ADDRESS EXTENDED instruction. > + * > + * SPDX-License-Identifier: GPL-2.0-or-later > + */ > +#include <assert.h> > +#include <stdlib.h> > + > +int main(void) > +{ > + unsigned long long ar = -1, b2 = 100000, r, x2 = 500; > + int tmp; > + > + asm("ear %[tmp],%[r]\n" > + "lae %[r],42(%[x2],%[b2])\n" > + "ear %[ar],%[r]\n" > + "sar %[r],%[tmp]" > + : [tmp] "=&r" (tmp), [r] "=&r" (r), [ar] "+r" (ar) > + : [b2] "r" (b2), [x2] "r" (x2) > + : "memory"); > + assert(ar == 0xffffffff00000000ULL); > + assert(r == 100542); > + > + return EXIT_SUCCESS; > +} I'm sorry, but it fails when building with Clang (version 17): .../qemu/tests/tcg/s390x/lae.c:14:9: error: invalid operand for instruction 14 | asm("ear %[tmp],%[r]\n" | ^ <inline asm>:1:10: note: instantiated into assembly here 1 | ear %r2,%r1 | ^ .../qemu/tests/tcg/s390x/lae.c:16:10: error: invalid operand for instruction 16 | "ear %[ar],%[r]\n" | ^ <inline asm>:3:9: note: instantiated into assembly here 3 | ear %r0,%r1 | ^ .../qemu/tests/tcg/s390x/lae.c:17:10: error: invalid operand for instruction 17 | "sar %[r],%[tmp]" | ^ <inline asm>:4:5: note: instantiated into assembly here 4 | sar %r1,%r2 | ^ 3 errors generated. Any suggestions how to fix it best? Thomas
On Thu, 2024-01-11 at 09:37 +0100, Thomas Huth wrote: > On 10/01/2024 00.22, Ilya Leoshkevich wrote: > > Add a small test to prevent regressions. Userspace runs in primary > > mode, so LAE should always set the access register to 0. > > > > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> > > --- > > tests/tcg/s390x/Makefile.target | 1 + > > tests/tcg/s390x/lae.c | 25 +++++++++++++++++++++++++ > > 2 files changed, 26 insertions(+) > > create mode 100644 tests/tcg/s390x/lae.c > > > > diff --git a/tests/tcg/s390x/Makefile.target > > b/tests/tcg/s390x/Makefile.target > > index 0e670f3f8b9..30994dcf9c2 100644 > > --- a/tests/tcg/s390x/Makefile.target > > +++ b/tests/tcg/s390x/Makefile.target > > @@ -44,6 +44,7 @@ TESTS+=clgebr > > TESTS+=clc > > TESTS+=laalg > > TESTS+=add-logical-with-carry > > +TESTS+=lae > > > > cdsg: CFLAGS+=-pthread > > cdsg: LDFLAGS+=-pthread > > diff --git a/tests/tcg/s390x/lae.c b/tests/tcg/s390x/lae.c > > new file mode 100644 > > index 00000000000..661e95f9978 > > --- /dev/null > > +++ b/tests/tcg/s390x/lae.c > > @@ -0,0 +1,25 @@ > > +/* > > + * Test the LOAD ADDRESS EXTENDED instruction. > > + * > > + * SPDX-License-Identifier: GPL-2.0-or-later > > + */ > > +#include <assert.h> > > +#include <stdlib.h> > > + > > +int main(void) > > +{ > > + unsigned long long ar = -1, b2 = 100000, r, x2 = 500; > > + int tmp; > > + > > + asm("ear %[tmp],%[r]\n" > > + "lae %[r],42(%[x2],%[b2])\n" > > + "ear %[ar],%[r]\n" > > + "sar %[r],%[tmp]" > > + : [tmp] "=&r" (tmp), [r] "=&r" (r), [ar] "+r" (ar) > > + : [b2] "r" (b2), [x2] "r" (x2) > > + : "memory"); > > + assert(ar == 0xffffffff00000000ULL); > > + assert(r == 100542); > > + > > + return EXIT_SUCCESS; > > +} > > I'm sorry, but it fails when building with Clang (version 17): > > .../qemu/tests/tcg/s390x/lae.c:14:9: error: invalid operand for > instruction > 14 | asm("ear %[tmp],%[r]\n" > | ^ > <inline asm>:1:10: note: instantiated into assembly here > 1 | ear %r2,%r1 > | ^ > .../qemu/tests/tcg/s390x/lae.c:16:10: error: invalid operand for > instruction > 16 | "ear %[ar],%[r]\n" > | ^ > <inline asm>:3:9: note: instantiated into assembly here > 3 | ear %r0,%r1 > | ^ > .../qemu/tests/tcg/s390x/lae.c:17:10: error: invalid operand for > instruction > 17 | "sar %[r],%[tmp]" > | ^ > <inline asm>:4:5: note: instantiated into assembly here > 4 | sar %r1,%r2 > | ^ > 3 errors generated. > > Any suggestions how to fix it best? > > Thomas > clang wants %aN there, and I don't see a way to convert %rN to %aN. Seems like I'll have to hardcode the register number. I'll send a v2.
diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target index 0e670f3f8b9..30994dcf9c2 100644 --- a/tests/tcg/s390x/Makefile.target +++ b/tests/tcg/s390x/Makefile.target @@ -44,6 +44,7 @@ TESTS+=clgebr TESTS+=clc TESTS+=laalg TESTS+=add-logical-with-carry +TESTS+=lae cdsg: CFLAGS+=-pthread cdsg: LDFLAGS+=-pthread diff --git a/tests/tcg/s390x/lae.c b/tests/tcg/s390x/lae.c new file mode 100644 index 00000000000..661e95f9978 --- /dev/null +++ b/tests/tcg/s390x/lae.c @@ -0,0 +1,25 @@ +/* + * Test the LOAD ADDRESS EXTENDED instruction. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#include <assert.h> +#include <stdlib.h> + +int main(void) +{ + unsigned long long ar = -1, b2 = 100000, r, x2 = 500; + int tmp; + + asm("ear %[tmp],%[r]\n" + "lae %[r],42(%[x2],%[b2])\n" + "ear %[ar],%[r]\n" + "sar %[r],%[tmp]" + : [tmp] "=&r" (tmp), [r] "=&r" (r), [ar] "+r" (ar) + : [b2] "r" (b2), [x2] "r" (x2) + : "memory"); + assert(ar == 0xffffffff00000000ULL); + assert(r == 100542); + + return EXIT_SUCCESS; +}
Add a small test to prevent regressions. Userspace runs in primary mode, so LAE should always set the access register to 0. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> --- tests/tcg/s390x/Makefile.target | 1 + tests/tcg/s390x/lae.c | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 tests/tcg/s390x/lae.c