Message ID | 20230703155801.179167-13-iii@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | target/s390x: Miscellaneous TCG fixes | expand |
On 03.07.23 17:50, Ilya Leoshkevich wrote: > Add a small test to prevent regressions. > > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> > --- > tests/tcg/s390x/mie3-mvcrl.c | 46 ++++++++++++++++++++++++++++-------- > 1 file changed, 36 insertions(+), 10 deletions(-) > > diff --git a/tests/tcg/s390x/mie3-mvcrl.c b/tests/tcg/s390x/mie3-mvcrl.c > index 93c7b0a2903..ec78dd1d493 100644 > --- a/tests/tcg/s390x/mie3-mvcrl.c > +++ b/tests/tcg/s390x/mie3-mvcrl.c > @@ -1,29 +1,55 @@ > +#include <stdbool.h> > #include <stdint.h> > +#include <stdlib.h> > #include <string.h> > > - > -static inline void mvcrl_8(const char *dst, const char *src) > +static void mvcrl(const char *dst, const char *src, size_t len) > { > + register long r0 asm("r0") = len; > + > asm volatile ( > - "llill %%r0, 8\n" > ".insn sse, 0xE50A00000000, 0(%[dst]), 0(%[src])" > - : : [dst] "d" (dst), [src] "d" (src) > - : "r0", "memory"); > + : : [dst] "d" (dst), [src] "d" (src), "r" (r0) > + : "memory"); > } > > - > -int main(int argc, char *argv[]) > +static bool test(void) > { > const char *alpha = "abcdefghijklmnop"; > > /* array missing 'i' */ > - char tstr[17] = "abcdefghjklmnop\0" ; > + char tstr[17] = "abcdefghjklmnop\0"; > > /* mvcrl reference use: 'open a hole in an array' */ > - mvcrl_8(tstr + 9, tstr + 8); > + mvcrl(tstr + 9, tstr + 8, 8); > > /* place missing 'i' */ > tstr[8] = 'i'; > > - return strncmp(alpha, tstr, 16ul); > + return strncmp(alpha, tstr, 16ul) == 0; > +} > + > +static bool test_bad_r0(void) > +{ > + char src[256]; > + > + /* > + * PoP says: Bits 32-55 of general register 0 should contain zeros; > + * otherwise, the program may not operate compatibly in the future. > + * > + * Try it anyway in order to check whether this would crash QEMU itself. > + */ > + mvcrl(src, src, (size_t)-1); > + > + return true; > +} > + > +int main(void) > +{ > + bool ok = true; > + > + ok &= test(); > + ok &= test_bad_r0(); > + > + return ok ? EXIT_SUCCESS : EXIT_FAILURE; > } Reviewed-by: David Hildenbrand <david@redhat.com>
diff --git a/tests/tcg/s390x/mie3-mvcrl.c b/tests/tcg/s390x/mie3-mvcrl.c index 93c7b0a2903..ec78dd1d493 100644 --- a/tests/tcg/s390x/mie3-mvcrl.c +++ b/tests/tcg/s390x/mie3-mvcrl.c @@ -1,29 +1,55 @@ +#include <stdbool.h> #include <stdint.h> +#include <stdlib.h> #include <string.h> - -static inline void mvcrl_8(const char *dst, const char *src) +static void mvcrl(const char *dst, const char *src, size_t len) { + register long r0 asm("r0") = len; + asm volatile ( - "llill %%r0, 8\n" ".insn sse, 0xE50A00000000, 0(%[dst]), 0(%[src])" - : : [dst] "d" (dst), [src] "d" (src) - : "r0", "memory"); + : : [dst] "d" (dst), [src] "d" (src), "r" (r0) + : "memory"); } - -int main(int argc, char *argv[]) +static bool test(void) { const char *alpha = "abcdefghijklmnop"; /* array missing 'i' */ - char tstr[17] = "abcdefghjklmnop\0" ; + char tstr[17] = "abcdefghjklmnop\0"; /* mvcrl reference use: 'open a hole in an array' */ - mvcrl_8(tstr + 9, tstr + 8); + mvcrl(tstr + 9, tstr + 8, 8); /* place missing 'i' */ tstr[8] = 'i'; - return strncmp(alpha, tstr, 16ul); + return strncmp(alpha, tstr, 16ul) == 0; +} + +static bool test_bad_r0(void) +{ + char src[256]; + + /* + * PoP says: Bits 32-55 of general register 0 should contain zeros; + * otherwise, the program may not operate compatibly in the future. + * + * Try it anyway in order to check whether this would crash QEMU itself. + */ + mvcrl(src, src, (size_t)-1); + + return true; +} + +int main(void) +{ + bool ok = true; + + ok &= test(); + ok &= test_bad_r0(); + + return ok ? EXIT_SUCCESS : EXIT_FAILURE; }
Add a small test to prevent regressions. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> --- tests/tcg/s390x/mie3-mvcrl.c | 46 ++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 10 deletions(-)