]>
git.ipfire.org Git - thirdparty/openssl.git/blob - crypto/armcap.c
10 unsigned int OPENSSL_armcap_P
;
12 static sigset_t all_masked
;
14 static sigjmp_buf ill_jmp
;
15 static void ill_handler (int sig
) { siglongjmp(ill_jmp
,sig
); }
18 * Following subroutines could have been inlined, but it's not all
19 * ARM compilers support inline assembler...
21 void _armv7_neon_probe(void);
22 unsigned int _armv7_tick(void);
24 unsigned int OPENSSL_rdtsc(void)
26 if (OPENSSL_armcap_P
|ARMV7_TICK
)
32 void OPENSSL_cpuid_setup(void)
35 struct sigaction ill_oact
,ill_act
;
42 if ((e
=getenv("OPENSSL_armcap")))
44 OPENSSL_armcap_P
=strtoul(e
,NULL
,0);
48 sigfillset(&all_masked
);
49 sigdelset(&all_masked
,SIGILL
);
50 sigdelset(&all_masked
,SIGTRAP
);
51 sigdelset(&all_masked
,SIGFPE
);
52 sigdelset(&all_masked
,SIGBUS
);
53 sigdelset(&all_masked
,SIGSEGV
);
57 memset(&ill_act
,0,sizeof(ill_act
));
58 ill_act
.sa_handler
= ill_handler
;
59 ill_act
.sa_mask
= all_masked
;
61 sigprocmask(SIG_SETMASK
,&ill_act
.sa_mask
,&oset
);
62 sigaction(SIGILL
,&ill_act
,&ill_oact
);
64 if (sigsetjmp(ill_jmp
,1) == 0)
67 OPENSSL_armcap_P
|= ARMV7_NEON
;
69 if (sigsetjmp(ill_jmp
,1) == 0)
72 OPENSSL_armcap_P
|= ARMV7_TICK
;
75 sigaction (SIGILL
,&ill_oact
,NULL
);
76 sigprocmask(SIG_SETMASK
,&oset
,NULL
);