1221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <stdio.h> 2221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <stdlib.h> 3221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <string.h> 4221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <setjmp.h> 5221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#include <signal.h> 6221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 7392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromextern unsigned long OPENSSL_s390xcap_P[]; 8221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 9221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic sigjmp_buf ill_jmp; 10221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void ill_handler (int sig) { siglongjmp(ill_jmp,sig); } 11221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 12221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromunsigned long OPENSSL_s390x_facilities(void); 13221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 14221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid OPENSSL_cpuid_setup(void) 15221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 16221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sigset_t oset; 17221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom struct sigaction ill_act,oact; 18221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 19392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (OPENSSL_s390xcap_P[0]) return; 20392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 21392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_s390xcap_P[0] = 1UL<<(8*sizeof(unsigned long)-1); 22221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 23221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom memset(&ill_act,0,sizeof(ill_act)); 24221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ill_act.sa_handler = ill_handler; 25221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sigfillset(&ill_act.sa_mask); 26221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sigdelset(&ill_act.sa_mask,SIGILL); 27221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sigdelset(&ill_act.sa_mask,SIGTRAP); 28221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sigprocmask(SIG_SETMASK,&ill_act.sa_mask,&oset); 29221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sigaction (SIGILL,&ill_act,&oact); 30221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 31221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* protection against missing store-facility-list-extended */ 32392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (sigsetjmp(ill_jmp,1) == 0) 33392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom OPENSSL_s390x_facilities(); 34221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 35221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sigaction (SIGILL,&oact,NULL); 36221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sigprocmask(SIG_SETMASK,&oset,NULL); 37221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 38