KVM: selftests: Convert vgic_irq away from VCPU_ID
authorSean Christopherson <seanjc@google.com>
Wed, 16 Feb 2022 16:41:38 +0000 (08:41 -0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Sat, 11 Jun 2022 15:47:01 +0000 (11:47 -0400)
Convert vgic_irq to use vm_create_with_one_vcpu() and pass around a
'struct kvm_vcpu' object instead of passing around a vCPU ID (which is
always the global VCPU_ID...).

Opportunstically align the indentation for multiple functions'
parameters.

Signed-off-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
tools/testing/selftests/kvm/aarch64/vgic_irq.c
tools/testing/selftests/kvm/include/aarch64/vgic.h
tools/testing/selftests/kvm/lib/aarch64/vgic.c

index 87e4189..1111702 100644 (file)
@@ -22,7 +22,6 @@
 
 #define GICD_BASE_GPA          0x08000000ULL
 #define GICR_BASE_GPA          0x080A0000ULL
-#define VCPU_ID                        0
 
 /*
  * Stores the user specified args; it's passed to the guest and to every test
@@ -589,7 +588,8 @@ 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)
+                                       struct kvm_vcpu *vcpu,
+                                       bool expect_failure)
 {
        /*
         * Ignore this when expecting failure as invalid intids will lead to
@@ -659,15 +659,16 @@ static void kvm_routing_and_irqfd_check(struct kvm_vm *vm,
                (tmp) < (uint64_t)(first) + (uint64_t)(num);                    \
                (tmp)++, (i)++)
 
-static void run_guest_cmd(struct kvm_vm *vm, int gic_fd,
-               struct kvm_inject_args *inject_args,
-               struct test_args *test_args)
+static void run_guest_cmd(struct kvm_vcpu *vcpu, int gic_fd,
+                         struct kvm_inject_args *inject_args,
+                         struct test_args *test_args)
 {
        kvm_inject_cmd cmd = inject_args->cmd;
        uint32_t intid = inject_args->first_intid;
        uint32_t num = inject_args->num;
        int level = inject_args->level;
        bool expect_failure = inject_args->expect_failure;
+       struct kvm_vm *vm = vcpu->vm;
        uint64_t tmp;
        uint32_t i;
 
@@ -705,12 +706,12 @@ static void run_guest_cmd(struct kvm_vm *vm, int gic_fd,
                break;
        case KVM_WRITE_ISPENDR:
                for (i = intid; i < intid + num; i++)
-                       kvm_irq_write_ispendr_check(gic_fd, i,
-                                       VCPU_ID, expect_failure);
+                       kvm_irq_write_ispendr_check(gic_fd, i, vcpu,
+                                                   expect_failure);
                break;
        case KVM_WRITE_ISACTIVER:
                for (i = intid; i < intid + num; i++)
-                       kvm_irq_write_isactiver(gic_fd, i, VCPU_ID);
+                       kvm_irq_write_isactiver(gic_fd, i, vcpu);
                break;
        default:
                break;
@@ -739,6 +740,7 @@ static void test_vgic(uint32_t nr_irqs, bool level_sensitive, bool eoi_split)
 {
        struct ucall uc;
        int gic_fd;
+       struct kvm_vcpu *vcpu;
        struct kvm_vm *vm;
        struct kvm_inject_args inject_args;
        vm_vaddr_t args_gva;
@@ -753,16 +755,16 @@ static void test_vgic(uint32_t nr_irqs, bool level_sensitive, bool eoi_split)
 
        print_args(&args);
 
-       vm = vm_create_default(VCPU_ID, 0, guest_code);
+       vm = vm_create_with_one_vcpu(&vcpu, guest_code);
        ucall_init(vm, NULL);
 
        vm_init_descriptor_tables(vm);
-       vcpu_init_descriptor_tables(vm, VCPU_ID);
+       vcpu_init_descriptor_tables(vm, vcpu->id);
 
        /* Setup the guest args page (so it gets the args). */
        args_gva = vm_vaddr_alloc_page(vm);
        memcpy(addr_gva2hva(vm, args_gva), &args, sizeof(args));
-       vcpu_args_set(vm, 0, 1, args_gva);
+       vcpu_args_set(vm, vcpu->id, 1, args_gva);
 
        gic_fd = vgic_v3_setup(vm, 1, nr_irqs,
                        GICD_BASE_GPA, GICR_BASE_GPA);
@@ -775,12 +777,12 @@ static void test_vgic(uint32_t nr_irqs, bool level_sensitive, bool eoi_split)
                guest_irq_handlers[args.eoi_split][args.level_sensitive]);
 
        while (1) {
-               vcpu_run(vm, VCPU_ID);
+               vcpu_run(vm, vcpu->id);
 
-               switch (get_ucall(vm, VCPU_ID, &uc)) {
+               switch (get_ucall(vm, vcpu->id, &uc)) {
                case UCALL_SYNC:
                        kvm_inject_get_call(vm, &uc, &inject_args);
-                       run_guest_cmd(vm, gic_fd, &inject_args, &args);
+                       run_guest_cmd(vcpu, gic_fd, &inject_args, &args);
                        break;
                case UCALL_ABORT:
                        TEST_FAIL("%s at %s:%ld\n\tvalues: %#lx, %#lx",
index 4442081..0ac6f05 100644 (file)
@@ -8,6 +8,8 @@
 
 #include <linux/kvm.h>
 
+#include "kvm_util.h"
+
 #define REDIST_REGION_ATTR_ADDR(count, base, flags, index) \
        (((uint64_t)(count) << 52) | \
        ((uint64_t)((base) >> 16) << 16) | \
@@ -26,8 +28,8 @@ void kvm_arm_irq_line(struct kvm_vm *vm, uint32_t intid, int level);
 int _kvm_arm_irq_line(struct kvm_vm *vm, uint32_t intid, int level);
 
 /* The vcpu arg only applies to private interrupts. */
-void kvm_irq_write_ispendr(int gic_fd, uint32_t intid, uint32_t vcpu);
-void kvm_irq_write_isactiver(int gic_fd, uint32_t intid, uint32_t vcpu);
+void kvm_irq_write_ispendr(int gic_fd, uint32_t intid, struct kvm_vcpu *vcpu);
+void kvm_irq_write_isactiver(int gic_fd, uint32_t intid, struct kvm_vcpu *vcpu);
 
 #define KVM_IRQCHIP_NUM_PINS   (1020 - 32)
 
index cfe3067..b5f28d2 100644 (file)
@@ -127,8 +127,8 @@ void kvm_arm_irq_line(struct kvm_vm *vm, uint32_t intid, int level)
        TEST_ASSERT(!ret, KVM_IOCTL_ERROR(KVM_IRQ_LINE, ret));
 }
 
-static void vgic_poke_irq(int gic_fd, uint32_t intid,
-               uint32_t vcpu, uint64_t reg_off)
+static void vgic_poke_irq(int gic_fd, uint32_t intid, struct kvm_vcpu *vcpu,
+                         uint64_t reg_off)
 {
        uint64_t reg = intid / 32;
        uint64_t index = intid % 32;
@@ -141,7 +141,7 @@ static void vgic_poke_irq(int gic_fd, uint32_t intid,
 
        if (intid_is_private) {
                /* TODO: only vcpu 0 implemented for now. */
-               assert(vcpu == 0);
+               assert(vcpu->id == 0);
                attr += SZ_64K;
        }
 
@@ -159,12 +159,12 @@ static void vgic_poke_irq(int gic_fd, uint32_t intid,
        kvm_device_attr_set(gic_fd, group, attr, &val);
 }
 
-void kvm_irq_write_ispendr(int gic_fd, uint32_t intid, uint32_t vcpu)
+void kvm_irq_write_ispendr(int gic_fd, uint32_t intid, struct kvm_vcpu *vcpu)
 {
        vgic_poke_irq(gic_fd, intid, vcpu, GICD_ISPENDR);
 }
 
-void kvm_irq_write_isactiver(int gic_fd, uint32_t intid, uint32_t vcpu)
+void kvm_irq_write_isactiver(int gic_fd, uint32_t intid, struct kvm_vcpu *vcpu)
 {
        vgic_poke_irq(gic_fd, intid, vcpu, GICD_ISACTIVER);
 }