1 // SPDX-License-Identifier: GPL-2.0 2 #include <stdbool.h> 3 #include <stdlib.h> 4 #include <string.h> 5 #include "tests.h" 6 #include "dso.h" 7 #include "debug.h" 8 #include "event.h" 9 10 static int test(const char *path, bool alloc_name, bool kmod, 11 int comp, const char *name) 12 { 13 struct kmod_path m; 14 15 memset(&m, 0x0, sizeof(m)); 16 17 TEST_ASSERT_VAL("kmod_path__parse", 18 !__kmod_path__parse(&m, path, alloc_name)); 19 20 pr_debug("%s - alloc name %d, kmod %d, comp %d, name '%s'\n", 21 path, alloc_name, m.kmod, m.comp, m.name); 22 23 TEST_ASSERT_VAL("wrong kmod", m.kmod == kmod); 24 TEST_ASSERT_VAL("wrong comp", m.comp == comp); 25 26 if (name) 27 TEST_ASSERT_VAL("wrong name", m.name && !strcmp(name, m.name)); 28 else 29 TEST_ASSERT_VAL("wrong name", !m.name); 30 31 free(m.name); 32 return 0; 33 } 34 35 static int test_is_kernel_module(const char *path, int cpumode, bool expect) 36 { 37 TEST_ASSERT_VAL("is_kernel_module", 38 (!!is_kernel_module(path, cpumode)) == (!!expect)); 39 pr_debug("%s (cpumode: %d) - is_kernel_module: %s\n", 40 path, cpumode, expect ? "true" : "false"); 41 return 0; 42 } 43 44 #define T(path, an, k, c, n) \ 45 TEST_ASSERT_VAL("failed", !test(path, an, k, c, n)) 46 47 #define M(path, c, e) \ 48 TEST_ASSERT_VAL("failed", !test_is_kernel_module(path, c, e)) 49 50 static int test__kmod_path__parse(struct test_suite *t __maybe_unused, int subtest __maybe_unused) 51 { 52 /* path alloc_name kmod comp name */ 53 T("/xxxx/xxxx/x-x.ko", true , true, 0 , "[x_x]"); 54 T("/xxxx/xxxx/x-x.ko", false , true, 0 , NULL ); 55 T("/xxxx/xxxx/x-x.ko", true , true, 0 , "[x_x]"); 56 T("/xxxx/xxxx/x-x.ko", false , true, 0 , NULL ); 57 M("/xxxx/xxxx/x-x.ko", PERF_RECORD_MISC_CPUMODE_UNKNOWN, true); 58 M("/xxxx/xxxx/x-x.ko", PERF_RECORD_MISC_KERNEL, true); 59 M("/xxxx/xxxx/x-x.ko", PERF_RECORD_MISC_USER, false); 60 61 #ifdef HAVE_ZLIB_SUPPORT 62 /* path alloc_name kmod comp name */ 63 T("/xxxx/xxxx/x.ko.gz", true , true, 1 , "[x]"); 64 T("/xxxx/xxxx/x.ko.gz", false , true, 1 , NULL ); 65 T("/xxxx/xxxx/x.ko.gz", true , true, 1 , "[x]"); 66 T("/xxxx/xxxx/x.ko.gz", false , true, 1 , NULL ); 67 M("/xxxx/xxxx/x.ko.gz", PERF_RECORD_MISC_CPUMODE_UNKNOWN, true); 68 M("/xxxx/xxxx/x.ko.gz", PERF_RECORD_MISC_KERNEL, true); 69 M("/xxxx/xxxx/x.ko.gz", PERF_RECORD_MISC_USER, false); 70 71 /* path alloc_name kmod comp name */ 72 T("/xxxx/xxxx/x.gz", true , false, 1 , "x.gz"); 73 T("/xxxx/xxxx/x.gz", false , false, 1 , NULL ); 74 T("/xxxx/xxxx/x.gz", true , false, 1 , "x.gz"); 75 T("/xxxx/xxxx/x.gz", false , false, 1 , NULL ); 76 M("/xxxx/xxxx/x.gz", PERF_RECORD_MISC_CPUMODE_UNKNOWN, false); 77 M("/xxxx/xxxx/x.gz", PERF_RECORD_MISC_KERNEL, false); 78 M("/xxxx/xxxx/x.gz", PERF_RECORD_MISC_USER, false); 79 80 /* path alloc_name kmod comp name */ 81 T("x.gz", true , false, 1 , "x.gz"); 82 T("x.gz", false , false, 1 , NULL ); 83 T("x.gz", true , false, 1 , "x.gz"); 84 T("x.gz", false , false, 1 , NULL ); 85 M("x.gz", PERF_RECORD_MISC_CPUMODE_UNKNOWN, false); 86 M("x.gz", PERF_RECORD_MISC_KERNEL, false); 87 M("x.gz", PERF_RECORD_MISC_USER, false); 88 89 /* path alloc_name kmod comp name */ 90 T("x.ko.gz", true , true, 1 , "[x]"); 91 T("x.ko.gz", false , true, 1 , NULL ); 92 T("x.ko.gz", true , true, 1 , "[x]"); 93 T("x.ko.gz", false , true, 1 , NULL ); 94 M("x.ko.gz", PERF_RECORD_MISC_CPUMODE_UNKNOWN, true); 95 M("x.ko.gz", PERF_RECORD_MISC_KERNEL, true); 96 M("x.ko.gz", PERF_RECORD_MISC_USER, false); 97 #endif 98 99 /* path alloc_name kmod comp name */ 100 T("[test_module]", true , true, false, "[test_module]"); 101 T("[test_module]", false , true, false, NULL ); 102 T("[test_module]", true , true, false, "[test_module]"); 103 T("[test_module]", false , true, false, NULL ); 104 M("[test_module]", PERF_RECORD_MISC_CPUMODE_UNKNOWN, true); 105 M("[test_module]", PERF_RECORD_MISC_KERNEL, true); 106 M("[test_module]", PERF_RECORD_MISC_USER, false); 107 108 /* path alloc_name kmod comp name */ 109 T("[test.module]", true , true, false, "[test.module]"); 110 T("[test.module]", false , true, false, NULL ); 111 T("[test.module]", true , true, false, "[test.module]"); 112 T("[test.module]", false , true, false, NULL ); 113 M("[test.module]", PERF_RECORD_MISC_CPUMODE_UNKNOWN, true); 114 M("[test.module]", PERF_RECORD_MISC_KERNEL, true); 115 M("[test.module]", PERF_RECORD_MISC_USER, false); 116 117 /* path alloc_name kmod comp name */ 118 T("[vdso]", true , false, false, "[vdso]"); 119 T("[vdso]", false , false, false, NULL ); 120 T("[vdso]", true , false, false, "[vdso]"); 121 T("[vdso]", false , false, false, NULL ); 122 M("[vdso]", PERF_RECORD_MISC_CPUMODE_UNKNOWN, false); 123 M("[vdso]", PERF_RECORD_MISC_KERNEL, false); 124 M("[vdso]", PERF_RECORD_MISC_USER, false); 125 126 T("[vdso32]", true , false, false, "[vdso32]"); 127 T("[vdso32]", false , false, false, NULL ); 128 T("[vdso32]", true , false, false, "[vdso32]"); 129 T("[vdso32]", false , false, false, NULL ); 130 M("[vdso32]", PERF_RECORD_MISC_CPUMODE_UNKNOWN, false); 131 M("[vdso32]", PERF_RECORD_MISC_KERNEL, false); 132 M("[vdso32]", PERF_RECORD_MISC_USER, false); 133 134 T("[vdsox32]", true , false, false, "[vdsox32]"); 135 T("[vdsox32]", false , false, false, NULL ); 136 T("[vdsox32]", true , false, false, "[vdsox32]"); 137 T("[vdsox32]", false , false, false, NULL ); 138 M("[vdsox32]", PERF_RECORD_MISC_CPUMODE_UNKNOWN, false); 139 M("[vdsox32]", PERF_RECORD_MISC_KERNEL, false); 140 M("[vdsox32]", PERF_RECORD_MISC_USER, false); 141 142 /* path alloc_name kmod comp name */ 143 T("[vsyscall]", true , false, false, "[vsyscall]"); 144 T("[vsyscall]", false , false, false, NULL ); 145 T("[vsyscall]", true , false, false, "[vsyscall]"); 146 T("[vsyscall]", false , false, false, NULL ); 147 M("[vsyscall]", PERF_RECORD_MISC_CPUMODE_UNKNOWN, false); 148 M("[vsyscall]", PERF_RECORD_MISC_KERNEL, false); 149 M("[vsyscall]", PERF_RECORD_MISC_USER, false); 150 151 /* path alloc_name kmod comp name */ 152 T("[kernel.kallsyms]", true , false, false, "[kernel.kallsyms]"); 153 T("[kernel.kallsyms]", false , false, false, NULL ); 154 T("[kernel.kallsyms]", true , false, false, "[kernel.kallsyms]"); 155 T("[kernel.kallsyms]", false , false, false, NULL ); 156 M("[kernel.kallsyms]", PERF_RECORD_MISC_CPUMODE_UNKNOWN, false); 157 M("[kernel.kallsyms]", PERF_RECORD_MISC_KERNEL, false); 158 M("[kernel.kallsyms]", PERF_RECORD_MISC_USER, false); 159 160 return 0; 161 } 162 163 DEFINE_SUITE("kmod_path__parse", kmod_path__parse); 164