8#include <botan/internal/cpuid.h>
10#if defined(BOTAN_HAS_OS_UTILS)
11 #include <botan/internal/os_utils.h>
16#if defined(BOTAN_TARGET_ARCH_IS_ARM32)
18uint32_t CPUID::CPUID_Data::detect_cpu_features(uint32_t allowed) {
21 #if defined(BOTAN_HAS_OS_UTILS)
24 const auto [hwcap_neon, hwcap_crypto] = *auxval;
33 enum class ARM_hwcap_bit : uint64_t {
41 feat |=
if_set(hwcap_neon, ARM_hwcap_bit::NEON_bit, CPUID::CPUID_ARM_NEON_BIT, allowed);
43 if(feat & CPUID::CPUID_ARM_NEON_BIT) {
44 feat |=
if_set(hwcap_crypto, ARM_hwcap_bit::AES_bit, CPUID::CPUID_ARM_AES_BIT, allowed);
45 feat |=
if_set(hwcap_crypto, ARM_hwcap_bit::PMULL_bit, CPUID::CPUID_ARM_PMULL_BIT, allowed);
46 feat |=
if_set(hwcap_crypto, ARM_hwcap_bit::SHA1_bit, CPUID::CPUID_ARM_SHA1_BIT, allowed);
47 feat |=
if_set(hwcap_crypto, ARM_hwcap_bit::SHA2_bit, CPUID::CPUID_ARM_SHA2_BIT, allowed);
static uint32_t if_set(uint64_t cpuid, T flag, CPUID::CPUID_bits bit, uint32_t allowed)
std::optional< std::pair< unsigned long, unsigned long > > get_auxval_hwcap()