diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/libcrypto/arch/aarch64/arm64cap.c | 60 |
1 files changed, 55 insertions, 5 deletions
diff --git a/src/lib/libcrypto/arch/aarch64/arm64cap.c b/src/lib/libcrypto/arch/aarch64/arm64cap.c index b541ac31b9..9d75daba0b 100644 --- a/src/lib/libcrypto/arch/aarch64/arm64cap.c +++ b/src/lib/libcrypto/arch/aarch64/arm64cap.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: arm64cap.c,v 1.1 2022/03/23 15:13:31 tb Exp $ */ | 1 | /* $OpenBSD: arm64cap.c,v 1.2 2022/03/25 17:42:07 robert Exp $ */ |
2 | #include <stdio.h> | 2 | #include <stdio.h> |
3 | #include <stdlib.h> | 3 | #include <stdlib.h> |
4 | #include <string.h> | 4 | #include <string.h> |
@@ -6,10 +6,63 @@ | |||
6 | #include <signal.h> | 6 | #include <signal.h> |
7 | #include <openssl/crypto.h> | 7 | #include <openssl/crypto.h> |
8 | 8 | ||
9 | #if defined(__OpenBSD__) | ||
10 | #include <sys/sysctl.h> | ||
11 | #include <machine/cpu.h> /* CPU_ID_AA64ISAR0 */ | ||
12 | #endif | ||
13 | |||
9 | #include "arm64_arch.h" | 14 | #include "arm64_arch.h" |
10 | 15 | ||
16 | /* ID_AA64ISAR0_EL1 required for OPENSSL_cpuid_setup */ | ||
17 | #define ID_AA64ISAR0_AES_SHIFT 4 | ||
18 | #define ID_AA64ISAR0_AES_MASK (0xf << ID_AA64ISAR0_AES_SHIFT) | ||
19 | #define ID_AA64ISAR0_AES(x) ((x) & ID_AA64ISAR0_AES_MASK) | ||
20 | #define ID_AA64ISAR0_AES_BASE (0x1 << ID_AA64ISAR0_AES_SHIFT) | ||
21 | #define ID_AA64ISAR0_AES_PMULL (0x2 << ID_AA64ISAR0_AES_SHIFT) | ||
22 | #define ID_AA64ISAR0_SHA1_SHIFT 8 | ||
23 | #define ID_AA64ISAR0_SHA1_MASK (0xf << ID_AA64ISAR0_SHA1_SHIFT) | ||
24 | #define ID_AA64ISAR0_SHA1(x) ((x) & ID_AA64ISAR0_SHA1_MASK) | ||
25 | #define ID_AA64ISAR0_SHA1_BASE (0x1 << ID_AA64ISAR0_SHA1_SHIFT) | ||
26 | #define ID_AA64ISAR0_SHA2_SHIFT 12 | ||
27 | #define ID_AA64ISAR0_SHA2_MASK (0xf << ID_AA64ISAR0_SHA2_SHIFT) | ||
28 | #define ID_AA64ISAR0_SHA2(x) ((x) & ID_AA64ISAR0_SHA2_MASK) | ||
29 | #define ID_AA64ISAR0_SHA2_BASE (0x1 << ID_AA64ISAR0_SHA2_SHIFT) | ||
30 | |||
11 | unsigned int OPENSSL_armcap_P; | 31 | unsigned int OPENSSL_armcap_P; |
12 | 32 | ||
33 | #if defined(__GNUC__) && __GNUC__ >= 2 | ||
34 | void OPENSSL_cpuid_setup(void) __attribute__((constructor)); | ||
35 | #endif | ||
36 | |||
37 | #if defined(CPU_ID_AA64ISAR0) | ||
38 | void | ||
39 | OPENSSL_cpuid_setup(void) | ||
40 | { | ||
41 | int isar0_mib[] = { CTL_MACHDEP, CPU_ID_AA64ISAR0 }; | ||
42 | size_t len = sizeof(uint64_t); | ||
43 | uint64_t cpu_id = 0; | ||
44 | |||
45 | if (OPENSSL_armcap_P != 0) | ||
46 | return; | ||
47 | |||
48 | if (sysctl(isar0_mib, 2, &cpu_id, &len, NULL, 0) < 0) | ||
49 | return; | ||
50 | |||
51 | OPENSSL_armcap_P |= ARMV7_NEON; | ||
52 | |||
53 | if (ID_AA64ISAR0_AES(cpu_id) >= ID_AA64ISAR0_AES_BASE) | ||
54 | OPENSSL_armcap_P |= ARMV8_AES; | ||
55 | |||
56 | if (ID_AA64ISAR0_AES(cpu_id) >= ID_AA64ISAR0_AES_PMULL) | ||
57 | OPENSSL_armcap_P |= ARMV8_PMULL; | ||
58 | |||
59 | if (ID_AA64ISAR0_SHA1(cpu_id) >= ID_AA64ISAR0_SHA1_BASE) | ||
60 | OPENSSL_armcap_P |= ARMV8_SHA1; | ||
61 | |||
62 | if (ID_AA64ISAR0_SHA2(cpu_id) >= ID_AA64ISAR0_SHA2_BASE) | ||
63 | OPENSSL_armcap_P |= ARMV8_SHA256; | ||
64 | } | ||
65 | #else | ||
13 | #if __ARM_ARCH__ >= 7 | 66 | #if __ARM_ARCH__ >= 7 |
14 | static sigset_t all_masked; | 67 | static sigset_t all_masked; |
15 | 68 | ||
@@ -28,10 +81,6 @@ void _armv8_sha256_probe(void); | |||
28 | void _armv8_pmull_probe(void); | 81 | void _armv8_pmull_probe(void); |
29 | #endif | 82 | #endif |
30 | 83 | ||
31 | #if defined(__GNUC__) && __GNUC__>=2 | ||
32 | void OPENSSL_cpuid_setup(void) __attribute__((constructor)); | ||
33 | #endif | ||
34 | |||
35 | void | 84 | void |
36 | OPENSSL_cpuid_setup(void) | 85 | OPENSSL_cpuid_setup(void) |
37 | { | 86 | { |
@@ -86,3 +135,4 @@ OPENSSL_cpuid_setup(void) | |||
86 | sigprocmask(SIG_SETMASK, &oset, NULL); | 135 | sigprocmask(SIG_SETMASK, &oset, NULL); |
87 | #endif | 136 | #endif |
88 | } | 137 | } |
138 | #endif | ||