KVM: arm64: selftests: get-reg-list: Prepare to run multiple configs at once
authorAndrew Jones <drjones@redhat.com>
Mon, 31 May 2021 10:33:41 +0000 (12:33 +0200)
committerMarc Zyngier <maz@kernel.org>
Tue, 22 Jun 2021 07:51:28 +0000 (08:51 +0100)
We don't want to have to create a new binary for each vcpu config, so
prepare to run the test for multiple vcpu configs in a single binary.
We do this by factoring out the test from main() and then looping over
configs. When given '--list' we still never print more than a single
reg-list for a single vcpu config though, because it would be confusing
otherwise.

No functional change intended.

Signed-off-by: Andrew Jones <drjones@redhat.com>
Reviewed-by: Ricardo Koller <ricarkol@google.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20210531103344.29325-3-drjones@redhat.com
tools/testing/selftests/kvm/aarch64/get-reg-list.c

index 7bb09ce..14fc8d8 100644 (file)
@@ -56,8 +56,8 @@ struct vcpu_config {
        struct reg_sublist sublists[];
 };
 
-static struct vcpu_config vregs_config;
-static struct vcpu_config sve_config;
+static struct vcpu_config *vcpu_configs[];
+static int vcpu_configs_n;
 
 #define for_each_sublist(c, s)                                                 \
        for ((s) = &(c)->sublists[0]; (s)->regs; ++(s))
@@ -400,29 +400,20 @@ static void check_supported(struct vcpu_config *c)
        }
 }
 
-int main(int ac, char **av)
+static bool print_list;
+static bool print_filtered;
+static bool fixup_core_regs;
+
+static void run_test(struct vcpu_config *c)
 {
-       struct vcpu_config *c = reg_list_sve() ? &sve_config : &vregs_config;
        struct kvm_vcpu_init init = { .target = -1, };
        int new_regs = 0, missing_regs = 0, i, n;
        int failed_get = 0, failed_set = 0, failed_reject = 0;
-       bool print_list = false, print_filtered = false, fixup_core_regs = false;
        struct kvm_vm *vm;
        struct reg_sublist *s;
 
        check_supported(c);
 
-       for (i = 1; i < ac; ++i) {
-               if (strcmp(av[i], "--core-reg-fixup") == 0)
-                       fixup_core_regs = true;
-               else if (strcmp(av[i], "--list") == 0)
-                       print_list = true;
-               else if (strcmp(av[i], "--list-filtered") == 0)
-                       print_filtered = true;
-               else
-                       TEST_FAIL("Unknown option: %s\n", av[i]);
-       }
-
        vm = vm_create(VM_MODE_DEFAULT, DEFAULT_GUEST_PHY_PAGES, O_RDWR);
        prepare_vcpu_init(c, &init);
        aarch64_vcpu_add_default(vm, 0, &init, NULL);
@@ -442,7 +433,7 @@ int main(int ac, char **av)
                                print_reg(c, id);
                }
                putchar('\n');
-               return 0;
+               return;
        }
 
        /*
@@ -541,6 +532,44 @@ int main(int ac, char **av)
                    "%d registers failed get; %d registers failed set; %d registers failed reject",
                    config_name(c), missing_regs, failed_get, failed_set, failed_reject);
 
+       pr_info("%s: PASS\n", config_name(c));
+       blessed_n = 0;
+       free(blessed_reg);
+       free(reg_list);
+       kvm_vm_free(vm);
+}
+
+int main(int ac, char **av)
+{
+       struct vcpu_config *c, *sel = NULL;
+       int i;
+
+       for (i = 1; i < ac; ++i) {
+               if (strcmp(av[i], "--core-reg-fixup") == 0)
+                       fixup_core_regs = true;
+               else if (strcmp(av[i], "--list") == 0)
+                       print_list = true;
+               else if (strcmp(av[i], "--list-filtered") == 0)
+                       print_filtered = true;
+               else
+                       TEST_FAIL("Unknown option: %s\n", av[i]);
+       }
+
+       if (print_list || print_filtered) {
+               /*
+                * We only want to print the register list of a single config.
+                * TODO: Add command line support to pick which config.
+                */
+               sel = vcpu_configs[0];
+       }
+
+       for (i = 0; i < vcpu_configs_n; ++i) {
+               c = vcpu_configs[i];
+               if (sel && c != sel)
+                       continue;
+               run_test(c);
+       }
+
        return 0;
 }
 
@@ -945,3 +974,8 @@ static struct vcpu_config sve_config = {
        {0},
        },
 };
+
+static struct vcpu_config *vcpu_configs[] = {
+       reg_list_sve() ? &sve_config : &vregs_config,
+};
+static int vcpu_configs_n = ARRAY_SIZE(vcpu_configs);