Hi Shaoqin, On 2/2/24 03:56, Shaoqin Huang wrote: > Add the invalid filter test includes sets the filter beyond the event s/includes/which > space and sets the invalid action to double check if the > KVM_ARM_VCPU_PMU_V3_FILTER will return the expected error. > > Signed-off-by: Shaoqin Huang <shahuang@xxxxxxxxxx> > --- > .../kvm/aarch64/pmu_event_filter_test.c | 36 +++++++++++++++++++ > 1 file changed, 36 insertions(+) > > diff --git a/tools/testing/selftests/kvm/aarch64/pmu_event_filter_test.c b/tools/testing/selftests/kvm/aarch64/pmu_event_filter_test.c > index d280382f362f..68e1f2003312 100644 > --- a/tools/testing/selftests/kvm/aarch64/pmu_event_filter_test.c > +++ b/tools/testing/selftests/kvm/aarch64/pmu_event_filter_test.c > @@ -7,6 +7,7 @@ > * This test checks if the guest only see the limited pmu event that userspace > * sets, if the guest can use those events which user allow, and if the guest > * can't use those events which user deny. > + * It also checks that setting invalid filter ranges return the expected error. > * This test runs only when KVM_CAP_ARM_PMU_V3, KVM_ARM_VCPU_PMU_V3_FILTER > * is supported on the host. > */ > @@ -183,6 +184,39 @@ static void for_each_test(void) > run_test(t); > } > > +static void set_invalid_filter(struct vpmu_vm *vm, void *arg) > +{ > + struct kvm_pmu_event_filter invalid; > + struct kvm_device_attr attr = { > + .group = KVM_ARM_VCPU_PMU_V3_CTRL, > + .attr = KVM_ARM_VCPU_PMU_V3_FILTER, > + .addr = (uint64_t)&invalid, > + }; > + int ret = 0; > + > + /* The max event number is (1 << 16), set a range largeer than it. */ in practice it is 16b on ARMv8.1 and 10b on ARMv8.0 but obvioulsy the check below works for both ;-) larger typ > + invalid = __DEFINE_FILTER(BIT(15), BIT(15)+1, 0); space between "+" > + ret = __vcpu_ioctl(vm->vcpu, KVM_SET_DEVICE_ATTR, &attr); kvm_device_attr_set() as commented by Oliver > + TEST_ASSERT(ret && errno == EINVAL, "Set Invalid filter range " > + "ret = %d, errno = %d (expected ret = -1, errno = EINVAL)", > + ret, errno); > + > + ret = 0; > + > + /* Set the Invalid action. */ > + invalid = __DEFINE_FILTER(0, 1, 3); > + ret = __vcpu_ioctl(vm->vcpu, KVM_SET_DEVICE_ATTR, &attr); > + TEST_ASSERT(ret && errno == EINVAL, "Set Invalid filter action " > + "ret = %d, errno = %d (expected ret = -1, errno = EINVAL)", > + ret, errno); > +} > + > +static void test_invalid_filter(void) > +{ > + vpmu_vm = __create_vpmu_vm(guest_code, set_invalid_filter, NULL); > + destroy_vpmu_vm(vpmu_vm); > +} > + > static bool kvm_supports_pmu_event_filter(void) > { > int r; > @@ -216,4 +250,6 @@ int main(void) > TEST_REQUIRE(host_pmu_supports_events()); > > for_each_test(); > + > + test_invalid_filter(); > } Thanks Eric