50 lines · plain
1#include <zircon/features.h>2#include <zircon/syscalls.h>3 4void __init_cpu_features_resolver() {5 if (__atomic_load_n(&__aarch64_cpu_features.features, __ATOMIC_RELAXED))6 return;7 8 // This ensures the vDSO is a direct link-time dependency of anything that9 // needs this initializer code.10#pragma comment(lib, "zircon")11 uint32_t features;12 zx_status_t status = _zx_system_get_features(ZX_FEATURE_KIND_CPU, &features);13 if (status != ZX_OK)14 return;15 16 unsigned long long feat = 0;17#define setCPUFeature(cpu_feature) feat |= 1ULL << cpu_feature18 19 if (features & ZX_ARM64_FEATURE_ISA_FP)20 setCPUFeature(FEAT_FP);21 if (features & ZX_ARM64_FEATURE_ISA_ASIMD)22 setCPUFeature(FEAT_SIMD);23 if (features & ZX_ARM64_FEATURE_ISA_PMULL)24 setCPUFeature(FEAT_PMULL);25 if (features & ZX_ARM64_FEATURE_ISA_SHA256)26 setCPUFeature(FEAT_SHA2);27 if (features & ZX_ARM64_FEATURE_ISA_CRC32)28 setCPUFeature(FEAT_CRC);29 if (features & ZX_ARM64_FEATURE_ISA_RDM)30 setCPUFeature(FEAT_RDM);31 if (features & ZX_ARM64_FEATURE_ISA_SHA3)32 setCPUFeature(FEAT_SHA3);33 if (features & ZX_ARM64_FEATURE_ISA_SM4)34 setCPUFeature(FEAT_SM4);35 if (features & ZX_ARM64_FEATURE_ISA_DP)36 setCPUFeature(FEAT_DOTPROD);37 if (features & ZX_ARM64_FEATURE_ISA_FHM)38 setCPUFeature(FEAT_FP16FML);39 if (features & ZX_ARM64_FEATURE_ISA_SHA512)40 setCPUFeature(FEAT_SHA3);41 if (features & ZX_ARM64_FEATURE_ISA_I8MM)42 setCPUFeature(FEAT_I8MM);43 if (features & ZX_ARM64_FEATURE_ISA_SVE)44 setCPUFeature(FEAT_SVE);45 46 setCPUFeature(FEAT_INIT);47 48 __atomic_store_n(&__aarch64_cpu_features.features, feat, __ATOMIC_RELAXED);49}50