Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'pull-tcg-20230116' of https://gitlab.com/rth7680/qemu into…
… staging - Reorg cpu_tb_exec around setjmp. - Use __attribute__((target)) for buffer_is_zero. - Add perfmap and jitdump for perf support. # -----BEGIN PGP SIGNATURE----- # # iQFRBAABCgA7FiEEekgeeIaLTbaoWgXAZN846K9+IV8FAmPFtXgdHHJpY2hhcmQu # aGVuZGVyc29uQGxpbmFyby5vcmcACgkQZN846K9+IV+62Af/YLdd77+IO8wcPN1n # 2esKNlrrYQ2/x40Hede6L4pp+Qz6M810YgNbhMchBS3u8YGIFzmVLaiz5N4nBGTq # ricOit6Jj2KonlxWaxgma1BW36ydBIwphC20WjrLTVgdNGvxmy4JKbfklTd4oIZ+ # +Kf1VTN1bbt7vfDntd454ck2rhtVZBEvYTynikA3LJ1W7EVN5etDUnrN3VwbaTTK # 0aY8MbDfGUASyrDzmaRcF5F90K+V2STuEUs1whgOuTBusZ6n3+FSDhW8CuDhsy/l # rXtPkQba3rtUWfJ1+o7bx3Gg4nbfn/9lxIfGwhQ79ywD9InjqLqu9etwVyhijx+n # k+tvPw== # =xFfF # -----END PGP SIGNATURE----- # gpg: Signature made Mon 16 Jan 2023 20:37:12 GMT # gpg: using RSA key 7A481E78868B4DB6A85A05C064DF38E8AF7E215F # gpg: issuer "richard.henderson@linaro.org" # gpg: Good signature from "Richard Henderson <richard.henderson@linaro.org>" [full] # Primary key fingerprint: 7A48 1E78 868B 4DB6 A85A 05C0 64DF 38E8 AF7E 215F * tag 'pull-tcg-20230116' of https://gitlab.com/rth7680/qemu: accel/tcg: Split out cpu_exec_{setjmp,loop} util/bufferiszero: Use __attribute__((target)) for avx2/avx512 tcg: add perfmap and jitdump accel/tcg: Add debuginfo support linux-user: Clean up when exiting due to a signal Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
- Loading branch information
Showing
19 changed files
with
763 additions
and
101 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,96 @@ | ||
/* | ||
* Debug information support. | ||
* | ||
* SPDX-License-Identifier: GPL-2.0-or-later | ||
*/ | ||
|
||
#include "qemu/osdep.h" | ||
#include "qemu/lockable.h" | ||
|
||
#include <elfutils/libdwfl.h> | ||
|
||
#include "debuginfo.h" | ||
|
||
static QemuMutex lock; | ||
static Dwfl *dwfl; | ||
static const Dwfl_Callbacks dwfl_callbacks = { | ||
.find_elf = NULL, | ||
.find_debuginfo = dwfl_standard_find_debuginfo, | ||
.section_address = NULL, | ||
.debuginfo_path = NULL, | ||
}; | ||
|
||
__attribute__((constructor)) | ||
static void debuginfo_init(void) | ||
{ | ||
qemu_mutex_init(&lock); | ||
} | ||
|
||
void debuginfo_report_elf(const char *name, int fd, uint64_t bias) | ||
{ | ||
QEMU_LOCK_GUARD(&lock); | ||
|
||
if (dwfl) { | ||
dwfl_report_begin_add(dwfl); | ||
} else { | ||
dwfl = dwfl_begin(&dwfl_callbacks); | ||
} | ||
|
||
if (dwfl) { | ||
dwfl_report_elf(dwfl, name, name, fd, bias, true); | ||
dwfl_report_end(dwfl, NULL, NULL); | ||
} | ||
} | ||
|
||
void debuginfo_lock(void) | ||
{ | ||
qemu_mutex_lock(&lock); | ||
} | ||
|
||
void debuginfo_query(struct debuginfo_query *q, size_t n) | ||
{ | ||
const char *symbol, *file; | ||
Dwfl_Module *dwfl_module; | ||
Dwfl_Line *dwfl_line; | ||
GElf_Off dwfl_offset; | ||
GElf_Sym dwfl_sym; | ||
size_t i; | ||
int line; | ||
|
||
if (!dwfl) { | ||
return; | ||
} | ||
|
||
for (i = 0; i < n; i++) { | ||
dwfl_module = dwfl_addrmodule(dwfl, q[i].address); | ||
if (!dwfl_module) { | ||
continue; | ||
} | ||
|
||
if (q[i].flags & DEBUGINFO_SYMBOL) { | ||
symbol = dwfl_module_addrinfo(dwfl_module, q[i].address, | ||
&dwfl_offset, &dwfl_sym, | ||
NULL, NULL, NULL); | ||
if (symbol) { | ||
q[i].symbol = symbol; | ||
q[i].offset = dwfl_offset; | ||
} | ||
} | ||
|
||
if (q[i].flags & DEBUGINFO_LINE) { | ||
dwfl_line = dwfl_module_getsrc(dwfl_module, q[i].address); | ||
if (dwfl_line) { | ||
file = dwfl_lineinfo(dwfl_line, NULL, &line, 0, NULL, NULL); | ||
if (file) { | ||
q[i].file = file; | ||
q[i].line = line; | ||
} | ||
} | ||
} | ||
} | ||
} | ||
|
||
void debuginfo_unlock(void) | ||
{ | ||
qemu_mutex_unlock(&lock); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
/* | ||
* Debug information support. | ||
* | ||
* SPDX-License-Identifier: GPL-2.0-or-later | ||
*/ | ||
|
||
#ifndef ACCEL_TCG_DEBUGINFO_H | ||
#define ACCEL_TCG_DEBUGINFO_H | ||
|
||
/* | ||
* 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.