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 <t...@linutronix.de> Cc: Ingo Molnar <mi...@kernel.org> Cc: Peter Zijlstra <pet...@infradead.org> Cc: Jiri Olsa <jo...@kernel.org> Cc: Arnaldo Carvalho de Melo <a...@kernel.org> Cc: Stephane Eranian <eran...@gmail.com> Cc: Russell King <li...@arm.linux.org.uk> Cc: Catalin Marinas <catalin.mari...@arm.com> Cc: Will Deacon <will.dea...@arm.com> Cc: Benjamin Herrenschmidt <b...@kernel.crashing.org> Cc: Michael Ellerman <m...@ellerman.id.au> Cc: Sukadev Bhattiprolu <suka...@linux.vnet.ibm.com> Signed-off-by: Madhavan Srinivasan <ma...@linux.vnet.ibm.com> --- 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