forked from Minki/linux
perf intel-pt: Implement decoder flags for trace begin / end
Have the Intel PT decoder implement the new Intel PT decoder flags for trace begin / end. Previously, the decoder would indicate begin / end by a branch from / to zero. That hides useful information, in particular when a trace ends with a call. That happens when using address filters, for example: $ perf record -e intel_pt/cyc,mtc_period=0,noretcomp/u --filter='filter main @ /bin/uname ' uname Linux [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.031 MB perf.data ] Before: $ perf script --itrace=cre -Ftime,flags,ip,sym,symoff,addr --ns 7249.622183310: tr strt 0 [unknown] => 401590 main+0x0 7249.622183311: call 4015b9 main+0x29 => 0 [unknown] 7249.622183711: tr strt 0 [unknown] => 4015be main+0x2e 7249.622183714: call 4015c8 main+0x38 => 0 [unknown] 7249.622247731: tr strt 0 [unknown] => 4015cd main+0x3d 7249.622247760: call 4015d7 main+0x47 => 0 [unknown] 7249.622248340: tr strt 0 [unknown] => 4015dc main+0x4c 7249.622248341: call 4015e1 main+0x51 => 0 [unknown] 7249.622248681: tr strt 0 [unknown] => 4015e6 main+0x56 7249.622248682: call 4015eb main+0x5b => 0 [unknown] 7249.622248970: tr strt 0 [unknown] => 4015f0 main+0x60 7249.622248971: call 401612 main+0x82 => 0 [unknown] 7249.622249757: tr strt 0 [unknown] => 401617 main+0x87 7249.622249770: call 401847 main+0x2b7 => 0 [unknown] 7249.622250606: tr strt 0 [unknown] => 40184c main+0x2bc 7249.622250612: call 4019bf main+0x42f => 0 [unknown] 7249.622256823: tr strt 0 [unknown] => 4019c4 main+0x434 7249.622256863: call 4019f5 main+0x465 => 0 [unknown] 7249.622264217: tr strt 0 [unknown] => 4019fa main+0x46a 7249.622264235: call 401832 main+0x2a2 => 0 [unknown] After: $ perf script --itrace=cre -Ftime,flags,ip,sym,symoff,addr --ns 7249.622183310: tr strt 0 [unknown] => 401590 main+0x0 7249.622183311: tr end call 4015b9 main+0x29 => 401ef0 set_program_name+0x0 7249.622183711: tr strt 0 [unknown] => 4015be main+0x2e 7249.622183714: tr end call 4015c8 main+0x38 => 4014b0 setlocale@plt+0x0 7249.622247731: tr strt 0 [unknown] => 4015cd main+0x3d 7249.622247760: tr end call 4015d7 main+0x47 => 4012d0 bindtextdomain@plt+0x0 7249.622248340: tr strt 0 [unknown] => 4015dc main+0x4c 7249.622248341: tr end call 4015e1 main+0x51 => 4012b0 textdomain@plt+0x0 7249.622248681: tr strt 0 [unknown] => 4015e6 main+0x56 7249.622248682: tr end call 4015eb main+0x5b => 404340 atexit+0x0 7249.622248970: tr strt 0 [unknown] => 4015f0 main+0x60 7249.622248971: tr end call 401612 main+0x82 => 401320 getopt_long@plt+0x0 7249.622249757: tr strt 0 [unknown] => 401617 main+0x87 7249.622249770: tr end call 401847 main+0x2b7 => 401360 uname@plt+0x0 7249.622250606: tr strt 0 [unknown] => 40184c main+0x2bc 7249.622250612: tr end call 4019bf main+0x42f => 401b10 print_element+0x0 7249.622256823: tr strt 0 [unknown] => 4019c4 main+0x434 7249.622256863: tr end call 4019f5 main+0x465 => 401340 __overflow@plt+0x0 7249.622264217: tr strt 0 [unknown] => 4019fa main+0x46a 7249.622264235: tr end call 401832 main+0x2a2 => 401520 exit@plt+0x0 Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Jiri Olsa <jolsa@redhat.com> Link: http://lkml.kernel.org/r/20180920130048.31432-7-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
c6b5da093a
commit
bea6385789
@ -1165,7 +1165,7 @@ static int intel_pt_walk_tip(struct intel_pt_decoder *decoder)
|
||||
decoder->pge = false;
|
||||
decoder->continuous_period = false;
|
||||
decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
|
||||
decoder->state.to_ip = 0;
|
||||
decoder->state.type |= INTEL_PT_TRACE_END;
|
||||
return 0;
|
||||
}
|
||||
if (err == INTEL_PT_RETURN)
|
||||
@ -1179,9 +1179,13 @@ static int intel_pt_walk_tip(struct intel_pt_decoder *decoder)
|
||||
decoder->continuous_period = false;
|
||||
decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
|
||||
decoder->state.from_ip = decoder->ip;
|
||||
decoder->state.to_ip = 0;
|
||||
if (decoder->packet.count != 0)
|
||||
if (decoder->packet.count == 0) {
|
||||
decoder->state.to_ip = 0;
|
||||
} else {
|
||||
decoder->state.to_ip = decoder->last_ip;
|
||||
decoder->ip = decoder->last_ip;
|
||||
}
|
||||
decoder->state.type |= INTEL_PT_TRACE_END;
|
||||
} else {
|
||||
decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
|
||||
decoder->state.from_ip = decoder->ip;
|
||||
@ -1208,7 +1212,8 @@ static int intel_pt_walk_tip(struct intel_pt_decoder *decoder)
|
||||
decoder->pkt_state = INTEL_PT_STATE_IN_SYNC;
|
||||
decoder->ip = to_ip;
|
||||
decoder->state.from_ip = decoder->ip;
|
||||
decoder->state.to_ip = 0;
|
||||
decoder->state.to_ip = to_ip;
|
||||
decoder->state.type |= INTEL_PT_TRACE_END;
|
||||
return 0;
|
||||
}
|
||||
intel_pt_log_at("ERROR: Conditional branch when expecting indirect branch",
|
||||
@ -1640,14 +1645,15 @@ static int intel_pt_walk_fup_tip(struct intel_pt_decoder *decoder)
|
||||
|
||||
case INTEL_PT_TIP_PGD:
|
||||
decoder->state.from_ip = decoder->ip;
|
||||
decoder->state.to_ip = 0;
|
||||
if (decoder->packet.count != 0) {
|
||||
if (decoder->packet.count == 0) {
|
||||
decoder->state.to_ip = 0;
|
||||
} else {
|
||||
intel_pt_set_ip(decoder);
|
||||
intel_pt_log("Omitting PGD ip " x64_fmt "\n",
|
||||
decoder->ip);
|
||||
decoder->state.to_ip = decoder->ip;
|
||||
}
|
||||
decoder->pge = false;
|
||||
decoder->continuous_period = false;
|
||||
decoder->state.type |= INTEL_PT_TRACE_END;
|
||||
return 0;
|
||||
|
||||
case INTEL_PT_TIP_PGE:
|
||||
@ -1661,6 +1667,7 @@ static int intel_pt_walk_fup_tip(struct intel_pt_decoder *decoder)
|
||||
intel_pt_set_ip(decoder);
|
||||
decoder->state.to_ip = decoder->ip;
|
||||
}
|
||||
decoder->state.type |= INTEL_PT_TRACE_BEGIN;
|
||||
return 0;
|
||||
|
||||
case INTEL_PT_TIP:
|
||||
@ -1739,6 +1746,7 @@ next:
|
||||
intel_pt_set_ip(decoder);
|
||||
decoder->state.from_ip = 0;
|
||||
decoder->state.to_ip = decoder->ip;
|
||||
decoder->state.type |= INTEL_PT_TRACE_BEGIN;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2077,9 +2085,13 @@ static int intel_pt_walk_to_ip(struct intel_pt_decoder *decoder)
|
||||
decoder->pge = decoder->packet.type != INTEL_PT_TIP_PGD;
|
||||
if (intel_pt_have_ip(decoder))
|
||||
intel_pt_set_ip(decoder);
|
||||
if (decoder->ip)
|
||||
return 0;
|
||||
break;
|
||||
if (!decoder->ip)
|
||||
break;
|
||||
if (decoder->packet.type == INTEL_PT_TIP_PGE)
|
||||
decoder->state.type |= INTEL_PT_TRACE_BEGIN;
|
||||
if (decoder->packet.type == INTEL_PT_TIP_PGD)
|
||||
decoder->state.type |= INTEL_PT_TRACE_END;
|
||||
return 0;
|
||||
|
||||
case INTEL_PT_FUP:
|
||||
if (intel_pt_have_ip(decoder))
|
||||
|
Loading…
Reference in New Issue
Block a user