aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJacob Bramley <jacob.bramley@arm.com>2020-07-08 13:36:33 +0100
committerJacob Bramley <jacob.bramley@arm.com>2020-07-16 09:50:25 +0000
commit31d432b2fb064806e399b5575cfe65124aaed707 (patch)
treeda8350f073528e91dc9a0bd4bb7d4bfaa505cffb /src
parent3d8d39423a52b34cb3ca2aca9c1ba38db32e20f4 (diff)
downloadvixl-31d432b2fb064806e399b5575cfe65124aaed707.tar.gz
Add support for AT_HWCAP2.
Change-Id: I3c893a6c1e3b25756999025a21ae310e5b3e199c
Diffstat (limited to 'src')
-rw-r--r--src/aarch64/cpu-aarch64.cc42
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