From 1ddfe2cc21e9509c8bd7e694b7515cce82f24025 Mon Sep 17 00:00:00 2001 From: Julian Seward Date: Wed, 13 Apr 2011 15:15:52 +0000 Subject: [PATCH] Test cases for #270082 (s390x: Make sure to point the PSW address to the next address on SIGILL) (Christian Borntraeger ) git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11694 --- none/tests/s390x/Makefile.am | 3 +- none/tests/s390x/op_exception.c | 38 +++++++++++++++++ none/tests/s390x/op_exception.stderr.exp | 54 ++++++++++++++++++++++++ none/tests/s390x/op_exception.stdout.exp | 2 + none/tests/s390x/op_exception.vgtest | 1 + 5 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 none/tests/s390x/op_exception.c create mode 100644 none/tests/s390x/op_exception.stderr.exp create mode 100644 none/tests/s390x/op_exception.stdout.exp create mode 100644 none/tests/s390x/op_exception.vgtest diff --git a/none/tests/s390x/Makefile.am b/none/tests/s390x/Makefile.am index 34c763bed5..a521449911 100644 --- a/none/tests/s390x/Makefile.am +++ b/none/tests/s390x/Makefile.am @@ -4,7 +4,8 @@ dist_noinst_SCRIPTS = filter_stderr INSN_TESTS = clc clcle cvb cvd icm lpr tcxb lam_stam xc mvst add sub mul \ and or xor insert div srst fold_And16 flogr sub_EI add_EI \ - and_EI or_EI xor_EI insert_EI mul_GE add_GE condloadstore + and_EI or_EI xor_EI insert_EI mul_GE add_GE condloadstore \ + op_exception check_PROGRAMS = $(INSN_TESTS) \ ex_sig \ diff --git a/none/tests/s390x/op_exception.c b/none/tests/s390x/op_exception.c new file mode 100644 index 0000000000..d6e8679685 --- /dev/null +++ b/none/tests/s390x/op_exception.c @@ -0,0 +1,38 @@ +/* zArchitecture specifies that operation exception(illegal opcode) is +suppressing. That means that the program check old psw will point to +the instruction after the illegal one (according to the calculated length). +There are some programs out there that use this mechanism to detect available +intruction (sigh). +This patch checks, that valgrind makes forard progress. */ +#include +#include +#include +static volatile int got_ill; +static void handle_ill(int sig) +{ + got_ill = 1; +} +int main() +{ + struct sigaction sa; + + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = handle_ill; + sigaction(SIGILL, &sa, NULL); + + got_ill = 0; + /* most architectures loop here, but on s390 this would increase the + PSW by 2 and then by 2 */ + asm volatile(".long 0\n"); + if (got_ill) + printf("0x00000000 does not loop\n"); + + got_ill = 0; + /* most architectures loop here, but on s390 this would increase the + PSW by 6 and then by 2*/ + asm volatile(".long 0xffffffff\n.long 0xffff0000\n"); + if (got_ill) + printf("0xffffffff does not loop\n"); + +} + diff --git a/none/tests/s390x/op_exception.stderr.exp b/none/tests/s390x/op_exception.stderr.exp new file mode 100644 index 0000000000..c76666888f --- /dev/null +++ b/none/tests/s390x/op_exception.stderr.exp @@ -0,0 +1,54 @@ + +vex s390->IR: unknown insn: 0000 +valgrind: Unrecognised instruction at address 0x......... + at 0x........: main (op_exception.c:23) +Your program just tried to execute an instruction that Valgrind +did not recognise. There are two possible reasons for this. +1. Your program has a bug and erroneously jumped to a non-code + location. If you are running Memcheck and you just saw a + warning about a bad jump, it's probably your program's fault. +2. The instruction is legitimate but Valgrind doesn't handle it, + i.e. it's Valgrind's fault. If you think this is the case or + you are not sure, please let us know and we'll try to fix it. +Either way, Valgrind will now raise a SIGILL signal which will +probably kill your program. +vex s390->IR: unknown insn: 0000 +valgrind: Unrecognised instruction at address 0x......... + at 0x........: main (op_exception.c:27) +Your program just tried to execute an instruction that Valgrind +did not recognise. There are two possible reasons for this. +1. Your program has a bug and erroneously jumped to a non-code + location. If you are running Memcheck and you just saw a + warning about a bad jump, it's probably your program's fault. +2. The instruction is legitimate but Valgrind doesn't handle it, + i.e. it's Valgrind's fault. If you think this is the case or + you are not sure, please let us know and we'll try to fix it. +Either way, Valgrind will now raise a SIGILL signal which will +probably kill your program. +vex s390->IR: unknown insn: FFFF FFFF FFFF +valgrind: Unrecognised instruction at address 0x......... + at 0x........: main (op_exception.c:30) +Your program just tried to execute an instruction that Valgrind +did not recognise. There are two possible reasons for this. +1. Your program has a bug and erroneously jumped to a non-code + location. If you are running Memcheck and you just saw a + warning about a bad jump, it's probably your program's fault. +2. The instruction is legitimate but Valgrind doesn't handle it, + i.e. it's Valgrind's fault. If you think this is the case or + you are not sure, please let us know and we'll try to fix it. +Either way, Valgrind will now raise a SIGILL signal which will +probably kill your program. +vex s390->IR: unknown insn: 0000 +valgrind: Unrecognised instruction at address 0x......... + at 0x........: main (op_exception.c:34) +Your program just tried to execute an instruction that Valgrind +did not recognise. There are two possible reasons for this. +1. Your program has a bug and erroneously jumped to a non-code + location. If you are running Memcheck and you just saw a + warning about a bad jump, it's probably your program's fault. +2. The instruction is legitimate but Valgrind doesn't handle it, + i.e. it's Valgrind's fault. If you think this is the case or + you are not sure, please let us know and we'll try to fix it. +Either way, Valgrind will now raise a SIGILL signal which will +probably kill your program. + diff --git a/none/tests/s390x/op_exception.stdout.exp b/none/tests/s390x/op_exception.stdout.exp new file mode 100644 index 0000000000..b6fcb3a14c --- /dev/null +++ b/none/tests/s390x/op_exception.stdout.exp @@ -0,0 +1,2 @@ +0x00000000 does not loop +0xffffffff does not loop diff --git a/none/tests/s390x/op_exception.vgtest b/none/tests/s390x/op_exception.vgtest new file mode 100644 index 0000000000..cbac49788e --- /dev/null +++ b/none/tests/s390x/op_exception.vgtest @@ -0,0 +1 @@ +prog: op_exception -- 2.47.2