[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v4 12/16] x86/xen: enable Hygon support to Xen



To make Xen works functionly on Hygon platforms, reuse AMD's Xen support
code path for Hygon.

There are six core performance events counters per thread, so there are
six MSRs for these counters(0-5). Also there are four legacy PMC MSRs,
they are alias of the counters(0-3).

In this version of kernel Hygon use the lagacy and safe versions of MSR
access. It works fine when VPMU enabled in Xen on Hygon platforms by
testing with perf.

Signed-off-by: Pu Wen <puwen@xxxxxxxx>
---
 arch/x86/xen/pmu.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/arch/x86/xen/pmu.c b/arch/x86/xen/pmu.c
index 7d00d4a..9403854 100644
--- a/arch/x86/xen/pmu.c
+++ b/arch/x86/xen/pmu.c
@@ -90,6 +90,12 @@ static void xen_pmu_arch_init(void)
                        k7_counters_mirrored = 0;
                        break;
                }
+       } else if (boot_cpu_data.x86_vendor == X86_VENDOR_HYGON) {
+               amd_num_counters = F10H_NUM_COUNTERS;
+               amd_counters_base = MSR_K7_PERFCTR0;
+               amd_ctrls_base = MSR_K7_EVNTSEL0;
+               amd_msr_step = 1;
+               k7_counters_mirrored = 0;
        } else {
                uint32_t eax, ebx, ecx, edx;
 
@@ -285,7 +291,7 @@ static bool xen_amd_pmu_emulate(unsigned int msr, u64 *val, 
bool is_read)
 
 bool pmu_msr_read(unsigned int msr, uint64_t *val, int *err)
 {
-       if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) {
+       if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL) {
                if (is_amd_pmu_msr(msr)) {
                        if (!xen_amd_pmu_emulate(msr, val, 1))
                                *val = native_read_msr_safe(msr, err);
@@ -308,7 +314,7 @@ bool pmu_msr_write(unsigned int msr, uint32_t low, uint32_t 
high, int *err)
 {
        uint64_t val = ((uint64_t)high << 32) | low;
 
-       if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) {
+       if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL) {
                if (is_amd_pmu_msr(msr)) {
                        if (!xen_amd_pmu_emulate(msr, &val, 0))
                                *err = native_write_msr_safe(msr, low, high);
@@ -379,7 +385,7 @@ static unsigned long long xen_intel_read_pmc(int counter)
 
 unsigned long long xen_read_pmc(int counter)
 {
-       if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD)
+       if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL)
                return xen_amd_read_pmc(counter);
        else
                return xen_intel_read_pmc(counter);
-- 
2.7.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.