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