From 02d57ea115b7669f588371c86484a2e8ebc369be Mon Sep 17 00:00:00 2001 From: Sergey Fedorov Date: Tue, 30 Jun 2015 12:35:09 +0300 Subject: cpu-exec: Do not invalidate original TB in cpu_exec_nocache() Instead of invalidating an original TB in cpu_exec_nocache() prematurely, just save a link to it in the temporary generated TB. If cpu_io_recompile() is raised subsequently from the temporary TB, invalidate the original one as well. That allows reusing the original TB each time cpu_exec_nocache() is called to handle expired instruction counter in icount mode. Signed-off-by: Sergey Fedorov Message-Id: <1435656909-29116-1-git-send-email-serge.fdrv@gmail.com> Signed-off-by: Paolo Bonzini --- translate-all.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'translate-all.c') diff --git a/translate-all.c b/translate-all.c index 60a3d8b2bd..755cdaba9c 100644 --- a/translate-all.c +++ b/translate-all.c @@ -1533,6 +1533,14 @@ void cpu_io_recompile(CPUState *cpu, uintptr_t retaddr) cs_base = tb->cs_base; flags = tb->flags; tb_phys_invalidate(tb, -1); + if (tb->cflags & CF_NOCACHE) { + if (tb->orig_tb) { + /* Invalidate original TB if this TB was generated in + * cpu_exec_nocache() */ + tb_phys_invalidate(tb->orig_tb, -1); + } + tb_free(tb); + } /* FIXME: In theory this could raise an exception. In practice we have already translated the block once so it's probably ok. */ tb_gen_code(cpu, pc, cs_base, flags, cflags); -- cgit v1.2.3