fuchsia.inc 1.7 KB

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