On Thu, Sep 30, 2021 at 10:51:05AM +0200, Eric Auger wrote: > 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 ACK > > + > > + /* 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? Wanted to test having two redists (just a bonus test). This one is sligthtly more interesting than the previous one, so will just remove the previous one. > > 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 You are right, and this is a weird place to make that check. > > vm_open() > > + max_phys_size = 1ULL << pa_bits; > > > > ret = test_kvm_device(KVM_DEV_TYPE_ARM_VGIC_V3); > > if (!ret) { > Eric > Thanks, Ricardo