1#ifndef __PERF_DSO
2#define __PERF_DSO
3
4#include <linux/atomic.h>
5#include <linux/types.h>
6#include <linux/rbtree.h>
7#include <sys/types.h>
8#include <stdbool.h>
9#include <pthread.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 pthread_rwlock_t 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[MAP__NR_TYPES];
141 struct rb_root symbol_names[MAP__NR_TYPES];
142 struct {
143 u64 addr;
144 struct symbol *symbol;
145 } last_find_result[MAP__NR_TYPES];
146 void *a2l;
147 char *symsrc_filename;
148 unsigned int a2l_fails;
149 enum dso_kernel_type kernel;
150 enum dso_swap_type needs_swap;
151 enum dso_binary_type symtab_type;
152 enum dso_binary_type binary_type;
153 enum dso_load_errno load_errno;
154 u8 adjust_symbols:1;
155 u8 has_build_id:1;
156 u8 has_srcline:1;
157 u8 hit:1;
158 u8 annotate_warned:1;
159 u8 short_name_allocated:1;
160 u8 long_name_allocated:1;
161 u8 is_64_bit:1;
162 u8 sorted_by_name;
163 u8 loaded;
164 u8 rel;
165 u8 build_id[BUILD_ID_SIZE];
166 u64 text_offset;
167 const char *short_name;
168 const char *long_name;
169 u16 long_name_len;
170 u16 short_name_len;
171 void *dwfl;
172 struct auxtrace_cache *auxtrace_cache;
173
174
175 struct {
176 struct rb_root cache;
177 int fd;
178 int status;
179 u32 status_seen;
180 size_t file_size;
181 struct list_head open_entry;
182 u64 debug_frame_offset;
183 u64 eh_frame_hdr_offset;
184 } data;
185
186 union {
187 void *priv;
188 u64 db_id;
189 };
190 atomic_t refcnt;
191 char name[0];
192};
193
194
195
196
197
198
199
200
201#define dso__for_each_symbol(dso, pos, n, type) \
202 symbols__for_each_entry(&(dso)->symbols[(type)], pos, n)
203
204static inline void dso__set_loaded(struct dso *dso, enum map_type type)
205{
206 dso->loaded |= (1 << type);
207}
208
209struct dso *dso__new(const char *name);
210void dso__delete(struct dso *dso);
211
212void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated);
213void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated);
214
215int dso__name_len(const struct dso *dso);
216
217struct dso *dso__get(struct dso *dso);
218void dso__put(struct dso *dso);
219
220static inline void __dso__zput(struct dso **dso)
221{
222 dso__put(*dso);
223 *dso = NULL;
224}
225
226#define dso__zput(dso) __dso__zput(&dso)
227
228bool dso__loaded(const struct dso *dso, enum map_type type);
229
230bool dso__sorted_by_name(const struct dso *dso, enum map_type type);
231void dso__set_sorted_by_name(struct dso *dso, enum map_type type);
232void dso__sort_by_name(struct dso *dso, enum map_type type);
233
234void dso__set_build_id(struct dso *dso, void *build_id);
235bool dso__build_id_equal(const struct dso *dso, u8 *build_id);
236void dso__read_running_kernel_build_id(struct dso *dso,
237 struct machine *machine);
238int dso__kernel_module_get_build_id(struct dso *dso, const char *root_dir);
239
240char dso__symtab_origin(const struct dso *dso);
241int dso__read_binary_type_filename(const struct dso *dso, enum dso_binary_type type,
242 char *root_dir, char *filename, size_t size);
243bool is_supported_compression(const char *ext);
244bool is_kernel_module(const char *pathname, int cpumode);
245bool decompress_to_file(const char *ext, const char *filename, int output_fd);
246bool dso__needs_decompress(struct dso *dso);
247
248struct kmod_path {
249 char *name;
250 char *ext;
251 bool comp;
252 bool kmod;
253};
254
255int __kmod_path__parse(struct kmod_path *m, const char *path,
256 bool alloc_name, bool alloc_ext);
257
258#define kmod_path__parse(__m, __p) __kmod_path__parse(__m, __p, false, false)
259#define kmod_path__parse_name(__m, __p) __kmod_path__parse(__m, __p, true , false)
260#define kmod_path__parse_ext(__m, __p) __kmod_path__parse(__m, __p, false, true)
261
262
263
264
265
266
267
268
269
270
271
272
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
305int dso__data_get_fd(struct dso *dso, struct machine *machine);
306void dso__data_put_fd(struct dso *dso);
307void dso__data_close(struct dso *dso);
308
309off_t dso__data_size(struct dso *dso, struct machine *machine);
310ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
311 u64 offset, u8 *data, ssize_t size);
312ssize_t dso__data_read_addr(struct dso *dso, struct map *map,
313 struct machine *machine, u64 addr,
314 u8 *data, ssize_t size);
315bool dso__data_status_seen(struct dso *dso, enum dso_data_status_seen by);
316
317struct map *dso__new_map(const char *name);
318struct dso *machine__findnew_kernel(struct machine *machine, const char *name,
319 const char *short_name, int dso_type);
320
321void __dsos__add(struct dsos *dsos, struct dso *dso);
322void dsos__add(struct dsos *dsos, struct dso *dso);
323struct dso *__dsos__addnew(struct dsos *dsos, const char *name);
324struct dso *__dsos__find(struct dsos *dsos, const char *name, bool cmp_short);
325struct dso *dsos__find(struct dsos *dsos, const char *name, bool cmp_short);
326struct dso *__dsos__findnew(struct dsos *dsos, const char *name);
327struct dso *dsos__findnew(struct dsos *dsos, const char *name);
328bool __dsos__read_build_ids(struct list_head *head, bool with_hits);
329
330void dso__reset_find_symbol_cache(struct dso *dso);
331
332size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp,
333 bool (skip)(struct dso *dso, int parm), int parm);
334size_t __dsos__fprintf(struct list_head *head, FILE *fp);
335
336size_t dso__fprintf_buildid(struct dso *dso, FILE *fp);
337size_t dso__fprintf_symbols_by_name(struct dso *dso,
338 enum map_type type, FILE *fp);
339size_t dso__fprintf(struct dso *dso, enum map_type type, FILE *fp);
340
341static inline bool dso__is_vmlinux(struct dso *dso)
342{
343 return dso->binary_type == DSO_BINARY_TYPE__VMLINUX ||
344 dso->binary_type == DSO_BINARY_TYPE__GUEST_VMLINUX;
345}
346
347static inline bool dso__is_kcore(struct dso *dso)
348{
349 return dso->binary_type == DSO_BINARY_TYPE__KCORE ||
350 dso->binary_type == DSO_BINARY_TYPE__GUEST_KCORE;
351}
352
353static inline bool dso__is_kallsyms(struct dso *dso)
354{
355 return dso->kernel && dso->long_name[0] != '/';
356}
357
358void dso__free_a2l(struct dso *dso);
359
360enum dso_type dso__type(struct dso *dso, struct machine *machine);
361
362int dso__strerror_load(struct dso *dso, char *buf, size_t buflen);
363
364void reset_fd_limit(void);
365
366#endif
367