162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef __PERF_DSO 362306a36Sopenharmony_ci#define __PERF_DSO 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/refcount.h> 662306a36Sopenharmony_ci#include <linux/types.h> 762306a36Sopenharmony_ci#include <linux/rbtree.h> 862306a36Sopenharmony_ci#include <sys/types.h> 962306a36Sopenharmony_ci#include <stdbool.h> 1062306a36Sopenharmony_ci#include <stdio.h> 1162306a36Sopenharmony_ci#include <linux/bitops.h> 1262306a36Sopenharmony_ci#include "build-id.h" 1362306a36Sopenharmony_ci#include "mutex.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistruct machine; 1662306a36Sopenharmony_cistruct map; 1762306a36Sopenharmony_cistruct perf_env; 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#define DSO__NAME_KALLSYMS "[kernel.kallsyms]" 2062306a36Sopenharmony_ci#define DSO__NAME_KCORE "[kernel.kcore]" 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cienum dso_binary_type { 2362306a36Sopenharmony_ci DSO_BINARY_TYPE__KALLSYMS = 0, 2462306a36Sopenharmony_ci DSO_BINARY_TYPE__GUEST_KALLSYMS, 2562306a36Sopenharmony_ci DSO_BINARY_TYPE__VMLINUX, 2662306a36Sopenharmony_ci DSO_BINARY_TYPE__GUEST_VMLINUX, 2762306a36Sopenharmony_ci DSO_BINARY_TYPE__JAVA_JIT, 2862306a36Sopenharmony_ci DSO_BINARY_TYPE__DEBUGLINK, 2962306a36Sopenharmony_ci DSO_BINARY_TYPE__BUILD_ID_CACHE, 3062306a36Sopenharmony_ci DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO, 3162306a36Sopenharmony_ci DSO_BINARY_TYPE__FEDORA_DEBUGINFO, 3262306a36Sopenharmony_ci DSO_BINARY_TYPE__UBUNTU_DEBUGINFO, 3362306a36Sopenharmony_ci DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO, 3462306a36Sopenharmony_ci DSO_BINARY_TYPE__BUILDID_DEBUGINFO, 3562306a36Sopenharmony_ci DSO_BINARY_TYPE__SYSTEM_PATH_DSO, 3662306a36Sopenharmony_ci DSO_BINARY_TYPE__GUEST_KMODULE, 3762306a36Sopenharmony_ci DSO_BINARY_TYPE__GUEST_KMODULE_COMP, 3862306a36Sopenharmony_ci DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE, 3962306a36Sopenharmony_ci DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP, 4062306a36Sopenharmony_ci DSO_BINARY_TYPE__KCORE, 4162306a36Sopenharmony_ci DSO_BINARY_TYPE__GUEST_KCORE, 4262306a36Sopenharmony_ci DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO, 4362306a36Sopenharmony_ci DSO_BINARY_TYPE__BPF_PROG_INFO, 4462306a36Sopenharmony_ci DSO_BINARY_TYPE__BPF_IMAGE, 4562306a36Sopenharmony_ci DSO_BINARY_TYPE__OOL, 4662306a36Sopenharmony_ci DSO_BINARY_TYPE__NOT_FOUND, 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cienum dso_space_type { 5062306a36Sopenharmony_ci DSO_SPACE__USER = 0, 5162306a36Sopenharmony_ci DSO_SPACE__KERNEL, 5262306a36Sopenharmony_ci DSO_SPACE__KERNEL_GUEST 5362306a36Sopenharmony_ci}; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cienum dso_swap_type { 5662306a36Sopenharmony_ci DSO_SWAP__UNSET, 5762306a36Sopenharmony_ci DSO_SWAP__NO, 5862306a36Sopenharmony_ci DSO_SWAP__YES, 5962306a36Sopenharmony_ci}; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cienum dso_data_status { 6262306a36Sopenharmony_ci DSO_DATA_STATUS_ERROR = -1, 6362306a36Sopenharmony_ci DSO_DATA_STATUS_UNKNOWN = 0, 6462306a36Sopenharmony_ci DSO_DATA_STATUS_OK = 1, 6562306a36Sopenharmony_ci}; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_cienum dso_data_status_seen { 6862306a36Sopenharmony_ci DSO_DATA_STATUS_SEEN_ITRACE, 6962306a36Sopenharmony_ci}; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cienum dso_type { 7262306a36Sopenharmony_ci DSO__TYPE_UNKNOWN, 7362306a36Sopenharmony_ci DSO__TYPE_64BIT, 7462306a36Sopenharmony_ci DSO__TYPE_32BIT, 7562306a36Sopenharmony_ci DSO__TYPE_X32BIT, 7662306a36Sopenharmony_ci}; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cienum dso_load_errno { 7962306a36Sopenharmony_ci DSO_LOAD_ERRNO__SUCCESS = 0, 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci /* 8262306a36Sopenharmony_ci * Choose an arbitrary negative big number not to clash with standard 8362306a36Sopenharmony_ci * errno since SUS requires the errno has distinct positive values. 8462306a36Sopenharmony_ci * See 'Issue 6' in the link below. 8562306a36Sopenharmony_ci * 8662306a36Sopenharmony_ci * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html 8762306a36Sopenharmony_ci */ 8862306a36Sopenharmony_ci __DSO_LOAD_ERRNO__START = -10000, 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci DSO_LOAD_ERRNO__INTERNAL_ERROR = __DSO_LOAD_ERRNO__START, 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci /* for symsrc__init() */ 9362306a36Sopenharmony_ci DSO_LOAD_ERRNO__INVALID_ELF, 9462306a36Sopenharmony_ci DSO_LOAD_ERRNO__CANNOT_READ_BUILDID, 9562306a36Sopenharmony_ci DSO_LOAD_ERRNO__MISMATCHING_BUILDID, 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci /* for decompress_kmodule */ 9862306a36Sopenharmony_ci DSO_LOAD_ERRNO__DECOMPRESSION_FAILURE, 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci __DSO_LOAD_ERRNO__END, 10162306a36Sopenharmony_ci}; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci#define DSO__SWAP(dso, type, val) \ 10462306a36Sopenharmony_ci({ \ 10562306a36Sopenharmony_ci type ____r = val; \ 10662306a36Sopenharmony_ci BUG_ON(dso->needs_swap == DSO_SWAP__UNSET); \ 10762306a36Sopenharmony_ci if (dso->needs_swap == DSO_SWAP__YES) { \ 10862306a36Sopenharmony_ci switch (sizeof(____r)) { \ 10962306a36Sopenharmony_ci case 2: \ 11062306a36Sopenharmony_ci ____r = bswap_16(val); \ 11162306a36Sopenharmony_ci break; \ 11262306a36Sopenharmony_ci case 4: \ 11362306a36Sopenharmony_ci ____r = bswap_32(val); \ 11462306a36Sopenharmony_ci break; \ 11562306a36Sopenharmony_ci case 8: \ 11662306a36Sopenharmony_ci ____r = bswap_64(val); \ 11762306a36Sopenharmony_ci break; \ 11862306a36Sopenharmony_ci default: \ 11962306a36Sopenharmony_ci BUG_ON(1); \ 12062306a36Sopenharmony_ci } \ 12162306a36Sopenharmony_ci } \ 12262306a36Sopenharmony_ci ____r; \ 12362306a36Sopenharmony_ci}) 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci#define DSO__DATA_CACHE_SIZE 4096 12662306a36Sopenharmony_ci#define DSO__DATA_CACHE_MASK ~(DSO__DATA_CACHE_SIZE - 1) 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci/* 12962306a36Sopenharmony_ci * Data about backing storage DSO, comes from PERF_RECORD_MMAP2 meta events 13062306a36Sopenharmony_ci */ 13162306a36Sopenharmony_cistruct dso_id { 13262306a36Sopenharmony_ci u32 maj; 13362306a36Sopenharmony_ci u32 min; 13462306a36Sopenharmony_ci u64 ino; 13562306a36Sopenharmony_ci u64 ino_generation; 13662306a36Sopenharmony_ci}; 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_cistruct dso_cache { 13962306a36Sopenharmony_ci struct rb_node rb_node; 14062306a36Sopenharmony_ci u64 offset; 14162306a36Sopenharmony_ci u64 size; 14262306a36Sopenharmony_ci char data[]; 14362306a36Sopenharmony_ci}; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_cistruct auxtrace_cache; 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_cistruct dso { 14862306a36Sopenharmony_ci struct mutex lock; 14962306a36Sopenharmony_ci struct list_head node; 15062306a36Sopenharmony_ci struct rb_node rb_node; /* rbtree node sorted by long name */ 15162306a36Sopenharmony_ci struct rb_root *root; /* root of rbtree that rb_node is in */ 15262306a36Sopenharmony_ci struct rb_root_cached symbols; 15362306a36Sopenharmony_ci struct symbol **symbol_names; 15462306a36Sopenharmony_ci size_t symbol_names_len; 15562306a36Sopenharmony_ci struct rb_root_cached inlined_nodes; 15662306a36Sopenharmony_ci struct rb_root_cached srclines; 15762306a36Sopenharmony_ci struct { 15862306a36Sopenharmony_ci u64 addr; 15962306a36Sopenharmony_ci struct symbol *symbol; 16062306a36Sopenharmony_ci } last_find_result; 16162306a36Sopenharmony_ci void *a2l; 16262306a36Sopenharmony_ci char *symsrc_filename; 16362306a36Sopenharmony_ci unsigned int a2l_fails; 16462306a36Sopenharmony_ci enum dso_space_type kernel; 16562306a36Sopenharmony_ci enum dso_swap_type needs_swap; 16662306a36Sopenharmony_ci enum dso_binary_type symtab_type; 16762306a36Sopenharmony_ci enum dso_binary_type binary_type; 16862306a36Sopenharmony_ci enum dso_load_errno load_errno; 16962306a36Sopenharmony_ci u8 adjust_symbols:1; 17062306a36Sopenharmony_ci u8 has_build_id:1; 17162306a36Sopenharmony_ci u8 header_build_id:1; 17262306a36Sopenharmony_ci u8 has_srcline:1; 17362306a36Sopenharmony_ci u8 hit:1; 17462306a36Sopenharmony_ci u8 annotate_warned:1; 17562306a36Sopenharmony_ci u8 auxtrace_warned:1; 17662306a36Sopenharmony_ci u8 short_name_allocated:1; 17762306a36Sopenharmony_ci u8 long_name_allocated:1; 17862306a36Sopenharmony_ci u8 is_64_bit:1; 17962306a36Sopenharmony_ci bool sorted_by_name; 18062306a36Sopenharmony_ci bool loaded; 18162306a36Sopenharmony_ci u8 rel; 18262306a36Sopenharmony_ci struct build_id bid; 18362306a36Sopenharmony_ci u64 text_offset; 18462306a36Sopenharmony_ci const char *short_name; 18562306a36Sopenharmony_ci const char *long_name; 18662306a36Sopenharmony_ci u16 long_name_len; 18762306a36Sopenharmony_ci u16 short_name_len; 18862306a36Sopenharmony_ci void *dwfl; /* DWARF debug info */ 18962306a36Sopenharmony_ci struct auxtrace_cache *auxtrace_cache; 19062306a36Sopenharmony_ci int comp; 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci /* dso data file */ 19362306a36Sopenharmony_ci struct { 19462306a36Sopenharmony_ci struct rb_root cache; 19562306a36Sopenharmony_ci int fd; 19662306a36Sopenharmony_ci int status; 19762306a36Sopenharmony_ci u32 status_seen; 19862306a36Sopenharmony_ci u64 file_size; 19962306a36Sopenharmony_ci struct list_head open_entry; 20062306a36Sopenharmony_ci u64 elf_base_addr; 20162306a36Sopenharmony_ci u64 debug_frame_offset; 20262306a36Sopenharmony_ci u64 eh_frame_hdr_addr; 20362306a36Sopenharmony_ci u64 eh_frame_hdr_offset; 20462306a36Sopenharmony_ci } data; 20562306a36Sopenharmony_ci /* bpf prog information */ 20662306a36Sopenharmony_ci struct { 20762306a36Sopenharmony_ci u32 id; 20862306a36Sopenharmony_ci u32 sub_id; 20962306a36Sopenharmony_ci struct perf_env *env; 21062306a36Sopenharmony_ci } bpf_prog; 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci union { /* Tool specific area */ 21362306a36Sopenharmony_ci void *priv; 21462306a36Sopenharmony_ci u64 db_id; 21562306a36Sopenharmony_ci }; 21662306a36Sopenharmony_ci struct nsinfo *nsinfo; 21762306a36Sopenharmony_ci struct dso_id id; 21862306a36Sopenharmony_ci refcount_t refcnt; 21962306a36Sopenharmony_ci char name[]; 22062306a36Sopenharmony_ci}; 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci/* dso__for_each_symbol - iterate over the symbols of given type 22362306a36Sopenharmony_ci * 22462306a36Sopenharmony_ci * @dso: the 'struct dso *' in which symbols are iterated 22562306a36Sopenharmony_ci * @pos: the 'struct symbol *' to use as a loop cursor 22662306a36Sopenharmony_ci * @n: the 'struct rb_node *' to use as a temporary storage 22762306a36Sopenharmony_ci */ 22862306a36Sopenharmony_ci#define dso__for_each_symbol(dso, pos, n) \ 22962306a36Sopenharmony_ci symbols__for_each_entry(&(dso)->symbols, pos, n) 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci#define dsos__for_each_with_build_id(pos, head) \ 23262306a36Sopenharmony_ci list_for_each_entry(pos, head, node) \ 23362306a36Sopenharmony_ci if (!pos->has_build_id) \ 23462306a36Sopenharmony_ci continue; \ 23562306a36Sopenharmony_ci else 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_cistatic inline void dso__set_loaded(struct dso *dso) 23862306a36Sopenharmony_ci{ 23962306a36Sopenharmony_ci dso->loaded = true; 24062306a36Sopenharmony_ci} 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_cistruct dso *dso__new_id(const char *name, struct dso_id *id); 24362306a36Sopenharmony_cistruct dso *dso__new(const char *name); 24462306a36Sopenharmony_civoid dso__delete(struct dso *dso); 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ciint dso__cmp_id(struct dso *a, struct dso *b); 24762306a36Sopenharmony_civoid dso__set_short_name(struct dso *dso, const char *name, bool name_allocated); 24862306a36Sopenharmony_civoid dso__set_long_name(struct dso *dso, const char *name, bool name_allocated); 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_ciint dso__name_len(const struct dso *dso); 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_cistruct dso *dso__get(struct dso *dso); 25362306a36Sopenharmony_civoid dso__put(struct dso *dso); 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_cistatic inline void __dso__zput(struct dso **dso) 25662306a36Sopenharmony_ci{ 25762306a36Sopenharmony_ci dso__put(*dso); 25862306a36Sopenharmony_ci *dso = NULL; 25962306a36Sopenharmony_ci} 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci#define dso__zput(dso) __dso__zput(&dso) 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_cibool dso__loaded(const struct dso *dso); 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_cistatic inline bool dso__has_symbols(const struct dso *dso) 26662306a36Sopenharmony_ci{ 26762306a36Sopenharmony_ci return !RB_EMPTY_ROOT(&dso->symbols.rb_root); 26862306a36Sopenharmony_ci} 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_cichar *dso__filename_with_chroot(const struct dso *dso, const char *filename); 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_cibool dso__sorted_by_name(const struct dso *dso); 27362306a36Sopenharmony_civoid dso__set_sorted_by_name(struct dso *dso); 27462306a36Sopenharmony_civoid dso__sort_by_name(struct dso *dso); 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_civoid dso__set_build_id(struct dso *dso, struct build_id *bid); 27762306a36Sopenharmony_cibool dso__build_id_equal(const struct dso *dso, struct build_id *bid); 27862306a36Sopenharmony_civoid dso__read_running_kernel_build_id(struct dso *dso, 27962306a36Sopenharmony_ci struct machine *machine); 28062306a36Sopenharmony_ciint dso__kernel_module_get_build_id(struct dso *dso, const char *root_dir); 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_cichar dso__symtab_origin(const struct dso *dso); 28362306a36Sopenharmony_ciint dso__read_binary_type_filename(const struct dso *dso, enum dso_binary_type type, 28462306a36Sopenharmony_ci char *root_dir, char *filename, size_t size); 28562306a36Sopenharmony_cibool is_kernel_module(const char *pathname, int cpumode); 28662306a36Sopenharmony_cibool dso__needs_decompress(struct dso *dso); 28762306a36Sopenharmony_ciint dso__decompress_kmodule_fd(struct dso *dso, const char *name); 28862306a36Sopenharmony_ciint dso__decompress_kmodule_path(struct dso *dso, const char *name, 28962306a36Sopenharmony_ci char *pathname, size_t len); 29062306a36Sopenharmony_ciint filename__decompress(const char *name, char *pathname, 29162306a36Sopenharmony_ci size_t len, int comp, int *err); 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci#define KMOD_DECOMP_NAME "/tmp/perf-kmod-XXXXXX" 29462306a36Sopenharmony_ci#define KMOD_DECOMP_LEN sizeof(KMOD_DECOMP_NAME) 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_cistruct kmod_path { 29762306a36Sopenharmony_ci char *name; 29862306a36Sopenharmony_ci int comp; 29962306a36Sopenharmony_ci bool kmod; 30062306a36Sopenharmony_ci}; 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ciint __kmod_path__parse(struct kmod_path *m, const char *path, 30362306a36Sopenharmony_ci bool alloc_name); 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci#define kmod_path__parse(__m, __p) __kmod_path__parse(__m, __p, false) 30662306a36Sopenharmony_ci#define kmod_path__parse_name(__m, __p) __kmod_path__parse(__m, __p, true) 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_civoid dso__set_module_info(struct dso *dso, struct kmod_path *m, 30962306a36Sopenharmony_ci struct machine *machine); 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci/* 31262306a36Sopenharmony_ci * The dso__data_* external interface provides following functions: 31362306a36Sopenharmony_ci * dso__data_get_fd 31462306a36Sopenharmony_ci * dso__data_put_fd 31562306a36Sopenharmony_ci * dso__data_close 31662306a36Sopenharmony_ci * dso__data_size 31762306a36Sopenharmony_ci * dso__data_read_offset 31862306a36Sopenharmony_ci * dso__data_read_addr 31962306a36Sopenharmony_ci * dso__data_write_cache_offs 32062306a36Sopenharmony_ci * dso__data_write_cache_addr 32162306a36Sopenharmony_ci * 32262306a36Sopenharmony_ci * Please refer to the dso.c object code for each function and 32362306a36Sopenharmony_ci * arguments documentation. Following text tries to explain the 32462306a36Sopenharmony_ci * dso file descriptor caching. 32562306a36Sopenharmony_ci * 32662306a36Sopenharmony_ci * The dso__data* interface allows caching of opened file descriptors 32762306a36Sopenharmony_ci * to speed up the dso data accesses. The idea is to leave the file 32862306a36Sopenharmony_ci * descriptor opened ideally for the whole life of the dso object. 32962306a36Sopenharmony_ci * 33062306a36Sopenharmony_ci * The current usage of the dso__data_* interface is as follows: 33162306a36Sopenharmony_ci * 33262306a36Sopenharmony_ci * Get DSO's fd: 33362306a36Sopenharmony_ci * int fd = dso__data_get_fd(dso, machine); 33462306a36Sopenharmony_ci * if (fd >= 0) { 33562306a36Sopenharmony_ci * USE 'fd' SOMEHOW 33662306a36Sopenharmony_ci * dso__data_put_fd(dso); 33762306a36Sopenharmony_ci * } 33862306a36Sopenharmony_ci * 33962306a36Sopenharmony_ci * Read DSO's data: 34062306a36Sopenharmony_ci * n = dso__data_read_offset(dso_0, &machine, 0, buf, BUFSIZE); 34162306a36Sopenharmony_ci * n = dso__data_read_addr(dso_0, &machine, 0, buf, BUFSIZE); 34262306a36Sopenharmony_ci * 34362306a36Sopenharmony_ci * Eventually close DSO's fd: 34462306a36Sopenharmony_ci * dso__data_close(dso); 34562306a36Sopenharmony_ci * 34662306a36Sopenharmony_ci * It is not necessary to close the DSO object data file. Each time new 34762306a36Sopenharmony_ci * DSO data file is opened, the limit (RLIMIT_NOFILE/2) is checked. Once 34862306a36Sopenharmony_ci * it is crossed, the oldest opened DSO object is closed. 34962306a36Sopenharmony_ci * 35062306a36Sopenharmony_ci * The dso__delete function calls close_dso function to ensure the 35162306a36Sopenharmony_ci * data file descriptor gets closed/unmapped before the dso object 35262306a36Sopenharmony_ci * is freed. 35362306a36Sopenharmony_ci * 35462306a36Sopenharmony_ci * TODO 35562306a36Sopenharmony_ci*/ 35662306a36Sopenharmony_ciint dso__data_get_fd(struct dso *dso, struct machine *machine); 35762306a36Sopenharmony_civoid dso__data_put_fd(struct dso *dso); 35862306a36Sopenharmony_civoid dso__data_close(struct dso *dso); 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ciint dso__data_file_size(struct dso *dso, struct machine *machine); 36162306a36Sopenharmony_cioff_t dso__data_size(struct dso *dso, struct machine *machine); 36262306a36Sopenharmony_cissize_t dso__data_read_offset(struct dso *dso, struct machine *machine, 36362306a36Sopenharmony_ci u64 offset, u8 *data, ssize_t size); 36462306a36Sopenharmony_cissize_t dso__data_read_addr(struct dso *dso, struct map *map, 36562306a36Sopenharmony_ci struct machine *machine, u64 addr, 36662306a36Sopenharmony_ci u8 *data, ssize_t size); 36762306a36Sopenharmony_cibool dso__data_status_seen(struct dso *dso, enum dso_data_status_seen by); 36862306a36Sopenharmony_cissize_t dso__data_write_cache_offs(struct dso *dso, struct machine *machine, 36962306a36Sopenharmony_ci u64 offset, const u8 *data, ssize_t size); 37062306a36Sopenharmony_cissize_t dso__data_write_cache_addr(struct dso *dso, struct map *map, 37162306a36Sopenharmony_ci struct machine *machine, u64 addr, 37262306a36Sopenharmony_ci const u8 *data, ssize_t size); 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_cistruct map *dso__new_map(const char *name); 37562306a36Sopenharmony_cistruct dso *machine__findnew_kernel(struct machine *machine, const char *name, 37662306a36Sopenharmony_ci const char *short_name, int dso_type); 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_civoid dso__reset_find_symbol_cache(struct dso *dso); 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_cisize_t dso__fprintf_symbols_by_name(struct dso *dso, FILE *fp); 38162306a36Sopenharmony_cisize_t dso__fprintf(struct dso *dso, FILE *fp); 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_cistatic inline bool dso__is_vmlinux(const struct dso *dso) 38462306a36Sopenharmony_ci{ 38562306a36Sopenharmony_ci return dso->binary_type == DSO_BINARY_TYPE__VMLINUX || 38662306a36Sopenharmony_ci dso->binary_type == DSO_BINARY_TYPE__GUEST_VMLINUX; 38762306a36Sopenharmony_ci} 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_cistatic inline bool dso__is_kcore(const struct dso *dso) 39062306a36Sopenharmony_ci{ 39162306a36Sopenharmony_ci return dso->binary_type == DSO_BINARY_TYPE__KCORE || 39262306a36Sopenharmony_ci dso->binary_type == DSO_BINARY_TYPE__GUEST_KCORE; 39362306a36Sopenharmony_ci} 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_cistatic inline bool dso__is_kallsyms(const struct dso *dso) 39662306a36Sopenharmony_ci{ 39762306a36Sopenharmony_ci return dso->kernel && dso->long_name[0] != '/'; 39862306a36Sopenharmony_ci} 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_cibool dso__is_object_file(const struct dso *dso); 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_civoid dso__free_a2l(struct dso *dso); 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_cienum dso_type dso__type(struct dso *dso, struct machine *machine); 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ciint dso__strerror_load(struct dso *dso, char *buf, size_t buflen); 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_civoid reset_fd_limit(void); 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci#endif /* __PERF_DSO */ 411