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

source code of linux/arch/x86/include/asm/orc_types.h