1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Test the framework itself. These tests confirm that setup works. 4 * 5 * Copyright (C) 2023, Ventana Micro Systems Inc., Andrew Jones <ajones@ventanamicro.com> 6 */ 7 #include <libcflat.h> 8 #include <cpumask.h> 9 #include <on-cpus.h> 10 #include <asm/processor.h> 11 #include <asm/setup.h> 12 #include <asm/smp.h> 13 14 static void check_cpus(void) 15 { 16 int cpu; 17 18 for_each_present_cpu(cpu) 19 report_info("CPU%3d: hartid=%08lx", cpu, cpus[cpu].hartid); 20 } 21 22 static bool exceptions_work; 23 24 static void handler(struct pt_regs *regs) 25 { 26 exceptions_work = true; 27 regs->epc += 2; 28 } 29 30 static void check_exceptions(void) 31 { 32 install_exception_handler(EXC_INST_ILLEGAL, handler); 33 asm volatile(".4byte 0"); 34 install_exception_handler(EXC_INST_ILLEGAL, NULL); 35 report(exceptions_work, "exceptions"); 36 } 37 38 static cpumask_t cpus_alive; 39 40 static void check_secondary(void *data) 41 { 42 cpumask_set_cpu(smp_processor_id(), &cpus_alive); 43 } 44 45 static void check_smp(void) 46 { 47 int cpu, me = smp_processor_id(); 48 bool fail = false; 49 50 on_cpus(check_secondary, NULL); 51 52 report(cpumask_full(&cpu_online_mask), "Brought up all cpus"); 53 report(cpumask_full(&cpus_alive), "check_secondary"); 54 55 for_each_present_cpu(cpu) { 56 if (cpu == me) 57 continue; 58 if (!cpu_idle(cpu)) { 59 fail = true; 60 break; 61 } 62 } 63 report(!fail, "All secondaries are idle"); 64 } 65 66 int main(int argc, char **argv) 67 { 68 bool r; 69 70 report_prefix_push("selftest"); 71 72 report(!strncmp(argv[0], "selftest", 8), "program name"); 73 74 if (argc > 1) { 75 r = !strcmp(argv[1], "foo"); 76 if (argc > 2) 77 r &= !strcmp(argv[2], "bar"); 78 if (argc > 3) 79 r &= !strcmp(argv[3], "baz"); 80 report_info("matched %d command line parameters", argc - 1); 81 report(r, "command line parsing"); 82 } else { 83 report_skip("command line parsing"); 84 } 85 86 if (getenv("FOO")) { 87 r = !strcmp(getenv("FOO"), "foo"); 88 r &= !strcmp(getenv("BAR"), "bar"); 89 r &= !strcmp(getenv("BAZ"), "baz"); 90 report(r, "environ parsing"); 91 } else { 92 report_skip("environ parsing"); 93 } 94 95 check_exceptions(); 96 check_cpus(); 97 check_smp(); 98 99 return report_summary(); 100 } 101