From 3da7d9d9ae95c50beccea698acb8507a592c0030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Benn=C3=A9e?= Date: Thu, 22 Feb 2018 10:05:12 -0500 Subject: [PATCH] qemu-log: dfilter-ise exec, out_asm, op and opt_op qemu-log: dfilter-ise exec, out_asm, op and opt_op This ensures the code generation debug code will honour -dfilter if set. For the "exec" tracing I've added a new inline macro for efficiency's sake. Backports commit d977e1c2dbc9e63454b2000f91954d02543bf43b from qemu --- qemu/cpu-exec.c | 14 +++++++------- qemu/include/exec/exec-all.h | 8 +++++--- qemu/include/qemu/log.h | 15 +++++++++++++++ qemu/tcg/tcg.c | 6 ++++-- qemu/translate-all.c | 3 ++- 5 files changed, 33 insertions(+), 13 deletions(-) diff --git a/qemu/cpu-exec.c b/qemu/cpu-exec.c index b52fdcd2..fc147a14 100644 --- a/qemu/cpu-exec.c +++ b/qemu/cpu-exec.c @@ -284,9 +284,9 @@ static inline tcg_target_ulong cpu_tb_exec(CPUState *cpu, TranslationBlock *itb) uint8_t *tb_ptr = itb->tc_ptr; // Unicorn: commented out - //qemu_log_mask(CPU_LOG_EXEC, "Trace %p [" TARGET_FMT_lx "] %s\n", - // itb->tc_ptr, itb->pc, lookup_symbol(itb->pc)); - + //qemu_log_mask_and_addr(CPU_LOG_EXEC, itb->pc, + // "Trace %p [" TARGET_FMT_lx "] %s\n", + // itb->tc_ptr, itb->pc, lookup_symbol(itb->pc)); next_tb = tcg_qemu_tb_exec(env, tb_ptr); if ((next_tb & TB_EXIT_MASK) > TB_EXIT_IDX1) { @@ -297,10 +297,10 @@ static inline tcg_target_ulong cpu_tb_exec(CPUState *cpu, TranslationBlock *itb) CPUClass *cc = CPU_GET_CLASS(env->uc, cpu); TranslationBlock *tb = (TranslationBlock *)(next_tb & ~TB_EXIT_MASK); // Unicorn: commented out - //qemu_log_mask(CPU_LOG_EXEC, - // "Stopped execution of TB chain before %p [" - // TARGET_FMT_lx "] %s\n", - // itb->tc_ptr, itb->pc, lookup_symbol(itb->pc)); + //qemu_log_mask_and_addr(CPU_LOG_EXEC, itb->pc, + // "Stopped execution of TB chain before %p [" + // TARGET_FMT_lx "] %s\n", + // itb->tc_ptr, itb->pc, lookup_symbol(itb->pc)); if (cc->synchronize_from_tb) { // avoid sync twice when helper_uc_tracecode() already did this. if (env->uc->emu_counter <= env->uc->emu_count && diff --git a/qemu/include/exec/exec-all.h b/qemu/include/exec/exec-all.h index d6456202..f0b36e7b 100644 --- a/qemu/include/exec/exec-all.h +++ b/qemu/include/exec/exec-all.h @@ -373,9 +373,11 @@ static inline void tb_add_jump(TranslationBlock *tb, int n, { /* NOTE: this test is only needed for thread safety */ if (!tb->jmp_next[n]) { - qemu_log_mask(CPU_LOG_EXEC, "Linking TBs %p [" TARGET_FMT_lx - "] index %d -> %p [" TARGET_FMT_lx "]\n", - tb->tc_ptr, tb->pc, n, tb_next->tc_ptr, tb_next->pc); + qemu_log_mask_and_addr(CPU_LOG_EXEC, tb->pc, + "Linking TBs %p [" TARGET_FMT_lx + "] index %d -> %p [" TARGET_FMT_lx "]\n", + tb->tc_ptr, tb->pc, n, + tb_next->tc_ptr, tb_next->pc); /* patch the native jump address */ tb_set_jmp_target(tb, n, (uintptr_t)tb_next->tc_ptr); diff --git a/qemu/include/qemu/log.h b/qemu/include/qemu/log.h index ceb442a4..1fae5feb 100644 --- a/qemu/include/qemu/log.h +++ b/qemu/include/qemu/log.h @@ -74,6 +74,21 @@ qemu_log_vprintf(const char *fmt, va_list va) } \ } 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: */ diff --git a/qemu/tcg/tcg.c b/qemu/tcg/tcg.c index 0afd3dfe..2454e56f 100644 --- a/qemu/tcg/tcg.c +++ b/qemu/tcg/tcg.c @@ -2402,7 +2402,8 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb) #endif #ifdef DEBUG_DISAS - if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP))) { + if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP) + && qemu_log_in_addr_range(tb->pc))) { qemu_log("OP:\n"); tcg_dump_ops(s); qemu_log("\n"); @@ -2429,7 +2430,8 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb) #endif #ifdef DEBUG_DISAS - if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP_OPT))) { + if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP_OPT) + && qemu_log_in_addr_range(tb->pc))) { qemu_log("OP after optimization and liveness analysis:\n"); tcg_dump_ops(s); qemu_log("\n"); diff --git a/qemu/translate-all.c b/qemu/translate-all.c index 5165f1fe..58129451 100644 --- a/qemu/translate-all.c +++ b/qemu/translate-all.c @@ -1254,7 +1254,8 @@ TranslationBlock *tb_gen_code(CPUState *cpu, /* UNICORN: Commented out #ifdef DEBUG_DISAS - if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM)) { + if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM) && + qemu_log_in_addr_range(tb->pc)) { qemu_log("OUT: [size=%d]\n", gen_code_size); log_disas(tb->tc_ptr, gen_code_size); qemu_log("\n");