|
@@ -200,11 +200,12 @@ static void put_target_map(struct map *map, bool user)
|
|
|
}
|
|
|
|
|
|
|
|
|
-static struct dso *kernel_get_module_dso(const char *module)
|
|
|
+static int kernel_get_module_dso(const char *module, struct dso **pdso)
|
|
|
{
|
|
|
struct dso *dso;
|
|
|
struct map *map;
|
|
|
const char *vmlinux_name;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
if (module) {
|
|
|
list_for_each_entry(dso, &host_machine->kernel_dsos.head,
|
|
@@ -214,30 +215,21 @@ static struct dso *kernel_get_module_dso(const char *module)
|
|
|
goto found;
|
|
|
}
|
|
|
pr_debug("Failed to find module %s.\n", module);
|
|
|
- return NULL;
|
|
|
+ return -ENOENT;
|
|
|
}
|
|
|
|
|
|
map = host_machine->vmlinux_maps[MAP__FUNCTION];
|
|
|
dso = map->dso;
|
|
|
|
|
|
vmlinux_name = symbol_conf.vmlinux_name;
|
|
|
- if (vmlinux_name) {
|
|
|
- if (dso__load_vmlinux(dso, map, vmlinux_name, false, NULL) <= 0)
|
|
|
- return NULL;
|
|
|
- } else {
|
|
|
- if (dso__load_vmlinux_path(dso, map, NULL) <= 0) {
|
|
|
- pr_debug("Failed to load kernel map.\n");
|
|
|
- return NULL;
|
|
|
- }
|
|
|
- }
|
|
|
+ dso->load_errno = 0;
|
|
|
+ if (vmlinux_name)
|
|
|
+ ret = dso__load_vmlinux(dso, map, vmlinux_name, false, NULL);
|
|
|
+ else
|
|
|
+ ret = dso__load_vmlinux_path(dso, map, NULL);
|
|
|
found:
|
|
|
- return dso;
|
|
|
-}
|
|
|
-
|
|
|
-const char *kernel_get_module_path(const char *module)
|
|
|
-{
|
|
|
- struct dso *dso = kernel_get_module_dso(module);
|
|
|
- return (dso) ? dso->long_name : NULL;
|
|
|
+ *pdso = dso;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static int convert_exec_to_group(const char *exec, char **result)
|
|
@@ -389,16 +381,25 @@ static int get_alternative_line_range(struct debuginfo *dinfo,
|
|
|
static struct debuginfo *open_debuginfo(const char *module, bool silent)
|
|
|
{
|
|
|
const char *path = module;
|
|
|
- struct debuginfo *ret;
|
|
|
+ char reason[STRERR_BUFSIZE];
|
|
|
+ struct debuginfo *ret = NULL;
|
|
|
+ struct dso *dso = NULL;
|
|
|
+ int err;
|
|
|
|
|
|
if (!module || !strchr(module, '/')) {
|
|
|
- path = kernel_get_module_path(module);
|
|
|
- if (!path) {
|
|
|
+ err = kernel_get_module_dso(module, &dso);
|
|
|
+ if (err < 0) {
|
|
|
+ if (!dso || dso->load_errno == 0) {
|
|
|
+ if (!strerror_r(-err, reason, STRERR_BUFSIZE))
|
|
|
+ strcpy(reason, "(unknown)");
|
|
|
+ } else
|
|
|
+ dso__strerror_load(dso, reason, STRERR_BUFSIZE);
|
|
|
if (!silent)
|
|
|
- pr_err("Failed to find path of %s module.\n",
|
|
|
- module ?: "kernel");
|
|
|
+ pr_err("Failed to find the path for %s: %s\n",
|
|
|
+ module ?: "kernel", reason);
|
|
|
return NULL;
|
|
|
}
|
|
|
+ path = dso->long_name;
|
|
|
}
|
|
|
ret = debuginfo__new(path);
|
|
|
if (!ret && !silent) {
|