|
@@ -27,6 +27,7 @@ static u64 nr_unordered;
|
|
|
static bool no_callchain;
|
|
|
static bool latency_format;
|
|
|
static bool system_wide;
|
|
|
+static bool print_flags;
|
|
|
static const char *cpu_list;
|
|
|
static DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS);
|
|
|
|
|
@@ -446,6 +447,25 @@ static void print_sample_bts(union perf_event *event,
|
|
|
printf("\n");
|
|
|
}
|
|
|
|
|
|
+static void print_sample_flags(u32 flags)
|
|
|
+{
|
|
|
+ const char *chars = PERF_IP_FLAG_CHARS;
|
|
|
+ const int n = strlen(PERF_IP_FLAG_CHARS);
|
|
|
+ char str[33];
|
|
|
+ int i, pos = 0;
|
|
|
+
|
|
|
+ for (i = 0; i < n; i++, flags >>= 1) {
|
|
|
+ if (flags & 1)
|
|
|
+ str[pos++] = chars[i];
|
|
|
+ }
|
|
|
+ for (; i < 32; i++, flags >>= 1) {
|
|
|
+ if (flags & 1)
|
|
|
+ str[pos++] = '?';
|
|
|
+ }
|
|
|
+ str[pos] = 0;
|
|
|
+ printf(" %-4s ", str);
|
|
|
+}
|
|
|
+
|
|
|
static void process_event(union perf_event *event, struct perf_sample *sample,
|
|
|
struct perf_evsel *evsel, struct addr_location *al)
|
|
|
{
|
|
@@ -465,6 +485,9 @@ static void process_event(union perf_event *event, struct perf_sample *sample,
|
|
|
printf("%s: ", evname ? evname : "[unknown]");
|
|
|
}
|
|
|
|
|
|
+ if (print_flags)
|
|
|
+ print_sample_flags(sample->flags);
|
|
|
+
|
|
|
if (is_bts_event(attr)) {
|
|
|
print_sample_bts(event, sample, evsel, thread, al);
|
|
|
return;
|
|
@@ -1000,12 +1023,15 @@ static int parse_output_fields(const struct option *opt __maybe_unused,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- tok = strtok(tok, ",");
|
|
|
- while (tok) {
|
|
|
+ for (tok = strtok(tok, ","); tok; tok = strtok(NULL, ",")) {
|
|
|
for (i = 0; i < imax; ++i) {
|
|
|
if (strcmp(tok, all_output_options[i].str) == 0)
|
|
|
break;
|
|
|
}
|
|
|
+ if (i == imax && strcmp(tok, "flags") == 0) {
|
|
|
+ print_flags = true;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
if (i == imax) {
|
|
|
fprintf(stderr, "Invalid field requested.\n");
|
|
|
rc = -EINVAL;
|
|
@@ -1033,8 +1059,6 @@ static int parse_output_fields(const struct option *opt __maybe_unused,
|
|
|
}
|
|
|
output[type].fields |= all_output_options[i].field;
|
|
|
}
|
|
|
-
|
|
|
- tok = strtok(NULL, ",");
|
|
|
}
|
|
|
|
|
|
if (type >= 0) {
|
|
@@ -1555,7 +1579,7 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused)
|
|
|
"comma separated output fields prepend with 'type:'. "
|
|
|
"Valid types: hw,sw,trace,raw. "
|
|
|
"Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso,"
|
|
|
- "addr,symoff,period", parse_output_fields),
|
|
|
+ "addr,symoff,period,flags", parse_output_fields),
|
|
|
OPT_BOOLEAN('a', "all-cpus", &system_wide,
|
|
|
"system-wide collection from all CPUs"),
|
|
|
OPT_STRING('S', "symbols", &symbol_conf.sym_list_str, "symbol[,symbol...]",
|