summaryrefslogtreecommitdiff
path: root/arch/arm64/include/asm/stacktrace/common.h
diff options
context:
space:
mode:
authorMark Rutland <mark.rutland@arm.com>2024-10-17 10:25:33 +0100
committerCatalin Marinas <catalin.marinas@arm.com>2024-10-17 18:06:24 +0100
commit886c2b0ba820b9d6ffe3a7c670eb2f519755123c (patch)
treec550d9d7b7d5705adc8387895a6acc20eb45cb8a /arch/arm64/include/asm/stacktrace/common.h
parent1454363098a0f7f14479f6a45945bf8d3d775a95 (diff)
arm64: use a common struct frame_record
Currently the signal handling code has its own struct frame_record, the definition of struct pt_regs open-codes a frame record as an array, and the kernel unwinder hard-codes frame record offsets. Move to a common struct frame_record that can be used throughout the kernel. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Reviewed-by: Mark Brown <broonie@kernel.org> Reviewed-by: Miroslav Benes <mbenes@suse.cz> Reviewed-by: Puranjay Mohan <puranjay12@gmail.com> Cc: Ard Biesheuvel <ardb@kernel.org> Cc: Josh Poimboeuf <jpoimboe@kernel.org> Cc: Kalesh Singh <kaleshsingh@google.com> Cc: Madhavan T. Venkataraman <madvenka@linux.microsoft.com> Cc: Marc Zyngier <maz@kernel.org> Cc: Will Deacon <will@kernel.org> Link: https://lore.kernel.org/r/20241017092538.1859841-6-mark.rutland@arm.com Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Diffstat (limited to 'arch/arm64/include/asm/stacktrace/common.h')
-rw-r--r--arch/arm64/include/asm/stacktrace/common.h8
1 files changed, 5 insertions, 3 deletions
diff --git a/arch/arm64/include/asm/stacktrace/common.h b/arch/arm64/include/asm/stacktrace/common.h
index f63dc654e545..7fab6876e497 100644
--- a/arch/arm64/include/asm/stacktrace/common.h
+++ b/arch/arm64/include/asm/stacktrace/common.h
@@ -137,21 +137,23 @@ found:
static inline int
unwind_next_frame_record(struct unwind_state *state)
{
+ struct frame_record *record;
unsigned long fp = state->fp;
int err;
if (fp & 0x7)
return -EINVAL;
- err = unwind_consume_stack(state, fp, 16);
+ err = unwind_consume_stack(state, fp, sizeof(*record));
if (err)
return err;
/*
* Record this frame record's values.
*/
- state->fp = READ_ONCE(*(unsigned long *)(fp));
- state->pc = READ_ONCE(*(unsigned long *)(fp + 8));
+ record = (struct frame_record *)fp;
+ state->fp = READ_ONCE(record->fp);
+ state->pc = READ_ONCE(record->lr);
return 0;
}