|
@@ -955,6 +955,9 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts,
|
|
|
if (opts->sample_address)
|
|
|
perf_evsel__set_sample_bit(evsel, DATA_SRC);
|
|
|
|
|
|
+ if (opts->sample_phys_addr)
|
|
|
+ perf_evsel__set_sample_bit(evsel, PHYS_ADDR);
|
|
|
+
|
|
|
if (opts->no_buffering) {
|
|
|
attr->watermark = 0;
|
|
|
attr->wakeup_events = 1;
|
|
@@ -1464,7 +1467,7 @@ static void __p_sample_type(char *buf, size_t size, u64 value)
|
|
|
bit_name(PERIOD), bit_name(STREAM_ID), bit_name(RAW),
|
|
|
bit_name(BRANCH_STACK), bit_name(REGS_USER), bit_name(STACK_USER),
|
|
|
bit_name(IDENTIFIER), bit_name(REGS_INTR), bit_name(DATA_SRC),
|
|
|
- bit_name(WEIGHT),
|
|
|
+ bit_name(WEIGHT), bit_name(PHYS_ADDR),
|
|
|
{ .name = NULL, }
|
|
|
};
|
|
|
#undef bit_name
|
|
@@ -2206,6 +2209,12 @@ int perf_evsel__parse_sample(struct perf_evsel *evsel, union perf_event *event,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ data->phys_addr = 0;
|
|
|
+ if (type & PERF_SAMPLE_PHYS_ADDR) {
|
|
|
+ data->phys_addr = *array;
|
|
|
+ array++;
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -2311,6 +2320,9 @@ size_t perf_event__sample_event_size(const struct perf_sample *sample, u64 type,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (type & PERF_SAMPLE_PHYS_ADDR)
|
|
|
+ result += sizeof(u64);
|
|
|
+
|
|
|
return result;
|
|
|
}
|
|
|
|
|
@@ -2500,6 +2512,11 @@ int perf_event__synthesize_sample(union perf_event *event, u64 type,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (type & PERF_SAMPLE_PHYS_ADDR) {
|
|
|
+ *array = sample->phys_addr;
|
|
|
+ array++;
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|