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 */ 53struct 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 end:1; 61#elif defined(__BIG_ENDIAN_BITFIELD) 62 unsigned bp_reg:4; 63 unsigned sp_reg:4; 64 unsigned unused:5; 65 unsigned end:1; 66 unsigned type:2; 67#endif 68} __packed; 69 70#endif /* __ASSEMBLY__ */ 71 72#endif /* _ORC_TYPES_H */ 73