KVM: riscv: selftests: Add commandline option for SBI PMU test
authorAtish Patra <atishp@rivosinc.com>
Sat, 20 Apr 2024 15:17:40 +0000 (08:17 -0700)
committerAnup Patel <anup@brainfault.org>
Fri, 26 Apr 2024 07:44:15 +0000 (13:14 +0530)
SBI PMU test comprises of multiple tests and user may want to run
only a subset depending on the platform. The most common case would
be to run all to validate all the tests. However, some platform may
not support all events or all ISA extensions.

The commandline option allows user to disable any set of tests if
they want to.

Suggested-by: Andrew Jones <ajones@ventanamicro.com>
Signed-off-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Link: https://lore.kernel.org/r/20240420151741.962500-25-atishp@rivosinc.com
Signed-off-by: Anup Patel <anup@brainfault.org>
tools/testing/selftests/kvm/riscv/sbi_pmu_test.c

index 0fd9b76ae8384c09904bcb6983c6e2e6577fc7c7..69bb94e6b22762081da27196b6b6903e55374c0d 100644 (file)
@@ -33,6 +33,13 @@ static unsigned long counter_mask_available;
 
 static bool illegal_handler_invoked;
 
+#define SBI_PMU_TEST_BASIC     BIT(0)
+#define SBI_PMU_TEST_EVENTS    BIT(1)
+#define SBI_PMU_TEST_SNAPSHOT  BIT(2)
+#define SBI_PMU_TEST_OVERFLOW  BIT(3)
+
+static int disabled_tests;
+
 unsigned long pmu_csr_read_num(int csr_num)
 {
 #define switchcase_csr_read(__csr_num, __val)          {\
@@ -608,19 +615,67 @@ static void test_vm_events_overflow(void *guest_code)
        test_vm_destroy(vm);
 }
 
-int main(void)
+static void test_print_help(char *name)
+{
+       pr_info("Usage: %s [-h] [-d <test name>]\n", name);
+       pr_info("\t-d: Test to disable. Available tests are 'basic', 'events', 'snapshot', 'overflow'\n");
+       pr_info("\t-h: print this help screen\n");
+}
+
+static bool parse_args(int argc, char *argv[])
+{
+       int opt;
+
+       while ((opt = getopt(argc, argv, "hd:")) != -1) {
+               switch (opt) {
+               case 'd':
+                       if (!strncmp("basic", optarg, 5))
+                               disabled_tests |= SBI_PMU_TEST_BASIC;
+                       else if (!strncmp("events", optarg, 6))
+                               disabled_tests |= SBI_PMU_TEST_EVENTS;
+                       else if (!strncmp("snapshot", optarg, 8))
+                               disabled_tests |= SBI_PMU_TEST_SNAPSHOT;
+                       else if (!strncmp("overflow", optarg, 8))
+                               disabled_tests |= SBI_PMU_TEST_OVERFLOW;
+                       else
+                               goto done;
+                       break;
+               case 'h':
+               default:
+                       goto done;
+               }
+       }
+
+       return true;
+done:
+       test_print_help(argv[0]);
+       return false;
+}
+
+int main(int argc, char *argv[])
 {
-       test_vm_basic_test(test_pmu_basic_sanity);
-       pr_info("SBI PMU basic test : PASS\n");
+       if (!parse_args(argc, argv))
+               exit(KSFT_SKIP);
+
+       if (!(disabled_tests & SBI_PMU_TEST_BASIC)) {
+               test_vm_basic_test(test_pmu_basic_sanity);
+               pr_info("SBI PMU basic test : PASS\n");
+       }
 
-       test_vm_events_test(test_pmu_events);
-       pr_info("SBI PMU event verification test : PASS\n");
+       if (!(disabled_tests & SBI_PMU_TEST_EVENTS)) {
+               test_vm_events_test(test_pmu_events);
+               pr_info("SBI PMU event verification test : PASS\n");
+       }
 
-       test_vm_events_snapshot_test(test_pmu_events_snaphost);
-       pr_info("SBI PMU event verification with snapshot test : PASS\n");
+       if (!(disabled_tests & SBI_PMU_TEST_SNAPSHOT)) {
+               test_vm_events_snapshot_test(test_pmu_events_snaphost);
+               pr_info("SBI PMU event verification with snapshot test : PASS\n");
+       }
 
-       test_vm_events_overflow(test_pmu_events_overflow);
-       pr_info("SBI PMU event verification with overflow test : PASS\n");
+       if (!(disabled_tests & SBI_PMU_TEST_OVERFLOW)) {
+               test_vm_events_overflow(test_pmu_events_overflow);
+               pr_info("SBI PMU event verification with overflow test : PASS\n");
+       }
 
        return 0;
 }