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