#include "precomp.h"
#if SYMCRYPT_CPU_ARM64 && SYMCRYPT_PLATFORM_WINDOWS
#undef UNREFERENCED_PARAMETER
#include <processthreadsapi.h>
#define PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE 30
VOID
SYMCRYPT_CALL
SymCryptDetectCpuFeaturesFromIsProcessorFeaturePresent(void)
{
if( IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) )
{
g_SymCryptCpuFeaturesNotPresent = (SYMCRYPT_CPU_FEATURES) ~(
SYMCRYPT_CPU_FEATURE_NEON |
SYMCRYPT_CPU_FEATURE_NEON_AES |
SYMCRYPT_CPU_FEATURE_NEON_PMULL |
SYMCRYPT_CPU_FEATURE_NEON_SHA256
);
} else {
g_SymCryptCpuFeaturesNotPresent = (SYMCRYPT_CPU_FEATURES) ~SYMCRYPT_CPU_FEATURE_NEON;
}
}
#elif SYMCRYPT_CPU_ARM64 && SYMCRYPT_GNUC
#if SYMCRYPT_PLATFORM_APPLE
#include <sys/sysctl.h>
VOID
SYMCRYPT_CALL
SymCryptDetectCpuFeaturesFromIsProcessorFeaturePresent(void)
{
SYMCRYPT_CPU_FEATURES result = ~SYMCRYPT_CPU_FEATURE_NEON;
uint32_t has_feature = 0;
size_t len = sizeof(has_feature);
if( sysctlbyname("hw.optional.arm.FEAT_AES", &has_feature, &len, NULL, 0) == 0 && has_feature )
{
result &= ~SYMCRYPT_CPU_FEATURE_NEON_AES;
}
has_feature = 0;
len = sizeof(has_feature);
if( sysctlbyname("hw.optional.arm.FEAT_PMULL", &has_feature, &len, NULL, 0) == 0 && has_feature )
{
result &= ~SYMCRYPT_CPU_FEATURE_NEON_PMULL;
}
has_feature = 0;
len = sizeof(has_feature);
if( sysctlbyname("hw.optional.arm.FEAT_SHA256", &has_feature, &len, NULL, 0) == 0 && has_feature )
{
result &= ~SYMCRYPT_CPU_FEATURE_NEON_SHA256;
}
g_SymCryptCpuFeaturesNotPresent = result;
}
#else
#include <sys/auxv.h>
#define HWCAP_AES (1 << 3)
#define HWCAP_PMULL (1 << 4)
#define HWCAP_SHA2 (1 << 6)
VOID
SYMCRYPT_CALL
SymCryptDetectCpuFeaturesFromIsProcessorFeaturePresent(void)
{
unsigned long hwcaps = getauxval( AT_HWCAP );
SYMCRYPT_CPU_FEATURES result = ~(
SYMCRYPT_CPU_FEATURE_NEON |
SYMCRYPT_CPU_FEATURE_NEON_AES |
SYMCRYPT_CPU_FEATURE_NEON_PMULL |
SYMCRYPT_CPU_FEATURE_NEON_SHA256
);
if( !(hwcaps & HWCAP_AES) )
{
result |= SYMCRYPT_CPU_FEATURE_NEON_AES;
}
if( !(hwcaps & HWCAP_PMULL) )
{
result |= SYMCRYPT_CPU_FEATURE_NEON_PMULL;
}
if( !(hwcaps & HWCAP_SHA2) )
{
result |= SYMCRYPT_CPU_FEATURE_NEON_SHA256;
}
g_SymCryptCpuFeaturesNotPresent = result;
}
#endif
#endif