This source file includes following definitions.
- dso__set_loaded
- __dso__zput
- dso__has_symbols
- dso__is_vmlinux
- dso__is_kcore
- dso__is_kallsyms
1
2 #ifndef __PERF_DSO
3 #define __PERF_DSO
4
5 #include <pthread.h>
6 #include <linux/refcount.h>
7 #include <linux/types.h>
8 #include <linux/rbtree.h>
9 #include <sys/types.h>
10 #include <stdbool.h>
11 #include <stdio.h>
12 #include <linux/bitops.h>
13 #include "build-id.h"
14
15 struct machine;
16 struct map;
17 struct perf_env;
18
19 #define DSO__NAME_KALLSYMS "[kernel.kallsyms]"
20 #define DSO__NAME_KCORE "[kernel.kcore]"
21
22 enum dso_binary_type {
23 DSO_BINARY_TYPE__KALLSYMS = 0,
24 DSO_BINARY_TYPE__GUEST_KALLSYMS,
25 DSO_BINARY_TYPE__VMLINUX,
26 DSO_BINARY_TYPE__GUEST_VMLINUX,
27 DSO_BINARY_TYPE__JAVA_JIT,
28 DSO_BINARY_TYPE__DEBUGLINK,
29 DSO_BINARY_TYPE__BUILD_ID_CACHE,
30 DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO,
31 DSO_BINARY_TYPE__FEDORA_DEBUGINFO,
32 DSO_BINARY_TYPE__UBUNTU_DEBUGINFO,
33 DSO_BINARY_TYPE__BUILDID_DEBUGINFO,
34 DSO_BINARY_TYPE__SYSTEM_PATH_DSO,
35 DSO_BINARY_TYPE__GUEST_KMODULE,
36 DSO_BINARY_TYPE__GUEST_KMODULE_COMP,
37 DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE,
38 DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP,
39 DSO_BINARY_TYPE__KCORE,
40 DSO_BINARY_TYPE__GUEST_KCORE,
41 DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO,
42 DSO_BINARY_TYPE__BPF_PROG_INFO,
43 DSO_BINARY_TYPE__NOT_FOUND,
44 };
45
46 enum dso_kernel_type {
47 DSO_TYPE_USER = 0,
48 DSO_TYPE_KERNEL,
49 DSO_TYPE_GUEST_KERNEL
50 };
51
52 enum dso_swap_type {
53 DSO_SWAP__UNSET,
54 DSO_SWAP__NO,
55 DSO_SWAP__YES,
56 };
57
58 enum dso_data_status {
59 DSO_DATA_STATUS_ERROR = -1,
60 DSO_DATA_STATUS_UNKNOWN = 0,
61 DSO_DATA_STATUS_OK = 1,
62 };
63
64 enum dso_data_status_seen {
65 DSO_DATA_STATUS_SEEN_ITRACE,
66 };
67
68 enum dso_type {
69 DSO__TYPE_UNKNOWN,
70 DSO__TYPE_64BIT,
71 DSO__TYPE_32BIT,
72 DSO__TYPE_X32BIT,
73 };
74
75 enum dso_load_errno {
76 DSO_LOAD_ERRNO__SUCCESS = 0,
77
78
79
80
81
82
83
84
85 __DSO_LOAD_ERRNO__START = -10000,
86
87 DSO_LOAD_ERRNO__INTERNAL_ERROR = __DSO_LOAD_ERRNO__START,
88
89
90 DSO_LOAD_ERRNO__INVALID_ELF,
91 DSO_LOAD_ERRNO__CANNOT_READ_BUILDID,
92 DSO_LOAD_ERRNO__MISMATCHING_BUILDID,
93
94
95 DSO_LOAD_ERRNO__DECOMPRESSION_FAILURE,
96
97 __DSO_LOAD_ERRNO__END,
98 };
99
100 #define DSO__SWAP(dso, type, val) \
101 ({ \
102 type ____r = val; \
103 BUG_ON(dso->needs_swap == DSO_SWAP__UNSET); \
104 if (dso->needs_swap == DSO_SWAP__YES) { \
105 switch (sizeof(____r)) { \
106 case 2: \
107 ____r = bswap_16(val); \
108 break; \
109 case 4: \
110 ____r = bswap_32(val); \
111 break; \
112 case 8: \
113 ____r = bswap_64(val); \
114 break; \
115 default: \
116 BUG_ON(1); \
117 } \
118 } \
119 ____r; \
120 })
121
122 #define DSO__DATA_CACHE_SIZE 4096
123 #define DSO__DATA_CACHE_MASK ~(DSO__DATA_CACHE_SIZE - 1)
124
125 struct dso_cache {
126 struct rb_node rb_node;
127 u64 offset;
128 u64 size;
129 char data[0];
130 };
131
132 struct auxtrace_cache;
133
134 struct dso {
135 pthread_mutex_t lock;
136 struct list_head node;
137 struct rb_node rb_node;
138 struct rb_root *root;
139 struct rb_root_cached symbols;
140 struct rb_root_cached symbol_names;
141 struct rb_root_cached inlined_nodes;
142 struct rb_root_cached srclines;
143 struct {
144 u64 addr;
145 struct symbol *symbol;
146 } last_find_result;
147 void *a2l;
148 char *symsrc_filename;
149 unsigned int a2l_fails;
150 enum dso_kernel_type kernel;
151 enum dso_swap_type needs_swap;
152 enum dso_binary_type symtab_type;
153 enum dso_binary_type binary_type;
154 enum dso_load_errno load_errno;
155 u8 adjust_symbols:1;
156 u8 has_build_id:1;
157 u8 has_srcline:1;
158 u8 hit:1;
159 u8 annotate_warned:1;
160 u8 short_name_allocated:1;
161 u8 long_name_allocated:1;
162 u8 is_64_bit:1;
163 bool sorted_by_name;
164 bool loaded;
165 u8 rel;
166 u8 build_id[BUILD_ID_SIZE];
167 u64 text_offset;
168 const char *short_name;
169 const char *long_name;
170 u16 long_name_len;
171 u16 short_name_len;
172 void *dwfl;
173 struct auxtrace_cache *auxtrace_cache;
174 int comp;
175
176
177 struct {
178 struct rb_root cache;
179 int fd;
180 int status;
181 u32 status_seen;
182 size_t file_size;
183 struct list_head open_entry;
184 u64 debug_frame_offset;
185 u64 eh_frame_hdr_offset;
186 } data;
187
188 struct {
189 u32 id;
190 u32 sub_id;
191 struct perf_env *env;
192 } bpf_prog;
193
194 union {
195 void *priv;
196 u64 db_id;
197 };
198 struct nsinfo *nsinfo;
199 refcount_t refcnt;
200 char name[0];
201 };
202
203
204
205
206
207
208
209 #define dso__for_each_symbol(dso, pos, n) \
210 symbols__for_each_entry(&(dso)->symbols, pos, n)
211
212 static inline void dso__set_loaded(struct dso *dso)
213 {
214 dso->loaded = true;
215 }
216
217 struct dso *dso__new(const char *name);
218 void dso__delete(struct dso *dso);
219
220 void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated);
221 void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated);
222
223 int dso__name_len(const struct dso *dso);
224
225 struct dso *dso__get(struct dso *dso);
226 void dso__put(struct dso *dso);
227
228 static inline void __dso__zput(struct dso **dso)
229 {
230 dso__put(*dso);
231 *dso = NULL;
232 }
233
234 #define dso__zput(dso) __dso__zput(&dso)
235
236 bool dso__loaded(const struct dso *dso);
237
238 static inline bool dso__has_symbols(const struct dso *dso)
239 {
240 return !RB_EMPTY_ROOT(&dso->symbols.rb_root);
241 }
242
243 bool dso__sorted_by_name(const struct dso *dso);
244 void dso__set_sorted_by_name(struct dso *dso);
245 void dso__sort_by_name(struct dso *dso);
246
247 void dso__set_build_id(struct dso *dso, void *build_id);
248 bool dso__build_id_equal(const struct dso *dso, u8 *build_id);
249 void dso__read_running_kernel_build_id(struct dso *dso,
250 struct machine *machine);
251 int dso__kernel_module_get_build_id(struct dso *dso, const char *root_dir);
252
253 char dso__symtab_origin(const struct dso *dso);
254 int dso__read_binary_type_filename(const struct dso *dso, enum dso_binary_type type,
255 char *root_dir, char *filename, size_t size);
256 bool is_kernel_module(const char *pathname, int cpumode);
257 bool dso__needs_decompress(struct dso *dso);
258 int dso__decompress_kmodule_fd(struct dso *dso, const char *name);
259 int dso__decompress_kmodule_path(struct dso *dso, const char *name,
260 char *pathname, size_t len);
261
262 #define KMOD_DECOMP_NAME "/tmp/perf-kmod-XXXXXX"
263 #define KMOD_DECOMP_LEN sizeof(KMOD_DECOMP_NAME)
264
265 struct kmod_path {
266 char *name;
267 int comp;
268 bool kmod;
269 };
270
271 int __kmod_path__parse(struct kmod_path *m, const char *path,
272 bool alloc_name);
273
274 #define kmod_path__parse(__m, __p) __kmod_path__parse(__m, __p, false)
275 #define kmod_path__parse_name(__m, __p) __kmod_path__parse(__m, __p, true)
276
277 void dso__set_module_info(struct dso *dso, struct kmod_path *m,
278 struct machine *machine);
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323 int dso__data_get_fd(struct dso *dso, struct machine *machine);
324 void dso__data_put_fd(struct dso *dso);
325 void dso__data_close(struct dso *dso);
326
327 int dso__data_file_size(struct dso *dso, struct machine *machine);
328 off_t dso__data_size(struct dso *dso, struct machine *machine);
329 ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
330 u64 offset, u8 *data, ssize_t size);
331 ssize_t dso__data_read_addr(struct dso *dso, struct map *map,
332 struct machine *machine, u64 addr,
333 u8 *data, ssize_t size);
334 bool dso__data_status_seen(struct dso *dso, enum dso_data_status_seen by);
335
336 struct map *dso__new_map(const char *name);
337 struct dso *machine__findnew_kernel(struct machine *machine, const char *name,
338 const char *short_name, int dso_type);
339
340 void dso__reset_find_symbol_cache(struct dso *dso);
341
342 size_t dso__fprintf_buildid(struct dso *dso, FILE *fp);
343 size_t dso__fprintf_symbols_by_name(struct dso *dso, FILE *fp);
344 size_t dso__fprintf(struct dso *dso, FILE *fp);
345
346 static inline bool dso__is_vmlinux(struct dso *dso)
347 {
348 return dso->binary_type == DSO_BINARY_TYPE__VMLINUX ||
349 dso->binary_type == DSO_BINARY_TYPE__GUEST_VMLINUX;
350 }
351
352 static inline bool dso__is_kcore(struct dso *dso)
353 {
354 return dso->binary_type == DSO_BINARY_TYPE__KCORE ||
355 dso->binary_type == DSO_BINARY_TYPE__GUEST_KCORE;
356 }
357
358 static inline bool dso__is_kallsyms(struct dso *dso)
359 {
360 return dso->kernel && dso->long_name[0] != '/';
361 }
362
363 void dso__free_a2l(struct dso *dso);
364
365 enum dso_type dso__type(struct dso *dso, struct machine *machine);
366
367 int dso__strerror_load(struct dso *dso, char *buf, size_t buflen);
368
369 void reset_fd_limit(void);
370
371 #endif