diff options
author | Jacob Bramley <jacob.bramley@arm.com> | 2020-07-08 13:36:33 +0100 |
---|---|---|
committer | Jacob Bramley <jacob.bramley@arm.com> | 2020-07-16 09:50:25 +0000 |
commit | 31d432b2fb064806e399b5575cfe65124aaed707 (patch) | |
tree | da8350f073528e91dc9a0bd4bb7d4bfaa505cffb /src | |
parent | 3d8d39423a52b34cb3ca2aca9c1ba38db32e20f4 (diff) | |
download | vixl-31d432b2fb064806e399b5575cfe65124aaed707.tar.gz |
Add support for AT_HWCAP2.
Change-Id: I3c893a6c1e3b25756999025a21ae310e5b3e199c
Diffstat (limited to 'src')
-rw-r--r-- | src/aarch64/cpu-aarch64.cc | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/src/aarch64/cpu-aarch64.cc b/src/aarch64/cpu-aarch64.cc index 86a6ce9c..a31e010d 100644 --- a/src/aarch64/cpu-aarch64.cc +++ b/src/aarch64/cpu-aarch64.cc @@ -259,17 +259,37 @@ CPUFeatures CPU::InferCPUFeaturesFromOS( CPUFeatures::kSSBSControl, CPUFeatures::kSB, CPUFeatures::kPAuth, - CPUFeatures::kPAuthGeneric}; - static const size_t kFeatureBitCount = - sizeof(kFeatureBits) / sizeof(kFeatureBits[0]); - - unsigned long auxv = getauxval(AT_HWCAP); // NOLINT(runtime/int) - - // TODO: Also examine AT_HWCAP2. - - VIXL_STATIC_ASSERT(kFeatureBitCount < (sizeof(auxv) * kBitsPerByte)); - for (size_t i = 0; i < kFeatureBitCount; i++) { - if (auxv & (1UL << i)) features.Combine(kFeatureBits[i]); + CPUFeatures::kPAuthGeneric, + // Bits 32-39 + CPUFeatures::kDCCVADP, + CPUFeatures::kNone, // "sve2" + CPUFeatures::kNone, // "sveaes" + CPUFeatures::kNone, // "svepmull" + CPUFeatures::kNone, // "svebitperm" + CPUFeatures::kNone, // "svesha3" + CPUFeatures::kNone, // "svesm4" + CPUFeatures::kFrintToFixedSizedInt, + // Bits 40-47 + CPUFeatures::kSVEI8MM, + CPUFeatures::kSVEF32MM, + CPUFeatures::kSVEF64MM, + CPUFeatures::kSVEBF16, + CPUFeatures::kI8MM, + CPUFeatures::kBF16, + CPUFeatures::kDGH, + CPUFeatures::kRNG, + // Bits 48+ + CPUFeatures::kBTI}; + + uint64_t hwcap_low32 = getauxval(AT_HWCAP); + uint64_t hwcap_high32 = getauxval(AT_HWCAP2); + VIXL_ASSERT(IsUint32(hwcap_low32)); + VIXL_ASSERT(IsUint32(hwcap_high32)); + uint64_t hwcap = hwcap_low32 | (hwcap_high32 << 32); + + VIXL_STATIC_ASSERT(ArrayLength(kFeatureBits) < 64); + for (size_t i = 0; i < ArrayLength(kFeatureBits); i++) { + if (hwcap & (UINT64_C(1) << i)) features.Combine(kFeatureBits[i]); } #endif // VIXL_USE_LINUX_HWCAP |