mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
perf intel-pt: Fix intel_pt_fup_event() assumptions about setting state type
commit4c761d805bupstream. 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:a472e65fc4("perf intel-pt: Add decoder support for ptwrite and power event packets") Signed-off-by: Adrian 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-4-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> [Adrian: Backport to v5.10] Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
3bb7fd4be8
commit
cbed09b44c
@@ -1114,61 +1114,55 @@ out_no_progress:
|
||||
|
||||
static bool intel_pt_fup_event(struct intel_pt_decoder *decoder)
|
||||
{
|
||||
enum intel_pt_sample_type type = decoder->state.type;
|
||||
bool ret = false;
|
||||
|
||||
decoder->state.type &= ~INTEL_PT_BRANCH;
|
||||
|
||||
if (decoder->set_fup_tx_flags) {
|
||||
decoder->set_fup_tx_flags = false;
|
||||
decoder->tx_flags = decoder->fup_tx_flags;
|
||||
decoder->state.type = INTEL_PT_TRANSACTION;
|
||||
decoder->state.type |= INTEL_PT_TRANSACTION;
|
||||
if (decoder->fup_tx_flags & INTEL_PT_ABORT_TX)
|
||||
decoder->state.type |= INTEL_PT_BRANCH;
|
||||
decoder->state.from_ip = decoder->ip;
|
||||
decoder->state.to_ip = 0;
|
||||
decoder->state.flags = decoder->fup_tx_flags;
|
||||
return true;
|
||||
ret = true;
|
||||
}
|
||||
if (decoder->set_fup_ptw) {
|
||||
decoder->set_fup_ptw = false;
|
||||
decoder->state.type = INTEL_PT_PTW;
|
||||
decoder->state.type |= INTEL_PT_PTW;
|
||||
decoder->state.flags |= INTEL_PT_FUP_IP;
|
||||
decoder->state.from_ip = decoder->ip;
|
||||
decoder->state.to_ip = 0;
|
||||
decoder->state.ptw_payload = decoder->fup_ptw_payload;
|
||||
return true;
|
||||
ret = true;
|
||||
}
|
||||
if (decoder->set_fup_mwait) {
|
||||
decoder->set_fup_mwait = false;
|
||||
decoder->state.type = INTEL_PT_MWAIT_OP;
|
||||
decoder->state.from_ip = decoder->ip;
|
||||
decoder->state.to_ip = 0;
|
||||
decoder->state.type |= INTEL_PT_MWAIT_OP;
|
||||
decoder->state.mwait_payload = decoder->fup_mwait_payload;
|
||||
ret = true;
|
||||
}
|
||||
if (decoder->set_fup_pwre) {
|
||||
decoder->set_fup_pwre = false;
|
||||
decoder->state.type |= INTEL_PT_PWR_ENTRY;
|
||||
decoder->state.type &= ~INTEL_PT_BRANCH;
|
||||
decoder->state.from_ip = decoder->ip;
|
||||
decoder->state.to_ip = 0;
|
||||
decoder->state.pwre_payload = decoder->fup_pwre_payload;
|
||||
ret = true;
|
||||
}
|
||||
if (decoder->set_fup_exstop) {
|
||||
decoder->set_fup_exstop = false;
|
||||
decoder->state.type |= INTEL_PT_EX_STOP;
|
||||
decoder->state.type &= ~INTEL_PT_BRANCH;
|
||||
decoder->state.flags |= INTEL_PT_FUP_IP;
|
||||
decoder->state.from_ip = decoder->ip;
|
||||
decoder->state.to_ip = 0;
|
||||
ret = true;
|
||||
}
|
||||
if (decoder->set_fup_bep) {
|
||||
decoder->set_fup_bep = false;
|
||||
decoder->state.type |= INTEL_PT_BLK_ITEMS;
|
||||
decoder->state.type &= ~INTEL_PT_BRANCH;
|
||||
ret = true;
|
||||
}
|
||||
if (ret) {
|
||||
decoder->state.from_ip = decoder->ip;
|
||||
decoder->state.to_ip = 0;
|
||||
ret = true;
|
||||
} else {
|
||||
decoder->state.type = type;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user