You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
1005 B
41 lines
1005 B
#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); |
|
}
|
|
|