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 | #ifndef __ASSEMBLY__ |
43 | #include <asm/byteorder.h> |
44 | |
45 | /* |
46 | * This struct is more or less a vastly simplified version of the DWARF Call |
47 | * Frame Information standard. It contains only the necessary parts of DWARF |
48 | * CFI, simplified for ease of access by the in-kernel unwinder. It tells the |
49 | * unwinder how to find the previous SP and BP (and sometimes entry regs) on |
50 | * the stack for a given code address. Each instance of the struct corresponds |
51 | * to one or more code locations. |
52 | */ |
53 | struct orc_entry { |
54 | s16 sp_offset; |
55 | s16 bp_offset; |
56 | #if defined(__LITTLE_ENDIAN_BITFIELD) |
57 | unsigned sp_reg:4; |
58 | unsigned bp_reg:4; |
59 | unsigned type:2; |
60 | unsigned signal:1; |
61 | unsigned end:1; |
62 | #elif defined(__BIG_ENDIAN_BITFIELD) |
63 | unsigned bp_reg:4; |
64 | unsigned sp_reg:4; |
65 | unsigned unused:4; |
66 | unsigned end:1; |
67 | unsigned signal:1; |
68 | unsigned type:2; |
69 | #endif |
70 | } __packed; |
71 | |
72 | #endif /* __ASSEMBLY__ */ |
73 | |
74 | #endif /* _ORC_TYPES_H */ |
75 | |