* [PATCH 3/4] VPMU: Enable vpmu for svm
@ 2010-05-12 16:25 Wei Wang2
0 siblings, 0 replies; only message in thread
From: Wei Wang2 @ 2010-05-12 16:25 UTC (permalink / raw)
To: xen-devel@lists.xensource.com
[-- Attachment #1: Type: text/plain, Size: 367 bytes --]
Signed-off-by: Wei Wang <wei.wang2@amd.com>
--
AMD GmbH, Germany
Operating System Research Center
Legal Information:
Advanced Micro Devices GmbH
Karl-Hammerschmidt-Str. 34
85609 Dornach b. München
Geschäftsführer: Andrew Bowd, Thomas M. McCoy, Giuliano Meroni
Sitz: Dornach, Gemeinde Aschheim, Landkreis München
Registergericht München, HRB Nr. 43632
[-- Attachment #2: svm_vpmu.patch --]
[-- Type: text/x-diff, Size: 5242 bytes --]
diff -r 2f77abf9ee21 xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c Tue May 11 15:34:43 2010 +0200
+++ b/xen/arch/x86/hvm/svm/svm.c Tue May 11 15:38:47 2010 +0200
@@ -635,6 +635,7 @@ static void svm_ctxt_switch_from(struct
svm_fpu_leave(v);
svm_save_dr(v);
+ vpmu_save(v);
svm_sync_vmcb(v);
svm_vmload(root_vmcb[cpu]);
@@ -675,6 +676,7 @@ static void svm_ctxt_switch_to(struct vc
svm_vmsave(root_vmcb[cpu]);
svm_vmload(v->arch.hvm_svm.vmcb);
+ vpmu_load(v);
if ( cpu_has_rdtscp )
wrmsrl(MSR_TSC_AUX, hvm_msr_tsc_aux(v));
@@ -738,12 +740,15 @@ static int svm_vcpu_initialise(struct vc
return rc;
}
+ vpmu_initialise(v);
return 0;
}
static void svm_vcpu_destroy(struct vcpu *v)
{
svm_destroy_vmcb(v);
+ vpmu_destroy(v);
+ passive_domain_destroy(v);
}
static void svm_inject_exception(
@@ -806,7 +811,7 @@ static int svm_event_pending(struct vcpu
static int svm_do_pmu_interrupt(struct cpu_user_regs *regs)
{
- return 0;
+ return vpmu_do_interrupt(regs);
}
static int svm_cpu_prepare(unsigned int cpu)
@@ -1042,6 +1047,17 @@ static int svm_msr_read_intercept(struct
msr_content = vmcb->lastinttoip;
break;
+ case MSR_K7_PERFCTR0:
+ case MSR_K7_PERFCTR1:
+ case MSR_K7_PERFCTR2:
+ case MSR_K7_PERFCTR3:
+ case MSR_K7_EVNTSEL0:
+ case MSR_K7_EVNTSEL1:
+ case MSR_K7_EVNTSEL2:
+ case MSR_K7_EVNTSEL3:
+ vpmu_do_rdmsr(regs);
+ goto done;
+
default:
if ( rdmsr_viridian_regs(ecx, &msr_content) ||
@@ -1060,6 +1076,7 @@ static int svm_msr_read_intercept(struct
regs->eax = (uint32_t)msr_content;
regs->edx = (uint32_t)(msr_content >> 32);
+done:
HVMTRACE_3D (MSR_READ, ecx, regs->eax, regs->edx);
HVM_DBG_LOG(DBG_LEVEL_1, "returns: ecx=%x, eax=%lx, edx=%lx",
ecx, (unsigned long)regs->eax, (unsigned long)regs->edx);
@@ -1124,6 +1141,17 @@ static int svm_msr_write_intercept(struc
vmcb->lastinttoip = msr_content;
break;
+ case MSR_K7_PERFCTR0:
+ case MSR_K7_PERFCTR1:
+ case MSR_K7_PERFCTR2:
+ case MSR_K7_PERFCTR3:
+ case MSR_K7_EVNTSEL0:
+ case MSR_K7_EVNTSEL1:
+ case MSR_K7_EVNTSEL2:
+ case MSR_K7_EVNTSEL3:
+ vpmu_do_wrmsr(regs);
+ goto done;
+
default:
if ( wrmsr_viridian_regs(ecx, msr_content) )
break;
@@ -1140,7 +1168,7 @@ static int svm_msr_write_intercept(struc
}
break;
}
-
+done:
return X86EMUL_OKAY;
gpf:
diff -r 2f77abf9ee21 xen/arch/x86/hvm/vpmu.c
--- a/xen/arch/x86/hvm/vpmu.c Tue May 11 15:34:43 2010 +0200
+++ b/xen/arch/x86/hvm/vpmu.c Tue May 11 15:38:47 2010 +0200
@@ -30,6 +30,8 @@
#include <public/sched.h>
#include <public/hvm/save.h>
#include <asm/hvm/vpmu.h>
+#include <asm/hvm/svm/svm.h>
+#include <asm/hvm/svm/vmcb.h>
static int __read_mostly opt_vpmu_enabled;
boolean_param("vpmu", opt_vpmu_enabled);
@@ -78,9 +80,14 @@ void vpmu_load(struct vcpu *v)
}
extern struct arch_vpmu_ops core2_vpmu_ops;
+extern struct arch_vpmu_ops amd_vpmu_ops;
+
void vpmu_initialise(struct vcpu *v)
{
struct vpmu_struct *vpmu = vcpu_vpmu(v);
+ __u8 vendor = current_cpu_data.x86_vendor;
+ __u8 family = current_cpu_data.x86;
+ __u8 cpu_model = current_cpu_data.x86_model;
if ( !opt_vpmu_enabled )
return;
@@ -88,17 +95,45 @@ void vpmu_initialise(struct vcpu *v)
if ( vpmu->flags & VPMU_CONTEXT_ALLOCATED )
vpmu_destroy(v);
- if ( current_cpu_data.x86 == 6 )
+ switch ( vendor )
{
- switch ( current_cpu_data.x86_model )
+ case X86_VENDOR_AMD:
{
- case 15:
- case 23:
- case 26:
- case 29:
- vpmu->arch_vpmu_ops = &core2_vpmu_ops;
- break;
+ switch ( family )
+ {
+ case 0x10:
+ vpmu->arch_vpmu_ops = &amd_vpmu_ops;
+ break;
+ default:
+ printk("VMPU: Initialization failed. "
+ "AMD processor family %d has not "
+ "been supported\n", family);
+ return;
+ }
}
+ break;
+
+ case X86_VENDOR_INTEL:
+ {
+ if ( family == 6 )
+ {
+ switch ( cpu_model )
+ {
+ case 15:
+ case 23:
+ case 26:
+ case 29:
+ vpmu->arch_vpmu_ops = &core2_vpmu_ops;
+ break;
+ }
+ }
+ }
+ break;
+
+ default:
+ printk("VMPU: Initialization failed. "
+ "Unknown CPU vendor %d\n", vendor);
+ return;
}
if ( vpmu->arch_vpmu_ops != NULL )
diff -r 2f77abf9ee21 xen/include/asm-x86/hvm/svm/svm.h
--- a/xen/include/asm-x86/hvm/svm/svm.h Tue May 11 15:34:43 2010 +0200
+++ b/xen/include/asm-x86/hvm/svm/svm.h Tue May 11 15:38:47 2010 +0200
@@ -27,6 +27,7 @@
#include <asm/processor.h>
#include <asm/hvm/svm/vmcb.h>
#include <asm/i387.h>
+#include <asm/hvm/vpmu.h>
void svm_dump_vmcb(const char *from, struct vmcb_struct *vmcb);
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2010-05-12 16:25 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-12 16:25 [PATCH 3/4] VPMU: Enable vpmu for svm Wei Wang2
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).