diff options
Diffstat (limited to 'toxencryptsave/crypto_pwhash_scryptsalsa208sha256/runtime.c')
-rw-r--r-- | toxencryptsave/crypto_pwhash_scryptsalsa208sha256/runtime.c | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/toxencryptsave/crypto_pwhash_scryptsalsa208sha256/runtime.c b/toxencryptsave/crypto_pwhash_scryptsalsa208sha256/runtime.c new file mode 100644 index 00000000..9b5c5131 --- /dev/null +++ b/toxencryptsave/crypto_pwhash_scryptsalsa208sha256/runtime.c | |||
@@ -0,0 +1,140 @@ | |||
1 | #ifdef HAVE_CONFIG_H | ||
2 | #include "config.h" | ||
3 | #endif | ||
4 | #ifdef VANILLA_NACL /* toxcore only uses this when libsodium is unavailable */ | ||
5 | |||
6 | #ifdef HAVE_ANDROID_GETCPUFEATURES | ||
7 | # include <cpu-features.h> | ||
8 | #endif | ||
9 | |||
10 | #include "runtime.h" | ||
11 | |||
12 | typedef struct CPUFeatures_ { | ||
13 | int initialized; | ||
14 | int has_neon; | ||
15 | int has_sse2; | ||
16 | int has_sse3; | ||
17 | } CPUFeatures; | ||
18 | |||
19 | static CPUFeatures _cpu_features; | ||
20 | |||
21 | #define CPUID_SSE2 0x04000000 | ||
22 | #define CPUIDECX_SSE3 0x00000001 | ||
23 | |||
24 | static int | ||
25 | _sodium_runtime_arm_cpu_features(CPUFeatures * const cpu_features) | ||
26 | { | ||
27 | #ifndef __arm__ | ||
28 | cpu_features->has_neon = 0; | ||
29 | return -1; | ||
30 | #else | ||
31 | # ifdef __APPLE__ | ||
32 | # ifdef __ARM_NEON__ | ||
33 | cpu_features->has_neon = 1; | ||
34 | # else | ||
35 | cpu_features->has_neon = 0; | ||
36 | # endif | ||
37 | # elif defined(HAVE_ANDROID_GETCPUFEATURES) && defined(ANDROID_CPU_ARM_FEATURE_NEON) | ||
38 | cpu_features->has_neon = | ||
39 | (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0x0; | ||
40 | # else | ||
41 | cpu_features->has_neon = 0; | ||
42 | # endif | ||
43 | return 0; | ||
44 | #endif | ||
45 | } | ||
46 | |||
47 | static void | ||
48 | _cpuid(unsigned int cpu_info[4U], const unsigned int cpu_info_type) | ||
49 | { | ||
50 | #ifdef _MSC_VER | ||
51 | __cpuidex((int *) cpu_info, cpu_info_type, 0); | ||
52 | #elif defined(HAVE_CPUID) | ||
53 | cpu_info[0] = cpu_info[1] = cpu_info[2] = cpu_info[3] = 0; | ||
54 | # ifdef __i386__ | ||
55 | __asm__ __volatile__ ("pushfl; pushfl; " | ||
56 | "popl %0; " | ||
57 | "movl %0, %1; xorl %2, %0; " | ||
58 | "pushl %0; " | ||
59 | "popfl; pushfl; popl %0; popfl" : | ||
60 | "=&r" (cpu_info[0]), "=&r" (cpu_info[1]) : | ||
61 | "i" (0x200000)); | ||
62 | if (((cpu_info[0] ^ cpu_info[1]) & 0x200000) == 0x0) { | ||
63 | return; | ||
64 | } | ||
65 | # endif | ||
66 | # ifdef __i386__ | ||
67 | __asm__ __volatile__ ("xchgl %%ebx, %k1; cpuid; xchgl %%ebx, %k1" : | ||
68 | "=a" (cpu_info[0]), "=&r" (cpu_info[1]), | ||
69 | "=c" (cpu_info[2]), "=d" (cpu_info[3]) : | ||
70 | "0" (cpu_info_type), "2" (0U)); | ||
71 | # elif defined(__x86_64__) | ||
72 | __asm__ __volatile__ ("xchgq %%rbx, %q1; cpuid; xchgq %%rbx, %q1" : | ||
73 | "=a" (cpu_info[0]), "=&r" (cpu_info[1]), | ||
74 | "=c" (cpu_info[2]), "=d" (cpu_info[3]) : | ||
75 | "0" (cpu_info_type), "2" (0U)); | ||
76 | # else | ||
77 | __asm__ __volatile__ ("cpuid" : | ||
78 | "=a" (cpu_info[0]), "=b" (cpu_info[1]), | ||
79 | "=c" (cpu_info[2]), "=d" (cpu_info[3]) : | ||
80 | "0" (cpu_info_type), "2" (0U)); | ||
81 | # endif | ||
82 | #else | ||
83 | cpu_info[0] = cpu_info[1] = cpu_info[2] = cpu_info[3] = 0; | ||
84 | #endif | ||
85 | } | ||
86 | |||
87 | static int | ||
88 | _sodium_runtime_intel_cpu_features(CPUFeatures * const cpu_features) | ||
89 | { | ||
90 | unsigned int cpu_info[4]; | ||
91 | unsigned int id; | ||
92 | |||
93 | _cpuid(cpu_info, 0x0); | ||
94 | if ((id = cpu_info[0]) == 0U) { | ||
95 | return -1; | ||
96 | } | ||
97 | _cpuid(cpu_info, 0x00000001); | ||
98 | #ifndef HAVE_EMMINTRIN_H | ||
99 | cpu_features->has_sse2 = 0; | ||
100 | #else | ||
101 | cpu_features->has_sse2 = ((cpu_info[3] & CPUID_SSE2) != 0x0); | ||
102 | #endif | ||
103 | |||
104 | #ifndef HAVE_PMMINTRIN_H | ||
105 | cpu_features->has_sse3 = 0; | ||
106 | #else | ||
107 | cpu_features->has_sse3 = ((cpu_info[2] & CPUIDECX_SSE3) != 0x0); | ||
108 | #endif | ||
109 | |||
110 | return 0; | ||
111 | } | ||
112 | |||
113 | int | ||
114 | sodium_runtime_get_cpu_features(void) | ||
115 | { | ||
116 | int ret = -1; | ||
117 | |||
118 | ret &= _sodium_runtime_arm_cpu_features(&_cpu_features); | ||
119 | ret &= _sodium_runtime_intel_cpu_features(&_cpu_features); | ||
120 | _cpu_features.initialized = 1; | ||
121 | |||
122 | return ret; | ||
123 | } | ||
124 | |||
125 | int | ||
126 | sodium_runtime_has_neon(void) { | ||
127 | return _cpu_features.has_neon; | ||
128 | } | ||
129 | |||
130 | int | ||
131 | sodium_runtime_has_sse2(void) { | ||
132 | return _cpu_features.has_sse2; | ||
133 | } | ||
134 | |||
135 | int | ||
136 | sodium_runtime_has_sse3(void) { | ||
137 | return _cpu_features.has_sse3; | ||
138 | } | ||
139 | |||
140 | #endif | ||