Lines Matching refs:dso

39 char dso__symtab_origin(const struct dso *dso)  in dso__symtab_origin()  argument
61 if (dso == NULL || dso->symtab_type == DSO_BINARY_TYPE__NOT_FOUND) in dso__symtab_origin()
63 return origin[dso->symtab_type]; in dso__symtab_origin()
66 int dso__read_binary_type_filename(const struct dso *dso, in dso__read_binary_type_filename() argument
82 len = __symbol__join_symfs(filename, size, dso->long_name); in dso__read_binary_type_filename()
113 if (dso__build_id_filename(dso, filename, size, false) == NULL) in dso__read_binary_type_filename()
118 if (dso__build_id_filename(dso, filename, size, true) == NULL) in dso__read_binary_type_filename()
124 snprintf(filename + len, size - len, "%s.debug", dso->long_name); in dso__read_binary_type_filename()
129 snprintf(filename + len, size - len, "%s", dso->long_name); in dso__read_binary_type_filename()
137 last_slash = dso->long_name + dso->long_name_len; in dso__read_binary_type_filename()
138 while (last_slash != dso->long_name && *last_slash != '/') in dso__read_binary_type_filename()
142 dir_size = last_slash - dso->long_name + 2; in dso__read_binary_type_filename()
147 len += scnprintf(filename + len, dir_size, "%s", dso->long_name); in dso__read_binary_type_filename()
154 if (!dso->has_build_id) { in dso__read_binary_type_filename()
159 build_id__sprintf(dso->build_id, in dso__read_binary_type_filename()
160 sizeof(dso->build_id), in dso__read_binary_type_filename()
170 __symbol__join_symfs(filename, size, dso->long_name); in dso__read_binary_type_filename()
176 root_dir, dso->long_name); in dso__read_binary_type_filename()
181 __symbol__join_symfs(filename, size, dso->long_name); in dso__read_binary_type_filename()
186 snprintf(filename, size, "%s", dso->long_name); in dso__read_binary_type_filename()
258 bool dso__needs_decompress(struct dso *dso) in dso__needs_decompress() argument
260 return dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP || in dso__needs_decompress()
261 dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP; in dso__needs_decompress()
264 static int decompress_kmodule(struct dso *dso, const char *name, in decompress_kmodule() argument
270 if (!dso__needs_decompress(dso)) in decompress_kmodule()
273 if (dso->comp == COMP_ID__NONE) in decompress_kmodule()
289 if (!compressions[dso->comp].is_compressed(name)) in decompress_kmodule()
294 dso->load_errno = errno; in decompress_kmodule()
298 if (compressions[dso->comp].decompress(name, fd)) { in decompress_kmodule()
299 dso->load_errno = DSO_LOAD_ERRNO__DECOMPRESSION_FAILURE; in decompress_kmodule()
313 int dso__decompress_kmodule_fd(struct dso *dso, const char *name) in dso__decompress_kmodule_fd() argument
315 return decompress_kmodule(dso, name, NULL, 0); in dso__decompress_kmodule_fd()
318 int dso__decompress_kmodule_path(struct dso *dso, const char *name, in dso__decompress_kmodule_path() argument
321 int fd = decompress_kmodule(dso, name, pathname, len); in dso__decompress_kmodule_path()
407 void dso__set_module_info(struct dso *dso, struct kmod_path *m, in dso__set_module_info() argument
411 dso->symtab_type = DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE; in dso__set_module_info()
413 dso->symtab_type = DSO_BINARY_TYPE__GUEST_KMODULE; in dso__set_module_info()
417 dso->symtab_type++; in dso__set_module_info()
418 dso->comp = m->comp; in dso__set_module_info()
421 dso__set_short_name(dso, strdup(m->name), true); in dso__set_module_info()
431 static void dso__list_add(struct dso *dso) in dso__list_add() argument
433 list_add_tail(&dso->data.open_entry, &dso__data_open); in dso__list_add()
437 static void dso__list_del(struct dso *dso) in dso__list_del() argument
439 list_del_init(&dso->data.open_entry); in dso__list_del()
468 static int __open_dso(struct dso *dso, struct machine *machine) in __open_dso() argument
481 if (dso__read_binary_type_filename(dso, dso->binary_type, in __open_dso()
488 if (dso__needs_decompress(dso)) { in __open_dso()
492 if (dso__decompress_kmodule_path(dso, name, newpath, len) < 0) { in __open_dso()
493 fd = -dso->load_errno; in __open_dso()
520 static int open_dso(struct dso *dso, struct machine *machine) in open_dso() argument
525 if (dso->binary_type != DSO_BINARY_TYPE__BUILD_ID_CACHE) in open_dso()
526 nsinfo__mountns_enter(dso->nsinfo, &nsc); in open_dso()
527 fd = __open_dso(dso, machine); in open_dso()
528 if (dso->binary_type != DSO_BINARY_TYPE__BUILD_ID_CACHE) in open_dso()
532 dso__list_add(dso); in open_dso()
543 static void close_data_fd(struct dso *dso) in close_data_fd() argument
545 if (dso->data.fd >= 0) { in close_data_fd()
546 close(dso->data.fd); in close_data_fd()
547 dso->data.fd = -1; in close_data_fd()
548 dso->data.file_size = 0; in close_data_fd()
549 dso__list_del(dso); in close_data_fd()
560 static void close_dso(struct dso *dso) in close_dso() argument
562 close_data_fd(dso); in close_dso()
567 struct dso *dso; in close_first_dso() local
569 dso = list_first_entry(&dso__data_open, struct dso, data.open_entry); in close_first_dso()
570 close_dso(dso); in close_first_dso()
634 void dso__data_close(struct dso *dso) in dso__data_close() argument
637 close_dso(dso); in dso__data_close()
641 static void try_to_open_dso(struct dso *dso, struct machine *machine) in try_to_open_dso() argument
650 if (dso->data.fd >= 0) in try_to_open_dso()
653 if (dso->binary_type != DSO_BINARY_TYPE__NOT_FOUND) { in try_to_open_dso()
654 dso->data.fd = open_dso(dso, machine); in try_to_open_dso()
659 dso->binary_type = binary_type_data[i++]; in try_to_open_dso()
661 dso->data.fd = open_dso(dso, machine); in try_to_open_dso()
662 if (dso->data.fd >= 0) in try_to_open_dso()
665 } while (dso->binary_type != DSO_BINARY_TYPE__NOT_FOUND); in try_to_open_dso()
667 if (dso->data.fd >= 0) in try_to_open_dso()
668 dso->data.status = DSO_DATA_STATUS_OK; in try_to_open_dso()
670 dso->data.status = DSO_DATA_STATUS_ERROR; in try_to_open_dso()
682 int dso__data_get_fd(struct dso *dso, struct machine *machine) in dso__data_get_fd() argument
684 if (dso->data.status == DSO_DATA_STATUS_ERROR) in dso__data_get_fd()
690 try_to_open_dso(dso, machine); in dso__data_get_fd()
692 if (dso->data.fd < 0) in dso__data_get_fd()
695 return dso->data.fd; in dso__data_get_fd()
698 void dso__data_put_fd(struct dso *dso __maybe_unused) in dso__data_put_fd()
703 bool dso__data_status_seen(struct dso *dso, enum dso_data_status_seen by) in dso__data_status_seen() argument
707 if (dso->data.status_seen & flag) in dso__data_status_seen()
710 dso->data.status_seen |= flag; in dso__data_status_seen()
715 static ssize_t bpf_read(struct dso *dso, u64 offset, char *data) in bpf_read() argument
722 node = perf_env__find_bpf_prog_info(dso->bpf_prog.env, dso->bpf_prog.id); in bpf_read()
724 dso->data.status = DSO_DATA_STATUS_ERROR; in bpf_read()
739 static int bpf_size(struct dso *dso) in bpf_size() argument
743 node = perf_env__find_bpf_prog_info(dso->bpf_prog.env, dso->bpf_prog.id); in bpf_size()
745 dso->data.status = DSO_DATA_STATUS_ERROR; in bpf_size()
749 dso->data.file_size = node->info_linear->info.jited_prog_len; in bpf_size()
754 dso_cache__free(struct dso *dso) in dso_cache__free() argument
756 struct rb_root *root = &dso->data.cache; in dso_cache__free()
759 pthread_mutex_lock(&dso->lock); in dso_cache__free()
768 pthread_mutex_unlock(&dso->lock); in dso_cache__free()
771 static struct dso_cache *dso_cache__find(struct dso *dso, u64 offset) in dso_cache__find() argument
773 const struct rb_root *root = &dso->data.cache; in dso_cache__find()
797 dso_cache__insert(struct dso *dso, struct dso_cache *new) in dso_cache__insert() argument
799 struct rb_root *root = &dso->data.cache; in dso_cache__insert()
805 pthread_mutex_lock(&dso->lock); in dso_cache__insert()
826 pthread_mutex_unlock(&dso->lock); in dso_cache__insert()
841 static ssize_t file_read(struct dso *dso, struct machine *machine, in file_read() argument
852 try_to_open_dso(dso, machine); in file_read()
854 if (dso->data.fd < 0) { in file_read()
855 dso->data.status = DSO_DATA_STATUS_ERROR; in file_read()
860 ret = pread(dso->data.fd, data, DSO__DATA_CACHE_SIZE, offset); in file_read()
867 dso_cache__read(struct dso *dso, struct machine *machine, in dso_cache__read() argument
879 if (dso->binary_type == DSO_BINARY_TYPE__BPF_PROG_INFO) in dso_cache__read()
880 ret = bpf_read(dso, cache_offset, cache->data); in dso_cache__read()
882 ret = file_read(dso, machine, cache_offset, cache->data); in dso_cache__read()
888 old = dso_cache__insert(dso, cache); in dso_cache__read()
904 static ssize_t dso_cache_read(struct dso *dso, struct machine *machine, in dso_cache_read() argument
909 cache = dso_cache__find(dso, offset); in dso_cache_read()
913 return dso_cache__read(dso, machine, offset, data, size); in dso_cache_read()
921 static ssize_t cached_read(struct dso *dso, struct machine *machine, in cached_read() argument
930 ret = dso_cache_read(dso, machine, offset, p, size); in cached_read()
950 static int file_size(struct dso *dso, struct machine *machine) in file_size() argument
962 try_to_open_dso(dso, machine); in file_size()
964 if (dso->data.fd < 0) { in file_size()
966 dso->data.status = DSO_DATA_STATUS_ERROR; in file_size()
970 if (fstat(dso->data.fd, &st) < 0) { in file_size()
974 dso->data.status = DSO_DATA_STATUS_ERROR; in file_size()
977 dso->data.file_size = st.st_size; in file_size()
984 int dso__data_file_size(struct dso *dso, struct machine *machine) in dso__data_file_size() argument
986 if (dso->data.file_size) in dso__data_file_size()
989 if (dso->data.status == DSO_DATA_STATUS_ERROR) in dso__data_file_size()
992 if (dso->binary_type == DSO_BINARY_TYPE__BPF_PROG_INFO) in dso__data_file_size()
993 return bpf_size(dso); in dso__data_file_size()
995 return file_size(dso, machine); in dso__data_file_size()
1005 off_t dso__data_size(struct dso *dso, struct machine *machine) in dso__data_size() argument
1007 if (dso__data_file_size(dso, machine)) in dso__data_size()
1011 return dso->data.file_size; in dso__data_size()
1014 static ssize_t data_read_offset(struct dso *dso, struct machine *machine, in data_read_offset() argument
1017 if (dso__data_file_size(dso, machine)) in data_read_offset()
1021 if (offset > dso->data.file_size) in data_read_offset()
1027 return cached_read(dso, machine, offset, data, size); in data_read_offset()
1041 ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine, in dso__data_read_offset() argument
1044 if (dso->data.status == DSO_DATA_STATUS_ERROR) in dso__data_read_offset()
1047 return data_read_offset(dso, machine, offset, data, size); in dso__data_read_offset()
1060 ssize_t dso__data_read_addr(struct dso *dso, struct map *map, in dso__data_read_addr() argument
1065 return dso__data_read_offset(dso, machine, offset, data, size); in dso__data_read_addr()
1071 struct dso *dso = dso__new(name); in dso__new_map() local
1073 if (dso) in dso__new_map()
1074 map = map__new2(0, dso); in dso__new_map()
1079 struct dso *machine__findnew_kernel(struct machine *machine, const char *name, in machine__findnew_kernel()
1085 struct dso *dso = machine__findnew_dso(machine, name); in machine__findnew_kernel() local
1091 if (dso != NULL) { in machine__findnew_kernel()
1092 dso__set_short_name(dso, short_name, false); in machine__findnew_kernel()
1093 dso->kernel = dso_type; in machine__findnew_kernel()
1096 return dso; in machine__findnew_kernel()
1099 void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated) in dso__set_long_name() argument
1101 struct rb_root *root = dso->root; in dso__set_long_name()
1106 if (dso->long_name_allocated) in dso__set_long_name()
1107 free((char *)dso->long_name); in dso__set_long_name()
1110 rb_erase(&dso->rb_node, root); in dso__set_long_name()
1115 RB_CLEAR_NODE(&dso->rb_node); in dso__set_long_name()
1116 dso->root = NULL; in dso__set_long_name()
1119 dso->long_name = name; in dso__set_long_name()
1120 dso->long_name_len = strlen(name); in dso__set_long_name()
1121 dso->long_name_allocated = name_allocated; in dso__set_long_name()
1124 __dsos__findnew_link_by_longname(root, dso, NULL); in dso__set_long_name()
1127 void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated) in dso__set_short_name() argument
1132 if (dso->short_name_allocated) in dso__set_short_name()
1133 free((char *)dso->short_name); in dso__set_short_name()
1135 dso->short_name = name; in dso__set_short_name()
1136 dso->short_name_len = strlen(name); in dso__set_short_name()
1137 dso->short_name_allocated = name_allocated; in dso__set_short_name()
1140 int dso__name_len(const struct dso *dso) in dso__name_len() argument
1142 if (!dso) in dso__name_len()
1145 return dso->long_name_len; in dso__name_len()
1147 return dso->short_name_len; in dso__name_len()
1150 bool dso__loaded(const struct dso *dso) in dso__loaded() argument
1152 return dso->loaded; in dso__loaded()
1155 bool dso__sorted_by_name(const struct dso *dso) in dso__sorted_by_name() argument
1157 return dso->sorted_by_name; in dso__sorted_by_name()
1160 void dso__set_sorted_by_name(struct dso *dso) in dso__set_sorted_by_name() argument
1162 dso->sorted_by_name = true; in dso__set_sorted_by_name()
1165 struct dso *dso__new(const char *name) in dso__new()
1167 struct dso *dso = calloc(1, sizeof(*dso) + strlen(name) + 1); in dso__new() local
1169 if (dso != NULL) { in dso__new()
1170 strcpy(dso->name, name); in dso__new()
1171 dso__set_long_name(dso, dso->name, false); in dso__new()
1172 dso__set_short_name(dso, dso->name, false); in dso__new()
1173 dso->symbols = dso->symbol_names = RB_ROOT_CACHED; in dso__new()
1174 dso->data.cache = RB_ROOT; in dso__new()
1175 dso->inlined_nodes = RB_ROOT_CACHED; in dso__new()
1176 dso->srclines = RB_ROOT_CACHED; in dso__new()
1177 dso->data.fd = -1; in dso__new()
1178 dso->data.status = DSO_DATA_STATUS_UNKNOWN; in dso__new()
1179 dso->symtab_type = DSO_BINARY_TYPE__NOT_FOUND; in dso__new()
1180 dso->binary_type = DSO_BINARY_TYPE__NOT_FOUND; in dso__new()
1181 dso->is_64_bit = (sizeof(void *) == 8); in dso__new()
1182 dso->loaded = 0; in dso__new()
1183 dso->rel = 0; in dso__new()
1184 dso->sorted_by_name = 0; in dso__new()
1185 dso->has_build_id = 0; in dso__new()
1186 dso->has_srcline = 1; in dso__new()
1187 dso->a2l_fails = 1; in dso__new()
1188 dso->kernel = DSO_TYPE_USER; in dso__new()
1189 dso->needs_swap = DSO_SWAP__UNSET; in dso__new()
1190 dso->comp = COMP_ID__NONE; in dso__new()
1191 RB_CLEAR_NODE(&dso->rb_node); in dso__new()
1192 dso->root = NULL; in dso__new()
1193 INIT_LIST_HEAD(&dso->node); in dso__new()
1194 INIT_LIST_HEAD(&dso->data.open_entry); in dso__new()
1195 pthread_mutex_init(&dso->lock, NULL); in dso__new()
1196 refcount_set(&dso->refcnt, 1); in dso__new()
1199 return dso; in dso__new()
1202 void dso__delete(struct dso *dso) in dso__delete() argument
1204 if (!RB_EMPTY_NODE(&dso->rb_node)) in dso__delete()
1206 dso->long_name); in dso__delete()
1209 inlines__tree_delete(&dso->inlined_nodes); in dso__delete()
1210 srcline__tree_delete(&dso->srclines); in dso__delete()
1211 symbols__delete(&dso->symbols); in dso__delete()
1213 if (dso->short_name_allocated) { in dso__delete()
1214 zfree((char **)&dso->short_name); in dso__delete()
1215 dso->short_name_allocated = false; in dso__delete()
1218 if (dso->long_name_allocated) { in dso__delete()
1219 zfree((char **)&dso->long_name); in dso__delete()
1220 dso->long_name_allocated = false; in dso__delete()
1223 dso__data_close(dso); in dso__delete()
1224 auxtrace_cache__free(dso->auxtrace_cache); in dso__delete()
1225 dso_cache__free(dso); in dso__delete()
1226 dso__free_a2l(dso); in dso__delete()
1227 zfree(&dso->symsrc_filename); in dso__delete()
1228 nsinfo__zput(dso->nsinfo); in dso__delete()
1229 pthread_mutex_destroy(&dso->lock); in dso__delete()
1230 free(dso); in dso__delete()
1233 struct dso *dso__get(struct dso *dso) in dso__get() argument
1235 if (dso) in dso__get()
1236 refcount_inc(&dso->refcnt); in dso__get()
1237 return dso; in dso__get()
1240 void dso__put(struct dso *dso) in dso__put() argument
1242 if (dso && refcount_dec_and_test(&dso->refcnt)) in dso__put()
1243 dso__delete(dso); in dso__put()
1246 void dso__set_build_id(struct dso *dso, void *build_id) in dso__set_build_id() argument
1248 memcpy(dso->build_id, build_id, sizeof(dso->build_id)); in dso__set_build_id()
1249 dso->has_build_id = 1; in dso__set_build_id()
1252 bool dso__build_id_equal(const struct dso *dso, u8 *build_id) in dso__build_id_equal() argument
1254 return memcmp(dso->build_id, build_id, sizeof(dso->build_id)) == 0; in dso__build_id_equal()
1257 void dso__read_running_kernel_build_id(struct dso *dso, struct machine *machine) in dso__read_running_kernel_build_id() argument
1264 if (sysfs__read_build_id(path, dso->build_id, in dso__read_running_kernel_build_id()
1265 sizeof(dso->build_id)) == 0) in dso__read_running_kernel_build_id()
1266 dso->has_build_id = true; in dso__read_running_kernel_build_id()
1269 int dso__kernel_module_get_build_id(struct dso *dso, in dso__kernel_module_get_build_id() argument
1277 const char *name = dso->short_name + 1; in dso__kernel_module_get_build_id()
1283 if (sysfs__read_build_id(filename, dso->build_id, in dso__kernel_module_get_build_id()
1284 sizeof(dso->build_id)) == 0) in dso__kernel_module_get_build_id()
1285 dso->has_build_id = true; in dso__kernel_module_get_build_id()
1290 size_t dso__fprintf_buildid(struct dso *dso, FILE *fp) in dso__fprintf_buildid() argument
1294 build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id); in dso__fprintf_buildid()
1298 size_t dso__fprintf(struct dso *dso, FILE *fp) in dso__fprintf() argument
1301 size_t ret = fprintf(fp, "dso: %s (", dso->short_name); in dso__fprintf()
1303 if (dso->short_name != dso->long_name) in dso__fprintf()
1304 ret += fprintf(fp, "%s, ", dso->long_name); in dso__fprintf()
1305 ret += fprintf(fp, "%sloaded, ", dso__loaded(dso) ? "" : "NOT "); in dso__fprintf()
1306 ret += dso__fprintf_buildid(dso, fp); in dso__fprintf()
1308 for (nd = rb_first_cached(&dso->symbols); nd; nd = rb_next(nd)) { in dso__fprintf()
1316 enum dso_type dso__type(struct dso *dso, struct machine *machine) in dso__type() argument
1321 fd = dso__data_get_fd(dso, machine); in dso__type()
1324 dso__data_put_fd(dso); in dso__type()
1330 int dso__strerror_load(struct dso *dso, char *buf, size_t buflen) in dso__strerror_load() argument
1332 int idx, errnum = dso->load_errno; in dso__strerror_load()