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