xref: /linux/tools/perf/util/dso.h (revision 473f6c8f437b049f8ec015d57cd59bb983b1d85c)
1 /* SPDX-License-Identifier: GPL-2.0 */
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 <stdio.h>
11 #include <linux/bitops.h>
12 #include <string.h>
13 #include "build-id.h"
14 #include "debuginfo.h"
15 #include "mutex.h"
16 #include <internal/rc_check.h>
17 
18 struct machine;
19 struct map;
20 struct perf_env;
21 
22 #define DSO__NAME_KALLSYMS	"[kernel.kallsyms]"
23 #define DSO__NAME_KCORE		"[kernel.kcore]"
24 #define DSO__NAME_GUEST_KALLSYMS		"[guest.kernel.kallsyms]"
25 #define DSO__NAME_GUEST_KALLSYMS_PID_PREFIX	"[guest.kernel.kallsyms."
26 
27 /*
28  * Validate names of the form "[guest.kernel.kallsyms.<pid>]", where
29  * <pid> is the PID of the guest VM and varies per guest, so it
30  * cannot be matched with strcmp() against a fixed string.
31  *
32  * Every character after the fixed prefix must be a decimal digit,
33  * with ']' immediately terminating the digit run and nothing
34  * following it. This rules out '/', "..", or any other character
35  * being smuggled into the name.
36  */
37 static inline bool is_guest_kallsyms_pid_name(const char *name)
38 {
39 	const size_t prefix_len = sizeof(DSO__NAME_GUEST_KALLSYMS_PID_PREFIX) - 1;
40 	size_t digits;
41 
42 	if (strncmp(name, DSO__NAME_GUEST_KALLSYMS_PID_PREFIX, prefix_len) != 0)
43 		return false;
44 
45 	digits = strspn(name + prefix_len, "0123456789");
46 	if (digits == 0)
47 		return false;
48 
49 	/* ']' must terminate the digit run, with nothing trailing it */
50 	if (name[prefix_len + digits] != ']')
51 		return false;
52 
53 	if (name[prefix_len + digits + 1] != '\0')
54 		return false;
55 
56 	return true;
57 }
58 
59 /**
60  * enum dso_binary_type - The kind of DSO generally associated with a memory
61  *                        region (struct map).
62  */
63 enum dso_binary_type {
64 	/** @DSO_BINARY_TYPE__KALLSYMS: Symbols from /proc/kallsyms file. */
65 	DSO_BINARY_TYPE__KALLSYMS = 0,
66 	/** @DSO_BINARY_TYPE__GUEST_KALLSYMS: Guest /proc/kallsyms file. */
67 	DSO_BINARY_TYPE__GUEST_KALLSYMS,
68 	/** @DSO_BINARY_TYPE__VMLINUX: Path to kernel /boot/vmlinux file. */
69 	DSO_BINARY_TYPE__VMLINUX,
70 	/** @DSO_BINARY_TYPE__GUEST_VMLINUX: Path to guest kernel /boot/vmlinux file. */
71 	DSO_BINARY_TYPE__GUEST_VMLINUX,
72 	/** @DSO_BINARY_TYPE__JAVA_JIT: Symbols from /tmp/perf.map file. */
73 	DSO_BINARY_TYPE__JAVA_JIT,
74 	/**
75 	 * @DSO_BINARY_TYPE__DEBUGLINK: Debug file readable from the file path
76 	 * in the .gnu_debuglink ELF section of the dso.
77 	 */
78 	DSO_BINARY_TYPE__DEBUGLINK,
79 	/**
80 	 * @DSO_BINARY_TYPE__BUILD_ID_CACHE: File named after buildid located in
81 	 * the buildid cache with an elf filename.
82 	 */
83 	DSO_BINARY_TYPE__BUILD_ID_CACHE,
84 	/**
85 	 * @DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO: File named after buildid
86 	 * located in the buildid cache with a debug filename.
87 	 */
88 	DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO,
89 	/**
90 	 * @DSO_BINARY_TYPE__FEDORA_DEBUGINFO: Debug file in /usr/lib/debug
91 	 * with .debug suffix.
92 	 */
93 	DSO_BINARY_TYPE__FEDORA_DEBUGINFO,
94 	/** @DSO_BINARY_TYPE__UBUNTU_DEBUGINFO: Debug file in /usr/lib/debug. */
95 	DSO_BINARY_TYPE__UBUNTU_DEBUGINFO,
96 	/**
97 	 * @DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO: dso__long_name debuginfo
98 	 * file in /usr/lib/debug/lib rather than the expected
99 	 * /usr/lib/debug/usr/lib.
100 	 */
101 	DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO,
102 	/**
103 	 * @DSO_BINARY_TYPE__BUILDID_DEBUGINFO: File named after buildid located
104 	 * in /usr/lib/debug/.build-id/.
105 	 */
106 	DSO_BINARY_TYPE__BUILDID_DEBUGINFO,
107 	/**
108 	 * @DSO_BINARY_TYPE__GNU_DEBUGDATA: MiniDebuginfo where a compressed
109 	 * ELF file is placed in a .gnu_debugdata section.
110 	 */
111 	DSO_BINARY_TYPE__GNU_DEBUGDATA,
112 	/** @DSO_BINARY_TYPE__SYSTEM_PATH_DSO: A regular executable/shared-object file. */
113 	DSO_BINARY_TYPE__SYSTEM_PATH_DSO,
114 	/** @DSO_BINARY_TYPE__GUEST_KMODULE: Guest kernel module .ko file. */
115 	DSO_BINARY_TYPE__GUEST_KMODULE,
116 	/** @DSO_BINARY_TYPE__GUEST_KMODULE_COMP: Guest kernel module .ko.gz file. */
117 	DSO_BINARY_TYPE__GUEST_KMODULE_COMP,
118 	/** @DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE: Kernel module .ko file. */
119 	DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE,
120 	/** @DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP: Kernel module .ko.gz file. */
121 	DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP,
122 	/** @DSO_BINARY_TYPE__KCORE: /proc/kcore file. */
123 	DSO_BINARY_TYPE__KCORE,
124 	/** @DSO_BINARY_TYPE__GUEST_KCORE: Guest /proc/kcore file. */
125 	DSO_BINARY_TYPE__GUEST_KCORE,
126 	/**
127 	 * @DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO: Openembedded/Yocto -dbg
128 	 * package debug info.
129 	 */
130 	DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO,
131 	/** @DSO_BINARY_TYPE__BPF_PROG_INFO: jitted BPF code. */
132 	DSO_BINARY_TYPE__BPF_PROG_INFO,
133 	/** @DSO_BINARY_TYPE__BPF_IMAGE: jitted BPF trampoline or dispatcher code. */
134 	DSO_BINARY_TYPE__BPF_IMAGE,
135 	/**
136 	 * @DSO_BINARY_TYPE__OOL: out of line code such as kprobe-replaced
137 	 * instructions or optimized kprobes or ftrace trampolines.
138 	 */
139 	DSO_BINARY_TYPE__OOL,
140 	/** @DSO_BINARY_TYPE__NOT_FOUND: Unknown DSO kind. */
141 	DSO_BINARY_TYPE__NOT_FOUND,
142 };
143 
144 enum dso_space_type {
145 	DSO_SPACE__USER = 0,
146 	DSO_SPACE__KERNEL,
147 	DSO_SPACE__KERNEL_GUEST
148 };
149 
150 enum dso_swap_type {
151 	DSO_SWAP__UNSET,
152 	DSO_SWAP__NO,
153 	DSO_SWAP__YES,
154 };
155 
156 enum dso_data_status {
157 	DSO_DATA_STATUS_ERROR	= -1,
158 	DSO_DATA_STATUS_UNKNOWN	= 0,
159 	DSO_DATA_STATUS_OK	= 1,
160 };
161 
162 enum dso_data_status_seen {
163 	DSO_DATA_STATUS_SEEN_ITRACE,
164 };
165 
166 enum dso_type {
167 	DSO__TYPE_UNKNOWN,
168 	DSO__TYPE_64BIT,
169 	DSO__TYPE_32BIT,
170 	DSO__TYPE_X32BIT,
171 };
172 
173 enum dso_load_errno {
174 	DSO_LOAD_ERRNO__SUCCESS		= 0,
175 
176 	/*
177 	 * Choose an arbitrary negative big number not to clash with standard
178 	 * errno since SUS requires the errno has distinct positive values.
179 	 * See 'Issue 6' in the link below.
180 	 *
181 	 * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
182 	 */
183 	__DSO_LOAD_ERRNO__START		= -10000,
184 
185 	DSO_LOAD_ERRNO__INTERNAL_ERROR	= __DSO_LOAD_ERRNO__START,
186 
187 	/* for symsrc__init() */
188 	DSO_LOAD_ERRNO__INVALID_ELF,
189 	DSO_LOAD_ERRNO__CANNOT_READ_BUILDID,
190 	DSO_LOAD_ERRNO__MISMATCHING_BUILDID,
191 
192 	/* for decompress_kmodule */
193 	DSO_LOAD_ERRNO__DECOMPRESSION_FAILURE,
194 
195 	__DSO_LOAD_ERRNO__END,
196 };
197 
198 #define DSO_SWAP_TYPE__SWAP(swap_type, type, val)		\
199 ({								\
200 	type ____r = val;					\
201 	BUG_ON(swap_type == DSO_SWAP__UNSET);			\
202 	if (swap_type == DSO_SWAP__YES) {			\
203 		switch (sizeof(____r)) {			\
204 		case 2:						\
205 			____r = bswap_16(val);			\
206 			break;					\
207 		case 4:						\
208 			____r = bswap_32(val);			\
209 			break;					\
210 		case 8:						\
211 			____r = bswap_64(val);			\
212 			break;					\
213 		default:					\
214 			BUG_ON(1);				\
215 		}						\
216 	}							\
217 	____r;							\
218 })
219 
220 #define DSO__SWAP(dso, type, val) DSO_SWAP_TYPE__SWAP(dso__needs_swap(dso), type, val)
221 
222 #define DSO__DATA_CACHE_SIZE 4096
223 #define DSO__DATA_CACHE_MASK ~(DSO__DATA_CACHE_SIZE - 1)
224 
225 /**
226  * struct dso_id
227  *
228  * Data about backing storage DSO, comes from PERF_RECORD_MMAP2 meta events,
229  * reading from /proc/pid/maps or synthesis of build_ids from DSOs. Possibly
230  * incomplete at any particular use.
231  */
232 struct dso_id {
233 	/* Data related to the mmap2 event or read from /proc/pid/maps. */
234 	struct {
235 		u32	maj;
236 		u32	min;
237 		u64	ino;
238 		u64	ino_generation;
239 	};
240 	/** @mmap2_valid: Are the maj, min and ino fields valid? */
241 	bool	mmap2_valid;
242 	/**
243 	 * @mmap2_ino_generation_valid: Is the ino_generation valid? Generally
244 	 * false for /proc/pid/maps mmap event.
245 	 */
246 	bool	mmap2_ino_generation_valid;
247 	/**
248 	 * @build_id: A possibly populated build_id. build_id__is_defined checks
249 	 * whether it is populated.
250 	 */
251 	struct build_id build_id;
252 };
253 
254 struct dso_cache {
255 	struct rb_node	rb_node;
256 	u64 offset;
257 	u64 size;
258 	char data[];
259 };
260 
261 struct dso_data {
262 	struct rb_root	 cache;
263 	struct list_head open_entry;
264 #ifdef REFCNT_CHECKING
265 	struct dso	 *dso;
266 #endif
267 	int		 fd;
268 	int		 status;
269 	u32		 status_seen;
270 	u64		 file_size;
271 #ifdef HAVE_LIBUNWIND_SUPPORT
272 	u64		 elf_base_addr;
273 	u64		 debug_frame_offset;
274 	u64		 eh_frame_hdr_addr;
275 	u64		 eh_frame_hdr_offset;
276 #endif
277 };
278 
279 struct dso_bpf_prog {
280 	u32		id;
281 	u32		sub_id;
282 	struct perf_env	*env;
283 };
284 
285 struct auxtrace_cache;
286 
287 DECLARE_RC_STRUCT(dso) {
288 	struct mutex	 lock;
289 	struct dsos	 *dsos;
290 	struct rb_root_cached symbols;
291 	struct symbol	 **symbol_names;
292 	size_t		 symbol_names_len;
293 	struct rb_root_cached inlined_nodes;
294 	struct rb_root_cached srclines;
295 	struct rb_root	 data_types;
296 	struct rb_root	 global_vars;
297 
298 	struct {
299 		u64		addr;
300 		struct symbol	*symbol;
301 	} last_find_result;
302 	u64		 text_offset;
303 	u64		 text_end;
304 	const char	 *short_name;
305 	const char	 *long_name;
306 	void		 *a2l;
307 	void		 *libdw;
308 	char		 *symsrc_filename;
309 	struct nsinfo	*nsinfo;
310 	struct auxtrace_cache *auxtrace_cache;
311 	union { /* Tool specific area */
312 		void	 *priv;
313 		u64	 db_id;
314 	};
315 	/* bpf prog information */
316 	struct dso_bpf_prog bpf_prog;
317 	/* dso data file */
318 	struct dso_data	 data;
319 	struct dso_id	 id;
320 	unsigned int	 a2l_fails;
321 	int		 comp;
322 	refcount_t	 refcnt;
323 	enum dso_load_errno	load_errno;
324 	u16		 long_name_len;
325 	u16		 short_name_len;
326 	enum dso_binary_type	symtab_type:8;
327 	enum dso_binary_type	binary_type:8;
328 	enum dso_space_type	kernel:2;
329 	enum dso_swap_type	needs_swap:2;
330 	bool			is_kmod:1;
331 	u8		 adjust_symbols:1;
332 	u8		 header_build_id:1;
333 	u8		 has_srcline:1;
334 	u8		 hit:1;
335 	u8		 annotate_warned:1;
336 	u8		 auxtrace_warned:1;
337 	u8		 debuginfo_warned:1;
338 	u8		 short_name_allocated:1;
339 	u8		 long_name_allocated:1;
340 	u8		 is_64_bit:1;
341 	bool		 sorted_by_name;
342 	bool		 loaded;
343 	u8		 rel;
344 	char		 name[];
345 };
346 
347 extern struct mutex _dso__data_open_lock;
348 extern const struct dso_id dso_id_empty;
349 
350 int dso_id__cmp(const struct dso_id *a, const struct dso_id *b);
351 
352 /* dso__for_each_symbol - iterate over the symbols of given type
353  *
354  * @dso: the 'struct dso *' in which symbols are iterated
355  * @pos: the 'struct symbol *' to use as a loop cursor
356  * @n: the 'struct rb_node *' to use as a temporary storage
357  */
358 #define dso__for_each_symbol(dso, pos, n)	\
359 	symbols__for_each_entry(dso__symbols(dso), pos, n)
360 
361 static inline void *dso__a2l(const struct dso *dso)
362 {
363 	return RC_CHK_ACCESS(dso)->a2l;
364 }
365 
366 static inline void dso__set_a2l(struct dso *dso, void *val)
367 {
368 	RC_CHK_ACCESS(dso)->a2l = val;
369 }
370 
371 static inline void *dso__libdw(const struct dso *dso)
372 {
373 	return RC_CHK_ACCESS(dso)->libdw;
374 }
375 
376 static inline void dso__set_libdw(struct dso *dso, void *val)
377 {
378 	RC_CHK_ACCESS(dso)->libdw = val;
379 }
380 
381 struct Dwfl;
382 #ifdef HAVE_LIBDW_SUPPORT
383 struct Dwfl *dso__libdw_dwfl(struct dso *dso);
384 #else
385 static inline struct Dwfl *dso__libdw_dwfl(struct dso *dso __maybe_unused)
386 {
387 	return NULL;
388 }
389 #endif
390 
391 static inline unsigned int dso__a2l_fails(const struct dso *dso)
392 {
393 	return RC_CHK_ACCESS(dso)->a2l_fails;
394 }
395 
396 static inline void dso__set_a2l_fails(struct dso *dso, unsigned int val)
397 {
398 	RC_CHK_ACCESS(dso)->a2l_fails = val;
399 }
400 
401 static inline bool dso__adjust_symbols(const struct dso *dso)
402 {
403 	return RC_CHK_ACCESS(dso)->adjust_symbols;
404 }
405 
406 static inline void dso__set_adjust_symbols(struct dso *dso, bool val)
407 {
408 	RC_CHK_ACCESS(dso)->adjust_symbols = val;
409 }
410 
411 static inline bool dso__annotate_warned(const struct dso *dso)
412 {
413 	return RC_CHK_ACCESS(dso)->annotate_warned;
414 }
415 
416 static inline void dso__set_annotate_warned(struct dso *dso)
417 {
418 	RC_CHK_ACCESS(dso)->annotate_warned = 1;
419 }
420 
421 static inline bool dso__debuginfo_warned(const struct dso *dso)
422 {
423 	return RC_CHK_ACCESS(dso)->debuginfo_warned;
424 }
425 
426 static inline void dso__set_debuginfo_warned(struct dso *dso)
427 {
428 	RC_CHK_ACCESS(dso)->debuginfo_warned = 1;
429 }
430 
431 static inline bool dso__auxtrace_warned(const struct dso *dso)
432 {
433 	return RC_CHK_ACCESS(dso)->auxtrace_warned;
434 }
435 
436 static inline void dso__set_auxtrace_warned(struct dso *dso)
437 {
438 	RC_CHK_ACCESS(dso)->auxtrace_warned = 1;
439 }
440 
441 static inline struct auxtrace_cache *dso__auxtrace_cache(struct dso *dso)
442 {
443 	return RC_CHK_ACCESS(dso)->auxtrace_cache;
444 }
445 
446 static inline void dso__set_auxtrace_cache(struct dso *dso, struct auxtrace_cache *cache)
447 {
448 	RC_CHK_ACCESS(dso)->auxtrace_cache = cache;
449 }
450 
451 static inline struct dso_bpf_prog *dso__bpf_prog(struct dso *dso)
452 {
453 	return &RC_CHK_ACCESS(dso)->bpf_prog;
454 }
455 
456 static inline bool dso__has_srcline(const struct dso *dso)
457 {
458 	return RC_CHK_ACCESS(dso)->has_srcline;
459 }
460 
461 static inline void dso__set_has_srcline(struct dso *dso, bool val)
462 {
463 	RC_CHK_ACCESS(dso)->has_srcline = val;
464 }
465 
466 static inline int dso__comp(const struct dso *dso)
467 {
468 	return RC_CHK_ACCESS(dso)->comp;
469 }
470 
471 static inline void dso__set_comp(struct dso *dso, int comp)
472 {
473 	RC_CHK_ACCESS(dso)->comp = comp;
474 }
475 
476 static inline struct dso_data *dso__data(struct dso *dso)
477 {
478 	return &RC_CHK_ACCESS(dso)->data;
479 }
480 
481 static inline u64 dso__db_id(const struct dso *dso)
482 {
483 	return RC_CHK_ACCESS(dso)->db_id;
484 }
485 
486 static inline void dso__set_db_id(struct dso *dso, u64 db_id)
487 {
488 	RC_CHK_ACCESS(dso)->db_id = db_id;
489 }
490 
491 static inline struct dsos *dso__dsos(struct dso *dso)
492 {
493 	return RC_CHK_ACCESS(dso)->dsos;
494 }
495 
496 static inline void dso__set_dsos(struct dso *dso, struct dsos *dsos)
497 {
498 	RC_CHK_ACCESS(dso)->dsos = dsos;
499 }
500 
501 static inline bool dso__header_build_id(struct dso *dso)
502 {
503 	return RC_CHK_ACCESS(dso)->header_build_id;
504 }
505 
506 static inline void dso__set_header_build_id(struct dso *dso, bool val)
507 {
508 	RC_CHK_ACCESS(dso)->header_build_id = val;
509 }
510 
511 static inline bool dso__hit(const struct dso *dso)
512 {
513 	return RC_CHK_ACCESS(dso)->hit;
514 }
515 
516 static inline void dso__set_hit(struct dso *dso)
517 {
518 	RC_CHK_ACCESS(dso)->hit = 1;
519 }
520 
521 static inline struct dso_id *dso__id(struct dso *dso)
522 {
523 	return &RC_CHK_ACCESS(dso)->id;
524 }
525 
526 static inline const struct dso_id *dso__id_const(const struct dso *dso)
527 {
528 	return &RC_CHK_ACCESS(dso)->id;
529 }
530 
531 static inline const struct build_id *dso__bid(const struct dso *dso)
532 {
533 	return &dso__id_const(dso)->build_id;
534 }
535 
536 static inline bool dso__has_build_id(const struct dso *dso)
537 {
538 	return build_id__is_defined(dso__bid(dso));
539 }
540 
541 static inline struct rb_root_cached *dso__inlined_nodes(struct dso *dso)
542 {
543 	return &RC_CHK_ACCESS(dso)->inlined_nodes;
544 }
545 
546 static inline bool dso__is_64_bit(const struct dso *dso)
547 {
548 	return RC_CHK_ACCESS(dso)->is_64_bit;
549 }
550 
551 static inline void dso__set_is_64_bit(struct dso *dso, bool is)
552 {
553 	RC_CHK_ACCESS(dso)->is_64_bit = is;
554 }
555 
556 static inline bool dso__is_kmod(const struct dso *dso)
557 {
558 	return RC_CHK_ACCESS(dso)->is_kmod;
559 }
560 
561 static inline void dso__set_is_kmod(struct dso *dso)
562 {
563 	RC_CHK_ACCESS(dso)->is_kmod = 1;
564 }
565 
566 static inline enum dso_space_type dso__kernel(const struct dso *dso)
567 {
568 	return RC_CHK_ACCESS(dso)->kernel;
569 }
570 
571 static inline void dso__set_kernel(struct dso *dso, enum dso_space_type kernel)
572 {
573 	RC_CHK_ACCESS(dso)->kernel = kernel;
574 }
575 
576 static inline u64 dso__last_find_result_addr(const struct dso *dso)
577 {
578 	return RC_CHK_ACCESS(dso)->last_find_result.addr;
579 }
580 
581 static inline void dso__set_last_find_result_addr(struct dso *dso, u64 addr)
582 {
583 	RC_CHK_ACCESS(dso)->last_find_result.addr = addr;
584 }
585 
586 static inline struct symbol *dso__last_find_result_symbol(const struct dso *dso)
587 {
588 	return RC_CHK_ACCESS(dso)->last_find_result.symbol;
589 }
590 
591 static inline void dso__set_last_find_result_symbol(struct dso *dso, struct symbol *symbol)
592 {
593 	RC_CHK_ACCESS(dso)->last_find_result.symbol = symbol;
594 }
595 
596 static inline enum dso_load_errno *dso__load_errno(struct dso *dso)
597 {
598 	return &RC_CHK_ACCESS(dso)->load_errno;
599 }
600 
601 static inline void dso__set_loaded(struct dso *dso)
602 {
603 	RC_CHK_ACCESS(dso)->loaded = true;
604 }
605 
606 static inline struct mutex *dso__lock(struct dso *dso)
607 {
608 	return &RC_CHK_ACCESS(dso)->lock;
609 }
610 
611 static inline const char *dso__long_name(const struct dso *dso)
612 {
613 	return RC_CHK_ACCESS(dso)->long_name;
614 }
615 
616 static inline bool dso__long_name_allocated(const struct dso *dso)
617 {
618 	return RC_CHK_ACCESS(dso)->long_name_allocated;
619 }
620 
621 static inline void dso__set_long_name_allocated(struct dso *dso, bool allocated)
622 {
623 	RC_CHK_ACCESS(dso)->long_name_allocated = allocated;
624 }
625 
626 static inline u16 dso__long_name_len(const struct dso *dso)
627 {
628 	return RC_CHK_ACCESS(dso)->long_name_len;
629 }
630 
631 static inline const char *dso__name(const struct dso *dso)
632 {
633 	return RC_CHK_ACCESS(dso)->name;
634 }
635 
636 static inline enum dso_swap_type dso__needs_swap(const struct dso *dso)
637 {
638 	return RC_CHK_ACCESS(dso)->needs_swap;
639 }
640 
641 static inline void dso__set_needs_swap(struct dso *dso, enum dso_swap_type type)
642 {
643 	RC_CHK_ACCESS(dso)->needs_swap = type;
644 }
645 
646 static inline struct nsinfo *dso__nsinfo(struct dso *dso)
647 {
648 	return RC_CHK_ACCESS(dso)->nsinfo;
649 }
650 
651 static inline const struct nsinfo *dso__nsinfo_const(const struct dso *dso)
652 {
653 	return RC_CHK_ACCESS(dso)->nsinfo;
654 }
655 
656 static inline struct nsinfo **dso__nsinfo_ptr(struct dso *dso)
657 {
658 	return &RC_CHK_ACCESS(dso)->nsinfo;
659 }
660 
661 void dso__set_nsinfo(struct dso *dso, struct nsinfo *nsi);
662 
663 static inline u8 dso__rel(const struct dso *dso)
664 {
665 	return RC_CHK_ACCESS(dso)->rel;
666 }
667 
668 static inline void dso__set_rel(struct dso *dso, u8 rel)
669 {
670 	RC_CHK_ACCESS(dso)->rel = rel;
671 }
672 
673 static inline const char *dso__short_name(const struct dso *dso)
674 {
675 	return RC_CHK_ACCESS(dso)->short_name;
676 }
677 
678 static inline bool dso__short_name_allocated(const struct dso *dso)
679 {
680 	return RC_CHK_ACCESS(dso)->short_name_allocated;
681 }
682 
683 static inline void dso__set_short_name_allocated(struct dso *dso, bool allocated)
684 {
685 	RC_CHK_ACCESS(dso)->short_name_allocated = allocated;
686 }
687 
688 static inline u16 dso__short_name_len(const struct dso *dso)
689 {
690 	return RC_CHK_ACCESS(dso)->short_name_len;
691 }
692 
693 static inline struct rb_root_cached *dso__srclines(struct dso *dso)
694 {
695 	return &RC_CHK_ACCESS(dso)->srclines;
696 }
697 
698 static inline struct rb_root *dso__data_types(struct dso *dso)
699 {
700 	return &RC_CHK_ACCESS(dso)->data_types;
701 }
702 
703 static inline struct rb_root *dso__global_vars(struct dso *dso)
704 {
705 	return &RC_CHK_ACCESS(dso)->global_vars;
706 }
707 
708 static inline struct rb_root_cached *dso__symbols(struct dso *dso)
709 {
710 	return &RC_CHK_ACCESS(dso)->symbols;
711 }
712 
713 static inline struct symbol **dso__symbol_names(struct dso *dso)
714 {
715 	return RC_CHK_ACCESS(dso)->symbol_names;
716 }
717 
718 static inline void dso__set_symbol_names(struct dso *dso, struct symbol **names)
719 {
720 	RC_CHK_ACCESS(dso)->symbol_names = names;
721 }
722 
723 static inline size_t dso__symbol_names_len(struct dso *dso)
724 {
725 	return RC_CHK_ACCESS(dso)->symbol_names_len;
726 }
727 
728 static inline void dso__set_symbol_names_len(struct dso *dso, size_t len)
729 {
730 	RC_CHK_ACCESS(dso)->symbol_names_len = len;
731 }
732 
733 static inline const char *dso__symsrc_filename(const struct dso *dso)
734 {
735 	return RC_CHK_ACCESS(dso)->symsrc_filename;
736 }
737 
738 static inline void dso__set_symsrc_filename(struct dso *dso, char *val)
739 {
740 	RC_CHK_ACCESS(dso)->symsrc_filename = val;
741 }
742 
743 static inline void dso__free_symsrc_filename(struct dso *dso)
744 {
745 	zfree(&RC_CHK_ACCESS(dso)->symsrc_filename);
746 }
747 
748 static inline enum dso_binary_type dso__symtab_type(const struct dso *dso)
749 {
750 	return RC_CHK_ACCESS(dso)->symtab_type;
751 }
752 
753 static inline void dso__set_symtab_type(struct dso *dso, enum dso_binary_type bt)
754 {
755 	RC_CHK_ACCESS(dso)->symtab_type = bt;
756 }
757 
758 static inline u64 dso__text_end(const struct dso *dso)
759 {
760 	return RC_CHK_ACCESS(dso)->text_end;
761 }
762 
763 static inline void dso__set_text_end(struct dso *dso, u64 val)
764 {
765 	RC_CHK_ACCESS(dso)->text_end = val;
766 }
767 
768 static inline u64 dso__text_offset(const struct dso *dso)
769 {
770 	return RC_CHK_ACCESS(dso)->text_offset;
771 }
772 
773 static inline void dso__set_text_offset(struct dso *dso, u64 val)
774 {
775 	RC_CHK_ACCESS(dso)->text_offset = val;
776 }
777 
778 struct dso *dso__new_id(const char *name, const struct dso_id *id);
779 struct dso *dso__new(const char *name);
780 void dso__delete(struct dso *dso);
781 
782 int dso__cmp_id(struct dso *a, struct dso *b);
783 void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated);
784 void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated);
785 void __dso__improve_id(struct dso *dso, const struct dso_id *id);
786 
787 int dso__name_len(const struct dso *dso);
788 
789 struct dso *dso__get(struct dso *dso);
790 void dso__put(struct dso *dso) LOCKS_EXCLUDED(_dso__data_open_lock);
791 
792 static inline void __dso__zput(struct dso **dso)
793 {
794 	dso__put(*dso);
795 	*dso = NULL;
796 }
797 
798 #define dso__zput(dso) __dso__zput(&dso)
799 
800 bool dso__loaded(const struct dso *dso);
801 
802 static inline bool dso__has_symbols(const struct dso *dso)
803 {
804 	return !RB_EMPTY_ROOT(&RC_CHK_ACCESS(dso)->symbols.rb_root);
805 }
806 
807 char *dso__filename_with_chroot(const struct dso *dso, const char *filename);
808 
809 bool dso__sorted_by_name(const struct dso *dso);
810 void dso__set_sorted_by_name(struct dso *dso);
811 void dso__sort_by_name(struct dso *dso);
812 
813 int dso__swap_init(struct dso *dso, unsigned char eidata);
814 
815 void dso__set_build_id(struct dso *dso, const struct build_id *bid);
816 bool dso__build_id_equal(const struct dso *dso, const struct build_id *bid);
817 void dso__read_running_kernel_build_id(struct dso *dso,
818 				       struct machine *machine);
819 int dso__kernel_module_get_build_id(struct dso *dso, const char *root_dir);
820 
821 char dso__symtab_origin(const struct dso *dso);
822 int dso__read_binary_type_filename(const struct dso *dso, enum dso_binary_type type,
823 				   const char *root_dir, char *filename, size_t size);
824 bool is_kernel_module(const char *pathname, int cpumode);
825 bool dso__needs_decompress(struct dso *dso);
826 int dso__decompress_kmodule_fd(struct dso *dso, const char *name);
827 int dso__decompress_kmodule_path(struct dso *dso, const char *name,
828 				 char *pathname, size_t len);
829 int filename__decompress(const char *name, char *pathname,
830 			 size_t len, int comp, int *err);
831 
832 #define KMOD_DECOMP_NAME  "/tmp/perf-kmod-XXXXXX"
833 #define KMOD_DECOMP_LEN   sizeof(KMOD_DECOMP_NAME)
834 
835 struct kmod_path {
836 	char *name;
837 	int   comp;
838 	bool  kmod;
839 };
840 
841 int __kmod_path__parse(struct kmod_path *m, const char *path,
842 		     bool alloc_name);
843 
844 #define kmod_path__parse(__m, __p)      __kmod_path__parse(__m, __p, false)
845 #define kmod_path__parse_name(__m, __p) __kmod_path__parse(__m, __p, true)
846 
847 void dso__set_module_info(struct dso *dso, struct kmod_path *m,
848 			  struct machine *machine);
849 
850 /*
851  * The dso__data_* external interface provides following functions:
852  *   dso__data_get_fd
853  *   dso__data_put_fd
854  *   dso__data_close
855  *   dso__data_size
856  *   dso__data_read_offset
857  *   dso__data_read_addr
858  *   dso__data_write_cache_offs
859  *   dso__data_write_cache_addr
860  *
861  * Please refer to the dso.c object code for each function and
862  * arguments documentation. Following text tries to explain the
863  * dso file descriptor caching.
864  *
865  * The dso__data* interface allows caching of opened file descriptors
866  * to speed up the dso data accesses. The idea is to leave the file
867  * descriptor opened ideally for the whole life of the dso object.
868  *
869  * The current usage of the dso__data_* interface is as follows:
870  *
871  * Get DSO's fd:
872  *   int fd;
873  *   if (dso__data_get_fd(dso, machine, &fd)) {
874  *       USE 'fd' SOMEHOW
875  *       dso__data_put_fd(dso);
876  *   }
877  *
878  * Read DSO's data:
879  *   n = dso__data_read_offset(dso_0, &machine, 0, buf, BUFSIZE);
880  *   n = dso__data_read_addr(dso_0, &machine, 0, buf, BUFSIZE);
881  *
882  * Eventually close DSO's fd:
883  *   dso__data_close(dso);
884  *
885  * It is not necessary to close the DSO object data file. Each time new
886  * DSO data file is opened, the limit (RLIMIT_NOFILE/2) is checked. Once
887  * it is crossed, the oldest opened DSO object is closed.
888  *
889  * The dso__delete function calls close_dso function to ensure the
890  * data file descriptor gets closed/unmapped before the dso object
891  * is freed.
892  *
893  * TODO
894 */
895 bool dso__data_get_fd(struct dso *dso, struct machine *machine, int *fd)
896 	EXCLUSIVE_TRYLOCK_FUNCTION(true, _dso__data_open_lock);
897 void dso__data_put_fd(struct dso *dso) UNLOCK_FUNCTION(_dso__data_open_lock);
898 void dso__data_close(struct dso *dso) LOCKS_EXCLUDED(_dso__data_open_lock);
899 
900 int dso__data_file_size(struct dso *dso, struct machine *machine);
901 off_t dso__data_size(struct dso *dso, struct machine *machine);
902 ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
903 			      u64 offset, u8 *data, ssize_t size);
904 uint16_t dso__read_e_machine_endian(struct dso *optional_dso, int fd, uint32_t *e_flags,
905 				    bool *is_big_endian);
906 static inline uint16_t dso__read_e_machine(struct dso *optional_dso, int fd, uint32_t *e_flags)
907 {
908 	return dso__read_e_machine_endian(optional_dso, fd, e_flags, NULL);
909 }
910 uint16_t dso__e_machine_endian(struct dso *dso, struct machine *machine, uint32_t *e_flags,
911 			       bool *is_big_endian);
912 static inline uint16_t dso__e_machine(struct dso *dso, struct machine *machine, uint32_t *e_flags)
913 {
914 	return dso__e_machine_endian(dso, machine, e_flags, NULL);
915 }
916 ssize_t dso__data_read_addr(struct dso *dso, struct map *map,
917 			    struct machine *machine, u64 addr,
918 			    u8 *data, ssize_t size);
919 bool dso__data_status_seen(struct dso *dso, enum dso_data_status_seen by);
920 ssize_t dso__data_write_cache_offs(struct dso *dso, struct machine *machine,
921 				   u64 offset, const u8 *data, ssize_t size);
922 ssize_t dso__data_write_cache_addr(struct dso *dso, struct map *map,
923 				   struct machine *machine, u64 addr,
924 				   const u8 *data, ssize_t size);
925 
926 struct map *dso__new_map(const char *name);
927 struct dso *machine__findnew_kernel(struct machine *machine, const char *name,
928 				    const char *short_name, int dso_type);
929 
930 void dso__reset_find_symbol_cache(struct dso *dso);
931 
932 size_t dso__fprintf_symbols_by_name(struct dso *dso, FILE *fp);
933 size_t dso__fprintf(struct dso *dso, FILE *fp);
934 
935 static inline enum dso_binary_type dso__binary_type(const struct dso *dso)
936 {
937 	return RC_CHK_ACCESS(dso)->binary_type;
938 }
939 
940 static inline void dso__set_binary_type(struct dso *dso, enum dso_binary_type bt)
941 {
942 	RC_CHK_ACCESS(dso)->binary_type = bt;
943 }
944 
945 static inline bool dso__is_vmlinux(const struct dso *dso)
946 {
947 	enum dso_binary_type bt = dso__binary_type(dso);
948 
949 	return bt == DSO_BINARY_TYPE__VMLINUX || bt == DSO_BINARY_TYPE__GUEST_VMLINUX;
950 }
951 
952 static inline bool dso__is_kcore(const struct dso *dso)
953 {
954 	enum dso_binary_type bt = dso__binary_type(dso);
955 
956 	return bt == DSO_BINARY_TYPE__KCORE || bt == DSO_BINARY_TYPE__GUEST_KCORE;
957 }
958 
959 static inline bool dso__is_kallsyms(const struct dso *dso)
960 {
961 	enum dso_binary_type bt = dso__binary_type(dso);
962 	const char *name;
963 
964 	if (bt == DSO_BINARY_TYPE__KALLSYMS || bt == DSO_BINARY_TYPE__GUEST_KALLSYMS)
965 		return true;
966 
967 	if (bt != DSO_BINARY_TYPE__NOT_FOUND)
968 		return false;
969 
970 	if (!dso__kernel(dso))
971 		return false;
972 
973 	name = dso__long_name(dso);
974 	if (!name)
975 		return false;
976 
977 	if (!strcmp(name, DSO__NAME_KALLSYMS))
978 		return true;
979 
980 	if (!strcmp(name, DSO__NAME_GUEST_KALLSYMS))
981 		return true;
982 
983 	return is_guest_kallsyms_pid_name(name);
984 }
985 
986 bool dso__is_object_file(const struct dso *dso);
987 
988 void dso__free_a2l(struct dso *dso);
989 
990 enum dso_type dso__type(struct dso *dso, struct machine *machine);
991 
992 int dso__strerror_load(struct dso *dso, char *buf, size_t buflen);
993 
994 void reset_fd_limit(void);
995 
996 u64 dso__find_global_type(struct dso *dso, u64 addr);
997 u64 dso__findnew_global_type(struct dso *dso, u64 addr, u64 offset);
998 
999 /* Check if dso name is of format "/tmp/perf-%d.map" */
1000 bool perf_pid_map_tid(const char *dso_name, int *tid);
1001 bool is_perf_pid_map_name(const char *dso_name);
1002 
1003 struct debuginfo *dso__debuginfo(struct dso *dso);
1004 
1005 const u8 *dso__read_symbol(struct dso *dso, const char *symfs_filename,
1006 			   const struct map *map, const struct symbol *sym,
1007 			   u8 **out_buf, u64 *out_buf_len, bool *is_64bit);
1008 
1009 #endif /* __PERF_DSO */
1010