|
@@ -470,6 +470,17 @@ static int find_symbol_cb(void *arg, const char *name, char type,
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+u64 kallsyms__get_function_start(const char *kallsyms_filename,
|
|
|
+ const char *symbol_name)
|
|
|
+{
|
|
|
+ struct process_symbol_args args = { .name = symbol_name, };
|
|
|
+
|
|
|
+ if (kallsyms__parse(kallsyms_filename, &args, find_symbol_cb) <= 0)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ return args.start;
|
|
|
+}
|
|
|
+
|
|
|
int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
|
|
|
perf_event__handler_t process,
|
|
|
struct machine *machine,
|
|
@@ -480,13 +491,13 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
|
|
|
char path[PATH_MAX];
|
|
|
char name_buff[PATH_MAX];
|
|
|
struct map *map;
|
|
|
+ u64 start;
|
|
|
int err;
|
|
|
/*
|
|
|
* We should get this from /sys/kernel/sections/.text, but till that is
|
|
|
* available use this, and after it is use this as a fallback for older
|
|
|
* kernels.
|
|
|
*/
|
|
|
- struct process_symbol_args args = { .name = symbol_name, };
|
|
|
union perf_event *event = zalloc((sizeof(event->mmap) +
|
|
|
machine->id_hdr_size));
|
|
|
if (event == NULL) {
|
|
@@ -513,7 +524,8 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (kallsyms__parse(filename, &args, find_symbol_cb) <= 0) {
|
|
|
+ start = kallsyms__get_function_start(filename, symbol_name);
|
|
|
+ if (!start) {
|
|
|
free(event);
|
|
|
return -ENOENT;
|
|
|
}
|
|
@@ -525,7 +537,7 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
|
|
|
event->mmap.header.type = PERF_RECORD_MMAP;
|
|
|
event->mmap.header.size = (sizeof(event->mmap) -
|
|
|
(sizeof(event->mmap.filename) - size) + machine->id_hdr_size);
|
|
|
- event->mmap.pgoff = args.start;
|
|
|
+ event->mmap.pgoff = start;
|
|
|
event->mmap.start = map->start;
|
|
|
event->mmap.len = map->end - event->mmap.start;
|
|
|
event->mmap.pid = machine->pid;
|