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