diff --git a/qemu/target-m68k/cpu.c b/qemu/target-m68k/cpu.c index 97d46d9a..e0dc9453 100644 --- a/qemu/target-m68k/cpu.c +++ b/qemu/target-m68k/cpu.c @@ -254,8 +254,6 @@ static void m68k_cpu_class_init(struct uc_struct *uc, ObjectClass *c, void *data #else cc->get_phys_page_debug = m68k_cpu_get_phys_page_debug; #endif - cc->cpu_exec_enter = m68k_cpu_exec_enter; - cc->cpu_exec_exit = m68k_cpu_exec_exit; } static void register_cpu_type(void *opaque, const M68kCPUInfo *info) diff --git a/qemu/target-m68k/cpu.h b/qemu/target-m68k/cpu.h index 8bc819c4..88558235 100644 --- a/qemu/target-m68k/cpu.h +++ b/qemu/target-m68k/cpu.h @@ -63,6 +63,7 @@ #define EXCP_HALT_INSN 0x101 #define NB_MMU_MODES 2 +#define TARGET_INSN_START_EXTRA_WORDS 1 typedef struct CPUM68KState { uint32_t dregs[8]; @@ -154,9 +155,6 @@ hwaddr m68k_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); int m68k_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg); int m68k_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); -void m68k_cpu_exec_enter(CPUState *cs); -void m68k_cpu_exec_exit(CPUState *cs); - void m68k_tcg_init(struct uc_struct *uc); M68kCPU *cpu_m68k_init(struct uc_struct *uc, const char *cpu_model); int cpu_m68k_exec(struct uc_struct *uc, CPUState *cpu); diff --git a/qemu/target-m68k/helper.c b/qemu/target-m68k/helper.c index 20dfa0a6..331d254b 100644 --- a/qemu/target-m68k/helper.c +++ b/qemu/target-m68k/helper.c @@ -836,23 +836,3 @@ void HELPER(set_mac_extu)(CPUM68KState *env, uint32_t val, uint32_t acc) res |= (uint64_t)(val & 0xffff0000) << 16; env->macc[acc + 1] = res; } - -void m68k_cpu_exec_enter(CPUState *cs) -{ - M68kCPU *cpu = M68K_CPU(cs->uc, cs); - CPUM68KState *env = &cpu->env; - - env->cc_op = CC_OP_FLAGS; - env->cc_dest = env->sr & 0xf; - env->cc_x = (env->sr >> 4) & 1; -} - -void m68k_cpu_exec_exit(CPUState *cs) -{ - M68kCPU *cpu = M68K_CPU(cs->uc, cs); - CPUM68KState *env = &cpu->env; - - cpu_m68k_flush_flags(env, env->cc_op); - env->cc_op = CC_OP_FLAGS; - env->sr = (env->sr & 0xffe0) | env->cc_dest | (env->cc_x << 4); -} diff --git a/qemu/target-m68k/translate.c b/qemu/target-m68k/translate.c index 16b607fb..935aee79 100644 --- a/qemu/target-m68k/translate.c +++ b/qemu/target-m68k/translate.c @@ -3128,7 +3128,7 @@ void gen_intermediate_code(CPUM68KState *env, TranslationBlock *tb) gen_tb_start(tcg_ctx); do { pc_offset = dc->pc - pc_start; - tcg_gen_insn_start(tcg_ctx, dc->pc); + tcg_gen_insn_start(tcg_ctx, dc->pc, dc->cc_op); num_insns++; if (unlikely(cpu_breakpoint_test(cs, dc->pc, BP_ANY))) { @@ -3200,5 +3200,9 @@ done_generating: void restore_state_to_opc(CPUM68KState *env, TranslationBlock *tb, target_ulong *data) { + int cc_op = data[1]; env->pc = data[0]; + if (cc_op != CC_OP_DYNAMIC) { + env->cc_op = cc_op; + } }