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