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