]> git.ipfire.org Git - thirdparty/openssl.git/blame - crypto/armcap.c
Merge branch 'erbridge-probable_primes'
[thirdparty/openssl.git] / crypto / armcap.c
CommitLineData
87873f43
AP
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <setjmp.h>
5#include <signal.h>
6#include <crypto.h>
7
8#include "arm_arch.h"
9
10unsigned int OPENSSL_armcap_P;
11
12static sigset_t all_masked;
13
14static sigjmp_buf ill_jmp;
15static void ill_handler (int sig) { siglongjmp(ill_jmp,sig); }
16
17/*
18 * Following subroutines could have been inlined, but it's not all
19 * ARM compilers support inline assembler...
20 */
21void _armv7_neon_probe(void);
4afa9f03
AP
22void _armv8_aes_probe(void);
23void _armv8_sha1_probe(void);
24void _armv8_sha256_probe(void);
25void _armv8_pmull_probe(void);
87873f43
AP
26unsigned int _armv7_tick(void);
27
28unsigned int OPENSSL_rdtsc(void)
29 {
8e52a906 30 if (OPENSSL_armcap_P & ARMV7_TICK)
87873f43
AP
31 return _armv7_tick();
32 else
33 return 0;
34 }
35
033a25ce 36#if defined(__GNUC__) && __GNUC__>=2
482cdf24 37void OPENSSL_cpuid_setup(void) __attribute__((constructor));
033a25ce 38#endif
87873f43
AP
39void OPENSSL_cpuid_setup(void)
40 {
41 char *e;
42 struct sigaction ill_oact,ill_act;
43 sigset_t oset;
44 static int trigger=0;
45
46 if (trigger) return;
47 trigger=1;
48
49 if ((e=getenv("OPENSSL_armcap")))
50 {
51 OPENSSL_armcap_P=strtoul(e,NULL,0);
52 return;
53 }
54
55 sigfillset(&all_masked);
56 sigdelset(&all_masked,SIGILL);
57 sigdelset(&all_masked,SIGTRAP);
58 sigdelset(&all_masked,SIGFPE);
59 sigdelset(&all_masked,SIGBUS);
60 sigdelset(&all_masked,SIGSEGV);
61
62 OPENSSL_armcap_P = 0;
63
64 memset(&ill_act,0,sizeof(ill_act));
65 ill_act.sa_handler = ill_handler;
66 ill_act.sa_mask = all_masked;
67
68 sigprocmask(SIG_SETMASK,&ill_act.sa_mask,&oset);
69 sigaction(SIGILL,&ill_act,&ill_oact);
70
71 if (sigsetjmp(ill_jmp,1) == 0)
72 {
73 _armv7_neon_probe();
74 OPENSSL_armcap_P |= ARMV7_NEON;
4afa9f03
AP
75 if (sigsetjmp(ill_jmp,1) == 0)
76 {
77 _armv8_aes_probe();
78 OPENSSL_armcap_P |= ARMV8_AES;
79 }
80 if (sigsetjmp(ill_jmp,1) == 0)
81 {
82 _armv8_sha1_probe();
83 OPENSSL_armcap_P |= ARMV8_SHA1;
84 }
85 if (sigsetjmp(ill_jmp,1) == 0)
86 {
87 _armv8_sha256_probe();
88 OPENSSL_armcap_P |= ARMV8_SHA256;
89 }
90 if (sigsetjmp(ill_jmp,1) == 0)
91 {
92 _armv8_pmull_probe();
93 OPENSSL_armcap_P |= ARMV8_PMULL;
94 }
87873f43
AP
95 }
96 if (sigsetjmp(ill_jmp,1) == 0)
97 {
98 _armv7_tick();
99 OPENSSL_armcap_P |= ARMV7_TICK;
100 }
101
102 sigaction (SIGILL,&ill_oact,NULL);
103 sigprocmask(SIG_SETMASK,&oset,NULL);
104 }