59 lines
1.7 KiB
C
59 lines
1.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
#ifndef _ORC_TYPES_H
|
|
#define _ORC_TYPES_H
|
|
|
|
#include <linux/types.h>
|
|
|
|
/*
|
|
* The ORC_REG_* registers are base registers which are used to find other
|
|
* registers on the stack.
|
|
*
|
|
* ORC_REG_PREV_SP, also known as DWARF Call Frame Address (CFA), is the
|
|
* address of the previous frame: the caller's SP before it called the current
|
|
* function.
|
|
*
|
|
* ORC_REG_UNDEFINED means the corresponding register's value didn't change in
|
|
* the current frame.
|
|
*
|
|
* The most commonly used base registers are SP and FP -- which the previous SP
|
|
* is usually based on -- and PREV_SP and UNDEFINED -- which the previous FP is
|
|
* usually based on.
|
|
*
|
|
* The rest of the base registers are needed for special cases like entry code
|
|
* and GCC realigned stacks.
|
|
*/
|
|
#define ORC_REG_UNDEFINED 0
|
|
#define ORC_REG_PREV_SP 1
|
|
#define ORC_REG_SP 2
|
|
#define ORC_REG_FP 3
|
|
#define ORC_REG_MAX 4
|
|
|
|
#define ORC_TYPE_UNDEFINED 0
|
|
#define ORC_TYPE_END_OF_STACK 1
|
|
#define ORC_TYPE_CALL 2
|
|
#define ORC_TYPE_REGS 3
|
|
#define ORC_TYPE_REGS_PARTIAL 4
|
|
|
|
#ifndef __ASSEMBLY__
|
|
/*
|
|
* This struct is more or less a vastly simplified version of the DWARF Call
|
|
* Frame Information standard. It contains only the necessary parts of DWARF
|
|
* CFI, simplified for ease of access by the in-kernel unwinder. It tells the
|
|
* unwinder how to find the previous SP and FP (and sometimes entry regs) on
|
|
* the stack for a given code address. Each instance of the struct corresponds
|
|
* to one or more code locations.
|
|
*/
|
|
struct orc_entry {
|
|
s16 sp_offset;
|
|
s16 fp_offset;
|
|
s16 ra_offset;
|
|
unsigned int sp_reg:4;
|
|
unsigned int fp_reg:4;
|
|
unsigned int ra_reg:4;
|
|
unsigned int type:3;
|
|
unsigned int signal:1;
|
|
};
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
#endif /* _ORC_TYPES_H */
|