diff --git a/qemu/accel/tcg/cpu-exec.c b/qemu/accel/tcg/cpu-exec.c index a9986d16..99c313de 100644 --- a/qemu/accel/tcg/cpu-exec.c +++ b/qemu/accel/tcg/cpu-exec.c @@ -466,27 +466,32 @@ static inline void cpu_loop_exec_tb(CPUState *cpu, TranslationBlock *tb, } } -static void cpu_exec_step(struct uc_struct *uc, CPUState *cpu) +void cpu_exec_step_atomic(struct uc_struct *uc, CPUState *cpu) { CPUArchState *env = (CPUArchState *)cpu->env_ptr; TranslationBlock *tb; target_ulong cs_base, pc; uint32_t flags; uint32_t cflags = 1 | CF_IGNORE_ICOUNT; + uint32_t cf_mask = cflags & CF_HASH_MASK; cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags); if (sigsetjmp(cpu->jmp_env, 0) == 0) { - tb = tb_lookup__cpu_state(cpu, &pc, &cs_base, &flags, - cflags & CF_HASH_MASK); + tb = tb_lookup__cpu_state(cpu, &pc, &cs_base, &flags, cf_mask); if (tb == NULL) { mmap_lock(); - tb = tb_gen_code(cpu, pc, cs_base, flags, cflags); + tb = tb_htable_lookup(cpu, pc, cs_base, flags, cf_mask); + if (likely(tb == NULL)) { + tb = tb_gen_code(cpu, pc, cs_base, flags, cflags); + } mmap_unlock(); } + uc->parallel_cpus = false; /* execute the generated code */ cpu_tb_exec(cpu, tb); + uc->parallel_cpus = true; } else { /* We may have exited due to another problem here, so we need * to reset any tb_locks we may have taken but didn't release. @@ -502,20 +507,6 @@ static void cpu_exec_step(struct uc_struct *uc, CPUState *cpu) } } -void cpu_exec_step_atomic(struct uc_struct *uc, CPUState *cpu) -{ - // Unicorn: commented out - //start_exclusive(); - - /* Since we got here, we know that parallel_cpus must be true. */ - uc->parallel_cpus = false; - cpu_exec_step(uc, cpu); - uc->parallel_cpus = true; - - // Unicorn: commented out - //end_exclusive(); -} - /* main execution loop */ int cpu_exec(struct uc_struct *uc, CPUState *cpu)