Message ID | 20220312092541.585282-4-iii@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Fix BRASL and BRCL with large negative offsets | expand |
On 3/12/22 01:25, Ilya Leoshkevich wrote: > Add a small test in order to prevent regressions. > > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> > --- > tests/tcg/s390x/Makefile.target | 1 + > tests/tcg/s390x/branch-relative-long.c | 60 ++++++++++++++++++++++++++ > 2 files changed, 61 insertions(+) > create mode 100644 tests/tcg/s390x/branch-relative-long.c > > diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target > index 257c568c58..fd34b130f7 100644 > --- a/tests/tcg/s390x/Makefile.target > +++ b/tests/tcg/s390x/Makefile.target > @@ -15,6 +15,7 @@ TESTS+=mvc > TESTS+=shift > TESTS+=trap > TESTS+=signals-s390x > +TESTS+=branch-relative-long > > ifneq ($(HAVE_GDB_BIN),) > GDB_SCRIPT=$(SRC_PATH)/tests/guest-debug/run-test.py > diff --git a/tests/tcg/s390x/branch-relative-long.c b/tests/tcg/s390x/branch-relative-long.c > new file mode 100644 > index 0000000000..c6f3f2db6d > --- /dev/null > +++ b/tests/tcg/s390x/branch-relative-long.c > @@ -0,0 +1,60 @@ > +#include <stddef.h> > +#include <stdio.h> > +#include <string.h> > +#include <sys/mman.h> > + > +#define DEFINE_ASM(_name, _code) \ > + extern const char _name[]; \ > + extern const char _name ## _end[]; \ > + asm(" .globl " #_name "\n" \ > + #_name ":\n" \ > + " " _code "\n" \ > + " .globl " #_name "_end\n" \ > + #_name "_end:\n"); > + > +DEFINE_ASM(br_r14, "br %r14"); > +DEFINE_ASM(brasl_r0, "brasl %r0,.-0x100000000"); > +DEFINE_ASM(brcl_0xf, "brcl 0xf,.-0x100000000"); > + > +struct test { > + const char *code; > + const char *code_end; > +}; > + > +static const struct test tests[] = { > + { > + .code = brasl_r0, > + .code_end = brasl_r0_end, > + }, > + { > + .code = brcl_0xf, > + .code_end = brcl_0xf_end, > + }, > +}; > + > +int main(void) > +{ > + size_t length = 0x100000006; This length is a little specific, given the apparent open-endedness of "code_end". Though of course we know that we'll get an entire page allocated for these 6 bytes so there's no real problem. I'm not actually sure what to suggest to improve this though. For the series: Reviewed-by: Richard Henderson <richard.henderson@linaro.org> r~ > + unsigned char *buf; > + void (*code)(void); > + size_t i; > + > + buf = mmap(NULL, length, PROT_READ | PROT_WRITE | PROT_EXEC, > + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); > + if (buf == MAP_FAILED) { > + perror("SKIP: mmap() failed"); > + return 0; > + } > + > + memcpy(buf, br_r14, br_r14_end - br_r14); > + for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) { > + code = (void *)(buf + 0x100000000); > + memcpy(code, tests[i].code, tests[i].code_end - tests[i].code); > + code(); > + memset(code, 0, tests[i].code_end - tests[i].code); > + } > + > + munmap(buf, length); > + > + return 0; > +}
On 12.03.22 10:25, Ilya Leoshkevich wrote: > Add a small test in order to prevent regressions. > > Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> > --- > tests/tcg/s390x/Makefile.target | 1 + > tests/tcg/s390x/branch-relative-long.c | 60 ++++++++++++++++++++++++++ > 2 files changed, 61 insertions(+) > create mode 100644 tests/tcg/s390x/branch-relative-long.c > > diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target > index 257c568c58..fd34b130f7 100644 > --- a/tests/tcg/s390x/Makefile.target > +++ b/tests/tcg/s390x/Makefile.target > @@ -15,6 +15,7 @@ TESTS+=mvc > TESTS+=shift > TESTS+=trap > TESTS+=signals-s390x > +TESTS+=branch-relative-long > > ifneq ($(HAVE_GDB_BIN),) > GDB_SCRIPT=$(SRC_PATH)/tests/guest-debug/run-test.py > diff --git a/tests/tcg/s390x/branch-relative-long.c b/tests/tcg/s390x/branch-relative-long.c > new file mode 100644 > index 0000000000..c6f3f2db6d > --- /dev/null > +++ b/tests/tcg/s390x/branch-relative-long.c > @@ -0,0 +1,60 @@ > +#include <stddef.h> > +#include <stdio.h> > +#include <string.h> > +#include <sys/mman.h> > + > +#define DEFINE_ASM(_name, _code) \ > + extern const char _name[]; \ > + extern const char _name ## _end[]; \ > + asm(" .globl " #_name "\n" \ > + #_name ":\n" \ > + " " _code "\n" \ > + " .globl " #_name "_end\n" \ > + #_name "_end:\n"); > + > +DEFINE_ASM(br_r14, "br %r14"); > +DEFINE_ASM(brasl_r0, "brasl %r0,.-0x100000000"); > +DEFINE_ASM(brcl_0xf, "brcl 0xf,.-0x100000000"); > + > +struct test { > + const char *code; > + const char *code_end; > +}; > + > +static const struct test tests[] = { > + { > + .code = brasl_r0, > + .code_end = brasl_r0_end, > + }, > + { > + .code = brcl_0xf, > + .code_end = brcl_0xf_end, > + }, > +}; > + > +int main(void) > +{ > + size_t length = 0x100000006; > + unsigned char *buf; > + void (*code)(void); > + size_t i; > + > + buf = mmap(NULL, length, PROT_READ | PROT_WRITE | PROT_EXEC, > + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); With MAP_NORESERVE Reviewed-by: David Hildenbrand <david@redhat.com> Thanks!
diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target index 257c568c58..fd34b130f7 100644 --- a/tests/tcg/s390x/Makefile.target +++ b/tests/tcg/s390x/Makefile.target @@ -15,6 +15,7 @@ TESTS+=mvc TESTS+=shift TESTS+=trap TESTS+=signals-s390x +TESTS+=branch-relative-long ifneq ($(HAVE_GDB_BIN),) GDB_SCRIPT=$(SRC_PATH)/tests/guest-debug/run-test.py diff --git a/tests/tcg/s390x/branch-relative-long.c b/tests/tcg/s390x/branch-relative-long.c new file mode 100644 index 0000000000..c6f3f2db6d --- /dev/null +++ b/tests/tcg/s390x/branch-relative-long.c @@ -0,0 +1,60 @@ +#include <stddef.h> +#include <stdio.h> +#include <string.h> +#include <sys/mman.h> + +#define DEFINE_ASM(_name, _code) \ + extern const char _name[]; \ + extern const char _name ## _end[]; \ + asm(" .globl " #_name "\n" \ + #_name ":\n" \ + " " _code "\n" \ + " .globl " #_name "_end\n" \ + #_name "_end:\n"); + +DEFINE_ASM(br_r14, "br %r14"); +DEFINE_ASM(brasl_r0, "brasl %r0,.-0x100000000"); +DEFINE_ASM(brcl_0xf, "brcl 0xf,.-0x100000000"); + +struct test { + const char *code; + const char *code_end; +}; + +static const struct test tests[] = { + { + .code = brasl_r0, + .code_end = brasl_r0_end, + }, + { + .code = brcl_0xf, + .code_end = brcl_0xf_end, + }, +}; + +int main(void) +{ + size_t length = 0x100000006; + unsigned char *buf; + void (*code)(void); + size_t i; + + buf = mmap(NULL, length, PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (buf == MAP_FAILED) { + perror("SKIP: mmap() failed"); + return 0; + } + + memcpy(buf, br_r14, br_r14_end - br_r14); + for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) { + code = (void *)(buf + 0x100000000); + memcpy(code, tests[i].code, tests[i].code_end - tests[i].code); + code(); + memset(code, 0, tests[i].code_end - tests[i].code); + } + + munmap(buf, length); + + return 0; +}
Add a small test in order to prevent regressions. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> --- tests/tcg/s390x/Makefile.target | 1 + tests/tcg/s390x/branch-relative-long.c | 60 ++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 tests/tcg/s390x/branch-relative-long.c