1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov/* zArchitecture specifies that operation exception(illegal opcode) is
2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovsuppressing. That means that the program check old psw will point to
3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovthe instruction after the illegal one (according to the calculated length).
4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovThere are some programs out there that use this mechanism to detect available
5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovintruction (sigh).
6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy StepanovThis patch checks, that valgrind makes forard progress. */
7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <signal.h>
8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdio.h>
9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <string.h>
10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic volatile int got_ill;
11b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void handle_ill(int sig)
12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        got_ill = 1;
14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
15b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint main()
16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{
17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	struct sigaction sa;
18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	memset(&sa, 0, sizeof(sa));
20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	sa.sa_handler = handle_ill;
21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	sigaction(SIGILL, &sa, NULL);
22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	got_ill = 0;
24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	/* most architectures loop here, but on s390 this would increase the
25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	   PSW by 2 and then by 2 */
26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        asm volatile(".long 0\n");
27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if (got_ill)
28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                printf("0x00000000 does not loop\n");
29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	got_ill = 0;
31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	/* most architectures loop here, but on s390 this would increase the
32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	   PSW by 6 and then by 2*/
33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        asm volatile(".long 0xffffffff\n.long 0xffff0000\n");
34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov        if (got_ill)
35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov                printf("0xffffffff does not loop\n");
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov	return 0;
37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}
38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov
39