From efef49101e29ef5b5183b2a3c30779a3a78d3855 Mon Sep 17 00:00:00 2001 From: Ming Lei Date: Thu, 25 Nov 2010 19:27:25 +0800 Subject: [PATCH] --- yaml --- r: 223031 b: refs/heads/master c: d214afbd81405d4da2c5745fe867e6b313fd4178 h: refs/heads/master i: 223029: e46c7baa93d3fc9fa946c397ca08c46cb7d0d583 223027: 5ed3222d5376ae389b5ac93bcac04d0582665321 223023: 074d0d3b3d71fd8dc34749549159a0e5e76fd439 v: v3 --- [refs] | 2 +- trunk/tools/perf/util/symbol.c | 43 +++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 962211e57090..f0ad6fcd16ad 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 8a9533123f43f2cdb3eb601c17ff2ad336882eff +refs/heads/master: d214afbd81405d4da2c5745fe867e6b313fd4178 diff --git a/trunk/tools/perf/util/symbol.c b/trunk/tools/perf/util/symbol.c index 2af4d7d22373..d628c8d1cf5e 100644 --- a/trunk/tools/perf/util/symbol.c +++ b/trunk/tools/perf/util/symbol.c @@ -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;