diff options
-rw-r--r-- | cpu-exec.c | 7 | ||||
-rw-r--r-- | include/exec/exec-all.h | 1 | ||||
-rw-r--r-- | translate-all.c | 2 |
3 files changed, 6 insertions, 4 deletions
diff --git a/cpu-exec.c b/cpu-exec.c index 7eef0830fe..a1e3d58692 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -184,7 +184,7 @@ static inline tcg_target_ulong cpu_tb_exec(CPUState *cpu, uint8_t *tb_ptr) /* Execute the code without caching the generated code. An interpreter could be used if available. */ static void cpu_exec_nocache(CPUState *cpu, int max_cycles, - TranslationBlock *orig_tb) + TranslationBlock *orig_tb, bool ignore_icount) { TranslationBlock *tb; @@ -194,7 +194,8 @@ static void cpu_exec_nocache(CPUState *cpu, int max_cycles, max_cycles = CF_COUNT_MASK; tb = tb_gen_code(cpu, orig_tb->pc, orig_tb->cs_base, orig_tb->flags, - max_cycles | CF_NOCACHE); + max_cycles | CF_NOCACHE + | (ignore_icount ? CF_IGNORE_ICOUNT : 0)); tb->orig_tb = tcg_ctx.tb_ctx.tb_invalidated_flag ? NULL : orig_tb; cpu->current_tb = tb; /* execute the generated code */ @@ -519,7 +520,7 @@ int cpu_exec(CPUState *cpu) if (insns_left > 0) { /* Execute remaining instructions. */ tb = (TranslationBlock *)(next_tb & ~TB_EXIT_MASK); - cpu_exec_nocache(cpu, insns_left, tb); + cpu_exec_nocache(cpu, insns_left, tb, false); align_clocks(&sc, cpu); } cpu->exception_index = EXCP_INTERRUPT; diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h index 9b93b9b47d..b07de109fb 100644 --- a/include/exec/exec-all.h +++ b/include/exec/exec-all.h @@ -190,6 +190,7 @@ struct TranslationBlock { #define CF_LAST_IO 0x8000 /* Last insn may be an IO access. */ #define CF_NOCACHE 0x10000 /* To be freed after execution */ #define CF_USE_ICOUNT 0x20000 +#define CF_IGNORE_ICOUNT 0x40000 /* Do not generate icount code */ void *tc_ptr; /* pointer to the translated code */ uint8_t *tc_search; /* pointer to search data */ diff --git a/translate-all.c b/translate-all.c index 20ce40ec28..a940bd2e5e 100644 --- a/translate-all.c +++ b/translate-all.c @@ -1069,7 +1069,7 @@ TranslationBlock *tb_gen_code(CPUState *cpu, #endif phys_pc = get_page_addr_code(env, pc); - if (use_icount) { + if (use_icount && !(cflags & CF_IGNORE_ICOUNT)) { cflags |= CF_USE_ICOUNT; } |