[PATCH v3 06/10] target/i386/kvm: Use AMD PMU MSR paths for Hygon
Tina Zhang <[email protected]>
| Newsgroups | org.kernel.vger.kvm,org.nongnu.qemu-devel |
|---|---|
| Message-ID | <[email protected]> |
On SVM, KVM uses the AMD PMU implementation and AMD PMU CPUID/MSR layout. Hygon guests that enable PMU and request AMD PMU CPUID features such as perfctr-core need QEMU's KVM PMU setup and MSR state paths to use that layout too. The relevant QEMU KVM PMU paths are currently restricted to AuthenticAMD guests: host/guest PMU compatibility checks, AMD PMU information initialization, and AMD PMU MSR save/restore. For a Hygon Dhyana guest with pmu=on, the compatibility check reports vPMU as unsupported solely because the guest vendor is HygonGenuine rather than AuthenticAMD. If the VM continues, QEMU still skips AMD PMU setup and never saves or restores the AMD PMU MSRs for the Hygon guest. Treat Hygon as using the AMD PMU CPUID/MSR layout for these KVM PMU paths. Because the PMU MSR layout is shared, accept both AMD and Hygon hosts for guests using that layout. This intentionally allows the PMU compatibility check to pass for AMD-host/Hygon-guest and Hygon-host/AMD-guest combinations. This does not enable PMU, perfctr-core, or perfmon-v2 by default for the Dhyana CPU model. On backward migration to older QEMU, Hygon PMU MSR state may still be dropped because older QEMU did not write that state back through the AMD PMU MSR KVM paths for Hygon guests. Signed-off-by: Tina Zhang <[email protected]> --- target/i386/kvm/kvm.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index 01fc1d0674..f33bb6bd06 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -2178,7 +2178,7 @@ static X86PMUVendor x86_cpu_pmu_vendor(const CPUX86State *env) return X86_PMU_VENDOR_INTEL; } - if (IS_AMD_CPU(env)) { + if (IS_AMD_CPU(env) || IS_HYGON_CPU(env)) { return X86_PMU_VENDOR_AMD; } @@ -2197,7 +2197,8 @@ static X86PMUVendor x86_host_pmu_vendor(void) return X86_PMU_VENDOR_INTEL; } - if (g_str_equal(host_vendor, CPUID_VENDOR_AMD)) { + if (g_str_equal(host_vendor, CPUID_VENDOR_AMD) || + g_str_equal(host_vendor, CPUID_VENDOR_HYGON)) { return X86_PMU_VENDOR_AMD; } -- 2.43.7