Skip to content

Commit 4c761d8

Browse files
ahunter6acmel
authored andcommitted
perf intel-pt: Fix intel_pt_fup_event() assumptions about setting state type
intel_pt_fup_event() assumes it can overwrite the state type if there has been an FUP event, but this is an unnecessary and unexpected constraint on callers. Fix by touching only the state type flags that are affected by an FUP event. Fixes: a472e65 ("perf intel-pt: Add decoder support for ptwrite and power event packets") Signed-off-by: Adrian Hunter <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: [email protected] # v5.15+ Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent ad106a2 commit 4c761d8

File tree

1 file changed

+13
-19
lines changed

1 file changed

+13
-19
lines changed

tools/perf/util/intel-pt-decoder/intel-pt-decoder.c

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,61 +1205,55 @@ static int intel_pt_walk_insn(struct intel_pt_decoder *decoder,
12051205

12061206
static bool intel_pt_fup_event(struct intel_pt_decoder *decoder)
12071207
{
1208+
enum intel_pt_sample_type type = decoder->state.type;
12081209
bool ret = false;
12091210

1211+
decoder->state.type &= ~INTEL_PT_BRANCH;
1212+
12101213
if (decoder->set_fup_tx_flags) {
12111214
decoder->set_fup_tx_flags = false;
12121215
decoder->tx_flags = decoder->fup_tx_flags;
1213-
decoder->state.type = INTEL_PT_TRANSACTION;
1216+
decoder->state.type |= INTEL_PT_TRANSACTION;
12141217
if (decoder->fup_tx_flags & INTEL_PT_ABORT_TX)
12151218
decoder->state.type |= INTEL_PT_BRANCH;
1216-
decoder->state.from_ip = decoder->ip;
1217-
decoder->state.to_ip = 0;
12181219
decoder->state.flags = decoder->fup_tx_flags;
1219-
return true;
1220+
ret = true;
12201221
}
12211222
if (decoder->set_fup_ptw) {
12221223
decoder->set_fup_ptw = false;
1223-
decoder->state.type = INTEL_PT_PTW;
1224+
decoder->state.type |= INTEL_PT_PTW;
12241225
decoder->state.flags |= INTEL_PT_FUP_IP;
1225-
decoder->state.from_ip = decoder->ip;
1226-
decoder->state.to_ip = 0;
12271226
decoder->state.ptw_payload = decoder->fup_ptw_payload;
1228-
return true;
1227+
ret = true;
12291228
}
12301229
if (decoder->set_fup_mwait) {
12311230
decoder->set_fup_mwait = false;
1232-
decoder->state.type = INTEL_PT_MWAIT_OP;
1233-
decoder->state.from_ip = decoder->ip;
1234-
decoder->state.to_ip = 0;
1231+
decoder->state.type |= INTEL_PT_MWAIT_OP;
12351232
decoder->state.mwait_payload = decoder->fup_mwait_payload;
12361233
ret = true;
12371234
}
12381235
if (decoder->set_fup_pwre) {
12391236
decoder->set_fup_pwre = false;
12401237
decoder->state.type |= INTEL_PT_PWR_ENTRY;
1241-
decoder->state.type &= ~INTEL_PT_BRANCH;
1242-
decoder->state.from_ip = decoder->ip;
1243-
decoder->state.to_ip = 0;
12441238
decoder->state.pwre_payload = decoder->fup_pwre_payload;
12451239
ret = true;
12461240
}
12471241
if (decoder->set_fup_exstop) {
12481242
decoder->set_fup_exstop = false;
12491243
decoder->state.type |= INTEL_PT_EX_STOP;
1250-
decoder->state.type &= ~INTEL_PT_BRANCH;
12511244
decoder->state.flags |= INTEL_PT_FUP_IP;
1252-
decoder->state.from_ip = decoder->ip;
1253-
decoder->state.to_ip = 0;
12541245
ret = true;
12551246
}
12561247
if (decoder->set_fup_bep) {
12571248
decoder->set_fup_bep = false;
12581249
decoder->state.type |= INTEL_PT_BLK_ITEMS;
1259-
decoder->state.type &= ~INTEL_PT_BRANCH;
1250+
ret = true;
1251+
}
1252+
if (ret) {
12601253
decoder->state.from_ip = decoder->ip;
12611254
decoder->state.to_ip = 0;
1262-
ret = true;
1255+
} else {
1256+
decoder->state.type = type;
12631257
}
12641258
return ret;
12651259
}

0 commit comments

Comments
 (0)