|
@@ -496,18 +496,6 @@ struct process_args {
|
|
|
u64 start;
|
|
|
};
|
|
|
|
|
|
-static int symbol__in_kernel(void *arg, const char *name,
|
|
|
- char type __maybe_unused, u64 start)
|
|
|
-{
|
|
|
- struct process_args *args = arg;
|
|
|
-
|
|
|
- if (strchr(name, '['))
|
|
|
- return 0;
|
|
|
-
|
|
|
- args->start = start;
|
|
|
- return 1;
|
|
|
-}
|
|
|
-
|
|
|
static void machine__get_kallsyms_filename(struct machine *machine, char *buf,
|
|
|
size_t bufsz)
|
|
|
{
|
|
@@ -517,27 +505,41 @@ static void machine__get_kallsyms_filename(struct machine *machine, char *buf,
|
|
|
scnprintf(buf, bufsz, "%s/proc/kallsyms", machine->root_dir);
|
|
|
}
|
|
|
|
|
|
-/* Figure out the start address of kernel map from /proc/kallsyms */
|
|
|
-static u64 machine__get_kernel_start_addr(struct machine *machine)
|
|
|
+const char *ref_reloc_sym_names[] = {"_text", "_stext", NULL};
|
|
|
+
|
|
|
+/* Figure out the start address of kernel map from /proc/kallsyms.
|
|
|
+ * Returns the name of the start symbol in *symbol_name. Pass in NULL as
|
|
|
+ * symbol_name if it's not that important.
|
|
|
+ */
|
|
|
+static u64 machine__get_kernel_start_addr(struct machine *machine,
|
|
|
+ const char **symbol_name)
|
|
|
{
|
|
|
char filename[PATH_MAX];
|
|
|
- struct process_args args;
|
|
|
+ int i;
|
|
|
+ const char *name;
|
|
|
+ u64 addr = 0;
|
|
|
|
|
|
machine__get_kallsyms_filename(machine, filename, PATH_MAX);
|
|
|
|
|
|
if (symbol__restricted_filename(filename, "/proc/kallsyms"))
|
|
|
return 0;
|
|
|
|
|
|
- if (kallsyms__parse(filename, &args, symbol__in_kernel) <= 0)
|
|
|
- return 0;
|
|
|
+ for (i = 0; (name = ref_reloc_sym_names[i]) != NULL; i++) {
|
|
|
+ addr = kallsyms__get_function_start(filename, name);
|
|
|
+ if (addr)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (symbol_name)
|
|
|
+ *symbol_name = name;
|
|
|
|
|
|
- return args.start;
|
|
|
+ return addr;
|
|
|
}
|
|
|
|
|
|
int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel)
|
|
|
{
|
|
|
enum map_type type;
|
|
|
- u64 start = machine__get_kernel_start_addr(machine);
|
|
|
+ u64 start = machine__get_kernel_start_addr(machine, NULL);
|
|
|
|
|
|
for (type = 0; type < MAP__NR_TYPES; ++type) {
|
|
|
struct kmap *kmap;
|
|
@@ -852,23 +854,11 @@ static int machine__create_modules(struct machine *machine)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-const char *ref_reloc_sym_names[] = {"_text", "_stext", NULL};
|
|
|
-
|
|
|
int machine__create_kernel_maps(struct machine *machine)
|
|
|
{
|
|
|
struct dso *kernel = machine__get_kernel(machine);
|
|
|
- char filename[PATH_MAX];
|
|
|
const char *name;
|
|
|
- u64 addr = 0;
|
|
|
- int i;
|
|
|
-
|
|
|
- machine__get_kallsyms_filename(machine, filename, PATH_MAX);
|
|
|
-
|
|
|
- for (i = 0; (name = ref_reloc_sym_names[i]) != NULL; i++) {
|
|
|
- addr = kallsyms__get_function_start(filename, name);
|
|
|
- if (addr)
|
|
|
- break;
|
|
|
- }
|
|
|
+ u64 addr = machine__get_kernel_start_addr(machine, &name);
|
|
|
if (!addr)
|
|
|
return -1;
|
|
|
|