diff options
Diffstat (limited to 'tools/perf/util/machine.c')
| -rw-r--r-- | tools/perf/util/machine.c | 59 | 
1 files changed, 48 insertions, 11 deletions
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 2531b373f2cf..7ec12c207970 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -20,6 +20,7 @@  #include "path.h"  #include "srcline.h"  #include "symbol.h" +#include "synthetic-events.h"  #include "sort.h"  #include "strlist.h"  #include "target.h" @@ -128,23 +129,57 @@ out:  	return 0;  } -struct machine *machine__new_host(void) +static struct machine *__machine__new_host(bool kernel_maps)  {  	struct machine *machine = malloc(sizeof(*machine)); -	if (machine != NULL) { -		machine__init(machine, "", HOST_KERNEL_ID); +	if (!machine) +		return NULL; -		if (machine__create_kernel_maps(machine) < 0) -			goto out_delete; +	machine__init(machine, "", HOST_KERNEL_ID); -		machine->env = &perf_env; +	if (kernel_maps && machine__create_kernel_maps(machine) < 0) { +		free(machine); +		return NULL;  	} +	machine->env = &perf_env; +	return machine; +} + +struct machine *machine__new_host(void) +{ +	return __machine__new_host(/*kernel_maps=*/true); +} + +static int mmap_handler(const struct perf_tool *tool __maybe_unused, +			union perf_event *event, +			struct perf_sample *sample, +			struct machine *machine) +{ +	return machine__process_mmap2_event(machine, event, sample); +} +static int machine__init_live(struct machine *machine, pid_t pid) +{ +	union perf_event event; + +	memset(&event, 0, sizeof(event)); +	return perf_event__synthesize_mmap_events(NULL, &event, pid, pid, +						  mmap_handler, machine, true); +} + +struct machine *machine__new_live(bool kernel_maps, pid_t pid) +{ +	struct machine *machine = __machine__new_host(kernel_maps); + +	if (!machine) +		return NULL; + +	if (machine__init_live(machine, pid)) { +		machine__delete(machine); +		return NULL; +	}  	return machine; -out_delete: -	free(machine); -	return NULL;  }  struct machine *machine__new_kallsyms(void) @@ -1976,7 +2011,7 @@ static void ip__resolve_ams(struct thread *thread,  	 * Thus, we have to try consecutively until we find a match  	 * or else, the symbol is unknown  	 */ -	thread__find_cpumode_addr_location(thread, ip, &al); +	thread__find_cpumode_addr_location(thread, ip, /*symbols=*/true, &al);  	ams->addr = ip;  	ams->al_addr = al.addr; @@ -2078,7 +2113,7 @@ static int add_callchain_ip(struct thread *thread,  	al.sym = NULL;  	al.srcline = NULL;  	if (!cpumode) { -		thread__find_cpumode_addr_location(thread, ip, &al); +		thread__find_cpumode_addr_location(thread, ip, symbols, &al);  	} else {  		if (ip >= PERF_CONTEXT_MAX) {  			switch (ip) { @@ -2106,6 +2141,8 @@ static int add_callchain_ip(struct thread *thread,  		}  		if (symbols)  			thread__find_symbol(thread, *cpumode, ip, &al); +		else +			thread__find_map(thread, *cpumode, ip, &al);  	}  	if (al.sym != NULL) {  | 
