[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 69/69] tcg: fix cpu_io_recompile
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL 69/69] tcg: fix cpu_io_recompile |
Date: |
Tue, 13 Mar 2018 23:47:19 +0100 |
From: Pavel Dovgalyuk <address@hidden>
cpu_io_recompile() function was broken by
the commit 9b990ee5a3cc6aa38f81266fb0c6ef37a36c45b9. Instead of regenerating
the block starting from PC of the original block, it just set the instruction
counter for TCG. In most cases this was unnoticed, but in icount mode
there was an exception for incorrect usage of CF_LAST_IO flag.
This patch recovers recompilation of the original block and also
configures translation for executing single IO instruction which
caused a recompilation.
Signed-off-by: Pavel Dovgalyuk <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
Signed-off-by: Pavel Dovgalyuk <address@hidden>
---
accel/tcg/translate-all.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
index 67795cd78c..5ad1b919bc 100644
--- a/accel/tcg/translate-all.c
+++ b/accel/tcg/translate-all.c
@@ -1728,7 +1728,8 @@ void cpu_io_recompile(CPUState *cpu, uintptr_t retaddr)
CPUArchState *env = cpu->env_ptr;
#endif
TranslationBlock *tb;
- uint32_t n;
+ uint32_t n, flags;
+ target_ulong pc, cs_base;
tb_lock();
tb = tb_find_pc(retaddr);
@@ -1766,8 +1767,14 @@ void cpu_io_recompile(CPUState *cpu, uintptr_t retaddr)
cpu_abort(cpu, "TB too big during recompile");
}
- /* Adjust the execution state of the next TB. */
- cpu->cflags_next_tb = curr_cflags() | CF_LAST_IO | n;
+ pc = tb->pc;
+ cs_base = tb->cs_base;
+ flags = tb->flags;
+ tb_phys_invalidate(tb, -1);
+
+ /* Execute one IO instruction without caching
+ instead of creating large TB. */
+ cpu->cflags_next_tb = curr_cflags() | CF_LAST_IO | CF_NOCACHE | 1;
if (tb->cflags & CF_NOCACHE) {
if (tb->orig_tb) {
@@ -1778,6 +1785,11 @@ void cpu_io_recompile(CPUState *cpu, uintptr_t retaddr)
tb_remove(tb);
}
+ /* Generate new TB instead of the current one. */
+ /* 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, curr_cflags() | CF_LAST_IO | n);
+
/* TODO: If env->pc != tb->pc (i.e. the faulting instruction was not
* the first in the TB) then we end up generating a whole new TB and
* repeating the fault, which is horribly inefficient.
--
2.14.3
- [Qemu-devel] [PULL 59/69] replay/replay-internal.c: track holding of replay_lock, (continued)
- [Qemu-devel] [PULL 59/69] replay/replay-internal.c: track holding of replay_lock, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 58/69] replay/replay.c: bump REPLAY_VERSION again, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 61/69] replay: don't destroy mutex at exit, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 62/69] replay: push replay_mutex_lock up the call tree, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 64/69] replay: avoid recursive call of checkpoints, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 63/69] replay: check return values of fwrite, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 65/69] scripts/replay-dump.py: replay log dumper, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 66/69] replay: don't process async events when warping the clock, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 67/69] replay: save vmstate of the asynchronous events, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 68/69] replay: update documentation, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 69/69] tcg: fix cpu_io_recompile,
Paolo Bonzini <=
- Re: [Qemu-devel] [PULL 00/69] Misc patches for QEMU soft freeze, no-reply, 2018/03/13
Re: [Qemu-devel] [PULL 00/69] Misc patches for QEMU soft freeze, Peter Maydell, 2018/03/16