diff options
Diffstat (limited to 'src/lib/libcrypto/armcap.c')
-rw-r--r-- | src/lib/libcrypto/armcap.c | 70 |
1 files changed, 36 insertions, 34 deletions
diff --git a/src/lib/libcrypto/armcap.c b/src/lib/libcrypto/armcap.c index 9abaf396e5..0625587bdd 100644 --- a/src/lib/libcrypto/armcap.c +++ b/src/lib/libcrypto/armcap.c | |||
@@ -12,7 +12,8 @@ unsigned int OPENSSL_armcap_P; | |||
12 | static sigset_t all_masked; | 12 | static sigset_t all_masked; |
13 | 13 | ||
14 | static sigjmp_buf ill_jmp; | 14 | static sigjmp_buf ill_jmp; |
15 | static void ill_handler (int sig) { siglongjmp(ill_jmp,sig); } | 15 | static void ill_handler (int sig) { siglongjmp(ill_jmp, sig); |
16 | } | ||
16 | 17 | ||
17 | /* | 18 | /* |
18 | * Following subroutines could have been inlined, but it's not all | 19 | * Following subroutines could have been inlined, but it's not all |
@@ -21,60 +22,61 @@ static void ill_handler (int sig) { siglongjmp(ill_jmp,sig); } | |||
21 | void _armv7_neon_probe(void); | 22 | void _armv7_neon_probe(void); |
22 | unsigned int _armv7_tick(void); | 23 | unsigned int _armv7_tick(void); |
23 | 24 | ||
24 | unsigned int OPENSSL_rdtsc(void) | 25 | unsigned int |
25 | { | 26 | OPENSSL_rdtsc(void) |
27 | { | ||
26 | if (OPENSSL_armcap_P & ARMV7_TICK) | 28 | if (OPENSSL_armcap_P & ARMV7_TICK) |
27 | return _armv7_tick(); | 29 | return _armv7_tick(); |
28 | else | 30 | else |
29 | return 0; | 31 | return 0; |
30 | } | 32 | } |
31 | 33 | ||
32 | #if defined(__GNUC__) && __GNUC__>=2 | 34 | #if defined(__GNUC__) && __GNUC__>=2 |
33 | void OPENSSL_cpuid_setup(void) __attribute__((constructor)); | 35 | void OPENSSL_cpuid_setup(void) __attribute__((constructor)); |
34 | #endif | 36 | #endif |
35 | void OPENSSL_cpuid_setup(void) | 37 | |
36 | { | 38 | void |
39 | OPENSSL_cpuid_setup(void) | ||
40 | { | ||
37 | char *e; | 41 | char *e; |
38 | struct sigaction ill_oact,ill_act; | 42 | struct sigaction ill_oact, ill_act; |
39 | sigset_t oset; | 43 | sigset_t oset; |
40 | static int trigger=0; | 44 | static int trigger = 0; |
41 | 45 | ||
42 | if (trigger) return; | 46 | if (trigger) |
43 | trigger=1; | ||
44 | |||
45 | if ((e=getenv("OPENSSL_armcap"))) | ||
46 | { | ||
47 | OPENSSL_armcap_P=strtoul(e,NULL,0); | ||
48 | return; | 47 | return; |
49 | } | 48 | trigger = 1; |
49 | |||
50 | if ((e = getenv("OPENSSL_armcap"))) { | ||
51 | OPENSSL_armcap_P = strtoul(e, NULL, 0); | ||
52 | return; | ||
53 | } | ||
50 | 54 | ||
51 | sigfillset(&all_masked); | 55 | sigfillset(&all_masked); |
52 | sigdelset(&all_masked,SIGILL); | 56 | sigdelset(&all_masked, SIGILL); |
53 | sigdelset(&all_masked,SIGTRAP); | 57 | sigdelset(&all_masked, SIGTRAP); |
54 | sigdelset(&all_masked,SIGFPE); | 58 | sigdelset(&all_masked, SIGFPE); |
55 | sigdelset(&all_masked,SIGBUS); | 59 | sigdelset(&all_masked, SIGBUS); |
56 | sigdelset(&all_masked,SIGSEGV); | 60 | sigdelset(&all_masked, SIGSEGV); |
57 | 61 | ||
58 | OPENSSL_armcap_P = 0; | 62 | OPENSSL_armcap_P = 0; |
59 | 63 | ||
60 | memset(&ill_act,0,sizeof(ill_act)); | 64 | memset(&ill_act, 0, sizeof(ill_act)); |
61 | ill_act.sa_handler = ill_handler; | 65 | ill_act.sa_handler = ill_handler; |
62 | ill_act.sa_mask = all_masked; | 66 | ill_act.sa_mask = all_masked; |
63 | 67 | ||
64 | sigprocmask(SIG_SETMASK,&ill_act.sa_mask,&oset); | 68 | sigprocmask(SIG_SETMASK, &ill_act.sa_mask, &oset); |
65 | sigaction(SIGILL,&ill_act,&ill_oact); | 69 | sigaction(SIGILL, &ill_act, &ill_oact); |
66 | 70 | ||
67 | if (sigsetjmp(ill_jmp,1) == 0) | 71 | if (sigsetjmp(ill_jmp, 1) == 0) { |
68 | { | ||
69 | _armv7_neon_probe(); | 72 | _armv7_neon_probe(); |
70 | OPENSSL_armcap_P |= ARMV7_NEON; | 73 | OPENSSL_armcap_P |= ARMV7_NEON; |
71 | } | 74 | } |
72 | if (sigsetjmp(ill_jmp,1) == 0) | 75 | if (sigsetjmp(ill_jmp, 1) == 0) { |
73 | { | ||
74 | _armv7_tick(); | 76 | _armv7_tick(); |
75 | OPENSSL_armcap_P |= ARMV7_TICK; | 77 | OPENSSL_armcap_P |= ARMV7_TICK; |
76 | } | ||
77 | |||
78 | sigaction (SIGILL,&ill_oact,NULL); | ||
79 | sigprocmask(SIG_SETMASK,&oset,NULL); | ||
80 | } | 78 | } |
79 | |||
80 | sigaction (SIGILL, &ill_oact, NULL); | ||
81 | sigprocmask(SIG_SETMASK, &oset, NULL); | ||
82 | } | ||