diff options
Diffstat (limited to 'tools/perf/util/machine.c')
| -rw-r--r-- | tools/perf/util/machine.c | 64 | 
1 files changed, 52 insertions, 12 deletions
| diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index efdb38e65a9..b2ecad6ec46 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -955,6 +955,7 @@ int machine__process_mmap_event(struct machine *machine, union perf_event *event  	u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;  	struct thread *thread;  	struct map *map; +	enum map_type type;  	int ret = 0;  	if (dump_trace) @@ -971,10 +972,17 @@ int machine__process_mmap_event(struct machine *machine, union perf_event *event  	thread = machine__findnew_thread(machine, event->mmap.pid);  	if (thread == NULL)  		goto out_problem; + +	if (event->header.misc & PERF_RECORD_MISC_MMAP_DATA) +		type = MAP__VARIABLE; +	else +		type = MAP__FUNCTION; +  	map = map__new(&machine->user_dsos, event->mmap.start,  			event->mmap.len, event->mmap.pgoff,  			event->mmap.pid, event->mmap.filename, -			MAP__FUNCTION); +			type); +  	if (map == NULL)  		goto out_problem; @@ -1003,6 +1011,17 @@ int machine__process_fork_event(struct machine *machine, union perf_event *event  	return 0;  } +static void machine__remove_thread(struct machine *machine, struct thread *th) +{ +	machine->last_match = NULL; +	rb_erase(&th->rb_node, &machine->threads); +	/* +	 * We may have references to this thread, for instance in some hist_entry +	 * instances, so just move them to a separate list. +	 */ +	list_add_tail(&th->node, &machine->dead_threads); +} +  int machine__process_exit_event(struct machine *machine, union perf_event *event)  {  	struct thread *thread = machine__find_thread(machine, event->fork.tid); @@ -1039,17 +1058,6 @@ int machine__process_event(struct machine *machine, union perf_event *event)  	return ret;  } -void machine__remove_thread(struct machine *machine, struct thread *th) -{ -	machine->last_match = NULL; -	rb_erase(&th->rb_node, &machine->threads); -	/* -	 * We may have references to this thread, for instance in some hist_entry -	 * instances, so just move them to a separate list. -	 */ -	list_add_tail(&th->node, &machine->dead_threads); -} -  static bool symbol__match_parent_regex(struct symbol *sym)  {  	if (sym->name && !regexec(&parent_regex, sym->name, 0, NULL, 0)) @@ -1097,6 +1105,38 @@ found:  	ams->map = al.map;  } +static void ip__resolve_data(struct machine *machine, struct thread *thread, +			     u8 m, struct addr_map_symbol *ams, u64 addr) +{ +	struct addr_location al; + +	memset(&al, 0, sizeof(al)); + +	thread__find_addr_location(thread, machine, m, MAP__VARIABLE, addr, &al, +				   NULL); +	ams->addr = addr; +	ams->al_addr = al.addr; +	ams->sym = al.sym; +	ams->map = al.map; +} + +struct mem_info *machine__resolve_mem(struct machine *machine, +				      struct thread *thr, +				      struct perf_sample *sample, +				      u8 cpumode) +{ +	struct mem_info *mi = zalloc(sizeof(*mi)); + +	if (!mi) +		return NULL; + +	ip__resolve_ams(machine, thr, &mi->iaddr, sample->ip); +	ip__resolve_data(machine, thr, cpumode, &mi->daddr, sample->addr); +	mi->data_src.val = sample->data_src; + +	return mi; +} +  struct branch_info *machine__resolve_bstack(struct machine *machine,  					    struct thread *thr,  					    struct branch_stack *bs) |