mirror of https://github.com/xemu-project/xemu.git
exec/translator: Pass the locked filepointer to disas_log hook
We have fetched and locked the logfile in translator_loop. Pass the filepointer down to the disas_log hook so that it need not be fetched and locked again. Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20220417183019.755276-13-richard.henderson@linaro.org>
This commit is contained in:
parent
b7a83ff8df
commit
8eb806a763
|
@ -142,7 +142,7 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
|
|||
FILE *logfile = qemu_log_trylock();
|
||||
if (logfile) {
|
||||
fprintf(logfile, "----------------\n");
|
||||
ops->disas_log(db, cpu);
|
||||
ops->disas_log(db, cpu, logfile);
|
||||
fprintf(logfile, "\n");
|
||||
qemu_log_unlock(logfile);
|
||||
}
|
||||
|
|
|
@ -118,7 +118,7 @@ typedef struct TranslatorOps {
|
|||
void (*insn_start)(DisasContextBase *db, CPUState *cpu);
|
||||
void (*translate_insn)(DisasContextBase *db, CPUState *cpu);
|
||||
void (*tb_stop)(DisasContextBase *db, CPUState *cpu);
|
||||
void (*disas_log)(const DisasContextBase *db, CPUState *cpu);
|
||||
void (*disas_log)(const DisasContextBase *db, CPUState *cpu, FILE *f);
|
||||
} TranslatorOps;
|
||||
|
||||
/**
|
||||
|
|
|
@ -3027,10 +3027,11 @@ static void alpha_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
|
|||
}
|
||||
}
|
||||
|
||||
static void alpha_tr_disas_log(const DisasContextBase *dcbase, CPUState *cpu)
|
||||
static void alpha_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cpu, FILE *logfile)
|
||||
{
|
||||
qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
log_target_disas(cpu, dcbase->pc_first, dcbase->tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
|
||||
}
|
||||
|
||||
static const TranslatorOps alpha_tr_ops = {
|
||||
|
|
|
@ -14967,12 +14967,12 @@ static void aarch64_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
|
|||
}
|
||||
|
||||
static void aarch64_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cpu)
|
||||
CPUState *cpu, FILE *logfile)
|
||||
{
|
||||
DisasContext *dc = container_of(dcbase, DisasContext, base);
|
||||
|
||||
qemu_log("IN: %s\n", lookup_symbol(dc->base.pc_first));
|
||||
log_target_disas(cpu, dc->base.pc_first, dc->base.tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dc->base.pc_first));
|
||||
target_disas(logfile, cpu, dc->base.pc_first, dc->base.tb->size);
|
||||
}
|
||||
|
||||
const TranslatorOps aarch64_translator_ops = {
|
||||
|
|
|
@ -9891,12 +9891,13 @@ static void arm_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
|
|||
}
|
||||
}
|
||||
|
||||
static void arm_tr_disas_log(const DisasContextBase *dcbase, CPUState *cpu)
|
||||
static void arm_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cpu, FILE *logfile)
|
||||
{
|
||||
DisasContext *dc = container_of(dcbase, DisasContext, base);
|
||||
|
||||
qemu_log("IN: %s\n", lookup_symbol(dc->base.pc_first));
|
||||
log_target_disas(cpu, dc->base.pc_first, dc->base.tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dc->base.pc_first));
|
||||
target_disas(logfile, cpu, dc->base.pc_first, dc->base.tb->size);
|
||||
}
|
||||
|
||||
static const TranslatorOps arm_translator_ops = {
|
||||
|
|
|
@ -3015,10 +3015,11 @@ static void avr_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
|
|||
}
|
||||
}
|
||||
|
||||
static void avr_tr_disas_log(const DisasContextBase *dcbase, CPUState *cs)
|
||||
static void avr_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cs, FILE *logfile)
|
||||
{
|
||||
qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
log_target_disas(cs, dcbase->pc_first, dcbase->tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
target_disas(logfile, cs, dcbase->pc_first, dcbase->tb->size);
|
||||
}
|
||||
|
||||
static const TranslatorOps avr_tr_ops = {
|
||||
|
|
|
@ -3268,11 +3268,12 @@ static void cris_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
|
|||
}
|
||||
}
|
||||
|
||||
static void cris_tr_disas_log(const DisasContextBase *dcbase, CPUState *cpu)
|
||||
static void cris_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cpu, FILE *logfile)
|
||||
{
|
||||
if (!DISAS_CRIS) {
|
||||
qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
log_target_disas(cpu, dcbase->pc_first, dcbase->tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -833,10 +833,11 @@ static void hexagon_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
|
|||
}
|
||||
}
|
||||
|
||||
static void hexagon_tr_disas_log(const DisasContextBase *dcbase, CPUState *cpu)
|
||||
static void hexagon_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cpu, FILE *logfile)
|
||||
{
|
||||
qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
log_target_disas(cpu, dcbase->pc_first, dcbase->tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -4305,29 +4305,30 @@ static void hppa_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
|
|||
}
|
||||
}
|
||||
|
||||
static void hppa_tr_disas_log(const DisasContextBase *dcbase, CPUState *cs)
|
||||
static void hppa_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cs, FILE *logfile)
|
||||
{
|
||||
target_ulong pc = dcbase->pc_first;
|
||||
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
switch (pc) {
|
||||
case 0x00:
|
||||
qemu_log("IN:\n0x00000000: (null)\n");
|
||||
fprintf(logfile, "IN:\n0x00000000: (null)\n");
|
||||
return;
|
||||
case 0xb0:
|
||||
qemu_log("IN:\n0x000000b0: light-weight-syscall\n");
|
||||
fprintf(logfile, "IN:\n0x000000b0: light-weight-syscall\n");
|
||||
return;
|
||||
case 0xe0:
|
||||
qemu_log("IN:\n0x000000e0: set-thread-pointer-syscall\n");
|
||||
fprintf(logfile, "IN:\n0x000000e0: set-thread-pointer-syscall\n");
|
||||
return;
|
||||
case 0x100:
|
||||
qemu_log("IN:\n0x00000100: syscall\n");
|
||||
fprintf(logfile, "IN:\n0x00000100: syscall\n");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
qemu_log("IN: %s\n", lookup_symbol(pc));
|
||||
log_target_disas(cs, pc, dcbase->tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(pc));
|
||||
target_disas(logfile, cs, pc, dcbase->tb->size);
|
||||
}
|
||||
|
||||
static const TranslatorOps hppa_tr_ops = {
|
||||
|
|
|
@ -8690,12 +8690,12 @@ static void i386_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
|
|||
}
|
||||
|
||||
static void i386_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cpu)
|
||||
CPUState *cpu, FILE *logfile)
|
||||
{
|
||||
DisasContext *dc = container_of(dcbase, DisasContext, base);
|
||||
|
||||
qemu_log("IN: %s\n", lookup_symbol(dc->base.pc_first));
|
||||
log_target_disas(cpu, dc->base.pc_first, dc->base.tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dc->base.pc_first));
|
||||
target_disas(logfile, cpu, dc->base.pc_first, dc->base.tb->size);
|
||||
}
|
||||
|
||||
static const TranslatorOps i386_tr_ops = {
|
||||
|
|
|
@ -6257,10 +6257,11 @@ static void m68k_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
|
|||
}
|
||||
}
|
||||
|
||||
static void m68k_tr_disas_log(const DisasContextBase *dcbase, CPUState *cpu)
|
||||
static void m68k_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cpu, FILE *logfile)
|
||||
{
|
||||
qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
log_target_disas(cpu, dcbase->pc_first, dcbase->tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
|
||||
}
|
||||
|
||||
static const TranslatorOps m68k_tr_ops = {
|
||||
|
|
|
@ -1833,10 +1833,11 @@ static void mb_tr_tb_stop(DisasContextBase *dcb, CPUState *cs)
|
|||
}
|
||||
}
|
||||
|
||||
static void mb_tr_disas_log(const DisasContextBase *dcb, CPUState *cs)
|
||||
static void mb_tr_disas_log(const DisasContextBase *dcb,
|
||||
CPUState *cs, FILE *logfile)
|
||||
{
|
||||
qemu_log("IN: %s\n", lookup_symbol(dcb->pc_first));
|
||||
log_target_disas(cs, dcb->pc_first, dcb->tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dcb->pc_first));
|
||||
target_disas(logfile, cs, dcb->pc_first, dcb->tb->size);
|
||||
}
|
||||
|
||||
static const TranslatorOps mb_tr_ops = {
|
||||
|
|
|
@ -16141,10 +16141,11 @@ static void mips_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
|
|||
}
|
||||
}
|
||||
|
||||
static void mips_tr_disas_log(const DisasContextBase *dcbase, CPUState *cs)
|
||||
static void mips_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cs, FILE *logfile)
|
||||
{
|
||||
qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
log_target_disas(cs, dcbase->pc_first, dcbase->tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
target_disas(logfile, cs, dcbase->pc_first, dcbase->tb->size);
|
||||
}
|
||||
|
||||
static const TranslatorOps mips_tr_ops = {
|
||||
|
|
|
@ -833,10 +833,11 @@ static void nios2_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
|
|||
}
|
||||
}
|
||||
|
||||
static void nios2_tr_disas_log(const DisasContextBase *dcbase, CPUState *cpu)
|
||||
static void nios2_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cpu, FILE *logfile)
|
||||
{
|
||||
qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
log_target_disas(cpu, dcbase->pc_first, dcbase->tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
|
||||
}
|
||||
|
||||
static const TranslatorOps nios2_tr_ops = {
|
||||
|
|
|
@ -1687,12 +1687,13 @@ static void openrisc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
|
|||
}
|
||||
}
|
||||
|
||||
static void openrisc_tr_disas_log(const DisasContextBase *dcbase, CPUState *cs)
|
||||
static void openrisc_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cs, FILE *logfile)
|
||||
{
|
||||
DisasContext *s = container_of(dcbase, DisasContext, base);
|
||||
|
||||
qemu_log("IN: %s\n", lookup_symbol(s->base.pc_first));
|
||||
log_target_disas(cs, s->base.pc_first, s->base.tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(s->base.pc_first));
|
||||
target_disas(logfile, cs, s->base.pc_first, s->base.tb->size);
|
||||
}
|
||||
|
||||
static const TranslatorOps openrisc_tr_ops = {
|
||||
|
|
|
@ -7769,10 +7769,11 @@ static void ppc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
|
|||
}
|
||||
}
|
||||
|
||||
static void ppc_tr_disas_log(const DisasContextBase *dcbase, CPUState *cs)
|
||||
static void ppc_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cs, FILE *logfile)
|
||||
{
|
||||
qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
log_target_disas(cs, dcbase->pc_first, dcbase->tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
target_disas(logfile, cs, dcbase->pc_first, dcbase->tb->size);
|
||||
}
|
||||
|
||||
static const TranslatorOps ppc_tr_ops = {
|
||||
|
|
|
@ -1155,18 +1155,20 @@ static void riscv_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
|
|||
}
|
||||
}
|
||||
|
||||
static void riscv_tr_disas_log(const DisasContextBase *dcbase, CPUState *cpu)
|
||||
static void riscv_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cpu, FILE *logfile)
|
||||
{
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
RISCVCPU *rvcpu = RISCV_CPU(cpu);
|
||||
CPURISCVState *env = &rvcpu->env;
|
||||
#endif
|
||||
|
||||
qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
qemu_log("Priv: "TARGET_FMT_ld"; Virt: "TARGET_FMT_ld"\n", env->priv, env->virt);
|
||||
fprintf(logfile, "Priv: "TARGET_FMT_ld"; Virt: "TARGET_FMT_ld"\n",
|
||||
env->priv, env->virt);
|
||||
#endif
|
||||
log_target_disas(cpu, dcbase->pc_first, dcbase->tb->size);
|
||||
target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
|
||||
}
|
||||
|
||||
static const TranslatorOps riscv_tr_ops = {
|
||||
|
|
|
@ -2342,10 +2342,11 @@ static void rx_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
|
|||
}
|
||||
}
|
||||
|
||||
static void rx_tr_disas_log(const DisasContextBase *dcbase, CPUState *cs)
|
||||
static void rx_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cs, FILE *logfile)
|
||||
{
|
||||
qemu_log("IN:\n"); /* , lookup_symbol(dcbase->pc_first)); */
|
||||
log_target_disas(cs, dcbase->pc_first, dcbase->tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
target_disas(logfile, cs, dcbase->pc_first, dcbase->tb->size);
|
||||
}
|
||||
|
||||
static const TranslatorOps rx_tr_ops = {
|
||||
|
|
|
@ -6660,16 +6660,17 @@ static void s390x_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
|
|||
}
|
||||
}
|
||||
|
||||
static void s390x_tr_disas_log(const DisasContextBase *dcbase, CPUState *cs)
|
||||
static void s390x_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cs, FILE *logfile)
|
||||
{
|
||||
DisasContext *dc = container_of(dcbase, DisasContext, base);
|
||||
|
||||
if (unlikely(dc->ex_value)) {
|
||||
/* ??? Unfortunately log_target_disas can't use host memory. */
|
||||
qemu_log("IN: EXECUTE %016" PRIx64, dc->ex_value);
|
||||
/* ??? Unfortunately target_disas can't use host memory. */
|
||||
fprintf(logfile, "IN: EXECUTE %016" PRIx64, dc->ex_value);
|
||||
} else {
|
||||
qemu_log("IN: %s\n", lookup_symbol(dc->base.pc_first));
|
||||
log_target_disas(cs, dc->base.pc_first, dc->base.tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dc->base.pc_first));
|
||||
target_disas(logfile, cs, dc->base.pc_first, dc->base.tb->size);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2352,10 +2352,11 @@ static void sh4_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
|
|||
}
|
||||
}
|
||||
|
||||
static void sh4_tr_disas_log(const DisasContextBase *dcbase, CPUState *cs)
|
||||
static void sh4_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cs, FILE *logfile)
|
||||
{
|
||||
qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
log_target_disas(cs, dcbase->pc_first, dcbase->tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
target_disas(logfile, cs, dcbase->pc_first, dcbase->tb->size);
|
||||
}
|
||||
|
||||
static const TranslatorOps sh4_tr_ops = {
|
||||
|
|
|
@ -5901,10 +5901,11 @@ static void sparc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
|
|||
}
|
||||
}
|
||||
|
||||
static void sparc_tr_disas_log(const DisasContextBase *dcbase, CPUState *cpu)
|
||||
static void sparc_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cpu, FILE *logfile)
|
||||
{
|
||||
qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
log_target_disas(cpu, dcbase->pc_first, dcbase->tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
|
||||
}
|
||||
|
||||
static const TranslatorOps sparc_tr_ops = {
|
||||
|
|
|
@ -8861,10 +8861,11 @@ static void tricore_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
|
|||
}
|
||||
}
|
||||
|
||||
static void tricore_tr_disas_log(const DisasContextBase *dcbase, CPUState *cpu)
|
||||
static void tricore_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cpu, FILE *logfile)
|
||||
{
|
||||
qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
log_target_disas(cpu, dcbase->pc_first, dcbase->tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
|
||||
}
|
||||
|
||||
static const TranslatorOps tricore_tr_ops = {
|
||||
|
|
|
@ -1296,10 +1296,11 @@ static void xtensa_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
|
|||
}
|
||||
}
|
||||
|
||||
static void xtensa_tr_disas_log(const DisasContextBase *dcbase, CPUState *cpu)
|
||||
static void xtensa_tr_disas_log(const DisasContextBase *dcbase,
|
||||
CPUState *cpu, FILE *logfile)
|
||||
{
|
||||
qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
log_target_disas(cpu, dcbase->pc_first, dcbase->tb->size);
|
||||
fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
|
||||
target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
|
||||
}
|
||||
|
||||
static const TranslatorOps xtensa_translator_ops = {
|
||||
|
|
Loading…
Reference in New Issue