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 | |