The spec for ID_DFR0_EL1 says "In an AArch64-only implementation, this register is UNKNOWN." Indeed ThunderX just returns zero when that register is read. That means we can't rely on a non-zero value to determine if we can test the PMU. As the pmu-version is only needed by ARM/AArch32, then if we're running AArch64 code, we can return true from pmu_probe() even when pmu-version is zero. Signed-off-by: Andrew Jones <drjones@xxxxxxxxxx> --- Applies on top of not-yet-merged https://lists.gnu.org/archive/html/qemu-devel/2016-12/msg00811.html --- arm/pmu.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/arm/pmu.c b/arm/pmu.c index a39dae43c99e..a0597c5b7806 100644 --- a/arm/pmu.c +++ b/arm/pmu.c @@ -37,6 +37,7 @@ static unsigned int pmu_version; #if defined(__arm__) +#define is_aarch64() (false) #define PMCR __ACCESS_CP15(c9, 0, c12, 0) #define ID_DFR0 __ACCESS_CP15(c0, 0, c1, 2) #define PMSELR __ACCESS_CP15(c9, 0, c12, 5) @@ -95,6 +96,7 @@ static inline void precise_instrs_loop(int loop, uint32_t pmcr) : "cc"); } #elif defined(__aarch64__) +#define is_aarch64() (true) static inline uint32_t get_id_dfr0(void) { return read_sysreg(id_dfr0_el1); } static inline uint32_t get_pmcr(void) { return read_sysreg(pmcr_el0); } static inline void set_pmcr(uint32_t v) { write_sysreg(v, pmcr_el0); } @@ -265,7 +267,7 @@ bool pmu_probe(void) if (pmu_version) report_info("PMU version: %d", pmu_version); - return pmu_version; + return pmu_version || is_aarch64(); } int main(int argc, char *argv[]) -- 2.9.3 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html