x86: check for exit request after every hooked instruction. this should fix issue #232

This commit is contained in:
Nguyen Anh Quynh 2015-11-07 01:02:45 +08:00
parent 4c5ecda908
commit 938d0b89eb
2 changed files with 4 additions and 7 deletions

View file

@ -294,8 +294,8 @@ static tcg_target_ulong cpu_tb_exec(CPUState *cpu, uint8_t *tb_ptr)
TranslationBlock *tb = (TranslationBlock *)(next_tb & ~TB_EXIT_MASK);
if (cc->synchronize_from_tb) {
// avoid sync twice when helper_uc_tracecode() already did this.
if (env->uc->emu_counter <= env->uc->emu_count)
cc->synchronize_from_tb(cpu, tb); // qq
if (env->uc->emu_counter <= env->uc->emu_count && !env->uc->stop_request)
cc->synchronize_from_tb(cpu, tb);
} else {
assert(cc->set_pc);
// avoid sync twice when helper_uc_tracecode() already did this.

View file

@ -4774,13 +4774,10 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s,
}
// generate code to call callback
gen_uc_tracecode(tcg_ctx, 0xf1f1f1f1, trace->callback, env->uc, pc_start, trace->user_data);
// if requested to emulate only some instructions, check if
// we need to exit immediately
if (env->uc->emu_count > 0) {
// the callback might want to stop emulation immediately
check_exit_request(tcg_ctx);
}
}
}
s->pc = pc_start;
prefixes = 0;