xref: /linux/arch/arm64/include/asm/stacktrace/frame.h (revision 60675d4ca1ef0857e44eba5849b74a3a998d0c0f)
1886c2b0bSMark Rutland /* SPDX-License-Identifier: GPL-2.0-only */
2886c2b0bSMark Rutland #ifndef __ASM_STACKTRACE_FRAME_H
3886c2b0bSMark Rutland #define __ASM_STACKTRACE_FRAME_H
4886c2b0bSMark Rutland 
5886c2b0bSMark Rutland /*
6*c2c6b27bSMark Rutland  * - FRAME_META_TYPE_NONE
7*c2c6b27bSMark Rutland  *
8*c2c6b27bSMark Rutland  *   This value is reserved.
9*c2c6b27bSMark Rutland  *
10*c2c6b27bSMark Rutland  * - FRAME_META_TYPE_FINAL
11*c2c6b27bSMark Rutland  *
12*c2c6b27bSMark Rutland  *   The record is the last entry on the stack.
13*c2c6b27bSMark Rutland  *   Unwinding should terminate successfully.
14*c2c6b27bSMark Rutland  *
15*c2c6b27bSMark Rutland  * - FRAME_META_TYPE_PT_REGS
16*c2c6b27bSMark Rutland  *
17*c2c6b27bSMark Rutland  *   The record is embedded within a struct pt_regs, recording the registers at
18*c2c6b27bSMark Rutland  *   an arbitrary point in time.
19*c2c6b27bSMark Rutland  *   Unwinding should consume pt_regs::pc, followed by pt_regs::lr.
20*c2c6b27bSMark Rutland  *
21*c2c6b27bSMark Rutland  * Note: all other values are reserved and should result in unwinding
22*c2c6b27bSMark Rutland  * terminating with an error.
23*c2c6b27bSMark Rutland  */
24*c2c6b27bSMark Rutland #define FRAME_META_TYPE_NONE		0
25*c2c6b27bSMark Rutland #define FRAME_META_TYPE_FINAL		1
26*c2c6b27bSMark Rutland #define FRAME_META_TYPE_PT_REGS		2
27*c2c6b27bSMark Rutland 
28*c2c6b27bSMark Rutland #ifndef __ASSEMBLY__
29*c2c6b27bSMark Rutland /*
30886c2b0bSMark Rutland  * A standard AAPCS64 frame record.
31886c2b0bSMark Rutland  */
32886c2b0bSMark Rutland struct frame_record {
33886c2b0bSMark Rutland 	u64 fp;
34886c2b0bSMark Rutland 	u64 lr;
35886c2b0bSMark Rutland };
36886c2b0bSMark Rutland 
37*c2c6b27bSMark Rutland /*
38*c2c6b27bSMark Rutland  * A metadata frame record indicating a special unwind.
39*c2c6b27bSMark Rutland  * The record::{fp,lr} fields must be zero to indicate the presence of
40*c2c6b27bSMark Rutland  * metadata.
41*c2c6b27bSMark Rutland  */
42*c2c6b27bSMark Rutland struct frame_record_meta {
43*c2c6b27bSMark Rutland 	struct frame_record record;
44*c2c6b27bSMark Rutland 	u64 type;
45*c2c6b27bSMark Rutland };
46*c2c6b27bSMark Rutland #endif /* __ASSEMBLY */
47*c2c6b27bSMark Rutland 
48886c2b0bSMark Rutland #endif /* __ASM_STACKTRACE_FRAME_H */
49