linux/tools/arch/x86/include/asm/orc_types.h
<<
>>
Prefs
   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