Bug steps: 1. windows VM with pvpanic device:<panic model='isa'/>in xml 2. inject the panic in windows, the vm state is paused (guest-panicked) 3. migrate the vm to other host, vm state is running
Check the vmstate before runstate_set(RUN_STATE_RUNNING) Signed-off-by: hangaohuai <hangaoh...@huawei.com> --- cpus.c | 3 +++ include/sysemu/sysemu.h | 1 + vl.c | 5 +++++ 3 files changed, 9 insertions(+) diff --git a/cpus.c b/cpus.c index c857ad2..37b93aa 100644 --- a/cpus.c +++ b/cpus.c @@ -1734,6 +1734,9 @@ int vm_prepare_start(void) if (runstate_is_running()) { qapi_event_send_stop(&error_abort); res = -1; + } else if (runstate_is_paniced()) { + qemu_system_guest_panicked(NULL); + res = -1; } else { replay_enable_events(); cpu_enable_ticks(); diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h index 576c7ce..08015c7 100644 --- a/include/sysemu/sysemu.h +++ b/include/sysemu/sysemu.h @@ -23,6 +23,7 @@ extern bool qemu_uuid_set; bool runstate_check(RunState state); void runstate_set(RunState new_state); int runstate_is_running(void); +int runstate_is_paniced(void); bool runstate_needs_reset(void); bool runstate_store(char *str, size_t size); typedef struct vm_change_state_entry VMChangeStateEntry; diff --git a/vl.c b/vl.c index 16a3b5e..ea7e3f8 100644 --- a/vl.c +++ b/vl.c @@ -729,6 +729,11 @@ int runstate_is_running(void) return runstate_check(RUN_STATE_RUNNING); } +int runstate_is_paniced(void) +{ + return runstate_check(RUN_STATE_GUEST_PANICKED); +} + bool runstate_needs_reset(void) { return runstate_check(RUN_STATE_INTERNAL_ERROR) || -- 1.8.3.1