2023-01-12 18:20:12 +03:00
|
|
|
/*
|
|
|
|
* Debug information support.
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
*/
|
|
|
|
|
2024-01-25 08:46:30 +03:00
|
|
|
#ifndef TCG_DEBUGINFO_H
|
|
|
|
#define TCG_DEBUGINFO_H
|
2023-01-12 18:20:12 +03:00
|
|
|
|
2022-12-21 16:14:34 +03:00
|
|
|
#include "qemu/bitops.h"
|
|
|
|
|
2023-01-12 18:20:12 +03:00
|
|
|
/*
|
|
|
|
* Debuginfo describing a certain address.
|
|
|
|
*/
|
|
|
|
struct debuginfo_query {
|
|
|
|
uint64_t address; /* Input: address. */
|
|
|
|
int flags; /* Input: debuginfo subset. */
|
|
|
|
const char *symbol; /* Symbol that the address is part of. */
|
|
|
|
uint64_t offset; /* Offset from the symbol. */
|
|
|
|
const char *file; /* Source file associated with the address. */
|
|
|
|
int line; /* Line number in the source file. */
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Debuginfo subsets.
|
|
|
|
*/
|
|
|
|
#define DEBUGINFO_SYMBOL BIT(1)
|
|
|
|
#define DEBUGINFO_LINE BIT(2)
|
|
|
|
|
|
|
|
#if defined(CONFIG_TCG) && defined(CONFIG_LIBDW)
|
|
|
|
/*
|
|
|
|
* Load debuginfo for the specified guest ELF image.
|
|
|
|
* Return true on success, false on failure.
|
|
|
|
*/
|
|
|
|
void debuginfo_report_elf(const char *name, int fd, uint64_t bias);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Take the debuginfo lock.
|
|
|
|
*/
|
|
|
|
void debuginfo_lock(void);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Fill each on N Qs with the debuginfo about Q->ADDRESS as specified by
|
|
|
|
* Q->FLAGS:
|
|
|
|
*
|
|
|
|
* - DEBUGINFO_SYMBOL: update Q->SYMBOL and Q->OFFSET. If symbol debuginfo is
|
|
|
|
* missing, then leave them as is.
|
|
|
|
* - DEBUINFO_LINE: update Q->FILE and Q->LINE. If line debuginfo is missing,
|
|
|
|
* then leave them as is.
|
|
|
|
*
|
|
|
|
* This function must be called under the debuginfo lock. The results can be
|
|
|
|
* accessed only until the debuginfo lock is released.
|
|
|
|
*/
|
|
|
|
void debuginfo_query(struct debuginfo_query *q, size_t n);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Release the debuginfo lock.
|
|
|
|
*/
|
|
|
|
void debuginfo_unlock(void);
|
|
|
|
#else
|
|
|
|
static inline void debuginfo_report_elf(const char *image_name, int image_fd,
|
|
|
|
uint64_t load_bias)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void debuginfo_lock(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void debuginfo_query(struct debuginfo_query *q, size_t n)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void debuginfo_unlock(void)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|