[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [for-4.2 PATCH v2 7/8] icount: clean up cpu_can_io at the e
From: |
Pavel Dovgalyuk |
Subject: |
[Qemu-devel] [for-4.2 PATCH v2 7/8] icount: clean up cpu_can_io at the entry to the block |
Date: |
Thu, 25 Jul 2019 11:44:49 +0300 |
User-agent: |
StGit/0.17.1-dirty |
From: Pavel Dovgalyuk <address@hidden>
Most of IO instructions can be executed only at the end of the block in
icount mode. Therefore translator can set cpu_can_io flag when translating
the last instruction.
But when the blocks are chained, then this flag is not reset and may
remain set at the beginning of the next block.
This patch resets the flag at the entry of any translation block,
making I/O operations impossible by default.
Signed-off-by: Pavel Dovgalyuk <address@hidden>
--
v2 changes:
- reset can_do_io at the start of every TB (suggested by Paolo Bonzini)
---
accel/tcg/cpu-exec.c | 1 -
include/exec/gen-icount.h | 38 ++++++++++++++++++++------------------
2 files changed, 20 insertions(+), 19 deletions(-)
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
index 6c85c3ee1e..48272c781b 100644
--- a/accel/tcg/cpu-exec.c
+++ b/accel/tcg/cpu-exec.c
@@ -169,7 +169,6 @@ static inline tcg_target_ulong cpu_tb_exec(CPUState *cpu,
TranslationBlock *itb)
}
#endif /* DEBUG_DISAS */
- cpu->can_do_io = !use_icount;
ret = tcg_qemu_tb_exec(env, tb_ptr);
cpu->can_do_io = 1;
last_tb = (TranslationBlock *)(ret & ~TB_EXIT_MASK);
diff --git a/include/exec/gen-icount.h b/include/exec/gen-icount.h
index f7669b6841..4004e6c9d0 100644
--- a/include/exec/gen-icount.h
+++ b/include/exec/gen-icount.h
@@ -7,6 +7,24 @@
static TCGOp *icount_start_insn;
+static inline void gen_io_start(void)
+{
+ TCGv_i32 tmp = tcg_const_i32(1);
+ tcg_gen_st_i32(tmp, cpu_env,
+ offsetof(ArchCPU, parent_obj.can_do_io) -
+ offsetof(ArchCPU, env));
+ tcg_temp_free_i32(tmp);
+}
+
+static inline void gen_io_end(void)
+{
+ TCGv_i32 tmp = tcg_const_i32(0);
+ tcg_gen_st_i32(tmp, cpu_env,
+ offsetof(ArchCPU, parent_obj.can_do_io) -
+ offsetof(ArchCPU, env));
+ tcg_temp_free_i32(tmp);
+}
+
static inline void gen_tb_start(TranslationBlock *tb)
{
TCGv_i32 count, imm;
@@ -40,6 +58,8 @@ static inline void gen_tb_start(TranslationBlock *tb)
tcg_gen_st16_i32(count, cpu_env,
offsetof(ArchCPU, neg.icount_decr.u16.low) -
offsetof(ArchCPU, env));
+ /* Disable I/O by default */
+ gen_io_end();
}
tcg_temp_free_i32(count);
@@ -57,22 +77,4 @@ static inline void gen_tb_end(TranslationBlock *tb, int
num_insns)
tcg_gen_exit_tb(tb, TB_EXIT_REQUESTED);
}
-static inline void gen_io_start(void)
-{
- TCGv_i32 tmp = tcg_const_i32(1);
- tcg_gen_st_i32(tmp, cpu_env,
- offsetof(ArchCPU, parent_obj.can_do_io) -
- offsetof(ArchCPU, env));
- tcg_temp_free_i32(tmp);
-}
-
-static inline void gen_io_end(void)
-{
- TCGv_i32 tmp = tcg_const_i32(0);
- tcg_gen_st_i32(tmp, cpu_env,
- offsetof(ArchCPU, parent_obj.can_do_io) -
- offsetof(ArchCPU, env));
- tcg_temp_free_i32(tmp);
-}
-
#endif
- [Qemu-devel] [for-4.2 PATCH v2 0/8] Some record/replay fixes, Pavel Dovgalyuk, 2019/07/25
- [Qemu-devel] [for-4.2 PATCH v2 1/8] replay: add missing fix for internal function, Pavel Dovgalyuk, 2019/07/25
- [Qemu-devel] [for-4.2 PATCH v2 2/8] replay: document development rules, Pavel Dovgalyuk, 2019/07/25
- [Qemu-devel] [for-4.2 PATCH v2 3/8] util/qemu-timer: refactor deadline calculation for external timers, Pavel Dovgalyuk, 2019/07/25
- [Qemu-devel] [for-4.2 PATCH v2 4/8] replay: fix replay shutdown, Pavel Dovgalyuk, 2019/07/25
- [Qemu-devel] [for-4.2 PATCH v2 5/8] replay: refine replay-time module, Pavel Dovgalyuk, 2019/07/25
- [Qemu-devel] [for-4.2 PATCH v2 6/8] replay: rename step-related variables and functions, Pavel Dovgalyuk, 2019/07/25
- [Qemu-devel] [for-4.2 PATCH v2 7/8] icount: clean up cpu_can_io at the entry to the block,
Pavel Dovgalyuk <=
- [Qemu-devel] [for-4.2 PATCH v2 8/8] icount: remove unnecessary gen_io_end calls, Pavel Dovgalyuk, 2019/07/25