]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: selftests: aarch64: Add ISPENDR write tests in vgic_irq
authorRicardo Koller <ricarkol@google.com>
Tue, 9 Nov 2021 02:39:05 +0000 (18:39 -0800)
committerMarc Zyngier <maz@kernel.org>
Tue, 28 Dec 2021 19:25:00 +0000 (19:25 +0000)
Add injection tests that use writing into the ISPENDR register (to mark
IRQs as pending). This is typically used by migration code.

Signed-off-by: Ricardo Koller <ricarkol@google.com>
Acked-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20211109023906.1091208-17-ricarkol@google.com
tools/testing/selftests/kvm/aarch64/vgic_irq.c

index 121113f24ed306ebce80594d72521292a8196090..ab39f0bf18e7c7da6fa47b0884466f07a1c5bf0a 100644 (file)
@@ -65,6 +65,7 @@ typedef enum {
        KVM_SET_IRQ_LINE_HIGH,
        KVM_SET_LEVEL_INFO_HIGH,
        KVM_INJECT_IRQFD,
+       KVM_WRITE_ISPENDR,
 } kvm_inject_cmd;
 
 struct kvm_inject_args {
@@ -105,6 +106,7 @@ static struct kvm_inject_desc inject_edge_fns[] = {
        /*                                      sgi    ppi    spi */
        { KVM_INJECT_EDGE_IRQ_LINE,             false, false, true },
        { KVM_INJECT_IRQFD,                     false, false, true },
+       { KVM_WRITE_ISPENDR,                    true,  false, true },
        { 0, },
 };
 
@@ -113,6 +115,7 @@ static struct kvm_inject_desc inject_level_fns[] = {
        { KVM_SET_IRQ_LINE_HIGH,                false, true,  true },
        { KVM_SET_LEVEL_INFO_HIGH,              false, true,  true },
        { KVM_INJECT_IRQFD,                     false, false, true },
+       { KVM_WRITE_ISPENDR,                    false, true,  true },
        { 0, },
 };
 
@@ -495,6 +498,20 @@ static void kvm_set_gsi_routing_irqchip_check(struct kvm_vm *vm,
        }
 }
 
+static void kvm_irq_write_ispendr_check(int gic_fd, uint32_t intid,
+                       uint32_t vcpu, bool expect_failure)
+{
+       /*
+        * Ignore this when expecting failure as invalid intids will lead to
+        * either trying to inject SGIs when we configured the test to be
+        * level_sensitive (or the reverse), or inject large intids which
+        * will lead to writing above the ISPENDR register space (and we
+        * don't want to do that either).
+        */
+       if (!expect_failure)
+               kvm_irq_write_ispendr(gic_fd, intid, vcpu);
+}
+
 static void kvm_routing_and_irqfd_check(struct kvm_vm *vm,
                uint32_t intid, uint32_t num, uint32_t kvm_max_routes,
                bool expect_failure)
@@ -597,6 +614,11 @@ static void run_guest_cmd(struct kvm_vm *vm, int gic_fd,
                                        test_args->kvm_max_routes,
                                        expect_failure);
                break;
+       case KVM_WRITE_ISPENDR:
+               for (i = intid; i < intid + num; i++)
+                       kvm_irq_write_ispendr_check(gic_fd, i,
+                                       VCPU_ID, expect_failure);
+               break;
        default:
                break;
        }