|
@@ -305,7 +305,7 @@ void kvm_pmu_software_increment(struct kvm_vcpu *vcpu, u64 val)
|
|
continue;
|
|
continue;
|
|
type = vcpu_sys_reg(vcpu, PMEVTYPER0_EL0 + i)
|
|
type = vcpu_sys_reg(vcpu, PMEVTYPER0_EL0 + i)
|
|
& ARMV8_PMU_EVTYPE_EVENT;
|
|
& ARMV8_PMU_EVTYPE_EVENT;
|
|
- if ((type == ARMV8_PMU_EVTYPE_EVENT_SW_INCR)
|
|
|
|
|
|
+ if ((type == ARMV8_PMUV3_PERFCTR_SW_INCR)
|
|
&& (enable & BIT(i))) {
|
|
&& (enable & BIT(i))) {
|
|
reg = vcpu_sys_reg(vcpu, PMEVCNTR0_EL0 + i) + 1;
|
|
reg = vcpu_sys_reg(vcpu, PMEVCNTR0_EL0 + i) + 1;
|
|
reg = lower_32_bits(reg);
|
|
reg = lower_32_bits(reg);
|
|
@@ -379,7 +379,8 @@ void kvm_pmu_set_counter_event_type(struct kvm_vcpu *vcpu, u64 data,
|
|
eventsel = data & ARMV8_PMU_EVTYPE_EVENT;
|
|
eventsel = data & ARMV8_PMU_EVTYPE_EVENT;
|
|
|
|
|
|
/* Software increment event does't need to be backed by a perf event */
|
|
/* Software increment event does't need to be backed by a perf event */
|
|
- if (eventsel == ARMV8_PMU_EVTYPE_EVENT_SW_INCR)
|
|
|
|
|
|
+ if (eventsel == ARMV8_PMUV3_PERFCTR_SW_INCR &&
|
|
|
|
+ select_idx != ARMV8_PMU_CYCLE_IDX)
|
|
return;
|
|
return;
|
|
|
|
|
|
memset(&attr, 0, sizeof(struct perf_event_attr));
|
|
memset(&attr, 0, sizeof(struct perf_event_attr));
|
|
@@ -391,7 +392,8 @@ void kvm_pmu_set_counter_event_type(struct kvm_vcpu *vcpu, u64 data,
|
|
attr.exclude_kernel = data & ARMV8_PMU_EXCLUDE_EL1 ? 1 : 0;
|
|
attr.exclude_kernel = data & ARMV8_PMU_EXCLUDE_EL1 ? 1 : 0;
|
|
attr.exclude_hv = 1; /* Don't count EL2 events */
|
|
attr.exclude_hv = 1; /* Don't count EL2 events */
|
|
attr.exclude_host = 1; /* Don't count host events */
|
|
attr.exclude_host = 1; /* Don't count host events */
|
|
- attr.config = eventsel;
|
|
|
|
|
|
+ attr.config = (select_idx == ARMV8_PMU_CYCLE_IDX) ?
|
|
|
|
+ ARMV8_PMUV3_PERFCTR_CPU_CYCLES : eventsel;
|
|
|
|
|
|
counter = kvm_pmu_get_counter_value(vcpu, select_idx);
|
|
counter = kvm_pmu_get_counter_value(vcpu, select_idx);
|
|
/* The initial sample period (overflow count) of an event. */
|
|
/* The initial sample period (overflow count) of an event. */
|