[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 05/16] x86/VPMU: Handle APIC_LVTPC accesses
>>> On 06.01.14 at 20:24, Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> wrote: > Update APIC_LVTPC vector when HVM guest writes to it. > > Signed-off-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> > --- > xen/arch/x86/hvm/svm/vpmu.c | 4 ---- > xen/arch/x86/hvm/vlapic.c | 5 ++++- > xen/arch/x86/hvm/vmx/vpmu_core2.c | 17 ----------------- > xen/arch/x86/hvm/vpmu.c | 16 +++++++++++++--- > xen/include/asm-x86/hvm/vpmu.h | 1 + > 5 files changed, 18 insertions(+), 25 deletions(-) > > diff --git a/xen/arch/x86/hvm/svm/vpmu.c b/xen/arch/x86/hvm/svm/vpmu.c > index 842bce7..1f7d6b7 100644 > --- a/xen/arch/x86/hvm/svm/vpmu.c > +++ b/xen/arch/x86/hvm/svm/vpmu.c > @@ -290,8 +290,6 @@ static int amd_vpmu_do_wrmsr(unsigned int msr, uint64_t > msr_content) > if ( !acquire_pmu_ownership(PMU_OWNER_HVM) ) > return 1; > vpmu_set(vpmu, VPMU_RUNNING); > - apic_write(APIC_LVTPC, PMU_APIC_VECTOR); > - vpmu->hw_lapic_lvtpc = PMU_APIC_VECTOR; > > if ( is_hvm_domain(v->domain) && > !((struct amd_vpmu_context *)vpmu->context)->msr_bitmap_set ) > @@ -302,8 +300,6 @@ static int amd_vpmu_do_wrmsr(unsigned int msr, uint64_t > msr_content) > if ( (get_pmu_reg_type(msr) == MSR_TYPE_CTRL) && > (is_pmu_enabled(msr_content) == 0) && vpmu_is_set(vpmu, > VPMU_RUNNING) > ) > { > - apic_write(APIC_LVTPC, PMU_APIC_VECTOR | APIC_LVT_MASKED); > - vpmu->hw_lapic_lvtpc = PMU_APIC_VECTOR | APIC_LVT_MASKED; > vpmu_reset(vpmu, VPMU_RUNNING); > if ( is_hvm_domain(v->domain) && > ((struct amd_vpmu_context *)vpmu->context)->msr_bitmap_set ) > diff --git a/xen/arch/x86/hvm/vlapic.c b/xen/arch/x86/hvm/vlapic.c > index bc06010..d954f4f 100644 > --- a/xen/arch/x86/hvm/vlapic.c > +++ b/xen/arch/x86/hvm/vlapic.c > @@ -38,6 +38,7 @@ > #include <asm/hvm/support.h> > #include <asm/hvm/vmx/vmx.h> > #include <asm/hvm/nestedhvm.h> > +#include <asm/hvm/vpmu.h> > #include <public/hvm/ioreq.h> > #include <public/hvm/params.h> > > @@ -732,8 +733,10 @@ static int vlapic_reg_write(struct vcpu *v, > vlapic_adjust_i8259_target(v->domain); > pt_may_unmask_irq(v->domain, NULL); > } > - if ( (offset == APIC_LVTT) && !(val & APIC_LVT_MASKED) ) > + else if ( (offset == APIC_LVTT) && !(val & APIC_LVT_MASKED) ) > pt_may_unmask_irq(NULL, &vlapic->pt); > + else if ( offset == APIC_LVTPC ) > + vpmu_lvtpc_update(val); > break; > > case APIC_TMICT: > diff --git a/xen/arch/x86/hvm/vmx/vpmu_core2.c > b/xen/arch/x86/hvm/vmx/vpmu_core2.c > index 89212ec..7fd2420 100644 > --- a/xen/arch/x86/hvm/vmx/vpmu_core2.c > +++ b/xen/arch/x86/hvm/vmx/vpmu_core2.c > @@ -532,19 +532,6 @@ static int core2_vpmu_do_wrmsr(unsigned int msr, > uint64_t msr_content) > else > vpmu_reset(vpmu, VPMU_RUNNING); > > - /* Setup LVTPC in local apic */ > - if ( vpmu_is_set(vpmu, VPMU_RUNNING) && > - is_vlapic_lvtpc_enabled(vcpu_vlapic(v)) ) > - { > - apic_write_around(APIC_LVTPC, PMU_APIC_VECTOR); > - vpmu->hw_lapic_lvtpc = PMU_APIC_VECTOR; > - } > - else > - { > - apic_write_around(APIC_LVTPC, PMU_APIC_VECTOR | APIC_LVT_MASKED); > - vpmu->hw_lapic_lvtpc = PMU_APIC_VECTOR | APIC_LVT_MASKED; > - } > - > if ( type != MSR_TYPE_GLOBAL ) > { > u64 mask; > @@ -710,10 +697,6 @@ static int core2_vpmu_do_interrupt(struct cpu_user_regs > *regs) > return 0; > } > > - /* HW sets the MASK bit when performance counter interrupt occurs*/ > - vpmu->hw_lapic_lvtpc = apic_read(APIC_LVTPC) & ~APIC_LVT_MASKED; > - apic_write_around(APIC_LVTPC, vpmu->hw_lapic_lvtpc); > - > return 1; > } > > diff --git a/xen/arch/x86/hvm/vpmu.c b/xen/arch/x86/hvm/vpmu.c > index d6a9ff6..2c1201b 100644 > --- a/xen/arch/x86/hvm/vpmu.c > +++ b/xen/arch/x86/hvm/vpmu.c > @@ -64,6 +64,14 @@ static void __init parse_vpmu_param(char *s) > } > } > > +void vpmu_lvtpc_update(uint32_t val) > +{ > + struct vpmu_struct *vpmu = vcpu_vpmu(current); > + > + vpmu->hw_lapic_lvtpc = PMU_APIC_VECTOR | (val & APIC_LVT_MASKED); > + apic_write(APIC_LVTPC, vpmu->hw_lapic_lvtpc); > +} > + > int vpmu_do_wrmsr(unsigned int msr, uint64_t msr_content) > { > struct vpmu_struct *vpmu = vcpu_vpmu(current); > @@ -227,19 +235,21 @@ void vpmu_initialise(struct vcpu *v) > case X86_VENDOR_AMD: > if ( svm_vpmu_initialise(v, opt_vpmu_enabled) != 0 ) > opt_vpmu_enabled = 0; > - break; > + return; > > case X86_VENDOR_INTEL: > if ( vmx_vpmu_initialise(v, opt_vpmu_enabled) != 0 ) > opt_vpmu_enabled = 0; > - break; > + return; > > default: > printk("VPMU: Initialization failed. " > "Unknown CPU vendor %d\n", vendor); > opt_vpmu_enabled = 0; > - break; > + return; > } > + > + vpmu->hw_lapic_lvtpc = PMU_APIC_VECTOR | APIC_LVT_MASKED; > } So what is this good for? All code paths above use "return" now, hence how would execution get here? Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |