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