* [PATCH v3 10/10] KVM: arm64: selftests: Add basic ITS device tests
@ 2021-09-28 20:11 Ricardo Koller
2021-09-29 0:19 ` Ricardo Koller
0 siblings, 1 reply; 7+ messages in thread
From: Ricardo Koller @ 2021-09-28 20:11 UTC (permalink / raw)
To: kvm, maz, kvmarm, drjones, eric.auger, alexandru.elisei
Cc: Paolo Bonzini, oupton, james.morse, suzuki.poulose, shuah,
jingzhangos, pshier, rananta, reijiw, Ricardo Koller
Add some ITS device tests: general KVM device tests (address not defined
already, address aligned) and tests for the ITS region being within the
addressable IPA range.
Signed-off-by: Ricardo Koller <ricarkol@google.com>
---
.../testing/selftests/kvm/aarch64/vgic_init.c | 42 +++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c
index 417a9a515cad..180221ec325d 100644
--- a/tools/testing/selftests/kvm/aarch64/vgic_init.c
+++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c
@@ -603,6 +603,47 @@ static void test_v3_redist_ipa_range_check_at_vcpu_run(void)
vm_gic_destroy(&v);
}
+static void test_v3_its_region(void)
+{
+ struct vm_gic v;
+ uint64_t addr;
+ int its_fd, ret;
+
+ v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS);
+ its_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_ITS, false);
+
+ addr = 0x401000;
+ ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
+ TEST_ASSERT(ret && errno == EINVAL,
+ "ITS region with misaligned address");
+
+ addr = max_phys_size;
+ ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
+ TEST_ASSERT(ret && errno == E2BIG,
+ "register ITS region with base address beyond IPA range");
+
+ addr = max_phys_size - 0x10000;
+ ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
+ TEST_ASSERT(ret && errno == E2BIG,
+ "Half of ITS region is beyond IPA range");
+
+ /* This one succeeds setting the ITS base */
+ addr = 0x400000;
+ kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
+
+ addr = 0x300000;
+ ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
+ TEST_ASSERT(ret && errno == EEXIST, "ITS base set again");
+
+ close(its_fd);
+ vm_gic_destroy(&v);
+}
+
/*
* Returns 0 if it's possible to create GIC device of a given type (V2 or V3).
*/
@@ -655,6 +696,7 @@ void run_tests(uint32_t gic_dev_type)
test_v3_last_bit_redist_regions();
test_v3_last_bit_single_rdist();
test_v3_redist_ipa_range_check_at_vcpu_run();
+ test_v3_its_region();
}
}
--
2.33.0.685.g46640cef36-goog
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH v3 10/10] KVM: arm64: selftests: Add basic ITS device tests
2021-09-28 20:11 [PATCH v3 10/10] KVM: arm64: selftests: Add basic ITS device tests Ricardo Koller
@ 2021-09-29 0:19 ` Ricardo Koller
0 siblings, 0 replies; 7+ messages in thread
From: Ricardo Koller @ 2021-09-29 0:19 UTC (permalink / raw)
To: kvm, maz, kvmarm, drjones, eric.auger, alexandru.elisei
Cc: Paolo Bonzini, oupton, james.morse, suzuki.poulose, shuah,
jingzhangos, pshier, rananta, reijiw
On Tue, Sep 28, 2021 at 01:11:57PM -0700, Ricardo Koller wrote:
> Add some ITS device tests: general KVM device tests (address not defined
> already, address aligned) and tests for the ITS region being within the
> addressable IPA range.
>
> Signed-off-by: Ricardo Koller <ricarkol@google.com>
> ---
> .../testing/selftests/kvm/aarch64/vgic_init.c | 42 +++++++++++++++++++
> 1 file changed, 42 insertions(+)
>
> diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c
> index 417a9a515cad..180221ec325d 100644
> --- a/tools/testing/selftests/kvm/aarch64/vgic_init.c
> +++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c
> @@ -603,6 +603,47 @@ static void test_v3_redist_ipa_range_check_at_vcpu_run(void)
> vm_gic_destroy(&v);
> }
>
> +static void test_v3_its_region(void)
> +{
> + struct vm_gic v;
> + uint64_t addr;
> + int its_fd, ret;
> +
> + v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS);
> + its_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_ITS, false);
> +
> + addr = 0x401000;
> + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> + TEST_ASSERT(ret && errno == EINVAL,
> + "ITS region with misaligned address");
> +
> + addr = max_phys_size;
> + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> + TEST_ASSERT(ret && errno == E2BIG,
> + "register ITS region with base address beyond IPA range");
> +
> + addr = max_phys_size - 0x10000;
> + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> + TEST_ASSERT(ret && errno == E2BIG,
> + "Half of ITS region is beyond IPA range");
> +
> + /* This one succeeds setting the ITS base */
> + addr = 0x400000;
> + kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> +
> + addr = 0x300000;
> + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> + TEST_ASSERT(ret && errno == EEXIST, "ITS base set again");
> +
> + close(its_fd);
> + vm_gic_destroy(&v);
> +}
> +
> /*
> * Returns 0 if it's possible to create GIC device of a given type (V2 or V3).
> */
> @@ -655,6 +696,7 @@ void run_tests(uint32_t gic_dev_type)
> test_v3_last_bit_redist_regions();
> test_v3_last_bit_single_rdist();
> test_v3_redist_ipa_range_check_at_vcpu_run();
> + test_v3_its_region();
> }
> }
>
> --
> 2.33.0.685.g46640cef36-goog
>
Please ignore this email. This patch is already included in the right trhread.
Sorry and thanks,
Ricardo
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v3 00/10] KVM: arm64: vgic: Missing checks for REDIST/CPU and ITS regions above the VM IPA size
@ 2021-09-28 18:47 Ricardo Koller
2021-09-29 0:10 ` [PATCH v3 10/10] KVM: arm64: selftests: Add basic ITS device tests Ricardo Koller
0 siblings, 1 reply; 7+ messages in thread
From: Ricardo Koller @ 2021-09-28 18:47 UTC (permalink / raw)
To: kvm, maz, kvmarm, drjones, eric.auger, alexandru.elisei
Cc: Paolo Bonzini, oupton, james.morse, suzuki.poulose, shuah,
jingzhangos, pshier, rananta, reijiw, Ricardo Koller
KVM doesn't check for redist, CPU interface, and ITS regions that extend
partially above the guest addressable IPA range (phys_size). This can happen
when using the V[2|3]_ADDR_TYPE_CPU, ADDR_TYPE_REDIST[_REGION], or
ITS_ADDR_TYPE attributes to set a new region that extends partially above
phys_size (with the base below phys_size). The issue is that vcpus can
potentially run into a situation where some redistributors are addressable and
others are not, or just the first half of the ITS is addressable.
Patches 1-4 fixes the issue for GICv2 and GICv3 (and the ITS). Patches 5-10 add
some selftests for all these fixes. While adding these tests, these add support
for some extra GICv2 and ITS device tests.
Changes:
v3: add missing checks for GICv2 and the ITS, plus tests for the fixes.
v2: adding a test for KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION, and returning E2BIG
instead of EINVAL (thanks Alexandru and Eric).
Ricardo Koller (10):
kvm: arm64: vgic: Introduce vgic_check_iorange
KVM: arm64: vgic-v3: Check redist region is not above the VM IPA size
KVM: arm64: vgic-v2: Check cpu interface region is not above the VM
IPA size
KVM: arm64: vgic-v3: Check ITS region is not above the VM IPA size
KVM: arm64: selftests: Make vgic_init gic version agnostic
KVM: arm64: selftests: Make vgic_init/vm_gic_create version agnostic
KVM: arm64: selftests: Add some tests for GICv2 in vgic_init
KVM: arm64: selftests: Add tests for GIC redist/cpuif partially above
IPA range
KVM: arm64: selftests: Add test for legacy GICv3 REDIST base partially
above IPA range
KVM: arm64: selftests: Add basic ITS device tests
arch/arm64/kvm/vgic/vgic-its.c | 4 +-
arch/arm64/kvm/vgic/vgic-kvm-device.c | 29 +-
arch/arm64/kvm/vgic/vgic-mmio-v3.c | 6 +-
arch/arm64/kvm/vgic/vgic-v3.c | 4 +
arch/arm64/kvm/vgic/vgic.h | 4 +
.../testing/selftests/kvm/aarch64/vgic_init.c | 372 +++++++++++++-----
6 files changed, 317 insertions(+), 102 deletions(-)
--
2.33.0.685.g46640cef36-goog
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH v3 10/10] KVM: arm64: selftests: Add basic ITS device tests
2021-09-28 18:47 [PATCH v3 00/10] KVM: arm64: vgic: Missing checks for REDIST/CPU and ITS regions above the VM IPA size Ricardo Koller
@ 2021-09-29 0:10 ` Ricardo Koller
2021-09-30 9:14 ` Eric Auger
0 siblings, 1 reply; 7+ messages in thread
From: Ricardo Koller @ 2021-09-29 0:10 UTC (permalink / raw)
To: kvm, maz, kvmarm, drjones, eric.auger, alexandru.elisei
Cc: Paolo Bonzini, oupton, james.morse, suzuki.poulose, shuah,
jingzhangos, pshier, rananta, reijiw, Ricardo Koller
Add some ITS device tests: general KVM device tests (address not defined
already, address aligned) and tests for the ITS region being within the
addressable IPA range.
Signed-off-by: Ricardo Koller <ricarkol@google.com>
---
.../testing/selftests/kvm/aarch64/vgic_init.c | 42 +++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c
index 417a9a515cad..180221ec325d 100644
--- a/tools/testing/selftests/kvm/aarch64/vgic_init.c
+++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c
@@ -603,6 +603,47 @@ static void test_v3_redist_ipa_range_check_at_vcpu_run(void)
vm_gic_destroy(&v);
}
+static void test_v3_its_region(void)
+{
+ struct vm_gic v;
+ uint64_t addr;
+ int its_fd, ret;
+
+ v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS);
+ its_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_ITS, false);
+
+ addr = 0x401000;
+ ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
+ TEST_ASSERT(ret && errno == EINVAL,
+ "ITS region with misaligned address");
+
+ addr = max_phys_size;
+ ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
+ TEST_ASSERT(ret && errno == E2BIG,
+ "register ITS region with base address beyond IPA range");
+
+ addr = max_phys_size - 0x10000;
+ ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
+ TEST_ASSERT(ret && errno == E2BIG,
+ "Half of ITS region is beyond IPA range");
+
+ /* This one succeeds setting the ITS base */
+ addr = 0x400000;
+ kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
+
+ addr = 0x300000;
+ ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
+ KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
+ TEST_ASSERT(ret && errno == EEXIST, "ITS base set again");
+
+ close(its_fd);
+ vm_gic_destroy(&v);
+}
+
/*
* Returns 0 if it's possible to create GIC device of a given type (V2 or V3).
*/
@@ -655,6 +696,7 @@ void run_tests(uint32_t gic_dev_type)
test_v3_last_bit_redist_regions();
test_v3_last_bit_single_rdist();
test_v3_redist_ipa_range_check_at_vcpu_run();
+ test_v3_its_region();
}
}
--
2.33.0.685.g46640cef36-goog
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH v3 10/10] KVM: arm64: selftests: Add basic ITS device tests
2021-09-29 0:10 ` [PATCH v3 10/10] KVM: arm64: selftests: Add basic ITS device tests Ricardo Koller
@ 2021-09-30 9:14 ` Eric Auger
2021-09-30 20:10 ` Ricardo Koller
2021-10-05 1:03 ` Ricardo Koller
0 siblings, 2 replies; 7+ messages in thread
From: Eric Auger @ 2021-09-30 9:14 UTC (permalink / raw)
To: Ricardo Koller, kvm, maz, kvmarm, drjones, alexandru.elisei
Cc: Paolo Bonzini, oupton, james.morse, suzuki.poulose, shuah,
jingzhangos, pshier, rananta, reijiw
Hi Ricardo,
On 9/29/21 2:10 AM, Ricardo Koller wrote:
> Add some ITS device tests: general KVM device tests (address not defined
> already, address aligned) and tests for the ITS region being within the
> addressable IPA range.
>
> Signed-off-by: Ricardo Koller <ricarkol@google.com>
> ---
> .../testing/selftests/kvm/aarch64/vgic_init.c | 42 +++++++++++++++++++
> 1 file changed, 42 insertions(+)
>
> diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c
> index 417a9a515cad..180221ec325d 100644
> --- a/tools/testing/selftests/kvm/aarch64/vgic_init.c
> +++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c
> @@ -603,6 +603,47 @@ static void test_v3_redist_ipa_range_check_at_vcpu_run(void)
> vm_gic_destroy(&v);
> }
>
> +static void test_v3_its_region(void)
> +{
> + struct vm_gic v;
> + uint64_t addr;
> + int its_fd, ret;
> +
> + v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS);
> + its_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_ITS, false);
this may fail if the ITS device has not been registered by KVM (host GICv2)
Maybe refine the patch title mentionning this is an ITS device "init" test.
as per Documentation/virt/kvm/devices/arm-vgic-its.rst we could also try
instantiating the ITS before the GIC and try instantiating several ITSs
with overlapping addresses.
But I would totally understand if you consider this out of the scope of
your fixes + tests.
Thanks!
Eric
> +
> + addr = 0x401000;
> + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> + TEST_ASSERT(ret && errno == EINVAL,
> + "ITS region with misaligned address");
> +
> + addr = max_phys_size;
> + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> + TEST_ASSERT(ret && errno == E2BIG,
> + "register ITS region with base address beyond IPA range");
> +
> + addr = max_phys_size - 0x10000;
> + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> + TEST_ASSERT(ret && errno == E2BIG,
> + "Half of ITS region is beyond IPA range");
> +
> + /* This one succeeds setting the ITS base */
> + addr = 0x400000;
> + kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> +
> + addr = 0x300000;
> + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> + TEST_ASSERT(ret && errno == EEXIST, "ITS base set again");
> +
> + close(its_fd);
> + vm_gic_destroy(&v);
> +}
> +
> /*
> * Returns 0 if it's possible to create GIC device of a given type (V2 or V3).
> */
> @@ -655,6 +696,7 @@ void run_tests(uint32_t gic_dev_type)
> test_v3_last_bit_redist_regions();
> test_v3_last_bit_single_rdist();
> test_v3_redist_ipa_range_check_at_vcpu_run();
> + test_v3_its_region();
> }
> }
>
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH v3 10/10] KVM: arm64: selftests: Add basic ITS device tests
2021-09-30 9:14 ` Eric Auger
@ 2021-09-30 20:10 ` Ricardo Koller
2021-10-05 8:04 ` Eric Auger
2021-10-05 1:03 ` Ricardo Koller
1 sibling, 1 reply; 7+ messages in thread
From: Ricardo Koller @ 2021-09-30 20:10 UTC (permalink / raw)
To: Eric Auger
Cc: kvm, maz, kvmarm, drjones, alexandru.elisei, Paolo Bonzini,
oupton, james.morse, suzuki.poulose, shuah, jingzhangos, pshier,
rananta, reijiw
Hi Eric,
On Thu, Sep 30, 2021 at 11:14:02AM +0200, Eric Auger wrote:
> Hi Ricardo,
>
> On 9/29/21 2:10 AM, Ricardo Koller wrote:
> > Add some ITS device tests: general KVM device tests (address not defined
> > already, address aligned) and tests for the ITS region being within the
> > addressable IPA range.
> >
> > Signed-off-by: Ricardo Koller <ricarkol@google.com>
> > ---
> > .../testing/selftests/kvm/aarch64/vgic_init.c | 42 +++++++++++++++++++
> > 1 file changed, 42 insertions(+)
> >
> > diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c
> > index 417a9a515cad..180221ec325d 100644
> > --- a/tools/testing/selftests/kvm/aarch64/vgic_init.c
> > +++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c
> > @@ -603,6 +603,47 @@ static void test_v3_redist_ipa_range_check_at_vcpu_run(void)
> > vm_gic_destroy(&v);
> > }
> >
> > +static void test_v3_its_region(void)
> > +{
> > + struct vm_gic v;
> > + uint64_t addr;
> > + int its_fd, ret;
> > +
> > + v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS);
> > + its_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_ITS, false);
> this may fail if the ITS device has not been registered by KVM (host GICv2)
At the moment it's just called in the GICv3 case. It seems that
registering a GICv3 device results in having an ITS registered as well
(from kvm_register_vgic_device()). I'm assuming this won't change;
we might as well check that assumption. What do you think?
Thanks,
Ricardo
>
> Maybe refine the patch title mentionning this is an ITS device "init" test.
> as per Documentation/virt/kvm/devices/arm-vgic-its.rst we could also try
> instantiating the ITS before the GIC and try instantiating several ITSs
> with overlapping addresses.
> But I would totally understand if you consider this out of the scope of
> your fixes + tests.
>
> Thanks!
>
> Eric
> > +
> > + addr = 0x401000;
> > + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> > + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> > + TEST_ASSERT(ret && errno == EINVAL,
> > + "ITS region with misaligned address");
> > +
> > + addr = max_phys_size;
> > + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> > + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> > + TEST_ASSERT(ret && errno == E2BIG,
> > + "register ITS region with base address beyond IPA range");
> > +
> > + addr = max_phys_size - 0x10000;
> > + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> > + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> > + TEST_ASSERT(ret && errno == E2BIG,
> > + "Half of ITS region is beyond IPA range");
> > +
> > + /* This one succeeds setting the ITS base */
> > + addr = 0x400000;
> > + kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> > + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> > +
> > + addr = 0x300000;
> > + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> > + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> > + TEST_ASSERT(ret && errno == EEXIST, "ITS base set again");
> > +
> > + close(its_fd);
> > + vm_gic_destroy(&v);
> > +}
> > +
> > /*
> > * Returns 0 if it's possible to create GIC device of a given type (V2 or V3).
> > */
> > @@ -655,6 +696,7 @@ void run_tests(uint32_t gic_dev_type)
> > test_v3_last_bit_redist_regions();
> > test_v3_last_bit_single_rdist();
> > test_v3_redist_ipa_range_check_at_vcpu_run();
> > + test_v3_its_region();
> > }
> > }
> >
>
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH v3 10/10] KVM: arm64: selftests: Add basic ITS device tests
2021-09-30 20:10 ` Ricardo Koller
@ 2021-10-05 8:04 ` Eric Auger
0 siblings, 0 replies; 7+ messages in thread
From: Eric Auger @ 2021-10-05 8:04 UTC (permalink / raw)
To: Ricardo Koller
Cc: kvm, maz, kvmarm, drjones, alexandru.elisei, Paolo Bonzini,
oupton, james.morse, suzuki.poulose, shuah, jingzhangos, pshier,
rananta, reijiw
Hi Ricardo,
On 9/30/21 10:10 PM, Ricardo Koller wrote:
> Hi Eric,
>
> On Thu, Sep 30, 2021 at 11:14:02AM +0200, Eric Auger wrote:
>> Hi Ricardo,
>>
>> On 9/29/21 2:10 AM, Ricardo Koller wrote:
>>> Add some ITS device tests: general KVM device tests (address not defined
>>> already, address aligned) and tests for the ITS region being within the
>>> addressable IPA range.
>>>
>>> Signed-off-by: Ricardo Koller <ricarkol@google.com>
>>> ---
>>> .../testing/selftests/kvm/aarch64/vgic_init.c | 42 +++++++++++++++++++
>>> 1 file changed, 42 insertions(+)
>>>
>>> diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c
>>> index 417a9a515cad..180221ec325d 100644
>>> --- a/tools/testing/selftests/kvm/aarch64/vgic_init.c
>>> +++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c
>>> @@ -603,6 +603,47 @@ static void test_v3_redist_ipa_range_check_at_vcpu_run(void)
>>> vm_gic_destroy(&v);
>>> }
>>>
>>> +static void test_v3_its_region(void)
>>> +{
>>> + struct vm_gic v;
>>> + uint64_t addr;
>>> + int its_fd, ret;
>>> +
>>> + v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS);
>>> + its_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_ITS, false);
>> this may fail if the ITS device has not been registered by KVM (host GICv2)
> At the moment it's just called in the GICv3 case. It seems that
OK I missed that. in that case that's fine.
Thanks
Eric
> registering a GICv3 device results in having an ITS registered as well
> (from kvm_register_vgic_device()). I'm assuming this won't change;
> we might as well check that assumption. What do you think?
>
> Thanks,
> Ricardo
>
>> Maybe refine the patch title mentionning this is an ITS device "init" test.
>> as per Documentation/virt/kvm/devices/arm-vgic-its.rst we could also try
>> instantiating the ITS before the GIC and try instantiating several ITSs
>> with overlapping addresses.
>> But I would totally understand if you consider this out of the scope of
>> your fixes + tests.
>>
>> Thanks!
>>
>> Eric
>>> +
>>> + addr = 0x401000;
>>> + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
>>> + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
>>> + TEST_ASSERT(ret && errno == EINVAL,
>>> + "ITS region with misaligned address");
>>> +
>>> + addr = max_phys_size;
>>> + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
>>> + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
>>> + TEST_ASSERT(ret && errno == E2BIG,
>>> + "register ITS region with base address beyond IPA range");
>>> +
>>> + addr = max_phys_size - 0x10000;
>>> + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
>>> + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
>>> + TEST_ASSERT(ret && errno == E2BIG,
>>> + "Half of ITS region is beyond IPA range");
>>> +
>>> + /* This one succeeds setting the ITS base */
>>> + addr = 0x400000;
>>> + kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
>>> + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
>>> +
>>> + addr = 0x300000;
>>> + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
>>> + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
>>> + TEST_ASSERT(ret && errno == EEXIST, "ITS base set again");
>>> +
>>> + close(its_fd);
>>> + vm_gic_destroy(&v);
>>> +}
>>> +
>>> /*
>>> * Returns 0 if it's possible to create GIC device of a given type (V2 or V3).
>>> */
>>> @@ -655,6 +696,7 @@ void run_tests(uint32_t gic_dev_type)
>>> test_v3_last_bit_redist_regions();
>>> test_v3_last_bit_single_rdist();
>>> test_v3_redist_ipa_range_check_at_vcpu_run();
>>> + test_v3_its_region();
>>> }
>>> }
>>>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 10/10] KVM: arm64: selftests: Add basic ITS device tests
2021-09-30 9:14 ` Eric Auger
2021-09-30 20:10 ` Ricardo Koller
@ 2021-10-05 1:03 ` Ricardo Koller
1 sibling, 0 replies; 7+ messages in thread
From: Ricardo Koller @ 2021-10-05 1:03 UTC (permalink / raw)
To: Eric Auger
Cc: kvm, maz, kvmarm, drjones, alexandru.elisei, Paolo Bonzini,
oupton, james.morse, suzuki.poulose, shuah, jingzhangos, pshier,
rananta, reijiw
On Thu, Sep 30, 2021 at 11:14:02AM +0200, Eric Auger wrote:
> Hi Ricardo,
>
> On 9/29/21 2:10 AM, Ricardo Koller wrote:
> > Add some ITS device tests: general KVM device tests (address not defined
> > already, address aligned) and tests for the ITS region being within the
> > addressable IPA range.
> >
> > Signed-off-by: Ricardo Koller <ricarkol@google.com>
> > ---
> > .../testing/selftests/kvm/aarch64/vgic_init.c | 42 +++++++++++++++++++
> > 1 file changed, 42 insertions(+)
> >
> > diff --git a/tools/testing/selftests/kvm/aarch64/vgic_init.c b/tools/testing/selftests/kvm/aarch64/vgic_init.c
> > index 417a9a515cad..180221ec325d 100644
> > --- a/tools/testing/selftests/kvm/aarch64/vgic_init.c
> > +++ b/tools/testing/selftests/kvm/aarch64/vgic_init.c
> > @@ -603,6 +603,47 @@ static void test_v3_redist_ipa_range_check_at_vcpu_run(void)
> > vm_gic_destroy(&v);
> > }
> >
> > +static void test_v3_its_region(void)
> > +{
> > + struct vm_gic v;
> > + uint64_t addr;
> > + int its_fd, ret;
> > +
> > + v = vm_gic_create_with_vcpus(KVM_DEV_TYPE_ARM_VGIC_V3, NR_VCPUS);
> > + its_fd = kvm_create_device(v.vm, KVM_DEV_TYPE_ARM_VGIC_ITS, false);
> this may fail if the ITS device has not been registered by KVM (host GICv2)
>
> Maybe refine the patch title mentionning this is an ITS device "init" test.
> as per Documentation/virt/kvm/devices/arm-vgic-its.rst we could also try
> instantiating the ITS before the GIC and try instantiating several ITSs
> with overlapping addresses.
> But I would totally understand if you consider this out of the scope of
> your fixes + tests.
Will just send a v4 with init tests for now. ACK on changing the patch
title.
Thanks,
Ricardo
>
> Thanks!
>
> Eric
> > +
> > + addr = 0x401000;
> > + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> > + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> > + TEST_ASSERT(ret && errno == EINVAL,
> > + "ITS region with misaligned address");
> > +
> > + addr = max_phys_size;
> > + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> > + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> > + TEST_ASSERT(ret && errno == E2BIG,
> > + "register ITS region with base address beyond IPA range");
> > +
> > + addr = max_phys_size - 0x10000;
> > + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> > + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> > + TEST_ASSERT(ret && errno == E2BIG,
> > + "Half of ITS region is beyond IPA range");
> > +
> > + /* This one succeeds setting the ITS base */
> > + addr = 0x400000;
> > + kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> > + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> > +
> > + addr = 0x300000;
> > + ret = _kvm_device_access(its_fd, KVM_DEV_ARM_VGIC_GRP_ADDR,
> > + KVM_VGIC_ITS_ADDR_TYPE, &addr, true);
> > + TEST_ASSERT(ret && errno == EEXIST, "ITS base set again");
> > +
> > + close(its_fd);
> > + vm_gic_destroy(&v);
> > +}
> > +
> > /*
> > * Returns 0 if it's possible to create GIC device of a given type (V2 or V3).
> > */
> > @@ -655,6 +696,7 @@ void run_tests(uint32_t gic_dev_type)
> > test_v3_last_bit_redist_regions();
> > test_v3_last_bit_single_rdist();
> > test_v3_redist_ipa_range_check_at_vcpu_run();
> > + test_v3_its_region();
> > }
> > }
> >
>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2021-10-05 8:05 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-09-28 20:11 [PATCH v3 10/10] KVM: arm64: selftests: Add basic ITS device tests Ricardo Koller
2021-09-29 0:19 ` Ricardo Koller
-- strict thread matches above, loose matches on Subject: below --
2021-09-28 18:47 [PATCH v3 00/10] KVM: arm64: vgic: Missing checks for REDIST/CPU and ITS regions above the VM IPA size Ricardo Koller
2021-09-29 0:10 ` [PATCH v3 10/10] KVM: arm64: selftests: Add basic ITS device tests Ricardo Koller
2021-09-30 9:14 ` Eric Auger
2021-09-30 20:10 ` Ricardo Koller
2021-10-05 8:04 ` Eric Auger
2021-10-05 1:03 ` Ricardo Koller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox