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