arm64: KVM: Reset PMU state when resetting vcpu
When resetting vcpu, it needs to reset the PMU state to initial status. Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org> Reviewed-by: Marc Zyngier <marc.zyngier@arm.com> Reviewed-by: Andrew Jones <drjones@redhat.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
This commit is contained in:
parent
b02386eb7d
commit
2aa36e9840
3 changed files with 22 additions and 0 deletions
|
@ -120,6 +120,9 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu)
|
||||||
/* Reset system registers */
|
/* Reset system registers */
|
||||||
kvm_reset_sys_regs(vcpu);
|
kvm_reset_sys_regs(vcpu);
|
||||||
|
|
||||||
|
/* Reset PMU */
|
||||||
|
kvm_pmu_vcpu_reset(vcpu);
|
||||||
|
|
||||||
/* Reset timer */
|
/* Reset timer */
|
||||||
return kvm_timer_vcpu_reset(vcpu, cpu_vtimer_irq);
|
return kvm_timer_vcpu_reset(vcpu, cpu_vtimer_irq);
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,7 @@ struct kvm_pmu {
|
||||||
u64 kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu, u64 select_idx);
|
u64 kvm_pmu_get_counter_value(struct kvm_vcpu *vcpu, u64 select_idx);
|
||||||
void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu, u64 select_idx, u64 val);
|
void kvm_pmu_set_counter_value(struct kvm_vcpu *vcpu, u64 select_idx, u64 val);
|
||||||
u64 kvm_pmu_valid_counter_mask(struct kvm_vcpu *vcpu);
|
u64 kvm_pmu_valid_counter_mask(struct kvm_vcpu *vcpu);
|
||||||
|
void kvm_pmu_vcpu_reset(struct kvm_vcpu *vcpu);
|
||||||
void kvm_pmu_disable_counter(struct kvm_vcpu *vcpu, u64 val);
|
void kvm_pmu_disable_counter(struct kvm_vcpu *vcpu, u64 val);
|
||||||
void kvm_pmu_enable_counter(struct kvm_vcpu *vcpu, u64 val);
|
void kvm_pmu_enable_counter(struct kvm_vcpu *vcpu, u64 val);
|
||||||
void kvm_pmu_overflow_set(struct kvm_vcpu *vcpu, u64 val);
|
void kvm_pmu_overflow_set(struct kvm_vcpu *vcpu, u64 val);
|
||||||
|
@ -67,6 +68,7 @@ static inline u64 kvm_pmu_valid_counter_mask(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
static inline void kvm_pmu_vcpu_reset(struct kvm_vcpu *vcpu) {}
|
||||||
static inline void kvm_pmu_disable_counter(struct kvm_vcpu *vcpu, u64 val) {}
|
static inline void kvm_pmu_disable_counter(struct kvm_vcpu *vcpu, u64 val) {}
|
||||||
static inline void kvm_pmu_enable_counter(struct kvm_vcpu *vcpu, u64 val) {}
|
static inline void kvm_pmu_enable_counter(struct kvm_vcpu *vcpu, u64 val) {}
|
||||||
static inline void kvm_pmu_overflow_set(struct kvm_vcpu *vcpu, u64 val) {}
|
static inline void kvm_pmu_overflow_set(struct kvm_vcpu *vcpu, u64 val) {}
|
||||||
|
|
|
@ -84,6 +84,23 @@ static void kvm_pmu_stop_counter(struct kvm_vcpu *vcpu, struct kvm_pmc *pmc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kvm_pmu_vcpu_reset - reset pmu state for cpu
|
||||||
|
* @vcpu: The vcpu pointer
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void kvm_pmu_vcpu_reset(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
struct kvm_pmu *pmu = &vcpu->arch.pmu;
|
||||||
|
|
||||||
|
for (i = 0; i < ARMV8_PMU_MAX_COUNTERS; i++) {
|
||||||
|
kvm_pmu_stop_counter(vcpu, &pmu->pmc[i]);
|
||||||
|
pmu->pmc[i].idx = i;
|
||||||
|
pmu->pmc[i].bitmask = 0xffffffffUL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
u64 kvm_pmu_valid_counter_mask(struct kvm_vcpu *vcpu)
|
u64 kvm_pmu_valid_counter_mask(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
u64 val = vcpu_sys_reg(vcpu, PMCR_EL0) >> ARMV8_PMU_PMCR_N_SHIFT;
|
u64 val = vcpu_sys_reg(vcpu, PMCR_EL0) >> ARMV8_PMU_PMCR_N_SHIFT;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue