From f232ffbd6f4d97dd6d086bc96d0f0075c83d0fa9 Mon Sep 17 00:00:00 2001 From: Yabin Cui Date: Thu, 8 Jun 2023 16:26:42 -0700 Subject: simpleperf: Check hardware counter dynamically in non-native ABIs ARM64 CtsSimpleperfTestCases may run via binary translation on a x86_64 environment, which may run on a VM not supporting hardware counters. Bug: 284801306 Test: run CtsSimpleperfTestCases Change-Id: Icc08d3639459c2c671f57c96860db085e8b7f8b9 --- simpleperf/cmd_record_test.cpp | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/simpleperf/cmd_record_test.cpp b/simpleperf/cmd_record_test.cpp index ffaf649b..7583bc50 100644 --- a/simpleperf/cmd_record_test.cpp +++ b/simpleperf/cmd_record_test.cpp @@ -281,25 +281,27 @@ bool HasHardwareCounter() { static int has_hw_counter = -1; if (has_hw_counter == -1) { has_hw_counter = 1; -#if defined(__x86__) || defined(__x86_64__) - // On x86 and x86_64, it's likely to run on an emulator or vm without hardware perf counters. - // It's hard to enumerate them all. So check the support at runtime. - const EventType* type = FindEventTypeByName("cpu-cycles", false); - CHECK(type != nullptr); - perf_event_attr attr = CreateDefaultPerfEventAttr(*type); - has_hw_counter = IsEventAttrSupported(attr, "cpu-cycles") ? 1 : 0; -#elif defined(__arm__) - std::string cpu_info; - if (android::base::ReadFileToString("/proc/cpuinfo", &cpu_info)) { - std::string hardware = GetHardwareFromCpuInfo(cpu_info); - if (std::regex_search(hardware, std::regex(R"(i\.MX6.*Quad)")) || - std::regex_search(hardware, std::regex(R"(SC7731e)")) || - std::regex_search(hardware, std::regex(R"(Qualcomm Technologies, Inc MSM8909)")) || - std::regex_search(hardware, std::regex(R"(Broadcom STB \(Flattened Device Tree\))"))) { - has_hw_counter = 0; + auto arch = GetBuildArch(); + if (arch == ARCH_X86_64 || arch == ARCH_X86_32 || !IsInNativeAbi()) { + // On x86 and x86_64, or when we are not in native abi, it's likely to run on an emulator or + // vm without hardware perf counters. It's hard to enumerate them all. So check the support + // at runtime. + const EventType* type = FindEventTypeByName("cpu-cycles", false); + CHECK(type != nullptr); + perf_event_attr attr = CreateDefaultPerfEventAttr(*type); + has_hw_counter = IsEventAttrSupported(attr, "cpu-cycles") ? 1 : 0; + } else if (arch == ARCH_ARM) { + std::string cpu_info; + if (android::base::ReadFileToString("/proc/cpuinfo", &cpu_info)) { + std::string hardware = GetHardwareFromCpuInfo(cpu_info); + if (std::regex_search(hardware, std::regex(R"(i\.MX6.*Quad)")) || + std::regex_search(hardware, std::regex(R"(SC7731e)")) || + std::regex_search(hardware, std::regex(R"(Qualcomm Technologies, Inc MSM8909)")) || + std::regex_search(hardware, std::regex(R"(Broadcom STB \(Flattened Device Tree\))"))) { + has_hw_counter = 0; + } } } -#endif // defined(__arm__) } return has_hw_counter == 1; } -- cgit v1.2.3