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
2
#include <stdio.h>
3
3
#include <stdlib.h>
4
4
#include <string.h>
5
5
#include <setjmp.h>
6
6
#include <signal.h>
7
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
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
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
66
#if __ARM_ARCH__ >= 7
14
67
static sigset_t all_masked ;
15
68
@@ -28,10 +81,6 @@ void _armv8_sha256_probe(void);
28
81
void _armv8_pmull_probe (void );
29
82
#endif
30
83
31
- #if defined(__GNUC__ ) && __GNUC__ >=2
32
- void OPENSSL_cpuid_setup (void ) __attribute__((constructor ));
33
- #endif
34
-
35
84
void
36
85
OPENSSL_cpuid_setup (void )
37
86
{
@@ -86,3 +135,4 @@ OPENSSL_cpuid_setup(void)
86
135
sigprocmask (SIG_SETMASK , & oset , NULL );
87
136
#endif
88
137
}
138
+ #endif
0 commit comments