|
1 |
| -void __init_cpu_features_resolver(unsigned long hwcap, |
2 |
| - const __ifunc_arg_t *arg) { |
| 1 | +#include <zircon/features.h> |
| 2 | +#include <zircon/syscalls.h> |
| 3 | + |
| 4 | +void __init_cpu_features_resolver() { |
3 | 5 | if (__aarch64_cpu_features.features)
|
4 | 6 | return;
|
5 | 7 |
|
6 |
| - __init_cpu_features_constructor(hwcap, arg); |
7 |
| -} |
8 |
| - |
9 |
| -void CONSTRUCTOR_ATTRIBUTE __init_cpu_features(void) { |
10 |
| - // CPU features already initialized. |
11 |
| - if (__aarch64_cpu_features.features) |
| 8 | + // This ensures the vDSO is a direct link-time dependency of anything that |
| 9 | + // 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) |
12 | 14 | return;
|
13 | 15 |
|
14 |
| - unsigned long hwcap = getauxval(AT_HWCAP); |
15 |
| - unsigned long hwcap2 = getauxval(AT_HWCAP2); |
| 16 | +#define setCPUFeature(cpu_feature) \ |
| 17 | + __aarch64_cpu_features.features |= 1ULL << cpu_feature |
| 18 | + |
| 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_AES) |
| 24 | + setCPUFeature(FEAT_AES); |
| 25 | + if (features & ZX_ARM64_FEATURE_ISA_PMULL) |
| 26 | + setCPUFeature(FEAT_PMULL); |
| 27 | + if (features & ZX_ARM64_FEATURE_ISA_SHA1) |
| 28 | + setCPUFeature(FEAT_SHA1); |
| 29 | + if (features & ZX_ARM64_FEATURE_ISA_SHA256) |
| 30 | + setCPUFeature(FEAT_SHA2); |
| 31 | + if (features & ZX_ARM64_FEATURE_ISA_CRC32) |
| 32 | + setCPUFeature(FEAT_CRC); |
| 33 | + if (features & ZX_ARM64_FEATURE_ISA_RDM) |
| 34 | + setCPUFeature(FEAT_RDM); |
| 35 | + if (features & ZX_ARM64_FEATURE_ISA_SHA3) |
| 36 | + setCPUFeature(FEAT_SHA3); |
| 37 | + if (features & ZX_ARM64_FEATURE_ISA_SM4) |
| 38 | + setCPUFeature(FEAT_SM4); |
| 39 | + if (features & ZX_ARM64_FEATURE_ISA_DP) |
| 40 | + setCPUFeature(FEAT_DOTPROD); |
| 41 | + if (features & ZX_ARM64_FEATURE_ISA_FHM) |
| 42 | + setCPUFeature(FEAT_FP16FML); |
| 43 | + if (features & ZX_ARM64_FEATURE_ISA_SHA512) |
| 44 | + setCPUFeature(FEAT_SHA3); |
| 45 | + if (features & ZX_ARM64_FEATURE_ISA_I8MM) |
| 46 | + setCPUFeature(FEAT_I8MM); |
| 47 | + if (features & ZX_ARM64_FEATURE_ISA_SVE) |
| 48 | + setCPUFeature(FEAT_SVE); |
16 | 49 |
|
17 |
| - __ifunc_arg_t arg; |
18 |
| - arg._size = sizeof(__ifunc_arg_t); |
19 |
| - arg._hwcap = hwcap; |
20 |
| - arg._hwcap2 = hwcap2; |
21 |
| - __init_cpu_features_constructor(hwcap | _IFUNC_ARG_HWCAP, &arg); |
| 50 | + setCPUFeature(FEAT_INIT); |
22 | 51 | }
|
0 commit comments