From 334e83efd7bf13fec2e92832a21e09f066b9fc92 Mon Sep 17 00:00:00 2001 From: mio Date: Sun, 13 Apr 2025 11:49:05 +0800 Subject: [PATCH] fix static variables used in m68k --- qemu/target/m68k/cpu.h | 3 +++ qemu/target/m68k/translate.c | 16 +++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/qemu/target/m68k/cpu.h b/qemu/target/m68k/cpu.h index 263a3d07..cc2c50e4 100644 --- a/qemu/target/m68k/cpu.h +++ b/qemu/target/m68k/cpu.h @@ -147,6 +147,9 @@ typedef struct CPUM68KState { /* Fields from here on are preserved across CPU reset. */ uint32_t features; + // translate opcode + void* opcode_table[65536]; + // Unicorn engine struct uc_struct *uc; } CPUM68KState; diff --git a/qemu/target/m68k/translate.c b/qemu/target/m68k/translate.c index 5d0fa749..5b9a74ce 100644 --- a/qemu/target/m68k/translate.c +++ b/qemu/target/m68k/translate.c @@ -5996,10 +5996,8 @@ DISAS_INSN(to_mext) gen_helper_set_mac_extu(tcg_ctx, tcg_ctx->cpu_env, val, acc); } -static disas_proc opcode_table[65536]; - static void -register_opcode (disas_proc proc, uint16_t opcode, uint16_t mask) +register_opcode (CPUM68KState *env, disas_proc proc, uint16_t opcode, uint16_t mask) { int i; int from; @@ -6029,7 +6027,7 @@ register_opcode (disas_proc proc, uint16_t opcode, uint16_t mask) to = from + i; for (i = from; i < to; i++) { if ((i & mask) == opcode) - opcode_table[i] = proc; + env->opcode_table[i] = proc; } } @@ -6043,16 +6041,16 @@ void register_m68k_insns (CPUM68KState *env) * Build the opcode table only once to avoid * multithreading issues. */ - if (opcode_table[0] != NULL) { - return; - } + // if (opcode_table[0] != NULL) { + // return; + // } /* * use BASE() for instruction available * for CF_ISA_A and M68000. */ #define BASE(name, opcode, mask) \ - register_opcode(disas_##name, 0x##opcode, 0x##mask) + register_opcode(env, disas_##name, 0x##opcode, 0x##mask) #define INSN(name, opcode, mask, feature) do { \ if (m68k_feature(env, M68K_FEATURE_##feature)) \ BASE(name, opcode, mask); \ @@ -6344,7 +6342,7 @@ static void m68k_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu) insn = read_im16(env, dc); - opcode_table[insn](env, dc, insn); + ((disas_proc)env->opcode_table[insn])(env, dc, insn); do_writebacks(dc); do_release(dc);