Hi Ricardo, On 9/28/21 8:48 PM, Ricardo Koller wrote: > Add tests for checking that KVM returns the right error when trying to > set GICv2 CPU interfaces or GICv3 Redistributors partially above the > addressable IPA range. Also tighten the IPA range by replacing > KVM_CAP_ARM_VM_IPA_SIZE with the IPA range currently configured for the > guest (i.e., the default). > > The check for the GICv3 redistributor created using the REDIST legacy > API is not sufficient as this new test only checks the check done using > vcpus already created when setting the base. The next commit will add > the missing test which verifies that the KVM check is done at first vcpu > run. > > Signed-off-by: Ricardo Koller <ricarkol@xxxxxxxxxx> > --- > .../testing/selftests/kvm/aarch64/vgic_init.c | 46 ++++++++++++++----- > 1 file changed, 35 insertions(+), 11 deletions(-) > > diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c > index 92f5c6ca6b8b..77a1941e61fa 100644 > --- a/tools/testing/selftests/kvm/aarch64/vgic_init.c > +++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c > @@ -31,7 +31,7 @@ struct vm_gic { > uint32_t gic_dev_type; > }; > > -static int max_ipa_bits; > +static uint64_t max_phys_size; > > /* helper to access a redistributor register */ > static int access_v3_redist_reg(int gicv3_fd, int vcpu, int offset, > @@ -150,16 +150,21 @@ static void subtest_dist_rdist(struct vm_gic *v) > TEST_ASSERT(ret && errno == EINVAL, "GIC redist/cpu base not aligned"); > > /* out of range address */ > - if (max_ipa_bits) { > - addr = 1ULL << max_ipa_bits; > - ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, > - dist.attr, &addr, true); > - TEST_ASSERT(ret && errno == E2BIG, "dist address beyond IPA limit"); > + addr = max_phys_size; > + ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, > + dist.attr, &addr, true); > + TEST_ASSERT(ret && errno == E2BIG, "dist address beyond IPA limit"); > > - ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, > - rdist.attr, &addr, true); > - TEST_ASSERT(ret && errno == E2BIG, "redist address beyond IPA limit"); > - } > + ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, > + rdist.attr, &addr, true); > + TEST_ASSERT(ret && errno == E2BIG, "redist address beyond IPA limit"); > + > + /* Space for half a rdist (a rdist is: 2 * rdist.alignment). */ > + addr = max_phys_size - dist.alignment; > + ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, > + rdist.attr, &addr, true); > + TEST_ASSERT(ret && errno == E2BIG, > + "half of the redist is beyond IPA limit"); > > /* set REDIST base address @0x0*/ > addr = 0x00000; > @@ -248,7 +253,21 @@ static void subtest_v3_redist_regions(struct vm_gic *v) > kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, > KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true); > > - addr = REDIST_REGION_ATTR_ADDR(1, 1ULL << max_ipa_bits, 0, 2); > + addr = REDIST_REGION_ATTR_ADDR(1, max_phys_size, 0, 2); > + ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, > + KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true); > + TEST_ASSERT(ret && errno == E2BIG, > + "register redist region with base address beyond IPA range"); > + > + /* The last redist is above the pa range. */ > + addr = REDIST_REGION_ATTR_ADDR(1, max_phys_size - 0x10000, 0, 2); > + ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, > + KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true); > + TEST_ASSERT(ret && errno == E2BIG, > + "register redist region with base address beyond IPA range"); s/base address/top address > + > + /* The last redist is above the pa range. */ > + addr = REDIST_REGION_ATTR_ADDR(2, max_phys_size - 0x30000, 0, 2); > ret = _kvm_device_access(v->gic_fd, KVM_DEV_ARM_VGIC_GRP_ADDR, > KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, &addr, true); Why this second check? > TEST_ASSERT(ret && errno == E2BIG, > @@ -608,8 +627,13 @@ void run_tests(uint32_t gic_dev_type) > int main(int ac, char **av) > { > int ret; > + int max_ipa_bits, pa_bits; > > max_ipa_bits = kvm_check_cap(KVM_CAP_ARM_VM_IPA_SIZE); > + pa_bits = vm_guest_mode_params[VM_MODE_DEFAULT].pa_bits; > + TEST_ASSERT(max_ipa_bits && pa_bits <= max_ipa_bits, > + "The default PA range should not be larger than the max."); Isn't it already enforced in the test infra instead? I see in lib/kvm_util.c #ifdef __aarch64__ if (vm->pa_bits != 40) vm->type = KVM_VM_TYPE_ARM_IPA_SIZE(vm->pa_bits); #endif vm_open() > + max_phys_size = 1ULL << pa_bits; > > ret = test_kvm_device(KVM_DEV_TYPE_ARM_VGIC_V3); > if (!ret) { Eric