Commit a882cc94 authored by Adrian Hunter's avatar Adrian Hunter Committed by Arnaldo Carvalho de Melo

perf intel-pt: Fix missing 'instruction' events with 'q' option

FUP packets contain IP information, which makes them also an 'instruction'
event in 'hop' mode i.e. the itrace 'q' option.  That wasn't happening, so
restructure the logic so that FUP events are added along with appropriate
'instruction' and 'branch' events.

Fixes: 7c1b16ba ("perf intel-pt: Add support for decoding FUP/TIP only")
Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: stable@vger.kernel.org # v5.15+
Link: https://lore.kernel.org/r/20211210162303.2288710-7-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent a32e6c5d
...@@ -2683,6 +2683,8 @@ static int intel_pt_scan_for_psb(struct intel_pt_decoder *decoder); ...@@ -2683,6 +2683,8 @@ static int intel_pt_scan_for_psb(struct intel_pt_decoder *decoder);
/* Hop mode: Ignore TNT, do not walk code, but get ip from FUPs and TIPs */ /* Hop mode: Ignore TNT, do not walk code, but get ip from FUPs and TIPs */
static int intel_pt_hop_trace(struct intel_pt_decoder *decoder, bool *no_tip, int *err) static int intel_pt_hop_trace(struct intel_pt_decoder *decoder, bool *no_tip, int *err)
{ {
*err = 0;
/* Leap from PSB to PSB, getting ip from FUP within PSB+ */ /* Leap from PSB to PSB, getting ip from FUP within PSB+ */
if (decoder->leap && !decoder->in_psb && decoder->packet.type != INTEL_PT_PSB) { if (decoder->leap && !decoder->in_psb && decoder->packet.type != INTEL_PT_PSB) {
*err = intel_pt_scan_for_psb(decoder); *err = intel_pt_scan_for_psb(decoder);
...@@ -2723,18 +2725,21 @@ static int intel_pt_hop_trace(struct intel_pt_decoder *decoder, bool *no_tip, in ...@@ -2723,18 +2725,21 @@ static int intel_pt_hop_trace(struct intel_pt_decoder *decoder, bool *no_tip, in
if (!decoder->packet.count) if (!decoder->packet.count)
return HOP_IGNORE; return HOP_IGNORE;
intel_pt_set_ip(decoder); intel_pt_set_ip(decoder);
if (intel_pt_fup_event(decoder)) if (decoder->set_fup_mwait || decoder->set_fup_pwre)
return HOP_RETURN; *no_tip = true;
if (!decoder->branch_enable || !decoder->pge) if (!decoder->branch_enable || !decoder->pge)
*no_tip = true; *no_tip = true;
if (*no_tip) { if (*no_tip) {
decoder->state.type = INTEL_PT_INSTRUCTION; decoder->state.type = INTEL_PT_INSTRUCTION;
decoder->state.from_ip = decoder->ip; decoder->state.from_ip = decoder->ip;
decoder->state.to_ip = 0; decoder->state.to_ip = 0;
intel_pt_fup_event(decoder);
return HOP_RETURN; return HOP_RETURN;
} }
intel_pt_fup_event(decoder);
decoder->state.type |= INTEL_PT_INSTRUCTION | INTEL_PT_BRANCH;
*err = intel_pt_walk_fup_tip(decoder); *err = intel_pt_walk_fup_tip(decoder);
if (!*err) if (!*err && decoder->state.to_ip)
decoder->pkt_state = INTEL_PT_STATE_RESAMPLE; decoder->pkt_state = INTEL_PT_STATE_RESAMPLE;
return HOP_RETURN; return HOP_RETURN;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment