Skip to content

Commit 9eee69f

Browse files
committed
Add cpu_aarch64_netbsd
1 parent 39de584 commit 9eee69f

File tree

2 files changed

+68
-0
lines changed

2 files changed

+68
-0
lines changed

crypto/fipsmodule/bcm.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
#include "cpucap/cpu_aarch64_apple.c"
7979
#include "cpucap/cpu_aarch64_freebsd.c"
8080
#include "cpucap/cpu_aarch64_linux.c"
81+
#include "cpucap/cpu_aarch64_netbsd.c"
8182
#include "cpucap/cpu_aarch64_openbsd.c"
8283
#include "cpucap/cpu_aarch64_win.c"
8384
#include "cpucap/cpu_arm_freebsd.c"
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0 OR ISC
3+
4+
#include <openssl/cpu.h>
5+
6+
#if defined(OPENSSL_AARCH64) && defined(OPENSSL_NETBSD) && \
7+
!defined(OPENSSL_STATIC_ARMCAP)
8+
9+
#include <aarch64/armreg.h>
10+
#include <stdio.h>
11+
#include <sys/sysctl.h>
12+
13+
#include <openssl/arm_arch.h>
14+
15+
#include "internal.h"
16+
17+
void OPENSSL_cpuid_setup(void) {
18+
// Use sysctl to read ID_AA64ISAR0_EL1 register
19+
size_t len = sizeof(uint64_t);
20+
uint64_t id_aa64isar0 = 0;
21+
22+
// Try to read the aarch64 instruction set attribute register
23+
if (sysctlbyname("machdep.id_aa64isar0", &id_aa64isar0, &len, NULL, 0) < 0) {
24+
return;
25+
}
26+
27+
OPENSSL_armcap_P |= ARMV7_NEON;
28+
29+
30+
/*
31+
* The extractor macro ID_AA64ISAR0_EL1_AES(reg) gets the field value.
32+
* The constants for comparison are:
33+
* - ID_AA64ISAR0_EL1_AES (value 1, base AES)
34+
* - ID_AA64ISAR0_EL1_AES_PMUL (value 2, AES + PMULL)
35+
*/
36+
if (ID_AA64ISAR0_EL1_AES(id_aa64isar0) >= ID_AA64ISAR0_EL1_AES) {
37+
OPENSSL_armcap_P |= ARMV8_AES;
38+
}
39+
40+
if (ID_AA64ISAR0_EL1_AES(id_aa64isar0) >= ID_AA64ISAR0_EL1_AES_PMUL) {
41+
OPENSSL_armcap_P |= ARMV8_PMULL;
42+
}
43+
44+
/*
45+
* The extractor is ID_AA64ISAR0_EL1_SHA1(reg).
46+
* The constant for base support is ID_AA64ISAR0_EL1_SHA1 (value 1).
47+
*/
48+
if (ID_AA64ISAR0_EL1_SHA1(id_aa64isar0) >= ID_AA64ISAR0_EL1_SHA1) {
49+
OPENSSL_armcap_P |= ARMV8_SHA1;
50+
}
51+
52+
/*
53+
* The extractor is ID_AA64ISAR0_EL1_SHA2(reg).
54+
* The constants for comparison are:
55+
* - ID_AA64ISAR0_EL1_SHA2 (value 1, SHA256)
56+
* - ID_AA64ISAR0_EL1_SHA512 (value 2, SHA256 + SHA512)
57+
*/
58+
if (ID_AA64ISAR0_EL1_SHA2(id_aa64isar0) >= ID_AA64ISAR0_EL1_SHA2) {
59+
OPENSSL_armcap_P |= ARMV8_SHA256;
60+
}
61+
62+
if (ID_AA64ISAR0_EL1_SHA2(id_aa64isar0) >= ID_AA64ISAR0_EL1_SHA512) {
63+
OPENSSL_armcap_P |= ARMV8_SHA512;
64+
}
65+
}
66+
67+
#endif // OPENSSL_AARCH64 && OPENSSL_NETBSD && !OPENSSL_STATIC_ARMCAP

0 commit comments

Comments
 (0)