@@ -11,9 +11,7 @@
*/
#define _GNU_SOURCE /* for program_invocation_short_name */
-#include "test_util.h"
-#include "kvm_util.h"
-#include "processor.h"
+#include "pmu.h"
/*
* In lieu of copying perf_event.h into tools...
@@ -32,6 +30,10 @@
#define MAX_FILTER_EVENTS 300
#define MAX_TEST_EVENTS 10
+#define PMU_EVENT_FILTER_INVALID_ACTION (KVM_PMU_EVENT_DENY + 1)
+#define PMU_EVENT_FILTER_INVALID_FLAGS (KVM_PMU_EVENT_FLAG_MASKED_EVENTS + 1)
+#define PMU_EVENT_FILTER_INVALID_NEVENTS (MAX_FILTER_EVENTS + 1)
+
/*
* This is how the event selector and unit mask are stored in an AMD
* core performance event-select register. Intel's format is similar,
@@ -762,6 +764,7 @@ static void test_filter_ioctl(struct kvm_vcpu *vcpu)
{
uint64_t e = ~0ul;
int r;
+ struct __kvm_pmu_event_filter f;
/*
* Unfortunately having invalid bits set in event data is expected to
@@ -780,6 +783,45 @@ static void test_filter_ioctl(struct kvm_vcpu *vcpu)
KVM_PMU_EVENT_FLAG_MASKED_EVENTS,
KVM_PMU_EVENT_ALLOW);
TEST_ASSERT(r == 0, "Valid PMU Event Filter is failing");
+
+ /*
+ * Testing unsupported "action" input values should return an error.
+ * Currently, only values 0 or 1 are supported.
+ */
+ f = base_event_filter;
+ f.action = PMU_EVENT_FILTER_INVALID_ACTION;
+ r = do_vcpu_set_pmu_event_filter(vcpu, &f);
+ TEST_ASSERT(r != 0, "Set invalid action is expected to fail.");
+
+ /*
+ * Testing unsupported "flags" input values should return an error.
+ * Currently, only values 0 or 1 are supported.
+ */
+ f = base_event_filter;
+ f.flags = PMU_EVENT_FILTER_INVALID_FLAGS;
+ r = do_vcpu_set_pmu_event_filter(vcpu, &f);
+ TEST_ASSERT(r != 0, "Set invalid flags is expected to fail.");
+
+ /*
+ * Testing unsupported "nevents" input values should return an error.
+ * Currently, only values less than or equal to
+ * MAX_FILTER_EVENTS are supported.
+ */
+ f = base_event_filter;
+ f.nevents = PMU_EVENT_FILTER_INVALID_NEVENTS;
+ r = do_vcpu_set_pmu_event_filter(vcpu, &f);
+ TEST_ASSERT(r != 0,
+ "Setting PMU event filters that exceeds the maximum supported value should fail");
+
+ /*
+ * In this case, setting non-exist fixed counters in the fixed bitmap
+ * doesn't fail.
+ */
+ f = base_event_filter;
+ f.fixed_counter_bitmap = ~GENMASK_ULL(X86_INTEL_MAX_FIXED_CTR_NUM, 0);
+ r = do_vcpu_set_pmu_event_filter(vcpu, &f);
+ TEST_ASSERT(r == 0,
+ "Setting invalid or non-exist fixed cunters in the fixed bitmap fail.");
}
int main(int argc, char *argv[])