cpu-exec: lookup/generate TB outside exclusive region during step_atomic

Now that all code generation has been converted to check CF_PARALLEL, we can
generate !CF_PARALLEL code without having yet set !parallel_cpus --
and therefore without having to be in the exclusive region during
cpu_exec_step_atomic.

While at it, merge cpu_exec_step into cpu_exec_step_atomic.

Backports commit ac03ee5331612e44beb393df2b578c951d27dc0d from qemu
This commit is contained in:
Emilio G. Cota 2019-05-06 00:52:39 -04:00 committed by Lioncash
parent c1e26c4e35
commit b1b069e8ad
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7

View file

@ -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)