[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 52/69] cpu-exec: fix exception_index handling
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL 52/69] cpu-exec: fix exception_index handling |
Date: |
Tue, 13 Mar 2018 23:47:02 +0100 |
From: Pavel Dovgalyuk <address@hidden>
Function cpu_handle_interrupt calls cc->cpu_exec_interrupt to process
pending hardware interrupts. Under the hood cpu_exec_interrupt uses
cpu->exception_index to pass information to the internal function which
is usually common for exception and interrupt processing.
But this value is not reset after return and may be processed again
by cpu_handle_exception. This does not happen due to overwriting
the exception_index at the end of cpu_handle_interrupt.
But this branch may also overwrite the valid exception_index in some cases.
Therefore this patch:
1. resets exception_index just after the call to cpu_exec_interrupt
2. prevents overwriting the meaningful value of exception_index
Signed-off-by: Pavel Dovgalyuk <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
Signed-off-by: Pavel Dovgalyuk <address@hidden>
---
accel/tcg/cpu-exec.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
index 280200f737..9cc697205c 100644
--- a/accel/tcg/cpu-exec.c
+++ b/accel/tcg/cpu-exec.c
@@ -585,6 +585,7 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
else {
if (cc->cpu_exec_interrupt(cpu, interrupt_request)) {
replay_interrupt();
+ cpu->exception_index = -1;
*last_tb = NULL;
}
/* The target hook may have updated the 'cpu->interrupt_request';
@@ -606,7 +607,9 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
if (unlikely(atomic_read(&cpu->exit_request)
|| (use_icount && cpu->icount_decr.u16.low + cpu->icount_extra == 0)))
{
atomic_set(&cpu->exit_request, 0);
- cpu->exception_index = EXCP_INTERRUPT;
+ if (cpu->exception_index == -1) {
+ cpu->exception_index = EXCP_INTERRUPT;
+ }
return true;
}
--
2.14.3
- [Qemu-devel] [PULL 42/69] hw/isa/superio: Factor out the FDC37M817 Super I/O from mips_malta.c, (continued)
- [Qemu-devel] [PULL 42/69] hw/isa/superio: Factor out the FDC37M817 Super I/O from mips_malta.c, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 46/69] MAINTAINERS: Add entries for the VT82C686B Super I/O, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 47/69] MAINTAINERS: Split the Alpha TCG/machine section, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 49/69] hw/alpha/dp264: Add the ISA DMA controller, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 48/69] hw/isa/superio: Add the SMC FDC37C669 Super I/O, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 45/69] hw/isa/vt82c686: Add the TYPE_VT82C686B_SUPERIO, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 44/69] hw/isa/vt82c686: Rename vt82c686b_init() -> vt82c686b_isa_init(), Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 43/69] hw/mips/mips_fulong2e: Factor out vt82c686b_southbridge_init(), Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 51/69] hw/i386/pc: Factor out the superio code, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 50/69] hw/alpha/dp264: Use the TYPE_SMC37C669_SUPERIO, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 52/69] cpu-exec: fix exception_index handling,
Paolo Bonzini <=
- [Qemu-devel] [PULL 53/69] replay: fix processing async events, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 54/69] replay: fixed replay_enable_events, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 56/69] replay: added replay log format description, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 55/69] replay: fix save/load vm for non-empty queue, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 57/69] replay: save prior value of the host clock, Paolo Bonzini, 2018/03/13
- [Qemu-devel] [PULL 60/69] replay: make locking visible outside replay code, Paolo Bonzini, 2018/03/13
- [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