diff options
Diffstat (limited to 'tools/perf/util')
| -rw-r--r-- | tools/perf/util/annotate.c | 18 | ||||
| -rw-r--r-- | tools/perf/util/evlist.c | 14 | ||||
| -rw-r--r-- | tools/perf/util/evlist.h | 2 | ||||
| -rw-r--r-- | tools/perf/util/evsel.c | 14 | ||||
| -rw-r--r-- | tools/perf/util/evsel.h | 1 | ||||
| -rw-r--r-- | tools/perf/util/intel-pt-decoder/inat.h | 10 | ||||
| -rw-r--r-- | tools/perf/util/intel-pt-decoder/x86-opcode-map.txt | 2 | ||||
| -rw-r--r-- | tools/perf/util/machine.c | 3 | ||||
| -rw-r--r-- | tools/perf/util/parse-events.c | 2 | ||||
| -rw-r--r-- | tools/perf/util/parse-events.h | 3 | ||||
| -rw-r--r-- | tools/perf/util/pmu.c | 5 | 
11 files changed, 58 insertions, 16 deletions
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index da1c4c4a0dd8..3369c7830260 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c @@ -165,7 +165,7 @@ static void ins__delete(struct ins_operands *ops)  static int ins__raw_scnprintf(struct ins *ins, char *bf, size_t size,  			      struct ins_operands *ops)  { -	return scnprintf(bf, size, "%-6.6s %s", ins->name, ops->raw); +	return scnprintf(bf, size, "%-6s %s", ins->name, ops->raw);  }  int ins__scnprintf(struct ins *ins, char *bf, size_t size, @@ -230,12 +230,12 @@ static int call__scnprintf(struct ins *ins, char *bf, size_t size,  			   struct ins_operands *ops)  {  	if (ops->target.name) -		return scnprintf(bf, size, "%-6.6s %s", ins->name, ops->target.name); +		return scnprintf(bf, size, "%-6s %s", ins->name, ops->target.name);  	if (ops->target.addr == 0)  		return ins__raw_scnprintf(ins, bf, size, ops); -	return scnprintf(bf, size, "%-6.6s *%" PRIx64, ins->name, ops->target.addr); +	return scnprintf(bf, size, "%-6s *%" PRIx64, ins->name, ops->target.addr);  }  static struct ins_ops call_ops = { @@ -299,7 +299,7 @@ static int jump__scnprintf(struct ins *ins, char *bf, size_t size,  			c++;  	} -	return scnprintf(bf, size, "%-6.6s %.*s%" PRIx64, +	return scnprintf(bf, size, "%-6s %.*s%" PRIx64,  			 ins->name, c ? c - ops->raw : 0, ops->raw,  			 ops->target.offset);  } @@ -372,7 +372,7 @@ static int lock__scnprintf(struct ins *ins, char *bf, size_t size,  	if (ops->locked.ins.ops == NULL)  		return ins__raw_scnprintf(ins, bf, size, ops); -	printed = scnprintf(bf, size, "%-6.6s ", ins->name); +	printed = scnprintf(bf, size, "%-6s ", ins->name);  	return printed + ins__scnprintf(&ops->locked.ins, bf + printed,  					size - printed, ops->locked.ops);  } @@ -448,7 +448,7 @@ out_free_source:  static int mov__scnprintf(struct ins *ins, char *bf, size_t size,  			   struct ins_operands *ops)  { -	return scnprintf(bf, size, "%-6.6s %s,%s", ins->name, +	return scnprintf(bf, size, "%-6s %s,%s", ins->name,  			 ops->source.name ?: ops->source.raw,  			 ops->target.name ?: ops->target.raw);  } @@ -488,7 +488,7 @@ static int dec__parse(struct arch *arch __maybe_unused, struct ins_operands *ops  static int dec__scnprintf(struct ins *ins, char *bf, size_t size,  			   struct ins_operands *ops)  { -	return scnprintf(bf, size, "%-6.6s %s", ins->name, +	return scnprintf(bf, size, "%-6s %s", ins->name,  			 ops->target.name ?: ops->target.raw);  } @@ -500,7 +500,7 @@ static struct ins_ops dec_ops = {  static int nop__scnprintf(struct ins *ins __maybe_unused, char *bf, size_t size,  			  struct ins_operands *ops __maybe_unused)  { -	return scnprintf(bf, size, "%-6.6s", "nop"); +	return scnprintf(bf, size, "%-6s", "nop");  }  static struct ins_ops nop_ops = { @@ -924,7 +924,7 @@ void disasm_line__free(struct disasm_line *dl)  int disasm_line__scnprintf(struct disasm_line *dl, char *bf, size_t size, bool raw)  {  	if (raw || !dl->ins.ops) -		return scnprintf(bf, size, "%-6.6s %s", dl->ins.name, dl->ops.raw); +		return scnprintf(bf, size, "%-6s %s", dl->ins.name, dl->ops.raw);  	return ins__scnprintf(&dl->ins, bf, size, &dl->ops);  } diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index c6c891e154a6..b62e523a7035 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -257,7 +257,7 @@ int perf_evlist__add_dummy(struct perf_evlist *evlist)  		.config = PERF_COUNT_SW_DUMMY,  		.size	= sizeof(attr), /* to capture ABI version */  	}; -	struct perf_evsel *evsel = perf_evsel__new(&attr); +	struct perf_evsel *evsel = perf_evsel__new_idx(&attr, evlist->nr_entries);  	if (evsel == NULL)  		return -ENOMEM; @@ -1786,3 +1786,15 @@ void perf_evlist__toggle_bkw_mmap(struct perf_evlist *evlist,  state_err:  	return;  } + +bool perf_evlist__exclude_kernel(struct perf_evlist *evlist) +{ +	struct perf_evsel *evsel; + +	evlist__for_each_entry(evlist, evsel) { +		if (!evsel->attr.exclude_kernel) +			return false; +	} + +	return true; +} diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h index e72ae64c11ac..491f69542920 100644 --- a/tools/perf/util/evlist.h +++ b/tools/perf/util/evlist.h @@ -312,4 +312,6 @@ perf_evlist__find_evsel_by_str(struct perf_evlist *evlist, const char *str);  struct perf_evsel *perf_evlist__event2evsel(struct perf_evlist *evlist,  					    union perf_event *event); + +bool perf_evlist__exclude_kernel(struct perf_evlist *evlist);  #endif /* __PERF_EVLIST_H */ diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index f894893c203d..d5fbcf8c7aa7 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -733,12 +733,16 @@ static void apply_config_terms(struct perf_evsel *evsel,  	list_for_each_entry(term, config_terms, list) {  		switch (term->type) {  		case PERF_EVSEL__CONFIG_TERM_PERIOD: -			attr->sample_period = term->val.period; -			attr->freq = 0; +			if (!(term->weak && opts->user_interval != ULLONG_MAX)) { +				attr->sample_period = term->val.period; +				attr->freq = 0; +			}  			break;  		case PERF_EVSEL__CONFIG_TERM_FREQ: -			attr->sample_freq = term->val.freq; -			attr->freq = 1; +			if (!(term->weak && opts->user_freq != UINT_MAX)) { +				attr->sample_freq = term->val.freq; +				attr->freq = 1; +			}  			break;  		case PERF_EVSEL__CONFIG_TERM_TIME:  			if (term->val.time) @@ -1371,7 +1375,7 @@ perf_evsel__process_group_data(struct perf_evsel *leader,  static int  perf_evsel__read_group(struct perf_evsel *leader, int cpu, int thread)  { -	struct perf_stat_evsel *ps = leader->priv; +	struct perf_stat_evsel *ps = leader->stats;  	u64 read_format = leader->attr.read_format;  	int size = perf_evsel__read_size(leader);  	u64 *data = ps->group_data; diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 9277df96ffda..157f49e8a772 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -67,6 +67,7 @@ struct perf_evsel_config_term {  		bool	overwrite;  		char	*branch;  	} val; +	bool weak;  };  struct perf_stat_evsel; diff --git a/tools/perf/util/intel-pt-decoder/inat.h b/tools/perf/util/intel-pt-decoder/inat.h index 125ecd2a300d..52dc8d911173 100644 --- a/tools/perf/util/intel-pt-decoder/inat.h +++ b/tools/perf/util/intel-pt-decoder/inat.h @@ -97,6 +97,16 @@  #define INAT_MAKE_GROUP(grp)	((grp << INAT_GRP_OFFS) | INAT_MODRM)  #define INAT_MAKE_IMM(imm)	(imm << INAT_IMM_OFFS) +/* Identifiers for segment registers */ +#define INAT_SEG_REG_IGNORE	0 +#define INAT_SEG_REG_DEFAULT	1 +#define INAT_SEG_REG_CS		2 +#define INAT_SEG_REG_SS		3 +#define INAT_SEG_REG_DS		4 +#define INAT_SEG_REG_ES		5 +#define INAT_SEG_REG_FS		6 +#define INAT_SEG_REG_GS		7 +  /* Attribute search APIs */  extern insn_attr_t inat_get_opcode_attribute(insn_byte_t opcode);  extern int inat_get_last_prefix_id(insn_byte_t last_pfx); diff --git a/tools/perf/util/intel-pt-decoder/x86-opcode-map.txt b/tools/perf/util/intel-pt-decoder/x86-opcode-map.txt index 12e377184ee4..c4d55919fac1 100644 --- a/tools/perf/util/intel-pt-decoder/x86-opcode-map.txt +++ b/tools/perf/util/intel-pt-decoder/x86-opcode-map.txt @@ -896,7 +896,7 @@ EndTable  GrpTable: Grp3_1  0: TEST Eb,Ib -1: +1: TEST Eb,Ib  2: NOT Eb  3: NEG Eb  4: MUL AL,Eb diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 6a8d03c3d9b7..270f3223c6df 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -172,6 +172,9 @@ void machine__exit(struct machine *machine)  {  	int i; +	if (machine == NULL) +		return; +  	machine__destroy_kernel_maps(machine);  	map_groups__exit(&machine->kmaps);  	dsos__exit(&machine->dsos); diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index a7fcd95961ef..170316795a18 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1116,6 +1116,7 @@ do {								\  	INIT_LIST_HEAD(&__t->list);				\  	__t->type       = PERF_EVSEL__CONFIG_TERM_ ## __type;	\  	__t->val.__name = __val;				\ +	__t->weak	= term->weak;				\  	list_add_tail(&__t->list, head_terms);			\  } while (0) @@ -2410,6 +2411,7 @@ static int new_term(struct parse_events_term **_term,  	*term = *temp;  	INIT_LIST_HEAD(&term->list); +	term->weak = false;  	switch (term->type_val) {  	case PARSE_EVENTS__TERM_TYPE_NUM: diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index be337c266697..88108cd11b4c 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -101,6 +101,9 @@ struct parse_events_term {  	/* error string indexes for within parsed string */  	int err_term;  	int err_val; + +	/* Coming from implicit alias */ +	bool weak;  };  struct parse_events_error { diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index 07cb2ac041d7..80fb1593913a 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -405,6 +405,11 @@ static int pmu_alias_terms(struct perf_pmu_alias *alias,  			parse_events_terms__purge(&list);  			return ret;  		} +		/* +		 * Weak terms don't override command line options, +		 * which we don't want for implicit terms in aliases. +		 */ +		cloned->weak = true;  		list_add_tail(&cloned->list, &list);  	}  	list_splice(&list, terms);  | 
