mirror of
https://github.com/JakeHillion/drgn.git
synced 2024-12-25 18:23:07 +00:00
87b7292aa5
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 commitc4fbf7e589
("libdrgn: fix for compilation error"), who did not respond. That commit reverted a single line of code to one originally written by me in commit640b1c011d
("libdrgn: embed DWARF index in DWARF info cache"). Signed-off-by: Omar Sandoval <osandov@osandov.com>
64 lines
1.3 KiB
C
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 */
|