| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <setjmp.h> |
| #include <signal.h> |
| |
| extern unsigned long OPENSSL_s390xcap_P[]; |
| |
| static sigjmp_buf ill_jmp; |
| static void ill_handler (int sig) { siglongjmp(ill_jmp,sig); } |
| |
| unsigned long OPENSSL_s390x_facilities(void); |
| |
| void OPENSSL_cpuid_setup(void) |
| { |
| sigset_t oset; |
| struct sigaction ill_act,oact; |
| |
| if (OPENSSL_s390xcap_P[0]) return; |
| |
| OPENSSL_s390xcap_P[0] = 1UL<<(8*sizeof(unsigned long)-1); |
| |
| memset(&ill_act,0,sizeof(ill_act)); |
| ill_act.sa_handler = ill_handler; |
| sigfillset(&ill_act.sa_mask); |
| sigdelset(&ill_act.sa_mask,SIGILL); |
| sigdelset(&ill_act.sa_mask,SIGTRAP); |
| sigprocmask(SIG_SETMASK,&ill_act.sa_mask,&oset); |
| sigaction (SIGILL,&ill_act,&oact); |
| |
| /* protection against missing store-facility-list-extended */ |
| if (sigsetjmp(ill_jmp,1) == 0) |
| OPENSSL_s390x_facilities(); |
| |
| sigaction (SIGILL,&oact,NULL); |
| sigprocmask(SIG_SETMASK,&oset,NULL); |
| } |