Alexandre Savard | 1b09e31 | 2012-08-07 20:33:29 -0400 | [diff] [blame] | 1 | #include <stdio.h> |
| 2 | #include <stdlib.h> |
| 3 | #include <string.h> |
| 4 | #include <setjmp.h> |
| 5 | #include <signal.h> |
| 6 | |
Alexandre Savard | 7541067 | 2012-08-08 09:50:01 -0400 | [diff] [blame] | 7 | extern unsigned long OPENSSL_s390xcap_P; |
Alexandre Savard | 1b09e31 | 2012-08-07 20:33:29 -0400 | [diff] [blame] | 8 | |
| 9 | static sigjmp_buf ill_jmp; |
| 10 | static void ill_handler (int sig) { siglongjmp(ill_jmp,sig); } |
| 11 | |
| 12 | unsigned long OPENSSL_s390x_facilities(void); |
| 13 | |
| 14 | void OPENSSL_cpuid_setup(void) |
| 15 | { |
| 16 | sigset_t oset; |
| 17 | struct sigaction ill_act,oact; |
| 18 | |
Alexandre Savard | 7541067 | 2012-08-08 09:50:01 -0400 | [diff] [blame] | 19 | if (OPENSSL_s390xcap_P) return; |
Alexandre Savard | 1b09e31 | 2012-08-07 20:33:29 -0400 | [diff] [blame] | 20 | |
| 21 | memset(&ill_act,0,sizeof(ill_act)); |
| 22 | ill_act.sa_handler = ill_handler; |
| 23 | sigfillset(&ill_act.sa_mask); |
| 24 | sigdelset(&ill_act.sa_mask,SIGILL); |
| 25 | sigdelset(&ill_act.sa_mask,SIGTRAP); |
| 26 | sigprocmask(SIG_SETMASK,&ill_act.sa_mask,&oset); |
| 27 | sigaction (SIGILL,&ill_act,&oact); |
| 28 | |
| 29 | /* protection against missing store-facility-list-extended */ |
Alexandre Savard | 7541067 | 2012-08-08 09:50:01 -0400 | [diff] [blame] | 30 | if (sigsetjmp(ill_jmp,0) == 0) |
| 31 | OPENSSL_s390xcap_P = OPENSSL_s390x_facilities(); |
| 32 | else |
| 33 | OPENSSL_s390xcap_P = 1UL<<63; |
Alexandre Savard | 1b09e31 | 2012-08-07 20:33:29 -0400 | [diff] [blame] | 34 | |
| 35 | sigaction (SIGILL,&oact,NULL); |
| 36 | sigprocmask(SIG_SETMASK,&oset,NULL); |
| 37 | } |