Skip to content
This repository has been archived by the owner on Feb 21, 2024. It is now read-only.

Commit

Permalink
P2 - Don't call block end callback on every translation block end
Browse files Browse the repository at this point in the history
  • Loading branch information
f4rnham committed Feb 18, 2018
1 parent 5dc6102 commit 8851454
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions qemu/target/i386/translate.c
Original file line number Diff line number Diff line change
Expand Up @@ -2184,7 +2184,7 @@ static inline void gen_goto_tb(DisasContext *s, int tb_num, target_ulong eip)
}
//Pyrebox: block_end
//helper_qemu_block_end_callback(CPUState* cpu,TranslationBlock* next_tb, target_ulong from,target_ulong to)
if (is_block_end_callback_needed(s->pgd)){
if (s->saved_pc && is_block_end_callback_needed(s->pgd)){
TCGv_ptr tcg_tb = tcg_const_ptr((tcg_target_ulong)s->tb);
TCGv tcg_from = tcg_temp_new();
tcg_gen_movi_tl(tcg_from, s->saved_pc);
Expand Down Expand Up @@ -2620,7 +2620,7 @@ do_gen_eob_worker(DisasContext *s, bool inhibit, bool recheck_tf, TCGv jr)

//Pyrebox: block_end
//helper_qemu_block_end_callback(CPUState* cpu,TranslationBlock* next_tb, target_ulong from)
if (is_block_end_callback_needed(s->pgd)){
if (s->saved_pc && is_block_end_callback_needed(s->pgd)){
TCGv_ptr tcg_tb = tcg_const_ptr((tcg_target_ulong)s->tb);
TCGv tcg_from = tcg_temp_new();
tcg_gen_movi_tl(tcg_from, s->saved_pc);
Expand All @@ -2646,7 +2646,7 @@ do_gen_eob_worker(DisasContext *s, bool inhibit, bool recheck_tf, TCGv jr)
}
//Pyrebox: block_end
//helper_qemu_block_end_callback(CPUState* cpu,TranslationBlock* next_tb, target_ulong from)
if (is_block_end_callback_needed(s->pgd)){
if (s->saved_pc && is_block_end_callback_needed(s->pgd)){
TCGv_ptr tcg_tb = tcg_const_ptr((tcg_target_ulong)s->tb);
TCGv tcg_from = tcg_temp_new();
tcg_gen_movi_tl(tcg_from, s->saved_pc);
Expand Down Expand Up @@ -6788,6 +6788,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s,
gen_pop_update(s, ot);
set_cc_op(s, CC_OP_EFLAGS);
/* abort translation because TF/AC flag may change */
s->saved_pc = 0;
gen_jmp_im(s->pc - s->cs_base);
gen_eob(s);
}
Expand Down Expand Up @@ -7178,6 +7179,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s,
break;
case 0xfb: /* sti */
if (s->vm86 ? s->iopl == 3 : s->cpl <= s->iopl) {
s->saved_pc = 0;
gen_helper_sti(cpu_env);
/* interruptions are enabled only the first insn after sti */
gen_jmp_im(s->pc - s->cs_base);
Expand Down Expand Up @@ -7717,6 +7719,7 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s,
gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base);
break;
}
s->saved_pc = 0;
gen_update_cc_op(s);
gen_jmp_im(pc_start - s->cs_base);
gen_lea_modrm(env, s, modrm);
Expand Down Expand Up @@ -8741,6 +8744,7 @@ void gen_intermediate_code(CPUState *cs, TranslationBlock *tb)
change to be happen */
if (dc->tf || dc->singlestep_enabled ||
(flags & HF_INHIBIT_IRQ_MASK)) {
dc->saved_pc = 0;
gen_jmp_im(pc_ptr - dc->cs_base);
gen_eob(dc);
break;
Expand All @@ -8764,6 +8768,7 @@ void gen_intermediate_code(CPUState *cs, TranslationBlock *tb)
(pc_ptr - pc_start) >= (TARGET_PAGE_SIZE - 32) ||
num_insns >= max_insns) {
gen_jmp_im(pc_ptr - dc->cs_base);
dc->saved_pc = 0;
gen_eob(dc);
break;
}
Expand Down

0 comments on commit 8851454

Please sign in to comment.