|
@@ -2131,14 +2131,55 @@ static struct dso *machine__create_kernel(struct machine *self)
|
|
|
return kernel;
|
|
|
}
|
|
|
|
|
|
+struct process_args {
|
|
|
+ u64 start;
|
|
|
+};
|
|
|
+
|
|
|
+static int symbol__in_kernel(void *arg, const char *name,
|
|
|
+ char type __used, u64 start)
|
|
|
+{
|
|
|
+ struct process_args *args = arg;
|
|
|
+
|
|
|
+ if (strchr(name, '['))
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ args->start = start;
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+/* Figure out the start address of kernel map from /proc/kallsyms */
|
|
|
+static u64 machine__get_kernel_start_addr(struct machine *machine)
|
|
|
+{
|
|
|
+ const char *filename;
|
|
|
+ char path[PATH_MAX];
|
|
|
+ struct process_args args;
|
|
|
+
|
|
|
+ if (machine__is_host(machine)) {
|
|
|
+ filename = "/proc/kallsyms";
|
|
|
+ } else {
|
|
|
+ if (machine__is_default_guest(machine))
|
|
|
+ filename = (char *)symbol_conf.default_guest_kallsyms;
|
|
|
+ else {
|
|
|
+ sprintf(path, "%s/proc/kallsyms", machine->root_dir);
|
|
|
+ filename = path;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (kallsyms__parse(filename, &args, symbol__in_kernel) <= 0)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ return args.start;
|
|
|
+}
|
|
|
+
|
|
|
int __machine__create_kernel_maps(struct machine *self, struct dso *kernel)
|
|
|
{
|
|
|
enum map_type type;
|
|
|
+ u64 start = machine__get_kernel_start_addr(self);
|
|
|
|
|
|
for (type = 0; type < MAP__NR_TYPES; ++type) {
|
|
|
struct kmap *kmap;
|
|
|
|
|
|
- self->vmlinux_maps[type] = map__new2(0, kernel, type);
|
|
|
+ self->vmlinux_maps[type] = map__new2(start, kernel, type);
|
|
|
if (self->vmlinux_maps[type] == NULL)
|
|
|
return -1;
|
|
|
|