]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - tools/objtool/orc_types.h
objtool: Make unreachable annotation inline asms explicitly volatile
[mirror_ubuntu-bionic-kernel.git] / tools / objtool / orc_types.h
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 } __packed;
92
93 /*
94 * This struct is used by asm and inline asm code to manually annotate the
95 * location of registers on the stack for the ORC unwinder.
96 *
97 * Type can be either ORC_TYPE_* or UNWIND_HINT_TYPE_*.
98 */
99 struct unwind_hint {
100 u32 ip;
101 s16 sp_offset;
102 u8 sp_reg;
103 u8 type;
104 };
105 #endif /* __ASSEMBLY__ */
106
107 #endif /* _ORC_TYPES_H */