diff options
author | Pavel Dovgaluk <Pavel.Dovgaluk@ispras.ru> | 2014-07-31 09:41:17 +0400 |
---|---|---|
committer | Andreas Färber <afaerber@suse.de> | 2014-09-05 16:32:48 +0200 |
commit | 6c3bff0ed8a40921464b9a07aa0fe079e860c978 (patch) | |
tree | 3c1b8dc85829a14915712728fd42c035e6d8efa1 | |
parent | fd884c07658d02a96a882b8457d6d7a5cd71a407 (diff) | |
download | qemu-6c3bff0ed8a40921464b9a07aa0fe079e860c978.zip |
exec: Save CPUState::exception_index field
This patch adds a subsection with exception_index field to the VMState for
correct saving the CPU state.
Without this patch, simulator could miss the pending exception in the saved
virtual machine state.
Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
Cc: qemu-stable@nongnu.org
Signed-off-by: Andreas Färber <afaerber@suse.de>
-rw-r--r-- | exec.c | 35 |
1 files changed, 35 insertions, 0 deletions
@@ -430,15 +430,50 @@ static int cpu_common_post_load(void *opaque, int version_id) return 0; } +static int cpu_common_pre_load(void *opaque) +{ + CPUState *cpu = opaque; + + cpu->exception_index = 0; + + return 0; +} + +static bool cpu_common_exception_index_needed(void *opaque) +{ + CPUState *cpu = opaque; + + return cpu->exception_index != 0; +} + +static const VMStateDescription vmstate_cpu_common_exception_index = { + .name = "cpu_common/exception_index", + .version_id = 1, + .minimum_version_id = 1, + .fields = (VMStateField[]) { + VMSTATE_INT32(exception_index, CPUState), + VMSTATE_END_OF_LIST() + } +}; + const VMStateDescription vmstate_cpu_common = { .name = "cpu_common", .version_id = 1, .minimum_version_id = 1, + .pre_load = cpu_common_pre_load, .post_load = cpu_common_post_load, .fields = (VMStateField[]) { VMSTATE_UINT32(halted, CPUState), VMSTATE_UINT32(interrupt_request, CPUState), VMSTATE_END_OF_LIST() + }, + .subsections = (VMStateSubsection[]) { + { + .vmsd = &vmstate_cpu_common_exception_index, + .needed = cpu_common_exception_index_needed, + } , { + /* empty */ + } } }; |