drgn/libdrgn/orc.h
Omar Sandoval 87b7292aa5 Relicense drgn from GPLv3+ to LGPLv2.1+
drgn is currently licensed as GPLv3+. Part of the long term vision for
drgn is that other projects can use it as a library providing
programmatic interfaces for debugger functionality. A more permissive
license is better suited to this goal. We decided on LGPLv2.1+ as a good
balance between software freedom and permissiveness.

All contributors not employed by Meta were contacted via email and
consented to the license change. The only exception was the author of
commit c4fbf7e589 ("libdrgn: fix for compilation error"), who did not
respond. That commit reverted a single line of code to one originally
written by me in commit 640b1c011d ("libdrgn: embed DWARF index in
DWARF info cache").

Signed-off-by: Omar Sandoval <osandov@osandov.com>
2022-11-01 17:05:16 -07:00

64 lines
1.3 KiB
C

// Copyright (c) Meta Platforms, Inc. and affiliates.
// SPDX-License-Identifier: LGPL-2.1-or-later
/**
* @file
*
* ORC unwinder definitions.
*
* As of Linux v5.12, ORC is only defined for x86-64. This file assumes that the
* overall format would be the same for other architectures other than
* architecture-specific register numbers, but this may require reorganization
* if that isn't the case.
*/
#ifndef DRGN_ORC_H
#define DRGN_ORC_H
#include <stdbool.h>
#include <stdint.h>
struct drgn_orc_entry {
int16_t sp_offset;
int16_t bp_offset;
/*
* This is represented by 4 bit fields in the Linux kernel, but this is
* easier to deal with.
*/
uint16_t flags;
};
/* These correspond to UNWIND_HINT_* in the Linux kernel. */
enum {
DRGN_ORC_TYPE_CALL = 0,
DRGN_ORC_TYPE_REGS = 1,
DRGN_ORC_TYPE_REGS_PARTIAL = 2,
};
static inline int drgn_orc_sp_reg(const struct drgn_orc_entry *orc)
{
return orc->flags & 0xf;
}
static inline int drgn_orc_bp_reg(const struct drgn_orc_entry *orc)
{
return (orc->flags >> 4) & 0xf;
}
static inline int drgn_orc_type(const struct drgn_orc_entry *orc)
{
return (orc->flags >> 8) & 0x3;
}
static inline bool drgn_orc_is_end(const struct drgn_orc_entry *orc)
{
return orc->flags & 0x400;
}
static inline bool drgn_orc_flags_is_terminator(uint16_t flags)
{
return (flags & 0x40f) == 0;
}
#endif /* DRGN_ORC_H */