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