1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Copyright (C) 2017 Josh Poimboeuf <jpoimboe@redhat.com>
4  */
5 
6 #ifndef _ORC_TYPES_H
7 #define _ORC_TYPES_H
8 
9 #include <linux/types.h>
10 #include <linux/compiler.h>
11 
12 /*
13  * The ORC_REG_* registers are base registers which are used to find other
14  * registers on the stack.
15  *
16  * ORC_REG_PREV_SP, also known as DWARF Call Frame Address (CFA), is the
17  * address of the previous frame: the caller's SP before it called the current
18  * function.
19  *
20  * ORC_REG_UNDEFINED means the corresponding register's value didn't change in
21  * the current frame.
22  *
23  * The most commonly used base registers are SP and BP -- which the previous SP
24  * is usually based on -- and PREV_SP and UNDEFINED -- which the previous BP is
25  * usually based on.
26  *
27  * The rest of the base registers are needed for special cases like entry code
28  * and GCC realigned stacks.
29  */
30 #define ORC_REG_UNDEFINED		0
31 #define ORC_REG_PREV_SP			1
32 #define ORC_REG_DX			2
33 #define ORC_REG_DI			3
34 #define ORC_REG_BP			4
35 #define ORC_REG_SP			5
36 #define ORC_REG_R10			6
37 #define ORC_REG_R13			7
38 #define ORC_REG_BP_INDIRECT		8
39 #define ORC_REG_SP_INDIRECT		9
40 #define ORC_REG_MAX			15
41 
42 /*
43  * ORC_TYPE_CALL: Indicates that sp_reg+sp_offset resolves to PREV_SP (the
44  * caller's SP right before it made the call).  Used for all callable
45  * functions, i.e. all C code and all callable asm functions.
46  *
47  * ORC_TYPE_REGS: Used in entry code to indicate that sp_reg+sp_offset points
48  * to a fully populated pt_regs from a syscall, interrupt, or exception.
49  *
50  * ORC_TYPE_REGS_IRET: Used in entry code to indicate that sp_reg+sp_offset
51  * points to the iret return frame.
52  *
53  * The UNWIND_HINT macros are used only for the unwind_hint struct.  They
54  * aren't used in struct orc_entry due to size and complexity constraints.
55  * Objtool converts them to real types when it converts the hints to orc
56  * entries.
57  */
58 #define ORC_TYPE_CALL			0
59 #define ORC_TYPE_REGS			1
60 #define ORC_TYPE_REGS_IRET		2
61 #define UNWIND_HINT_TYPE_RET_OFFSET	3
62 
63 #ifndef __ASSEMBLY__
64 /*
65  * This struct is more or less a vastly simplified version of the DWARF Call
66  * Frame Information standard.  It contains only the necessary parts of DWARF
67  * CFI, simplified for ease of access by the in-kernel unwinder.  It tells the
68  * unwinder how to find the previous SP and BP (and sometimes entry regs) on
69  * the stack for a given code address.  Each instance of the struct corresponds
70  * to one or more code locations.
71  */
72 struct orc_entry {
73 	s16		sp_offset;
74 	s16		bp_offset;
75 	unsigned	sp_reg:4;
76 	unsigned	bp_reg:4;
77 	unsigned	type:2;
78 	unsigned	end:1;
79 } __packed;
80 
81 /*
82  * This struct is used by asm and inline asm code to manually annotate the
83  * location of registers on the stack for the ORC unwinder.
84  *
85  * Type can be either ORC_TYPE_* or UNWIND_HINT_TYPE_*.
86  */
87 struct unwind_hint {
88 	u32		ip;
89 	s16		sp_offset;
90 	u8		sp_reg;
91 	u8		type;
92 	u8		end;
93 };
94 #endif /* __ASSEMBLY__ */
95 
96 #endif /* _ORC_TYPES_H */
97