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
15struct machine;
16struct map;
17struct perf_env;
18
19#define DSO__NAME_KALLSYMS "[kernel.kallsyms]"
20#define DSO__NAME_KCORE "[kernel.kcore]"
21
22enum 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
46enum dso_kernel_type {
47 DSO_TYPE_USER = 0,
48 DSO_TYPE_KERNEL,
49 DSO_TYPE_GUEST_KERNEL
50};
51
52enum dso_swap_type {
53 DSO_SWAP__UNSET,
54 DSO_SWAP__NO,
55 DSO_SWAP__YES,
56};
57
58enum dso_data_status {
59 DSO_DATA_STATUS_ERROR = -1,
60 DSO_DATA_STATUS_UNKNOWN = 0,
61 DSO_DATA_STATUS_OK = 1,
62};
63
64enum dso_data_status_seen {
65 DSO_DATA_STATUS_SEEN_ITRACE,
66};
67
68enum dso_type {
69 DSO__TYPE_UNKNOWN,
70 DSO__TYPE_64BIT,
71 DSO__TYPE_32BIT,
72 DSO__TYPE_X32BIT,
73};
74
75enum 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
126
127
128struct dso_id {
129 u32 maj;
130 u32 min;
131 u64 ino;
132 u64 ino_generation;
133};
134
135struct dso_cache {
136 struct rb_node rb_node;
137 u64 offset;
138 u64 size;
139 char data[0];
140};
141
142struct auxtrace_cache;
143
144struct dso {
145 pthread_mutex_t lock;
146 struct list_head node;
147 struct rb_node rb_node;
148 struct rb_root *root;
149 struct rb_root_cached symbols;
150 struct rb_root_cached symbol_names;
151 struct rb_root_cached inlined_nodes;
152 struct rb_root_cached srclines;
153 struct {
154 u64 addr;
155 struct symbol *symbol;
156 } last_find_result;
157 void *a2l;
158 char *symsrc_filename;
159 unsigned int a2l_fails;
160 enum dso_kernel_type kernel;
161 enum dso_swap_type needs_swap;
162 enum dso_binary_type symtab_type;
163 enum dso_binary_type binary_type;
164 enum dso_load_errno load_errno;
165 u8 adjust_symbols:1;
166 u8 has_build_id:1;
167 u8 has_srcline:1;
168 u8 hit:1;
169 u8 annotate_warned:1;
170 u8 short_name_allocated:1;
171 u8 long_name_allocated:1;
172 u8 is_64_bit:1;
173 bool sorted_by_name;
174 bool loaded;
175 u8 rel;
176 u8 build_id[BUILD_ID_SIZE];
177 u64 text_offset;
178 const char *short_name;
179 const char *long_name;
180 u16 long_name_len;
181 u16 short_name_len;
182 void *dwfl;
183 struct auxtrace_cache *auxtrace_cache;
184 int comp;
185
186
187 struct {
188 struct rb_root cache;
189 int fd;
190 int status;
191 u32 status_seen;
192 size_t file_size;
193 struct list_head open_entry;
194 u64 debug_frame_offset;
195 u64 eh_frame_hdr_offset;
196 } data;
197
198 struct {
199 u32 id;
200 u32 sub_id;
201 struct perf_env *env;
202 } bpf_prog;
203
204 union {
205 void *priv;
206 u64 db_id;
207 };
208 struct nsinfo *nsinfo;
209 struct dso_id id;
210 refcount_t refcnt;
211 char name[0];
212};
213
214
215
216
217
218
219
220#define dso__for_each_symbol(dso, pos, n) \
221 symbols__for_each_entry(&(dso)->symbols, pos, n)
222
223static inline void dso__set_loaded(struct dso *dso)
224{
225 dso->loaded = true;
226}
227
228struct dso *dso__new_id(const char *name, struct dso_id *id);
229struct dso *dso__new(const char *name);
230void dso__delete(struct dso *dso);
231
232int dso__cmp_id(struct dso *a, struct dso *b);
233void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated);
234void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated);
235
236int dso__name_len(const struct dso *dso);
237
238struct dso *dso__get(struct dso *dso);
239void dso__put(struct dso *dso);
240
241static inline void __dso__zput(struct dso **dso)
242{
243 dso__put(*dso);
244 *dso = NULL;
245}
246
247#define dso__zput(dso) __dso__zput(&dso)
248
249bool dso__loaded(const struct dso *dso);
250
251static inline bool dso__has_symbols(const struct dso *dso)
252{
253 return !RB_EMPTY_ROOT(&dso->symbols.rb_root);
254}
255
256bool dso__sorted_by_name(const struct dso *dso);
257void dso__set_sorted_by_name(struct dso *dso);
258void dso__sort_by_name(struct dso *dso);
259
260void dso__set_build_id(struct dso *dso, void *build_id);
261bool dso__build_id_equal(const struct dso *dso, u8 *build_id);
262void dso__read_running_kernel_build_id(struct dso *dso,
263 struct machine *machine);
264int dso__kernel_module_get_build_id(struct dso *dso, const char *root_dir);
265
266char dso__symtab_origin(const struct dso *dso);
267int dso__read_binary_type_filename(const struct dso *dso, enum dso_binary_type type,
268 char *root_dir, char *filename, size_t size);
269bool is_kernel_module(const char *pathname, int cpumode);
270bool dso__needs_decompress(struct dso *dso);
271int dso__decompress_kmodule_fd(struct dso *dso, const char *name);
272int dso__decompress_kmodule_path(struct dso *dso, const char *name,
273 char *pathname, size_t len);
274
275#define KMOD_DECOMP_NAME "/tmp/perf-kmod-XXXXXX"
276#define KMOD_DECOMP_LEN sizeof(KMOD_DECOMP_NAME)
277
278struct kmod_path {
279 char *name;
280 int comp;
281 bool kmod;
282};
283
284int __kmod_path__parse(struct kmod_path *m, const char *path,
285 bool alloc_name);
286
287#define kmod_path__parse(__m, __p) __kmod_path__parse(__m, __p, false)
288#define kmod_path__parse_name(__m, __p) __kmod_path__parse(__m, __p, true)
289
290void dso__set_module_info(struct dso *dso, struct kmod_path *m,
291 struct machine *machine);
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
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338int dso__data_get_fd(struct dso *dso, struct machine *machine);
339void dso__data_put_fd(struct dso *dso);
340void dso__data_close(struct dso *dso);
341
342int dso__data_file_size(struct dso *dso, struct machine *machine);
343off_t dso__data_size(struct dso *dso, struct machine *machine);
344ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
345 u64 offset, u8 *data, ssize_t size);
346ssize_t dso__data_read_addr(struct dso *dso, struct map *map,
347 struct machine *machine, u64 addr,
348 u8 *data, ssize_t size);
349bool dso__data_status_seen(struct dso *dso, enum dso_data_status_seen by);
350ssize_t dso__data_write_cache_offs(struct dso *dso, struct machine *machine,
351 u64 offset, const u8 *data, ssize_t size);
352ssize_t dso__data_write_cache_addr(struct dso *dso, struct map *map,
353 struct machine *machine, u64 addr,
354 const u8 *data, ssize_t size);
355
356struct map *dso__new_map(const char *name);
357struct dso *machine__findnew_kernel(struct machine *machine, const char *name,
358 const char *short_name, int dso_type);
359
360void dso__reset_find_symbol_cache(struct dso *dso);
361
362size_t dso__fprintf_buildid(struct dso *dso, FILE *fp);
363size_t dso__fprintf_symbols_by_name(struct dso *dso, FILE *fp);
364size_t dso__fprintf(struct dso *dso, FILE *fp);
365
366static inline bool dso__is_vmlinux(struct dso *dso)
367{
368 return dso->binary_type == DSO_BINARY_TYPE__VMLINUX ||
369 dso->binary_type == DSO_BINARY_TYPE__GUEST_VMLINUX;
370}
371
372static inline bool dso__is_kcore(struct dso *dso)
373{
374 return dso->binary_type == DSO_BINARY_TYPE__KCORE ||
375 dso->binary_type == DSO_BINARY_TYPE__GUEST_KCORE;
376}
377
378static inline bool dso__is_kallsyms(struct dso *dso)
379{
380 return dso->kernel && dso->long_name[0] != '/';
381}
382
383void dso__free_a2l(struct dso *dso);
384
385enum dso_type dso__type(struct dso *dso, struct machine *machine);
386
387int dso__strerror_load(struct dso *dso, char *buf, size_t buflen);
388
389void reset_fd_limit(void);
390
391#endif
392