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__MIXEDUP_UBUNTU_DEBUGINFO,
34 DSO_BINARY_TYPE__BUILDID_DEBUGINFO,
35 DSO_BINARY_TYPE__SYSTEM_PATH_DSO,
36 DSO_BINARY_TYPE__GUEST_KMODULE,
37 DSO_BINARY_TYPE__GUEST_KMODULE_COMP,
38 DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE,
39 DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP,
40 DSO_BINARY_TYPE__KCORE,
41 DSO_BINARY_TYPE__GUEST_KCORE,
42 DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO,
43 DSO_BINARY_TYPE__BPF_PROG_INFO,
44 DSO_BINARY_TYPE__BPF_IMAGE,
45 DSO_BINARY_TYPE__OOL,
46 DSO_BINARY_TYPE__NOT_FOUND,
47};
48
49enum dso_space_type {
50 DSO_SPACE__USER = 0,
51 DSO_SPACE__KERNEL,
52 DSO_SPACE__KERNEL_GUEST
53};
54
55enum dso_swap_type {
56 DSO_SWAP__UNSET,
57 DSO_SWAP__NO,
58 DSO_SWAP__YES,
59};
60
61enum dso_data_status {
62 DSO_DATA_STATUS_ERROR = -1,
63 DSO_DATA_STATUS_UNKNOWN = 0,
64 DSO_DATA_STATUS_OK = 1,
65};
66
67enum dso_data_status_seen {
68 DSO_DATA_STATUS_SEEN_ITRACE,
69};
70
71enum dso_type {
72 DSO__TYPE_UNKNOWN,
73 DSO__TYPE_64BIT,
74 DSO__TYPE_32BIT,
75 DSO__TYPE_X32BIT,
76};
77
78enum dso_load_errno {
79 DSO_LOAD_ERRNO__SUCCESS = 0,
80
81
82
83
84
85
86
87
88 __DSO_LOAD_ERRNO__START = -10000,
89
90 DSO_LOAD_ERRNO__INTERNAL_ERROR = __DSO_LOAD_ERRNO__START,
91
92
93 DSO_LOAD_ERRNO__INVALID_ELF,
94 DSO_LOAD_ERRNO__CANNOT_READ_BUILDID,
95 DSO_LOAD_ERRNO__MISMATCHING_BUILDID,
96
97
98 DSO_LOAD_ERRNO__DECOMPRESSION_FAILURE,
99
100 __DSO_LOAD_ERRNO__END,
101};
102
103#define DSO__SWAP(dso, type, val) \
104({ \
105 type ____r = val; \
106 BUG_ON(dso->needs_swap == DSO_SWAP__UNSET); \
107 if (dso->needs_swap == DSO_SWAP__YES) { \
108 switch (sizeof(____r)) { \
109 case 2: \
110 ____r = bswap_16(val); \
111 break; \
112 case 4: \
113 ____r = bswap_32(val); \
114 break; \
115 case 8: \
116 ____r = bswap_64(val); \
117 break; \
118 default: \
119 BUG_ON(1); \
120 } \
121 } \
122 ____r; \
123})
124
125#define DSO__DATA_CACHE_SIZE 4096
126#define DSO__DATA_CACHE_MASK ~(DSO__DATA_CACHE_SIZE - 1)
127
128
129
130
131struct dso_id {
132 u32 maj;
133 u32 min;
134 u64 ino;
135 u64 ino_generation;
136};
137
138struct dso_cache {
139 struct rb_node rb_node;
140 u64 offset;
141 u64 size;
142 char data[];
143};
144
145struct auxtrace_cache;
146
147struct dso {
148 pthread_mutex_t lock;
149 struct list_head node;
150 struct rb_node rb_node;
151 struct rb_root *root;
152 struct rb_root_cached symbols;
153 struct rb_root_cached symbol_names;
154 struct rb_root_cached inlined_nodes;
155 struct rb_root_cached srclines;
156 struct {
157 u64 addr;
158 struct symbol *symbol;
159 } last_find_result;
160 void *a2l;
161 char *symsrc_filename;
162 unsigned int a2l_fails;
163 enum dso_space_type kernel;
164 enum dso_swap_type needs_swap;
165 enum dso_binary_type symtab_type;
166 enum dso_binary_type binary_type;
167 enum dso_load_errno load_errno;
168 u8 adjust_symbols:1;
169 u8 has_build_id:1;
170 u8 has_srcline:1;
171 u8 hit:1;
172 u8 annotate_warned:1;
173 u8 auxtrace_warned:1;
174 u8 short_name_allocated:1;
175 u8 long_name_allocated:1;
176 u8 is_64_bit:1;
177 bool sorted_by_name;
178 bool loaded;
179 u8 rel;
180 struct build_id bid;
181 u64 text_offset;
182 const char *short_name;
183 const char *long_name;
184 u16 long_name_len;
185 u16 short_name_len;
186 void *dwfl;
187 struct auxtrace_cache *auxtrace_cache;
188 int comp;
189
190
191 struct {
192 struct rb_root cache;
193 int fd;
194 int status;
195 u32 status_seen;
196 size_t file_size;
197 struct list_head open_entry;
198 u64 debug_frame_offset;
199 u64 eh_frame_hdr_offset;
200 } data;
201
202 struct {
203 u32 id;
204 u32 sub_id;
205 struct perf_env *env;
206 } bpf_prog;
207
208 union {
209 void *priv;
210 u64 db_id;
211 };
212 struct nsinfo *nsinfo;
213 struct dso_id id;
214 refcount_t refcnt;
215 char name[];
216};
217
218
219
220
221
222
223
224#define dso__for_each_symbol(dso, pos, n) \
225 symbols__for_each_entry(&(dso)->symbols, pos, n)
226
227static inline void dso__set_loaded(struct dso *dso)
228{
229 dso->loaded = true;
230}
231
232struct dso *dso__new_id(const char *name, struct dso_id *id);
233struct dso *dso__new(const char *name);
234void dso__delete(struct dso *dso);
235
236int dso__cmp_id(struct dso *a, struct dso *b);
237void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated);
238void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated);
239
240int dso__name_len(const struct dso *dso);
241
242struct dso *dso__get(struct dso *dso);
243void dso__put(struct dso *dso);
244
245static inline void __dso__zput(struct dso **dso)
246{
247 dso__put(*dso);
248 *dso = NULL;
249}
250
251#define dso__zput(dso) __dso__zput(&dso)
252
253bool dso__loaded(const struct dso *dso);
254
255static inline bool dso__has_symbols(const struct dso *dso)
256{
257 return !RB_EMPTY_ROOT(&dso->symbols.rb_root);
258}
259
260bool dso__sorted_by_name(const struct dso *dso);
261void dso__set_sorted_by_name(struct dso *dso);
262void dso__sort_by_name(struct dso *dso);
263
264void dso__set_build_id(struct dso *dso, struct build_id *bid);
265bool dso__build_id_equal(const struct dso *dso, struct build_id *bid);
266void dso__read_running_kernel_build_id(struct dso *dso,
267 struct machine *machine);
268int dso__kernel_module_get_build_id(struct dso *dso, const char *root_dir);
269
270char dso__symtab_origin(const struct dso *dso);
271int dso__read_binary_type_filename(const struct dso *dso, enum dso_binary_type type,
272 char *root_dir, char *filename, size_t size);
273bool is_kernel_module(const char *pathname, int cpumode);
274bool dso__needs_decompress(struct dso *dso);
275int dso__decompress_kmodule_fd(struct dso *dso, const char *name);
276int dso__decompress_kmodule_path(struct dso *dso, const char *name,
277 char *pathname, size_t len);
278int filename__decompress(const char *name, char *pathname,
279 size_t len, int comp, int *err);
280
281#define KMOD_DECOMP_NAME "/tmp/perf-kmod-XXXXXX"
282#define KMOD_DECOMP_LEN sizeof(KMOD_DECOMP_NAME)
283
284struct kmod_path {
285 char *name;
286 int comp;
287 bool kmod;
288};
289
290int __kmod_path__parse(struct kmod_path *m, const char *path,
291 bool alloc_name);
292
293#define kmod_path__parse(__m, __p) __kmod_path__parse(__m, __p, false)
294#define kmod_path__parse_name(__m, __p) __kmod_path__parse(__m, __p, true)
295
296void dso__set_module_info(struct dso *dso, struct kmod_path *m,
297 struct machine *machine);
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
338
339
340
341
342
343
344int dso__data_get_fd(struct dso *dso, struct machine *machine);
345void dso__data_put_fd(struct dso *dso);
346void dso__data_close(struct dso *dso);
347
348int dso__data_file_size(struct dso *dso, struct machine *machine);
349off_t dso__data_size(struct dso *dso, struct machine *machine);
350ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
351 u64 offset, u8 *data, ssize_t size);
352ssize_t dso__data_read_addr(struct dso *dso, struct map *map,
353 struct machine *machine, u64 addr,
354 u8 *data, ssize_t size);
355bool dso__data_status_seen(struct dso *dso, enum dso_data_status_seen by);
356ssize_t dso__data_write_cache_offs(struct dso *dso, struct machine *machine,
357 u64 offset, const u8 *data, ssize_t size);
358ssize_t dso__data_write_cache_addr(struct dso *dso, struct map *map,
359 struct machine *machine, u64 addr,
360 const u8 *data, ssize_t size);
361
362struct map *dso__new_map(const char *name);
363struct dso *machine__findnew_kernel(struct machine *machine, const char *name,
364 const char *short_name, int dso_type);
365
366void dso__reset_find_symbol_cache(struct dso *dso);
367
368size_t dso__fprintf_symbols_by_name(struct dso *dso, FILE *fp);
369size_t dso__fprintf(struct dso *dso, FILE *fp);
370
371static inline bool dso__is_vmlinux(struct dso *dso)
372{
373 return dso->binary_type == DSO_BINARY_TYPE__VMLINUX ||
374 dso->binary_type == DSO_BINARY_TYPE__GUEST_VMLINUX;
375}
376
377static inline bool dso__is_kcore(struct dso *dso)
378{
379 return dso->binary_type == DSO_BINARY_TYPE__KCORE ||
380 dso->binary_type == DSO_BINARY_TYPE__GUEST_KCORE;
381}
382
383static inline bool dso__is_kallsyms(struct dso *dso)
384{
385 return dso->kernel && dso->long_name[0] != '/';
386}
387
388void dso__free_a2l(struct dso *dso);
389
390enum dso_type dso__type(struct dso *dso, struct machine *machine);
391
392int dso__strerror_load(struct dso *dso, char *buf, size_t buflen);
393
394void reset_fd_limit(void);
395
396#endif
397