sample-code/hwcaps.c (181 lines of code) (raw):
#include <stdio.h>
#include <sys/auxv.h>
#include <asm/hwcap.h>
#define HWCAP1_LIST(XX) \
XX(HWCAP_FP) \
XX(HWCAP_ASIMD) \
XX(HWCAP_EVTSTRM) \
XX(HWCAP_AES) \
XX(HWCAP_PMULL) \
XX(HWCAP_SHA1) \
XX(HWCAP_SHA2) \
XX(HWCAP_CRC32) \
XX(HWCAP_ATOMICS) \
XX(HWCAP_FPHP) \
XX(HWCAP_ASIMDHP) \
XX(HWCAP_CPUID) \
XX(HWCAP_ASIMDRDM) \
XX(HWCAP_JSCVT) \
XX(HWCAP_FCMA) \
XX(HWCAP_LRCPC) \
XX(HWCAP_DCPOP) \
XX(HWCAP_SHA3) \
XX(HWCAP_SM3) \
XX(HWCAP_SM4) \
XX(HWCAP_ASIMDDP) \
XX(HWCAP_SHA512) \
XX(HWCAP_SVE) \
XX(HWCAP_ASIMDFHM) \
XX(HWCAP_DIT) \
XX(HWCAP_USCAT) \
XX(HWCAP_ILRCPC) \
XX(HWCAP_FLAGM) \
XX(HWCAP_SSBS) \
XX(HWCAP_SB) \
XX(HWCAP_PACA) \
XX(HWCAP_PACG)
#if !defined(HWCAP2_MTE3)
#define HWCAP2_MTE3 (1UL << 63)
#endif
#if !defined(HWCAP2_SME)
#define HWCAP2_SME (1UL << 63)
#endif
#if !defined(HWCAP2_SME_I16I64)
#define HWCAP2_SME_I16I64 (1UL << 63)
#endif
#if !defined(HWCAP2_SME_F64F64)
#define HWCAP2_SME_F64F64 (1UL << 63)
#endif
#if !defined(HWCAP2_SME_I8I32)
#define HWCAP2_SME_I8I32 (1UL << 63)
#endif
#if !defined(HWCAP2_SME_F16F32)
#define HWCAP2_SME_F16F32 (1UL << 63)
#endif
#if !defined(HWCAP2_SME_B16F32)
#define HWCAP2_SME_B16F32 (1UL << 63)
#endif
#if !defined(HWCAP2_SME_F32F32)
#define HWCAP2_SME_F32F32 (1UL << 63)
#endif
#if !defined(HWCAP2_SME_FA64)
#define HWCAP2_SME_FA64 (1UL << 63)
#endif
#if !defined(HWCAP2_WFXT)
#define HWCAP2_WFXT (1UL << 63)
#endif
#if !defined(HWCAP2_EBF16)
#define HWCAP2_EBF16 (1UL << 63)
#endif
#if !defined(HWCAP2_SVE_EBF16)
#define HWCAP2_SVE_EBF16 (1UL << 63)
#endif
#if !defined(HWCAP2_CSSC)
#define HWCAP2_CSSC (1UL << 63)
#endif
#if !defined(HWCAP2_RPRFM)
#define HWCAP2_RPRFM (1UL << 63)
#endif
#if !defined(HWCAP2_SVE2P1)
#define HWCAP2_SVE2P1 (1UL << 63)
#endif
#if !defined(HWCAP2_SME2)
#define HWCAP2_SME2 (1UL << 63)
#endif
#if !defined(HWCAP2_SME2P1)
#define HWCAP2_SME2P1 (1UL << 63)
#endif
#if !defined(HWCAP2_SME_I16I32)
#define HWCAP2_SME_I16I32 (1UL << 63)
#endif
#if !defined(HWCAP2_SME_BI32I32)
#define HWCAP2_SME_BI32I32 (1UL << 63)
#endif
#if !defined(HWCAP2_SME_B16B16)
#define HWCAP2_SME_B16B16 (1UL << 63)
#endif
#if !defined(HWCAP2_SME_F16F16)
#define HWCAP2_SME_F16F16 (1UL << 63)
#endif
#if !defined(HWCAP2_MOPS)
#define HWCAP2_MOPS (1UL << 63)
#endif
#if !defined(HWCAP2_HBC)
#define HWCAP2_HBC (1UL << 63)
#endif
#if !defined(HWCAP2_SVE_B16B16)
#define HWCAP2_SVE_B16B16 (1UL << 63)
#endif
#if !defined(HWCAP2_LRCPC3)
#define HWCAP2_LRCPC3 (1UL << 63)
#endif
#if !defined(HWCAP2_LSE128)
#define HWCAP2_LSE128 (1UL << 63)
#endif
#define HWCAP2_LIST(XX) \
XX(HWCAP2_DCPODP) \
XX(HWCAP2_SVE2) \
XX(HWCAP2_SVEAES) \
XX(HWCAP2_SVEPMULL) \
XX(HWCAP2_SVEBITPERM) \
XX(HWCAP2_SVESHA3) \
XX(HWCAP2_SVESM4) \
XX(HWCAP2_FLAGM2) \
XX(HWCAP2_FRINT) \
XX(HWCAP2_SVEI8MM) \
XX(HWCAP2_SVEF32MM) \
XX(HWCAP2_SVEF64MM) \
XX(HWCAP2_SVEBF16) \
XX(HWCAP2_I8MM) \
XX(HWCAP2_BF16) \
XX(HWCAP2_DGH) \
XX(HWCAP2_RNG) \
XX(HWCAP2_BTI) \
XX(HWCAP2_MTE) \
XX(HWCAP2_ECV) \
XX(HWCAP2_AFP) \
XX(HWCAP2_RPRES) \
XX(HWCAP2_MTE3) \
XX(HWCAP2_SME) \
XX(HWCAP2_SME_I16I64) \
XX(HWCAP2_SME_F64F64) \
XX(HWCAP2_SME_I8I32) \
XX(HWCAP2_SME_F16F32) \
XX(HWCAP2_SME_B16F32) \
XX(HWCAP2_SME_F32F32) \
XX(HWCAP2_SME_FA64) \
XX(HWCAP2_WFXT) \
XX(HWCAP2_EBF16) \
XX(HWCAP2_SVE_EBF16) \
XX(HWCAP2_CSSC) \
XX(HWCAP2_RPRFM) \
XX(HWCAP2_SVE2P1) \
XX(HWCAP2_SME2) \
XX(HWCAP2_SME2P1) \
XX(HWCAP2_SME_I16I32) \
XX(HWCAP2_SME_BI32I32) \
XX(HWCAP2_SME_B16B16) \
XX(HWCAP2_SME_F16F16) \
XX(HWCAP2_MOPS) \
XX(HWCAP2_HBC) \
XX(HWCAP2_SVE_B16B16) \
XX(HWCAP2_LRCPC3) \
XX(HWCAP2_LSE128)
void aarch64_get_cpu_flags()
{
unsigned long hwcap = getauxval(AT_HWCAP);
unsigned long hwcap2 = getauxval(AT_HWCAP2);
#define XX(cap) \
printf( "%-20s %s\n", #cap, (hwcap & cap) ? "*" : " " );
HWCAP1_LIST(XX)
#undef XX
#define XX(cap) \
printf( "%-20s %s\n", #cap, (hwcap2 & cap) ? "*" : " " );
HWCAP2_LIST(XX)
#undef XX
}
int main(int argc, char *argv[])
{
aarch64_get_cpu_flags();
return 0;
}