Skip to content

Commit

Permalink
perf intel-pt: Synthesize iflag event
Browse files Browse the repository at this point in the history
Synthesize an attribute event and sample events for changes to the
interrupt flag represented by the MODE.Exec packet.

Signed-off-by: Adrian Hunter <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Andi Kleen <[email protected]>
Cc: Jiri Olsa <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
  • Loading branch information
ahunter6 authored and acmel committed Feb 15, 2022
1 parent ef3b2ba commit 069ca70
Showing 1 changed file with 52 additions and 0 deletions.
52 changes: 52 additions & 0 deletions tools/perf/util/intel-pt.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,9 @@ struct intel_pt {
u64 evt_sample_type;
u64 evt_id;

u64 iflag_chg_sample_type;
u64 iflag_chg_id;

u64 tsc_bit;
u64 mtc_bit;
u64 mtc_freq_bits;
Expand Down Expand Up @@ -2209,6 +2212,39 @@ static int intel_pt_synth_events_sample(struct intel_pt_queue *ptq)
pt->evt_sample_type);
}

static int intel_pt_synth_iflag_chg_sample(struct intel_pt_queue *ptq)
{
struct intel_pt *pt = ptq->pt;
union perf_event *event = ptq->event_buf;
struct perf_sample sample = { .ip = 0, };
struct perf_synth_intel_iflag_chg raw;

if (intel_pt_skip_event(pt))
return 0;

intel_pt_prep_p_sample(pt, ptq, event, &sample);

sample.id = ptq->pt->iflag_chg_id;
sample.stream_id = ptq->pt->iflag_chg_id;

raw.flags = 0;
raw.iflag = ptq->state->to_iflag;

if (ptq->state->type & INTEL_PT_BRANCH) {
raw.via_branch = 1;
raw.branch_ip = ptq->state->to_ip;
} else {
sample.addr = 0;
}
sample.flags = ptq->flags;

sample.raw_size = perf_synth__raw_size(raw);
sample.raw_data = perf_synth__raw_data(&raw);

return intel_pt_deliver_synth_event(pt, event, &sample,
pt->iflag_chg_sample_type);
}

static int intel_pt_synth_error(struct intel_pt *pt, int code, int cpu,
pid_t pid, pid_t tid, u64 ip, u64 timestamp)
{
Expand Down Expand Up @@ -2321,6 +2357,11 @@ static int intel_pt_sample(struct intel_pt_queue *ptq)
if (err)
return err;
}
if (state->type & INTEL_PT_IFLAG_CHG) {
err = intel_pt_synth_iflag_chg_sample(ptq);
if (err)
return err;
}
}

if (pt->sample_pwr_events) {
Expand Down Expand Up @@ -3531,6 +3572,17 @@ static int intel_pt_synth_events(struct intel_pt *pt,
id += 1;
}

if (pt->synth_opts.intr_events && pt->cap_event_trace) {
attr.config = PERF_SYNTH_INTEL_IFLAG_CHG;
err = intel_pt_synth_event(session, "iflag", &attr, id);
if (err)
return err;
pt->iflag_chg_sample_type = attr.sample_type;
pt->iflag_chg_id = id;
intel_pt_set_event_name(evlist, id, "iflag");
id += 1;
}

return 0;
}

Expand Down

0 comments on commit 069ca70

Please sign in to comment.