[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v6 01/14] replay: don't record interrupt poll
From: |
Pavel Dovgalyuk |
Subject: |
[PATCH v6 01/14] replay: don't record interrupt poll |
Date: |
Tue, 29 Sep 2020 14:01:10 +0300 |
User-agent: |
StGit/0.17.1-dirty |
Interrupt poll is not a real interrupt event. It is needed only for
thread safety. This interrupt is used for i386 and converted
to hardware interrupt by cpu_handle_interrupt function.
Therefore it is not needed to be recorded, because hardware
interrupt will be recorded after converting.
Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgalyuk@ispras.ru>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
--
v4 changes:
- Condition check refactoring (suggested by Alex Bennée)
---
accel/tcg/cpu-exec.c | 21 ++++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
index e10b46283c..a2b913c72f 100644
--- a/accel/tcg/cpu-exec.c
+++ b/accel/tcg/cpu-exec.c
@@ -430,8 +430,7 @@ static inline bool cpu_handle_halt(CPUState *cpu)
{
if (cpu->halted) {
#if defined(TARGET_I386) && !defined(CONFIG_USER_ONLY)
- if ((cpu->interrupt_request & CPU_INTERRUPT_POLL)
- && replay_interrupt()) {
+ if (cpu->interrupt_request & CPU_INTERRUPT_POLL) {
X86CPU *x86_cpu = X86_CPU(cpu);
qemu_mutex_lock_iothread();
apic_poll_irq(x86_cpu->apic_state);
@@ -527,6 +526,20 @@ static inline bool cpu_handle_exception(CPUState *cpu, int
*ret)
return false;
}
+/*
+ * CPU_INTERRUPT_POLL is a virtual event which gets converted into a
+ * "real" interrupt event later. It does not need to be recorded for
+ * replay purposes.
+ */
+static inline bool need_replay_interrupt(int interrupt_request)
+{
+#if defined(TARGET_I386)
+ return !(interrupt_request & CPU_INTERRUPT_POLL);
+#else
+ return true;
+#endif
+}
+
static inline bool cpu_handle_interrupt(CPUState *cpu,
TranslationBlock **last_tb)
{
@@ -588,7 +601,9 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
and via longjmp via cpu_loop_exit. */
else {
if (cc->cpu_exec_interrupt(cpu, interrupt_request)) {
- replay_interrupt();
+ if (need_replay_interrupt(interrupt_request)) {
+ replay_interrupt();
+ }
/*
* After processing the interrupt, ensure an EXCP_DEBUG is
* raised when single-stepping so that GDB doesn't miss the
- [PATCH v6 00/14] Reverse debugging, Pavel Dovgalyuk, 2020/09/29
- [PATCH v6 01/14] replay: don't record interrupt poll,
Pavel Dovgalyuk <=
- [PATCH v6 02/14] replay: provide an accessor for rr filename, Pavel Dovgalyuk, 2020/09/29
- [PATCH v6 03/14] qcow2: introduce icount field for snapshots, Pavel Dovgalyuk, 2020/09/29
- [PATCH v6 04/14] migration: introduce icount field for snapshots, Pavel Dovgalyuk, 2020/09/29
- [PATCH v6 05/14] qapi: introduce replay.json for record/replay-related stuff, Pavel Dovgalyuk, 2020/09/29
- [PATCH v6 06/14] replay: introduce info hmp/qmp command, Pavel Dovgalyuk, 2020/09/29
- [PATCH v6 07/14] replay: introduce breakpoint at the specified step, Pavel Dovgalyuk, 2020/09/29
- [PATCH v6 08/14] replay: implement replay-seek command, Pavel Dovgalyuk, 2020/09/29
- [PATCH v6 09/14] replay: flush rr queue before loading the vmstate, Pavel Dovgalyuk, 2020/09/29
- [PATCH v6 10/14] gdbstub: add reverse step support in replay mode, Pavel Dovgalyuk, 2020/09/29
- [PATCH v6 11/14] gdbstub: add reverse continue support in replay mode, Pavel Dovgalyuk, 2020/09/29