mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-12-24 04:55:38 +00:00
3dddb8564f
Usually the logging of the CPU state produced by -d cpu is sufficient to diagnose problems, but sometimes you want to see the state of the floating point registers as well. We don't want to enable that by default as it adds a lot of extra data to the log; instead, allow it to be optionally enabled via -d fpu. Backports relevant parts of commit ae7651804748c6b479d5ae09aeac4edb9c44f76e from qemu
132 lines
3.5 KiB
C
132 lines
3.5 KiB
C
#ifndef QEMU_LOG_H
|
|
#define QEMU_LOG_H
|
|
|
|
#include <stdarg.h>
|
|
#include "unicorn/platform.h"
|
|
#include "qemu/compiler.h"
|
|
#include "qom/cpu.h"
|
|
|
|
/* Private global variables, don't use */
|
|
extern FILE *qemu_logfile;
|
|
extern int qemu_loglevel;
|
|
|
|
/* Log settings checking macros: */
|
|
|
|
/* Returns true if qemu_log() will really write somewhere
|
|
*/
|
|
static inline bool qemu_log_enabled(void)
|
|
{
|
|
return qemu_logfile != NULL;
|
|
}
|
|
|
|
#define CPU_LOG_TB_OUT_ASM (1 << 0)
|
|
#define CPU_LOG_TB_IN_ASM (1 << 1)
|
|
#define CPU_LOG_TB_OP (1 << 2)
|
|
#define CPU_LOG_TB_OP_OPT (1 << 3)
|
|
#define CPU_LOG_INT (1 << 4)
|
|
#define CPU_LOG_EXEC (1 << 5)
|
|
#define CPU_LOG_PCALL (1 << 6)
|
|
#define CPU_LOG_IOPORT (1 << 7)
|
|
#define CPU_LOG_TB_CPU (1 << 8)
|
|
#define CPU_LOG_RESET (1 << 9)
|
|
#define LOG_UNIMP (1 << 10)
|
|
#define LOG_GUEST_ERROR (1 << 11)
|
|
#define CPU_LOG_MMU (1 << 12)
|
|
#define CPU_LOG_TB_NOCHAIN (1 << 13)
|
|
#define CPU_LOG_PAGE (1 << 14)
|
|
#define LOG_TRACE (1 << 15)
|
|
#define CPU_LOG_TB_OP_IND (1 << 16)
|
|
#define CPU_LOG_TB_FPU (1 << 17)
|
|
|
|
/* Returns true if a bit is set in the current loglevel mask
|
|
*/
|
|
static inline bool qemu_loglevel_mask(int mask)
|
|
{
|
|
return (qemu_loglevel & mask) != 0;
|
|
}
|
|
|
|
/* Logging functions: */
|
|
|
|
/* main logging function
|
|
*/
|
|
int GCC_FMT_ATTR(1, 2) qemu_log(const char *fmt, ...);
|
|
|
|
/* vfprintf-like logging function
|
|
*/
|
|
static inline void GCC_FMT_ATTR(1, 0)
|
|
qemu_log_vprintf(const char *fmt, va_list va)
|
|
{
|
|
if (qemu_logfile) {
|
|
vfprintf(qemu_logfile, fmt, va);
|
|
}
|
|
}
|
|
|
|
/* log only if a bit is set on the current loglevel mask:
|
|
* @mask: bit to check in the mask
|
|
* @fmt: printf-style format string
|
|
* @args: optional arguments for format string
|
|
*/
|
|
#define qemu_log_mask(MASK, FMT, ...) \
|
|
do { \
|
|
if (unlikely(qemu_loglevel_mask(MASK))) { \
|
|
qemu_log(FMT, ## __VA_ARGS__); \
|
|
} \
|
|
} while (0)
|
|
|
|
/* log only if a bit is set on the current loglevel mask
|
|
* and we are in the address range we care about:
|
|
* @mask: bit to check in the mask
|
|
* @addr: address to check in dfilter
|
|
* @fmt: printf-style format string
|
|
* @args: optional arguments for format string
|
|
*/
|
|
#define qemu_log_mask_and_addr(MASK, ADDR, FMT, ...) \
|
|
do { \
|
|
if (unlikely(qemu_loglevel_mask(MASK)) && \
|
|
qemu_log_in_addr_range(ADDR)) { \
|
|
qemu_log(FMT, ## __VA_ARGS__); \
|
|
} \
|
|
} while (0)
|
|
|
|
/* Special cases: */
|
|
|
|
/* cpu_dump_state() logging functions: */
|
|
/**
|
|
* log_cpu_state:
|
|
* @cpu: The CPU whose state is to be logged.
|
|
* @flags: Flags what to log.
|
|
*
|
|
* Logs the output of cpu_dump_state().
|
|
*/
|
|
static inline void log_cpu_state(CPUState *cpu, int flags)
|
|
{
|
|
if (qemu_log_enabled()) {
|
|
cpu_dump_state(cpu, qemu_logfile, fprintf, flags);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* log_cpu_state_mask:
|
|
* @mask: Mask when to log.
|
|
* @cpu: The CPU whose state is to be logged.
|
|
* @flags: Flags what to log.
|
|
*
|
|
* Logs the output of cpu_dump_state() if loglevel includes @mask.
|
|
*/
|
|
static inline void log_cpu_state_mask(int mask, CPUState *cpu, int flags)
|
|
{
|
|
if (qemu_loglevel & mask) {
|
|
log_cpu_state(cpu, flags);
|
|
}
|
|
}
|
|
|
|
void qemu_set_dfilter_ranges(const char *ranges);
|
|
bool qemu_log_in_addr_range(uint64_t addr);
|
|
|
|
/* fflush() the log file */
|
|
void qemu_log_flush(void);
|
|
/* Close the log file */
|
|
void qemu_log_close(void);
|
|
|
|
#endif
|