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

perf script: Display new D (Intr Disabled) and t (Intr Toggle) flags

Amend the display to include D and t flags in the same way as the x flag.
Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Link: https://lore.kernel.org/r/20220124084201.2699795-21-adrian.hunter@intel.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent a48b96ca
...@@ -195,16 +195,19 @@ OPTIONS ...@@ -195,16 +195,19 @@ OPTIONS
At this point usage is displayed, and perf-script exits. At this point usage is displayed, and perf-script exits.
The flags field is synthesized and may have a value when Instruction The flags field is synthesized and may have a value when Instruction
Trace decoding. The flags are "bcrosyiABExgh" which stand for branch, Trace decoding. The flags are "bcrosyiABExghDt" which stand for branch,
call, return, conditional, system, asynchronous, interrupt, call, return, conditional, system, asynchronous, interrupt,
transaction abort, trace begin, trace end, in transaction, VM-Entry, and VM-Exit transaction abort, trace begin, trace end, in transaction, VM-Entry,
respectively. Known combinations of flags are printed more nicely e.g. VM-Exit, interrupt disabled and interrupt disable toggle respectively.
Known combinations of flags are printed more nicely e.g.
"call" for "bc", "return" for "br", "jcc" for "bo", "jmp" for "b", "call" for "bc", "return" for "br", "jcc" for "bo", "jmp" for "b",
"int" for "bci", "iret" for "bri", "syscall" for "bcs", "sysret" for "brs", "int" for "bci", "iret" for "bri", "syscall" for "bcs", "sysret" for "brs",
"async" for "by", "hw int" for "bcyi", "tx abrt" for "bA", "tr strt" for "bB", "async" for "by", "hw int" for "bcyi", "tx abrt" for "bA", "tr strt" for "bB",
"tr end" for "bE", "vmentry" for "bcg", "vmexit" for "bch". "tr end" for "bE", "vmentry" for "bcg", "vmexit" for "bch".
However the "x" flag will be displayed separately in those However the "x", "D" and "t" flags will be displayed separately in those
cases e.g. "jcc (x)" for a condition branch within a transaction. cases e.g. "jcc (xD)" for a condition branch within a transaction
with interrupts disabled. Note, interrupts becoming disabled is "t",
whereas interrupts becoming enabled is "Dt".
The callindent field is synthesized and may have a value when The callindent field is synthesized and may have a value when
Instruction Trace decoding. For calls and returns, it will display the Instruction Trace decoding. For calls and returns, it will display the
......
...@@ -1579,26 +1579,34 @@ static const char *sample_flags_to_name(u32 flags) ...@@ -1579,26 +1579,34 @@ static const char *sample_flags_to_name(u32 flags)
int perf_sample__sprintf_flags(u32 flags, char *str, size_t sz) int perf_sample__sprintf_flags(u32 flags, char *str, size_t sz)
{ {
u32 xf = PERF_IP_FLAG_IN_TX | PERF_IP_FLAG_INTR_DISABLE |
PERF_IP_FLAG_INTR_TOGGLE;
const char *chars = PERF_IP_FLAG_CHARS; const char *chars = PERF_IP_FLAG_CHARS;
const size_t n = strlen(PERF_IP_FLAG_CHARS); const size_t n = strlen(PERF_IP_FLAG_CHARS);
bool in_tx = flags & PERF_IP_FLAG_IN_TX;
const char *name = NULL; const char *name = NULL;
size_t i, pos = 0; size_t i, pos = 0;
char xs[16] = {0};
name = sample_flags_to_name(flags & ~PERF_IP_FLAG_IN_TX); if (flags & xf)
snprintf(xs, sizeof(xs), "(%s%s%s)",
flags & PERF_IP_FLAG_IN_TX ? "x" : "",
flags & PERF_IP_FLAG_INTR_DISABLE ? "D" : "",
flags & PERF_IP_FLAG_INTR_TOGGLE ? "t" : "");
name = sample_flags_to_name(flags & ~xf);
if (name) if (name)
return snprintf(str, sz, "%-15s%4s", name, in_tx ? "(x)" : ""); return snprintf(str, sz, "%-15s%6s", name, xs);
if (flags & PERF_IP_FLAG_TRACE_BEGIN) { if (flags & PERF_IP_FLAG_TRACE_BEGIN) {
name = sample_flags_to_name(flags & ~(PERF_IP_FLAG_IN_TX | PERF_IP_FLAG_TRACE_BEGIN)); name = sample_flags_to_name(flags & ~(xf | PERF_IP_FLAG_TRACE_BEGIN));
if (name) if (name)
return snprintf(str, sz, "tr strt %-7s%4s", name, in_tx ? "(x)" : ""); return snprintf(str, sz, "tr strt %-7s%6s", name, xs);
} }
if (flags & PERF_IP_FLAG_TRACE_END) { if (flags & PERF_IP_FLAG_TRACE_END) {
name = sample_flags_to_name(flags & ~(PERF_IP_FLAG_IN_TX | PERF_IP_FLAG_TRACE_END)); name = sample_flags_to_name(flags & ~(xf | PERF_IP_FLAG_TRACE_END));
if (name) if (name)
return snprintf(str, sz, "tr end %-7s%4s", name, in_tx ? "(x)" : ""); return snprintf(str, sz, "tr end %-7s%6s", name, xs);
} }
for (i = 0; i < n; i++, flags >>= 1) { for (i = 0; i < n; i++, flags >>= 1) {
...@@ -1620,7 +1628,7 @@ static int perf_sample__fprintf_flags(u32 flags, FILE *fp) ...@@ -1620,7 +1628,7 @@ static int perf_sample__fprintf_flags(u32 flags, FILE *fp)
char str[SAMPLE_FLAGS_BUF_SIZE]; char str[SAMPLE_FLAGS_BUF_SIZE];
perf_sample__sprintf_flags(flags, str, sizeof(str)); perf_sample__sprintf_flags(flags, str, sizeof(str));
return fprintf(fp, " %-19s ", str); return fprintf(fp, " %-21s ", str);
} }
struct printer_data { struct printer_data {
......
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