1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __PERF_DSO 3 #define __PERF_DSO 4 5 #include <pthread.h> 6 #include <linux/refcount.h> 7 #include <linux/types.h> 8 #include <linux/rbtree.h> 9 #include <sys/types.h> 10 #include <stdbool.h> 11 #include <stdio.h> 12 #include <linux/bitops.h> 13 #include "build-id.h" 14 15 struct machine; 16 struct map; 17 struct perf_env; 18 19 #define DSO__NAME_KALLSYMS "[kernel.kallsyms]" 20 #define DSO__NAME_KCORE "[kernel.kcore]" 21 22 enum dso_binary_type { 23 DSO_BINARY_TYPE__KALLSYMS = 0, 24 DSO_BINARY_TYPE__GUEST_KALLSYMS, 25 DSO_BINARY_TYPE__VMLINUX, 26 DSO_BINARY_TYPE__GUEST_VMLINUX, 27 DSO_BINARY_TYPE__JAVA_JIT, 28 DSO_BINARY_TYPE__DEBUGLINK, 29 DSO_BINARY_TYPE__BUILD_ID_CACHE, 30 DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO, 31 DSO_BINARY_TYPE__FEDORA_DEBUGINFO, 32 DSO_BINARY_TYPE__UBUNTU_DEBUGINFO, 33 DSO_BINARY_TYPE__BUILDID_DEBUGINFO, 34 DSO_BINARY_TYPE__SYSTEM_PATH_DSO, 35 DSO_BINARY_TYPE__GUEST_KMODULE, 36 DSO_BINARY_TYPE__GUEST_KMODULE_COMP, 37 DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE, 38 DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP, 39 DSO_BINARY_TYPE__KCORE, 40 DSO_BINARY_TYPE__GUEST_KCORE, 41 DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO, 42 DSO_BINARY_TYPE__BPF_PROG_INFO, 43 DSO_BINARY_TYPE__NOT_FOUND, 44 }; 45 46 enum dso_kernel_type { 47 DSO_TYPE_USER = 0, 48 DSO_TYPE_KERNEL, 49 DSO_TYPE_GUEST_KERNEL 50 }; 51 52 enum dso_swap_type { 53 DSO_SWAP__UNSET, 54 DSO_SWAP__NO, 55 DSO_SWAP__YES, 56 }; 57 58 enum dso_data_status { 59 DSO_DATA_STATUS_ERROR = -1, 60 DSO_DATA_STATUS_UNKNOWN = 0, 61 DSO_DATA_STATUS_OK = 1, 62 }; 63 64 enum dso_data_status_seen { 65 DSO_DATA_STATUS_SEEN_ITRACE, 66 }; 67 68 enum dso_type { 69 DSO__TYPE_UNKNOWN, 70 DSO__TYPE_64BIT, 71 DSO__TYPE_32BIT, 72 DSO__TYPE_X32BIT, 73 }; 74 75 enum dso_load_errno { 76 DSO_LOAD_ERRNO__SUCCESS = 0, 77 78 /* 79 * Choose an arbitrary negative big number not to clash with standard 80 * errno since SUS requires the errno has distinct positive values. 81 * See 'Issue 6' in the link below. 82 * 83 * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html 84 */ 85 __DSO_LOAD_ERRNO__START = -10000, 86 87 DSO_LOAD_ERRNO__INTERNAL_ERROR = __DSO_LOAD_ERRNO__START, 88 89 /* for symsrc__init() */ 90 DSO_LOAD_ERRNO__INVALID_ELF, 91 DSO_LOAD_ERRNO__CANNOT_READ_BUILDID, 92 DSO_LOAD_ERRNO__MISMATCHING_BUILDID, 93 94 /* for decompress_kmodule */ 95 DSO_LOAD_ERRNO__DECOMPRESSION_FAILURE, 96 97 __DSO_LOAD_ERRNO__END, 98 }; 99 100 #define DSO__SWAP(dso, type, val) \ 101 ({ \ 102 type ____r = val; \ 103 BUG_ON(dso->needs_swap == DSO_SWAP__UNSET); \ 104 if (dso->needs_swap == DSO_SWAP__YES) { \ 105 switch (sizeof(____r)) { \ 106 case 2: \ 107 ____r = bswap_16(val); \ 108 break; \ 109 case 4: \ 110 ____r = bswap_32(val); \ 111 break; \ 112 case 8: \ 113 ____r = bswap_64(val); \ 114 break; \ 115 default: \ 116 BUG_ON(1); \ 117 } \ 118 } \ 119 ____r; \ 120 }) 121 122 #define DSO__DATA_CACHE_SIZE 4096 123 #define DSO__DATA_CACHE_MASK ~(DSO__DATA_CACHE_SIZE - 1) 124 125 /* 126 * Data about backing storage DSO, comes from PERF_RECORD_MMAP2 meta events 127 */ 128 struct dso_id { 129 u32 maj; 130 u32 min; 131 u64 ino; 132 u64 ino_generation; 133 }; 134 135 struct dso_cache { 136 struct rb_node rb_node; 137 u64 offset; 138 u64 size; 139 char data[0]; 140 }; 141 142 struct auxtrace_cache; 143 144 struct dso { 145 pthread_mutex_t lock; 146 struct list_head node; 147 struct rb_node rb_node; /* rbtree node sorted by long name */ 148 struct rb_root *root; /* root of rbtree that rb_node is in */ 149 struct rb_root_cached symbols; 150 struct rb_root_cached symbol_names; 151 struct rb_root_cached inlined_nodes; 152 struct rb_root_cached srclines; 153 struct { 154 u64 addr; 155 struct symbol *symbol; 156 } last_find_result; 157 void *a2l; 158 char *symsrc_filename; 159 unsigned int a2l_fails; 160 enum dso_kernel_type kernel; 161 enum dso_swap_type needs_swap; 162 enum dso_binary_type symtab_type; 163 enum dso_binary_type binary_type; 164 enum dso_load_errno load_errno; 165 u8 adjust_symbols:1; 166 u8 has_build_id:1; 167 u8 has_srcline:1; 168 u8 hit:1; 169 u8 annotate_warned:1; 170 u8 short_name_allocated:1; 171 u8 long_name_allocated:1; 172 u8 is_64_bit:1; 173 bool sorted_by_name; 174 bool loaded; 175 u8 rel; 176 u8 build_id[BUILD_ID_SIZE]; 177 u64 text_offset; 178 const char *short_name; 179 const char *long_name; 180 u16 long_name_len; 181 u16 short_name_len; 182 void *dwfl; /* DWARF debug info */ 183 struct auxtrace_cache *auxtrace_cache; 184 int comp; 185 186 /* dso data file */ 187 struct { 188 struct rb_root cache; 189 int fd; 190 int status; 191 u32 status_seen; 192 size_t file_size; 193 struct list_head open_entry; 194 u64 debug_frame_offset; 195 u64 eh_frame_hdr_offset; 196 } data; 197 /* bpf prog information */ 198 struct { 199 u32 id; 200 u32 sub_id; 201 struct perf_env *env; 202 } bpf_prog; 203 204 union { /* Tool specific area */ 205 void *priv; 206 u64 db_id; 207 }; 208 struct nsinfo *nsinfo; 209 struct dso_id id; 210 refcount_t refcnt; 211 char name[0]; 212 }; 213 214 /* dso__for_each_symbol - iterate over the symbols of given type 215 * 216 * @dso: the 'struct dso *' in which symbols itereated 217 * @pos: the 'struct symbol *' to use as a loop cursor 218 * @n: the 'struct rb_node *' to use as a temporary storage 219 */ 220 #define dso__for_each_symbol(dso, pos, n) \ 221 symbols__for_each_entry(&(dso)->symbols, pos, n) 222 223 static inline void dso__set_loaded(struct dso *dso) 224 { 225 dso->loaded = true; 226 } 227 228 struct dso *dso__new_id(const char *name, struct dso_id *id); 229 struct dso *dso__new(const char *name); 230 void dso__delete(struct dso *dso); 231 232 int dso__cmp_id(struct dso *a, struct dso *b); 233 void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated); 234 void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated); 235 236 int dso__name_len(const struct dso *dso); 237 238 struct dso *dso__get(struct dso *dso); 239 void dso__put(struct dso *dso); 240 241 static inline void __dso__zput(struct dso **dso) 242 { 243 dso__put(*dso); 244 *dso = NULL; 245 } 246 247 #define dso__zput(dso) __dso__zput(&dso) 248 249 bool dso__loaded(const struct dso *dso); 250 251 static inline bool dso__has_symbols(const struct dso *dso) 252 { 253 return !RB_EMPTY_ROOT(&dso->symbols.rb_root); 254 } 255 256 bool dso__sorted_by_name(const struct dso *dso); 257 void dso__set_sorted_by_name(struct dso *dso); 258 void dso__sort_by_name(struct dso *dso); 259 260 void dso__set_build_id(struct dso *dso, void *build_id); 261 bool dso__build_id_equal(const struct dso *dso, u8 *build_id); 262 void dso__read_running_kernel_build_id(struct dso *dso, 263 struct machine *machine); 264 int dso__kernel_module_get_build_id(struct dso *dso, const char *root_dir); 265 266 char dso__symtab_origin(const struct dso *dso); 267 int dso__read_binary_type_filename(const struct dso *dso, enum dso_binary_type type, 268 char *root_dir, char *filename, size_t size); 269 bool is_kernel_module(const char *pathname, int cpumode); 270 bool dso__needs_decompress(struct dso *dso); 271 int dso__decompress_kmodule_fd(struct dso *dso, const char *name); 272 int dso__decompress_kmodule_path(struct dso *dso, const char *name, 273 char *pathname, size_t len); 274 275 #define KMOD_DECOMP_NAME "/tmp/perf-kmod-XXXXXX" 276 #define KMOD_DECOMP_LEN sizeof(KMOD_DECOMP_NAME) 277 278 struct kmod_path { 279 char *name; 280 int comp; 281 bool kmod; 282 }; 283 284 int __kmod_path__parse(struct kmod_path *m, const char *path, 285 bool alloc_name); 286 287 #define kmod_path__parse(__m, __p) __kmod_path__parse(__m, __p, false) 288 #define kmod_path__parse_name(__m, __p) __kmod_path__parse(__m, __p, true) 289 290 void dso__set_module_info(struct dso *dso, struct kmod_path *m, 291 struct machine *machine); 292 293 /* 294 * The dso__data_* external interface provides following functions: 295 * dso__data_get_fd 296 * dso__data_put_fd 297 * dso__data_close 298 * dso__data_size 299 * dso__data_read_offset 300 * dso__data_read_addr 301 * dso__data_write_cache_offs 302 * dso__data_write_cache_addr 303 * 304 * Please refer to the dso.c object code for each function and 305 * arguments documentation. Following text tries to explain the 306 * dso file descriptor caching. 307 * 308 * The dso__data* interface allows caching of opened file descriptors 309 * to speed up the dso data accesses. The idea is to leave the file 310 * descriptor opened ideally for the whole life of the dso object. 311 * 312 * The current usage of the dso__data_* interface is as follows: 313 * 314 * Get DSO's fd: 315 * int fd = dso__data_get_fd(dso, machine); 316 * if (fd >= 0) { 317 * USE 'fd' SOMEHOW 318 * dso__data_put_fd(dso); 319 * } 320 * 321 * Read DSO's data: 322 * n = dso__data_read_offset(dso_0, &machine, 0, buf, BUFSIZE); 323 * n = dso__data_read_addr(dso_0, &machine, 0, buf, BUFSIZE); 324 * 325 * Eventually close DSO's fd: 326 * dso__data_close(dso); 327 * 328 * It is not necessary to close the DSO object data file. Each time new 329 * DSO data file is opened, the limit (RLIMIT_NOFILE/2) is checked. Once 330 * it is crossed, the oldest opened DSO object is closed. 331 * 332 * The dso__delete function calls close_dso function to ensure the 333 * data file descriptor gets closed/unmapped before the dso object 334 * is freed. 335 * 336 * TODO 337 */ 338 int dso__data_get_fd(struct dso *dso, struct machine *machine); 339 void dso__data_put_fd(struct dso *dso); 340 void dso__data_close(struct dso *dso); 341 342 int dso__data_file_size(struct dso *dso, struct machine *machine); 343 off_t dso__data_size(struct dso *dso, struct machine *machine); 344 ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine, 345 u64 offset, u8 *data, ssize_t size); 346 ssize_t dso__data_read_addr(struct dso *dso, struct map *map, 347 struct machine *machine, u64 addr, 348 u8 *data, ssize_t size); 349 bool dso__data_status_seen(struct dso *dso, enum dso_data_status_seen by); 350 ssize_t dso__data_write_cache_offs(struct dso *dso, struct machine *machine, 351 u64 offset, const u8 *data, ssize_t size); 352 ssize_t dso__data_write_cache_addr(struct dso *dso, struct map *map, 353 struct machine *machine, u64 addr, 354 const u8 *data, ssize_t size); 355 356 struct map *dso__new_map(const char *name); 357 struct dso *machine__findnew_kernel(struct machine *machine, const char *name, 358 const char *short_name, int dso_type); 359 360 void dso__reset_find_symbol_cache(struct dso *dso); 361 362 size_t dso__fprintf_buildid(struct dso *dso, FILE *fp); 363 size_t dso__fprintf_symbols_by_name(struct dso *dso, FILE *fp); 364 size_t dso__fprintf(struct dso *dso, FILE *fp); 365 366 static inline bool dso__is_vmlinux(struct dso *dso) 367 { 368 return dso->binary_type == DSO_BINARY_TYPE__VMLINUX || 369 dso->binary_type == DSO_BINARY_TYPE__GUEST_VMLINUX; 370 } 371 372 static inline bool dso__is_kcore(struct dso *dso) 373 { 374 return dso->binary_type == DSO_BINARY_TYPE__KCORE || 375 dso->binary_type == DSO_BINARY_TYPE__GUEST_KCORE; 376 } 377 378 static inline bool dso__is_kallsyms(struct dso *dso) 379 { 380 return dso->kernel && dso->long_name[0] != '/'; 381 } 382 383 void dso__free_a2l(struct dso *dso); 384 385 enum dso_type dso__type(struct dso *dso, struct machine *machine); 386 387 int dso__strerror_load(struct dso *dso, char *buf, size_t buflen); 388 389 void reset_fd_limit(void); 390 391 #endif /* __PERF_DSO */ 392