aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/probe-finder.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/probe-finder.c')
-rw-r--r--tools/perf/util/probe-finder.c86
1 files changed, 0 insertions, 86 deletions
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index e5e589fdef9b..4f6e277c457c 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -89,79 +89,6 @@ error:
89 return -ENOENT; 89 return -ENOENT;
90} 90}
91 91
92#if _ELFUTILS_PREREQ(0, 148)
93/* This method is buggy if elfutils is older than 0.148 */
94static int __linux_kernel_find_elf(Dwfl_Module *mod,
95 void **userdata,
96 const char *module_name,
97 Dwarf_Addr base,
98 char **file_name, Elf **elfp)
99{
100 int fd;
101 const char *path = kernel_get_module_path(module_name);
102
103 pr_debug2("Use file %s for %s\n", path, module_name);
104 if (path) {
105 fd = open(path, O_RDONLY);
106 if (fd >= 0) {
107 *file_name = strdup(path);
108 return fd;
109 }
110 }
111 /* If failed, try to call standard method */
112 return dwfl_linux_kernel_find_elf(mod, userdata, module_name, base,
113 file_name, elfp);
114}
115
116static const Dwfl_Callbacks kernel_callbacks = {
117 .find_debuginfo = dwfl_standard_find_debuginfo,
118 .debuginfo_path = &debuginfo_path,
119
120 .find_elf = __linux_kernel_find_elf,
121 .section_address = dwfl_linux_kernel_module_section_address,
122};
123
124/* Get a Dwarf from live kernel image */
125static int debuginfo__init_online_kernel_dwarf(struct debuginfo *dbg,
126 Dwarf_Addr addr)
127{
128 dbg->dwfl = dwfl_begin(&kernel_callbacks);
129 if (!dbg->dwfl)
130 return -EINVAL;
131
132 /* Load the kernel dwarves: Don't care the result here */
133 dwfl_linux_kernel_report_kernel(dbg->dwfl);
134 dwfl_linux_kernel_report_modules(dbg->dwfl);
135
136 dbg->dbg = dwfl_addrdwarf(dbg->dwfl, addr, &dbg->bias);
137 /* Here, check whether we could get a real dwarf */
138 if (!dbg->dbg) {
139 pr_debug("Failed to find kernel dwarf at %lx\n",
140 (unsigned long)addr);
141 dwfl_end(dbg->dwfl);
142 memset(dbg, 0, sizeof(*dbg));
143 return -ENOENT;
144 }
145
146 return 0;
147}
148#else
149/* With older elfutils, this just support kernel module... */
150static int debuginfo__init_online_kernel_dwarf(struct debuginfo *dbg,
151 Dwarf_Addr addr __maybe_unused)
152{
153 const char *path = kernel_get_module_path("kernel");
154
155 if (!path) {
156 pr_err("Failed to find vmlinux path\n");
157 return -ENOENT;
158 }
159
160 pr_debug2("Use file %s for debuginfo\n", path);
161 return debuginfo__init_offline_dwarf(dbg, path);
162}
163#endif
164
165struct debuginfo *debuginfo__new(const char *path) 92struct debuginfo *debuginfo__new(const char *path)
166{ 93{
167 struct debuginfo *dbg = zalloc(sizeof(*dbg)); 94 struct debuginfo *dbg = zalloc(sizeof(*dbg));
@@ -174,19 +101,6 @@ struct debuginfo *debuginfo__new(const char *path)
174 return dbg; 101 return dbg;
175} 102}
176 103
177struct debuginfo *debuginfo__new_online_kernel(unsigned long addr)
178{
179 struct debuginfo *dbg = zalloc(sizeof(*dbg));
180
181 if (!dbg)
182 return NULL;
183
184 if (debuginfo__init_online_kernel_dwarf(dbg, (Dwarf_Addr)addr) < 0)
185 zfree(&dbg);
186
187 return dbg;
188}
189
190void debuginfo__delete(struct debuginfo *dbg) 104void debuginfo__delete(struct debuginfo *dbg)
191{ 105{
192 if (dbg) { 106 if (dbg) {