|
@@ -58,6 +58,8 @@ enum perf_output_field {
|
|
|
PERF_OUTPUT_IREGS = 1U << 14,
|
|
|
PERF_OUTPUT_BRSTACK = 1U << 15,
|
|
|
PERF_OUTPUT_BRSTACKSYM = 1U << 16,
|
|
|
+ PERF_OUTPUT_DATA_SRC = 1U << 17,
|
|
|
+ PERF_OUTPUT_WEIGHT = 1U << 18,
|
|
|
};
|
|
|
|
|
|
struct output_option {
|
|
@@ -81,6 +83,8 @@ struct output_option {
|
|
|
{.str = "iregs", .field = PERF_OUTPUT_IREGS},
|
|
|
{.str = "brstack", .field = PERF_OUTPUT_BRSTACK},
|
|
|
{.str = "brstacksym", .field = PERF_OUTPUT_BRSTACKSYM},
|
|
|
+ {.str = "data_src", .field = PERF_OUTPUT_DATA_SRC},
|
|
|
+ {.str = "weight", .field = PERF_OUTPUT_WEIGHT},
|
|
|
};
|
|
|
|
|
|
/* default set to maintain compatibility with current format */
|
|
@@ -242,6 +246,16 @@ static int perf_evsel__check_attr(struct perf_evsel *evsel,
|
|
|
PERF_OUTPUT_ADDR, allow_user_set))
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ if (PRINT_FIELD(DATA_SRC) &&
|
|
|
+ perf_evsel__check_stype(evsel, PERF_SAMPLE_DATA_SRC, "DATA_SRC",
|
|
|
+ PERF_OUTPUT_DATA_SRC))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (PRINT_FIELD(WEIGHT) &&
|
|
|
+ perf_evsel__check_stype(evsel, PERF_SAMPLE_WEIGHT, "WEIGHT",
|
|
|
+ PERF_OUTPUT_WEIGHT))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
if (PRINT_FIELD(SYM) && !PRINT_FIELD(IP) && !PRINT_FIELD(ADDR)) {
|
|
|
pr_err("Display of symbols requested but neither sample IP nor "
|
|
|
"sample address\nis selected. Hence, no addresses to convert "
|
|
@@ -673,6 +687,12 @@ static void process_event(struct perf_script *script, union perf_event *event,
|
|
|
if (PRINT_FIELD(ADDR))
|
|
|
print_sample_addr(event, sample, thread, attr);
|
|
|
|
|
|
+ if (PRINT_FIELD(DATA_SRC))
|
|
|
+ printf("%16" PRIx64, sample->data_src);
|
|
|
+
|
|
|
+ if (PRINT_FIELD(WEIGHT))
|
|
|
+ printf("%16" PRIu64, sample->weight);
|
|
|
+
|
|
|
if (PRINT_FIELD(IP)) {
|
|
|
if (!symbol_conf.use_callchain)
|
|
|
printf(" ");
|