diff options
author | djm <> | 2012-10-13 21:23:50 +0000 |
---|---|---|
committer | djm <> | 2012-10-13 21:23:50 +0000 |
commit | 228cae30b117c2493f69ad3c195341cd6ec8d430 (patch) | |
tree | 29ff00b10d52c0978077c4fd83c33b065bade73e /src/lib/libcrypto/armcap.c | |
parent | 731838c66b52c0ae5888333005b74115a620aa96 (diff) | |
download | openbsd-228cae30b117c2493f69ad3c195341cd6ec8d430.tar.gz openbsd-228cae30b117c2493f69ad3c195341cd6ec8d430.tar.bz2 openbsd-228cae30b117c2493f69ad3c195341cd6ec8d430.zip |
import OpenSSL-1.0.1c
Diffstat (limited to 'src/lib/libcrypto/armcap.c')
-rw-r--r-- | src/lib/libcrypto/armcap.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/lib/libcrypto/armcap.c b/src/lib/libcrypto/armcap.c new file mode 100644 index 0000000000..5258d2fbdd --- /dev/null +++ b/src/lib/libcrypto/armcap.c | |||
@@ -0,0 +1,80 @@ | |||
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 | |||
10 | unsigned int OPENSSL_armcap_P; | ||
11 | |||
12 | static sigset_t all_masked; | ||
13 | |||
14 | static sigjmp_buf ill_jmp; | ||
15 | static 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 | */ | ||
21 | void _armv7_neon_probe(void); | ||
22 | unsigned int _armv7_tick(void); | ||
23 | |||
24 | unsigned int OPENSSL_rdtsc(void) | ||
25 | { | ||
26 | if (OPENSSL_armcap_P|ARMV7_TICK) | ||
27 | return _armv7_tick(); | ||
28 | else | ||
29 | return 0; | ||
30 | } | ||
31 | |||
32 | #if defined(__GNUC__) && __GNUC__>=2 | ||
33 | void OPENSSL_cpuid_setup(void) __attribute__((constructor)); | ||
34 | #endif | ||
35 | void OPENSSL_cpuid_setup(void) | ||
36 | { | ||
37 | char *e; | ||
38 | struct sigaction ill_oact,ill_act; | ||
39 | sigset_t oset; | ||
40 | static int trigger=0; | ||
41 | |||
42 | if (trigger) return; | ||
43 | trigger=1; | ||
44 | |||
45 | if ((e=getenv("OPENSSL_armcap"))) | ||
46 | { | ||
47 | OPENSSL_armcap_P=strtoul(e,NULL,0); | ||
48 | return; | ||
49 | } | ||
50 | |||
51 | sigfillset(&all_masked); | ||
52 | sigdelset(&all_masked,SIGILL); | ||
53 | sigdelset(&all_masked,SIGTRAP); | ||
54 | sigdelset(&all_masked,SIGFPE); | ||
55 | sigdelset(&all_masked,SIGBUS); | ||
56 | sigdelset(&all_masked,SIGSEGV); | ||
57 | |||
58 | OPENSSL_armcap_P = 0; | ||
59 | |||
60 | memset(&ill_act,0,sizeof(ill_act)); | ||
61 | ill_act.sa_handler = ill_handler; | ||
62 | ill_act.sa_mask = all_masked; | ||
63 | |||
64 | sigprocmask(SIG_SETMASK,&ill_act.sa_mask,&oset); | ||
65 | sigaction(SIGILL,&ill_act,&ill_oact); | ||
66 | |||
67 | if (sigsetjmp(ill_jmp,1) == 0) | ||
68 | { | ||
69 | _armv7_neon_probe(); | ||
70 | OPENSSL_armcap_P |= ARMV7_NEON; | ||
71 | } | ||
72 | if (sigsetjmp(ill_jmp,1) == 0) | ||
73 | { | ||
74 | _armv7_tick(); | ||
75 | OPENSSL_armcap_P |= ARMV7_TICK; | ||
76 | } | ||
77 | |||
78 | sigaction (SIGILL,&ill_oact,NULL); | ||
79 | sigprocmask(SIG_SETMASK,&oset,NULL); | ||
80 | } | ||