@@ -853,6 +853,19 @@ static uint64_t test_with_fixed_counter_filter(struct kvm_vcpu *vcpu,
return run_vcpu_to_sync(vcpu);
}
+static uint64_t test_set_gp_and_fixed_event_filter(struct kvm_vcpu *vcpu,
+ uint32_t action,
+ uint32_t bitmap)
+{
+ struct __kvm_pmu_event_filter f = base_event_filter;
+
+ f.action = action;
+ f.fixed_counter_bitmap = bitmap;
+ do_vcpu_set_pmu_event_filter(vcpu, &f);
+
+ return run_vcpu_to_sync(vcpu);
+}
+
static void __test_fixed_counter_bitmap(struct kvm_vcpu *vcpu, uint8_t idx,
uint8_t nr_fixed_counters)
{
@@ -881,6 +894,25 @@ static void __test_fixed_counter_bitmap(struct kvm_vcpu *vcpu, uint8_t idx,
bitmap);
TEST_ASSERT(!!count == !(bitmap & BIT(idx)),
"Fixed event filter does not work as expected.");
+
+ /*
+ * Check that setting both events[] and fixed_counter_bitmap
+ * does not affect the consistency of the fixed ctrs' behaviour.
+ *
+ * Note, the fixed_counter_bitmap has higher priority than the
+ * events list.
+ */
+ count = test_set_gp_and_fixed_event_filter(vcpu,
+ KVM_PMU_EVENT_ALLOW,
+ bitmap);
+ TEST_ASSERT(!!count == !!(bitmap & BIT(idx)),
+ "Fixed event filter does not work as expected.");
+
+ count = test_set_gp_and_fixed_event_filter(vcpu,
+ KVM_PMU_EVENT_DENY,
+ bitmap);
+ TEST_ASSERT(!!count == !(bitmap & BIT(idx)),
+ "Fixed event filter does not work as expected.");
}
}