From c18bd81071bf0807e1bd40d7e2dd34293f50bc50 Mon Sep 17 00:00:00 2001 From: naddy <> Date: Tue, 4 Aug 2026 21:21:26 +0000 Subject: switch aarch64 CPU feature detection to elf_aux_info() ok kettenis@ tb@ --- src/lib/libcrypto/arch/aarch64/crypto_cpu_caps.c | 82 ++++++------------------ 1 file changed, 19 insertions(+), 63 deletions(-) diff --git a/src/lib/libcrypto/arch/aarch64/crypto_cpu_caps.c b/src/lib/libcrypto/arch/aarch64/crypto_cpu_caps.c index b31a50ef75..4b0074df51 100644 --- a/src/lib/libcrypto/arch/aarch64/crypto_cpu_caps.c +++ b/src/lib/libcrypto/arch/aarch64/crypto_cpu_caps.c @@ -1,4 +1,4 @@ -/* $OpenBSD: crypto_cpu_caps.c,v 1.2 2024/11/12 13:52:31 jsing Exp $ */ +/* $OpenBSD: crypto_cpu_caps.c,v 1.3 2026/08/04 21:21:26 naddy Exp $ */ /* * Copyright (c) 2023 Joel Sing * @@ -15,10 +15,7 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include -#include - -#include +#include #include #include @@ -28,70 +25,29 @@ /* Machine dependent CPU capabilities. */ uint64_t crypto_cpu_caps_aarch64; -static inline uint64_t -extract_bits(uint64_t val, int start, int end) -{ - return (val >> end) & (1ULL << (1 + start - end)) - 1; -} - -static uint64_t -parse_isar0(uint64_t isar0) +void +crypto_cpu_caps_init(void) { - uint64_t caps = 0; - uint64_t feature; - - /* AES - bits [7:4] */ - feature = extract_bits(isar0, 7, 4); - if (feature >= 1) - caps |= CRYPTO_CPU_CAPS_AARCH64_AES; - if (feature >= 2) - caps |= CRYPTO_CPU_CAPS_AARCH64_PMULL; - - /* SHA1 - bits [11:8] */ - feature = extract_bits(isar0, 11, 8); - if (feature >= 1) - caps |= CRYPTO_CPU_CAPS_AARCH64_SHA1; - - /* SHA2 - bits [15:12] */ - feature = extract_bits(isar0, 15, 12); - if (feature >= 1) - caps |= CRYPTO_CPU_CAPS_AARCH64_SHA2; - if (feature >= 2) - caps |= CRYPTO_CPU_CAPS_AARCH64_SHA512; - - /* SHA3 - bits [35:32] */ - feature = extract_bits(isar0, 35, 32); - if (feature >= 1) - caps |= CRYPTO_CPU_CAPS_AARCH64_SHA3; + unsigned long hwcap; - return caps; -} + if (elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap)) != 0) + return; -static int -read_isar0(uint64_t *isar0) -{ - uint64_t isar; - int mib[2]; - size_t len; + if (hwcap & HWCAP_AES) + crypto_cpu_caps_aarch64 |= CRYPTO_CPU_CAPS_AARCH64_AES; - mib[0] = CTL_MACHDEP; - mib[1] = CPU_ID_AA64ISAR0; - len = sizeof(isar); - if (sysctl(mib, 2, &isar, &len, NULL, 0) == -1) - return 0; + if (hwcap & HWCAP_PMULL) + crypto_cpu_caps_aarch64 |= CRYPTO_CPU_CAPS_AARCH64_PMULL; - *isar0 = isar; + if (hwcap & HWCAP_SHA1) + crypto_cpu_caps_aarch64 |= CRYPTO_CPU_CAPS_AARCH64_SHA1; - return 1; -} + if (hwcap & HWCAP_SHA2) + crypto_cpu_caps_aarch64 |= CRYPTO_CPU_CAPS_AARCH64_SHA2; -void -crypto_cpu_caps_init(void) -{ - uint64_t isar = 0; - - if (!read_isar0(&isar)) - return; + if (hwcap & HWCAP_SHA512) + crypto_cpu_caps_aarch64 |= CRYPTO_CPU_CAPS_AARCH64_SHA512; - crypto_cpu_caps_aarch64 = parse_isar0(isar); + if (hwcap & HWCAP_SHA3) + crypto_cpu_caps_aarch64 |= CRYPTO_CPU_CAPS_AARCH64_SHA3; } -- cgit v1.2.3-55-g6feb