perf_prepare_sample is extended to include the perf_arch_regs_mask in the sample header size calculation. Update perf_output_sample() to dump the perf_arch_regs_mask to sample output.
Cc: Thomas Gleixner <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: Arnaldo Carvalho de Melo <[email protected]> Cc: Stephane Eranian <[email protected]> Cc: Russell King <[email protected]> Cc: Catalin Marinas <[email protected]> Cc: Will Deacon <[email protected]> Cc: Benjamin Herrenschmidt <[email protected]> Cc: Michael Ellerman <[email protected]> Cc: Sukadev Bhattiprolu <[email protected]> Signed-off-by: Madhavan Srinivasan <[email protected]> --- kernel/events/core.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/kernel/events/core.c b/kernel/events/core.c index 8cf540275c34..274288819829 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -5780,12 +5780,14 @@ void perf_output_sample(struct perf_output_handle *handle, if (sample_type & PERF_SAMPLE_REGS_USER) { u64 abi = data->regs_user.abi; + u64 arch_regs_mask = data->regs_user.arch_regs_mask; /* * If there are no regs to dump, notice it through * first u64 being zero (PERF_SAMPLE_REGS_ABI_NONE). */ perf_output_put(handle, abi); + perf_output_put(handle, arch_regs_mask); if (abi) { u64 mask = event->attr.sample_regs_user; @@ -5812,11 +5814,14 @@ void perf_output_sample(struct perf_output_handle *handle, if (sample_type & PERF_SAMPLE_REGS_INTR) { u64 abi = data->regs_intr.abi; + u64 arch_regs_mask = data->regs_intr.arch_regs_mask; + /* * If there are no regs to dump, notice it through * first u64 being zero (PERF_SAMPLE_REGS_ABI_NONE). */ perf_output_put(handle, abi); + perf_output_put(handle, arch_regs_mask); if (abi) { u64 mask = event->attr.sample_regs_intr; @@ -5910,8 +5915,8 @@ void perf_prepare_sample(struct perf_event_header *header, &data->regs_user_copy); if (sample_type & PERF_SAMPLE_REGS_USER) { - /* regs dump ABI info */ - int size = sizeof(u64); + /* regs dump ABI info and arch_regs_mask */ + int size = sizeof(u64) * 2; if (data->regs_user.regs) { u64 mask = event->attr.sample_regs_user; @@ -5947,8 +5952,8 @@ void perf_prepare_sample(struct perf_event_header *header, } if (sample_type & PERF_SAMPLE_REGS_INTR) { - /* regs dump ABI info */ - int size = sizeof(u64); + /* regs dump ABI info and arch_regs_mask */ + int size = sizeof(u64) * 2; perf_sample_regs_intr(&data->regs_intr, regs); @@ -5956,6 +5961,9 @@ void perf_prepare_sample(struct perf_event_header *header, u64 mask = event->attr.sample_regs_intr; size += hweight64(mask) * sizeof(u64); + + mask = data->regs_intr.arch_regs_mask; + size += hweight64(mask) * sizeof(u64); } header->size += size; -- 2.7.4

