Lines Matching refs:dso
42 char dso__symtab_origin(const struct dso *dso) in dso__symtab_origin() argument
65 if (dso == NULL || dso->symtab_type == DSO_BINARY_TYPE__NOT_FOUND) in dso__symtab_origin()
67 return origin[dso->symtab_type]; in dso__symtab_origin()
70 bool dso__is_object_file(const struct dso *dso) in dso__is_object_file() argument
72 switch (dso->binary_type) { in dso__is_object_file()
103 int dso__read_binary_type_filename(const struct dso *dso, in dso__read_binary_type_filename() argument
119 len = __symbol__join_symfs(filename, size, dso->long_name); in dso__read_binary_type_filename()
150 if (dso__build_id_filename(dso, filename, size, false) == NULL) in dso__read_binary_type_filename()
155 if (dso__build_id_filename(dso, filename, size, true) == NULL) in dso__read_binary_type_filename()
161 snprintf(filename + len, size - len, "%s.debug", dso->long_name); in dso__read_binary_type_filename()
166 snprintf(filename + len, size - len, "%s", dso->long_name); in dso__read_binary_type_filename()
175 if (strlen(dso->long_name) < 9 || in dso__read_binary_type_filename()
176 strncmp(dso->long_name, "/usr/lib/", 9)) { in dso__read_binary_type_filename()
181 snprintf(filename + len, size - len, "%s", dso->long_name + 4); in dso__read_binary_type_filename()
189 last_slash = dso->long_name + dso->long_name_len; in dso__read_binary_type_filename()
190 while (last_slash != dso->long_name && *last_slash != '/') in dso__read_binary_type_filename()
194 dir_size = last_slash - dso->long_name + 2; in dso__read_binary_type_filename()
199 len += scnprintf(filename + len, dir_size, "%s", dso->long_name); in dso__read_binary_type_filename()
206 if (!dso->has_build_id) { in dso__read_binary_type_filename()
211 build_id__sprintf(&dso->bid, build_id_hex); in dso__read_binary_type_filename()
220 __symbol__join_symfs(filename, size, dso->long_name); in dso__read_binary_type_filename()
226 root_dir, dso->long_name); in dso__read_binary_type_filename()
231 __symbol__join_symfs(filename, size, dso->long_name); in dso__read_binary_type_filename()
236 snprintf(filename, size, "%s", dso->long_name); in dso__read_binary_type_filename()
310 bool dso__needs_decompress(struct dso *dso) in dso__needs_decompress() argument
312 return dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP || in dso__needs_decompress()
313 dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP; in dso__needs_decompress()
359 static int decompress_kmodule(struct dso *dso, const char *name, in decompress_kmodule() argument
362 if (!dso__needs_decompress(dso)) in decompress_kmodule()
365 if (dso->comp == COMP_ID__NONE) in decompress_kmodule()
368 return filename__decompress(name, pathname, len, dso->comp, in decompress_kmodule()
369 &dso->load_errno); in decompress_kmodule()
372 int dso__decompress_kmodule_fd(struct dso *dso, const char *name) in dso__decompress_kmodule_fd() argument
374 return decompress_kmodule(dso, name, NULL, 0); in dso__decompress_kmodule_fd()
377 int dso__decompress_kmodule_path(struct dso *dso, const char *name, in dso__decompress_kmodule_path() argument
380 int fd = decompress_kmodule(dso, name, pathname, len); in dso__decompress_kmodule_path()
466 void dso__set_module_info(struct dso *dso, struct kmod_path *m, in dso__set_module_info() argument
470 dso->symtab_type = DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE; in dso__set_module_info()
472 dso->symtab_type = DSO_BINARY_TYPE__GUEST_KMODULE; in dso__set_module_info()
476 dso->symtab_type++; in dso__set_module_info()
477 dso->comp = m->comp; in dso__set_module_info()
480 dso__set_short_name(dso, strdup(m->name), true); in dso__set_module_info()
490 static void dso__list_add(struct dso *dso) in dso__list_add() argument
492 list_add_tail(&dso->data.open_entry, &dso__data_open); in dso__list_add()
496 static void dso__list_del(struct dso *dso) in dso__list_del() argument
498 list_del_init(&dso->data.open_entry); in dso__list_del()
527 char *dso__filename_with_chroot(const struct dso *dso, const char *filename) in dso__filename_with_chroot() argument
529 return filename_with_chroot(nsinfo__pid(dso->nsinfo), filename); in dso__filename_with_chroot()
532 static int __open_dso(struct dso *dso, struct machine *machine) in __open_dso() argument
542 mutex_lock(&dso->lock); in __open_dso()
546 if (dso__read_binary_type_filename(dso, dso->binary_type, in __open_dso()
553 if (errno != ENOENT || dso->nsinfo == NULL) in __open_dso()
556 new_name = dso__filename_with_chroot(dso, name); in __open_dso()
564 if (dso__needs_decompress(dso)) { in __open_dso()
568 if (dso__decompress_kmodule_path(dso, name, newpath, len) < 0) { in __open_dso()
569 fd = -dso->load_errno; in __open_dso()
583 mutex_unlock(&dso->lock); in __open_dso()
597 static int open_dso(struct dso *dso, struct machine *machine) in open_dso() argument
602 if (dso->binary_type != DSO_BINARY_TYPE__BUILD_ID_CACHE) { in open_dso()
603 mutex_lock(&dso->lock); in open_dso()
604 nsinfo__mountns_enter(dso->nsinfo, &nsc); in open_dso()
605 mutex_unlock(&dso->lock); in open_dso()
607 fd = __open_dso(dso, machine); in open_dso()
608 if (dso->binary_type != DSO_BINARY_TYPE__BUILD_ID_CACHE) in open_dso()
612 dso__list_add(dso); in open_dso()
623 static void close_data_fd(struct dso *dso) in close_data_fd() argument
625 if (dso->data.fd >= 0) { in close_data_fd()
626 close(dso->data.fd); in close_data_fd()
627 dso->data.fd = -1; in close_data_fd()
628 dso->data.file_size = 0; in close_data_fd()
629 dso__list_del(dso); in close_data_fd()
640 static void close_dso(struct dso *dso) in close_dso() argument
642 close_data_fd(dso); in close_dso()
647 struct dso *dso; in close_first_dso() local
649 dso = list_first_entry(&dso__data_open, struct dso, data.open_entry); in close_first_dso()
650 close_dso(dso); in close_first_dso()
714 void dso__data_close(struct dso *dso) in dso__data_close() argument
717 close_dso(dso); in dso__data_close()
721 static void try_to_open_dso(struct dso *dso, struct machine *machine) in try_to_open_dso() argument
730 if (dso->data.fd >= 0) in try_to_open_dso()
733 if (dso->binary_type != DSO_BINARY_TYPE__NOT_FOUND) { in try_to_open_dso()
734 dso->data.fd = open_dso(dso, machine); in try_to_open_dso()
739 dso->binary_type = binary_type_data[i++]; in try_to_open_dso()
741 dso->data.fd = open_dso(dso, machine); in try_to_open_dso()
742 if (dso->data.fd >= 0) in try_to_open_dso()
745 } while (dso->binary_type != DSO_BINARY_TYPE__NOT_FOUND); in try_to_open_dso()
747 if (dso->data.fd >= 0) in try_to_open_dso()
748 dso->data.status = DSO_DATA_STATUS_OK; in try_to_open_dso()
750 dso->data.status = DSO_DATA_STATUS_ERROR; in try_to_open_dso()
762 int dso__data_get_fd(struct dso *dso, struct machine *machine) in dso__data_get_fd() argument
764 if (dso->data.status == DSO_DATA_STATUS_ERROR) in dso__data_get_fd()
770 try_to_open_dso(dso, machine); in dso__data_get_fd()
772 if (dso->data.fd < 0) in dso__data_get_fd()
775 return dso->data.fd; in dso__data_get_fd()
778 void dso__data_put_fd(struct dso *dso __maybe_unused) in dso__data_put_fd()
783 bool dso__data_status_seen(struct dso *dso, enum dso_data_status_seen by) in dso__data_status_seen() argument
787 if (dso->data.status_seen & flag) in dso__data_status_seen()
790 dso->data.status_seen |= flag; in dso__data_status_seen()
796 static ssize_t bpf_read(struct dso *dso, u64 offset, char *data) in bpf_read() argument
803 node = perf_env__find_bpf_prog_info(dso->bpf_prog.env, dso->bpf_prog.id); in bpf_read()
805 dso->data.status = DSO_DATA_STATUS_ERROR; in bpf_read()
820 static int bpf_size(struct dso *dso) in bpf_size() argument
824 node = perf_env__find_bpf_prog_info(dso->bpf_prog.env, dso->bpf_prog.id); in bpf_size()
826 dso->data.status = DSO_DATA_STATUS_ERROR; in bpf_size()
830 dso->data.file_size = node->info_linear->info.jited_prog_len; in bpf_size()
836 dso_cache__free(struct dso *dso) in dso_cache__free() argument
838 struct rb_root *root = &dso->data.cache; in dso_cache__free()
841 mutex_lock(&dso->lock); in dso_cache__free()
850 mutex_unlock(&dso->lock); in dso_cache__free()
853 static struct dso_cache *__dso_cache__find(struct dso *dso, u64 offset) in __dso_cache__find() argument
855 const struct rb_root *root = &dso->data.cache; in __dso_cache__find()
879 dso_cache__insert(struct dso *dso, struct dso_cache *new) in dso_cache__insert() argument
881 struct rb_root *root = &dso->data.cache; in dso_cache__insert()
887 mutex_lock(&dso->lock); in dso_cache__insert()
908 mutex_unlock(&dso->lock); in dso_cache__insert()
925 static ssize_t file_read(struct dso *dso, struct machine *machine, in file_read() argument
936 try_to_open_dso(dso, machine); in file_read()
938 if (dso->data.fd < 0) { in file_read()
939 dso->data.status = DSO_DATA_STATUS_ERROR; in file_read()
944 ret = pread(dso->data.fd, data, DSO__DATA_CACHE_SIZE, offset); in file_read()
950 static struct dso_cache *dso_cache__populate(struct dso *dso, in dso_cache__populate() argument
964 if (dso->binary_type == DSO_BINARY_TYPE__BPF_PROG_INFO) in dso_cache__populate()
965 *ret = bpf_read(dso, cache_offset, cache->data); in dso_cache__populate()
968 if (dso->binary_type == DSO_BINARY_TYPE__OOL) in dso_cache__populate()
971 *ret = file_read(dso, machine, cache_offset, cache->data); in dso_cache__populate()
981 old = dso_cache__insert(dso, cache); in dso_cache__populate()
991 static struct dso_cache *dso_cache__find(struct dso *dso, in dso_cache__find() argument
996 struct dso_cache *cache = __dso_cache__find(dso, offset); in dso_cache__find()
998 return cache ? cache : dso_cache__populate(dso, machine, offset, ret); in dso_cache__find()
1001 static ssize_t dso_cache_io(struct dso *dso, struct machine *machine, in dso_cache_io() argument
1007 cache = dso_cache__find(dso, machine, offset, &ret); in dso_cache_io()
1019 static ssize_t cached_io(struct dso *dso, struct machine *machine, in cached_io() argument
1028 ret = dso_cache_io(dso, machine, offset, p, size, out); in cached_io()
1048 static int file_size(struct dso *dso, struct machine *machine) in file_size() argument
1060 try_to_open_dso(dso, machine); in file_size()
1062 if (dso->data.fd < 0) { in file_size()
1064 dso->data.status = DSO_DATA_STATUS_ERROR; in file_size()
1068 if (fstat(dso->data.fd, &st) < 0) { in file_size()
1072 dso->data.status = DSO_DATA_STATUS_ERROR; in file_size()
1075 dso->data.file_size = st.st_size; in file_size()
1082 int dso__data_file_size(struct dso *dso, struct machine *machine) in dso__data_file_size() argument
1084 if (dso->data.file_size) in dso__data_file_size()
1087 if (dso->data.status == DSO_DATA_STATUS_ERROR) in dso__data_file_size()
1090 if (dso->binary_type == DSO_BINARY_TYPE__BPF_PROG_INFO) in dso__data_file_size()
1091 return bpf_size(dso); in dso__data_file_size()
1093 return file_size(dso, machine); in dso__data_file_size()
1103 off_t dso__data_size(struct dso *dso, struct machine *machine) in dso__data_size() argument
1105 if (dso__data_file_size(dso, machine)) in dso__data_size()
1109 return dso->data.file_size; in dso__data_size()
1112 static ssize_t data_read_write_offset(struct dso *dso, struct machine *machine, in data_read_write_offset() argument
1116 if (dso__data_file_size(dso, machine)) in data_read_write_offset()
1120 if (offset > dso->data.file_size) in data_read_write_offset()
1126 return cached_io(dso, machine, offset, data, size, out); in data_read_write_offset()
1140 ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine, in dso__data_read_offset() argument
1143 if (dso->data.status == DSO_DATA_STATUS_ERROR) in dso__data_read_offset()
1146 return data_read_write_offset(dso, machine, offset, data, size, true); in dso__data_read_offset()
1159 ssize_t dso__data_read_addr(struct dso *dso, struct map *map, in dso__data_read_addr() argument
1165 return dso__data_read_offset(dso, machine, offset, data, size); in dso__data_read_addr()
1178 ssize_t dso__data_write_cache_offs(struct dso *dso, struct machine *machine, in dso__data_write_cache_offs() argument
1183 if (dso->data.status == DSO_DATA_STATUS_ERROR) in dso__data_write_cache_offs()
1186 return data_read_write_offset(dso, machine, offset, data, size, false); in dso__data_write_cache_offs()
1200 ssize_t dso__data_write_cache_addr(struct dso *dso, struct map *map, in dso__data_write_cache_addr() argument
1206 return dso__data_write_cache_offs(dso, machine, offset, data, size); in dso__data_write_cache_addr()
1212 struct dso *dso = dso__new(name); in dso__new_map() local
1214 if (dso) { in dso__new_map()
1215 map = map__new2(0, dso); in dso__new_map()
1216 dso__put(dso); in dso__new_map()
1222 struct dso *machine__findnew_kernel(struct machine *machine, const char *name, in machine__findnew_kernel()
1228 struct dso *dso = machine__findnew_dso(machine, name); in machine__findnew_kernel() local
1234 if (dso != NULL) { in machine__findnew_kernel()
1235 dso__set_short_name(dso, short_name, false); in machine__findnew_kernel()
1236 dso->kernel = dso_type; in machine__findnew_kernel()
1239 return dso; in machine__findnew_kernel()
1242 static void dso__set_long_name_id(struct dso *dso, const char *name, struct dso_id *id, bool name_a… in dso__set_long_name_id() argument
1244 struct rb_root *root = dso->root; in dso__set_long_name_id()
1249 if (dso->long_name_allocated) in dso__set_long_name_id()
1250 free((char *)dso->long_name); in dso__set_long_name_id()
1253 rb_erase(&dso->rb_node, root); in dso__set_long_name_id()
1258 RB_CLEAR_NODE(&dso->rb_node); in dso__set_long_name_id()
1259 dso->root = NULL; in dso__set_long_name_id()
1262 dso->long_name = name; in dso__set_long_name_id()
1263 dso->long_name_len = strlen(name); in dso__set_long_name_id()
1264 dso->long_name_allocated = name_allocated; in dso__set_long_name_id()
1267 __dsos__findnew_link_by_longname_id(root, dso, NULL, id); in dso__set_long_name_id()
1270 void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated) in dso__set_long_name() argument
1272 dso__set_long_name_id(dso, name, NULL, name_allocated); in dso__set_long_name()
1275 void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated) in dso__set_short_name() argument
1280 if (dso->short_name_allocated) in dso__set_short_name()
1281 free((char *)dso->short_name); in dso__set_short_name()
1283 dso->short_name = name; in dso__set_short_name()
1284 dso->short_name_len = strlen(name); in dso__set_short_name()
1285 dso->short_name_allocated = name_allocated; in dso__set_short_name()
1288 int dso__name_len(const struct dso *dso) in dso__name_len() argument
1290 if (!dso) in dso__name_len()
1293 return dso->long_name_len; in dso__name_len()
1295 return dso->short_name_len; in dso__name_len()
1298 bool dso__loaded(const struct dso *dso) in dso__loaded() argument
1300 return dso->loaded; in dso__loaded()
1303 bool dso__sorted_by_name(const struct dso *dso) in dso__sorted_by_name() argument
1305 return dso->sorted_by_name; in dso__sorted_by_name()
1308 void dso__set_sorted_by_name(struct dso *dso) in dso__set_sorted_by_name() argument
1310 dso->sorted_by_name = true; in dso__set_sorted_by_name()
1313 struct dso *dso__new_id(const char *name, struct dso_id *id) in dso__new_id()
1315 struct dso *dso = calloc(1, sizeof(*dso) + strlen(name) + 1); in dso__new_id() local
1317 if (dso != NULL) { in dso__new_id()
1318 strcpy(dso->name, name); in dso__new_id()
1320 dso->id = *id; in dso__new_id()
1321 dso__set_long_name_id(dso, dso->name, id, false); in dso__new_id()
1322 dso__set_short_name(dso, dso->name, false); in dso__new_id()
1323 dso->symbols = RB_ROOT_CACHED; in dso__new_id()
1324 dso->symbol_names = NULL; in dso__new_id()
1325 dso->symbol_names_len = 0; in dso__new_id()
1326 dso->data.cache = RB_ROOT; in dso__new_id()
1327 dso->inlined_nodes = RB_ROOT_CACHED; in dso__new_id()
1328 dso->srclines = RB_ROOT_CACHED; in dso__new_id()
1329 dso->data.fd = -1; in dso__new_id()
1330 dso->data.status = DSO_DATA_STATUS_UNKNOWN; in dso__new_id()
1331 dso->symtab_type = DSO_BINARY_TYPE__NOT_FOUND; in dso__new_id()
1332 dso->binary_type = DSO_BINARY_TYPE__NOT_FOUND; in dso__new_id()
1333 dso->is_64_bit = (sizeof(void *) == 8); in dso__new_id()
1334 dso->loaded = 0; in dso__new_id()
1335 dso->rel = 0; in dso__new_id()
1336 dso->sorted_by_name = 0; in dso__new_id()
1337 dso->has_build_id = 0; in dso__new_id()
1338 dso->has_srcline = 1; in dso__new_id()
1339 dso->a2l_fails = 1; in dso__new_id()
1340 dso->kernel = DSO_SPACE__USER; in dso__new_id()
1341 dso->needs_swap = DSO_SWAP__UNSET; in dso__new_id()
1342 dso->comp = COMP_ID__NONE; in dso__new_id()
1343 RB_CLEAR_NODE(&dso->rb_node); in dso__new_id()
1344 dso->root = NULL; in dso__new_id()
1345 INIT_LIST_HEAD(&dso->node); in dso__new_id()
1346 INIT_LIST_HEAD(&dso->data.open_entry); in dso__new_id()
1347 mutex_init(&dso->lock); in dso__new_id()
1348 refcount_set(&dso->refcnt, 1); in dso__new_id()
1351 return dso; in dso__new_id()
1354 struct dso *dso__new(const char *name) in dso__new()
1359 void dso__delete(struct dso *dso) in dso__delete() argument
1361 if (!RB_EMPTY_NODE(&dso->rb_node)) in dso__delete()
1363 dso->long_name); in dso__delete()
1366 inlines__tree_delete(&dso->inlined_nodes); in dso__delete()
1367 srcline__tree_delete(&dso->srclines); in dso__delete()
1368 symbols__delete(&dso->symbols); in dso__delete()
1369 dso->symbol_names_len = 0; in dso__delete()
1370 zfree(&dso->symbol_names); in dso__delete()
1371 if (dso->short_name_allocated) { in dso__delete()
1372 zfree((char **)&dso->short_name); in dso__delete()
1373 dso->short_name_allocated = false; in dso__delete()
1376 if (dso->long_name_allocated) { in dso__delete()
1377 zfree((char **)&dso->long_name); in dso__delete()
1378 dso->long_name_allocated = false; in dso__delete()
1381 dso__data_close(dso); in dso__delete()
1382 auxtrace_cache__free(dso->auxtrace_cache); in dso__delete()
1383 dso_cache__free(dso); in dso__delete()
1384 dso__free_a2l(dso); in dso__delete()
1385 zfree(&dso->symsrc_filename); in dso__delete()
1386 nsinfo__zput(dso->nsinfo); in dso__delete()
1387 mutex_destroy(&dso->lock); in dso__delete()
1388 free(dso); in dso__delete()
1391 struct dso *dso__get(struct dso *dso) in dso__get() argument
1393 if (dso) in dso__get()
1394 refcount_inc(&dso->refcnt); in dso__get()
1395 return dso; in dso__get()
1398 void dso__put(struct dso *dso) in dso__put() argument
1400 if (dso && refcount_dec_and_test(&dso->refcnt)) in dso__put()
1401 dso__delete(dso); in dso__put()
1404 void dso__set_build_id(struct dso *dso, struct build_id *bid) in dso__set_build_id() argument
1406 dso->bid = *bid; in dso__set_build_id()
1407 dso->has_build_id = 1; in dso__set_build_id()
1410 bool dso__build_id_equal(const struct dso *dso, struct build_id *bid) in dso__build_id_equal() argument
1412 if (dso->bid.size > bid->size && dso->bid.size == BUILD_ID_SIZE) { in dso__build_id_equal()
1417 return !memcmp(dso->bid.data, bid->data, bid->size) && in dso__build_id_equal()
1418 !memchr_inv(&dso->bid.data[bid->size], 0, in dso__build_id_equal()
1419 dso->bid.size - bid->size); in dso__build_id_equal()
1422 return dso->bid.size == bid->size && in dso__build_id_equal()
1423 memcmp(dso->bid.data, bid->data, dso->bid.size) == 0; in dso__build_id_equal()
1426 void dso__read_running_kernel_build_id(struct dso *dso, struct machine *machine) in dso__read_running_kernel_build_id() argument
1433 if (sysfs__read_build_id(path, &dso->bid) == 0) in dso__read_running_kernel_build_id()
1434 dso->has_build_id = true; in dso__read_running_kernel_build_id()
1437 int dso__kernel_module_get_build_id(struct dso *dso, in dso__kernel_module_get_build_id() argument
1445 const char *name = dso->short_name + 1; in dso__kernel_module_get_build_id()
1451 if (sysfs__read_build_id(filename, &dso->bid) == 0) in dso__kernel_module_get_build_id()
1452 dso->has_build_id = true; in dso__kernel_module_get_build_id()
1457 static size_t dso__fprintf_buildid(struct dso *dso, FILE *fp) in dso__fprintf_buildid() argument
1461 build_id__sprintf(&dso->bid, sbuild_id); in dso__fprintf_buildid()
1465 size_t dso__fprintf(struct dso *dso, FILE *fp) in dso__fprintf() argument
1468 size_t ret = fprintf(fp, "dso: %s (", dso->short_name); in dso__fprintf()
1470 if (dso->short_name != dso->long_name) in dso__fprintf()
1471 ret += fprintf(fp, "%s, ", dso->long_name); in dso__fprintf()
1472 ret += fprintf(fp, "%sloaded, ", dso__loaded(dso) ? "" : "NOT "); in dso__fprintf()
1473 ret += dso__fprintf_buildid(dso, fp); in dso__fprintf()
1475 for (nd = rb_first_cached(&dso->symbols); nd; nd = rb_next(nd)) { in dso__fprintf()
1483 enum dso_type dso__type(struct dso *dso, struct machine *machine) in dso__type() argument
1488 fd = dso__data_get_fd(dso, machine); in dso__type()
1491 dso__data_put_fd(dso); in dso__type()
1497 int dso__strerror_load(struct dso *dso, char *buf, size_t buflen) in dso__strerror_load() argument
1499 int idx, errnum = dso->load_errno; in dso__strerror_load()