From e4ea5e2d0e0e4c5188ab45b66f3195062ae059dc Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Mon, 13 Jun 2011 23:01:53 +0200 Subject: [PATCH 1/3] error framework: Fix compilation for w32/w64 The declaration of function error_set() should use macro GCC_FMT_ATTR instead of gcc's format printf attribute. For w32/w64, both declarations are different and GCC_FMT_ATTR is needed. Compilation for w64 even failed with the original code because mingw64 defines a macro for printf. GCC_FMT_ATTR requires qemu-common.h, so add it in error.c (it's also included by error_int.h but too late). Remove assert.h which is included by qemu-common.h. Cc: Luiz Capitulino Cc: Anthony Liguori Signed-off-by: Stefan Weil Signed-off-by: Luiz Capitulino --- error.c | 3 ++- error.h | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/error.c b/error.c index 867eec2c1a..74d7398b58 100644 --- a/error.c +++ b/error.c @@ -9,11 +9,12 @@ * This work is licensed under the terms of the GNU LGPL, version 2. See * the COPYING.LIB file in the top-level directory. */ + +#include "qemu-common.h" #include "error.h" #include "error_int.h" #include "qemu-objects.h" #include "qerror.h" -#include struct Error { diff --git a/error.h b/error.h index 003c855e65..0f92a6f570 100644 --- a/error.h +++ b/error.h @@ -25,8 +25,7 @@ typedef struct Error Error; * Currently, qerror.h defines these error formats. This function is not * meant to be used outside of QEMU. */ -void error_set(Error **err, const char *fmt, ...) - __attribute__((format(printf, 2, 3))); +void error_set(Error **err, const char *fmt, ...) GCC_FMT_ATTR(2, 3); /** * Returns true if an indirect pointer to an error is pointing to a valid From e063eb1f4a6d42371e7d288dfdb690d5821190ed Mon Sep 17 00:00:00 2001 From: Jan Kiszka Date: Tue, 14 Jun 2011 18:29:43 +0200 Subject: [PATCH 2/3] Allow silent system resets This allows qemu_system_reset to be issued silently for internal purposes, ie. without sending out a monitor event. Convert the system reset after startup to the silent mode. Signed-off-by: Jan Kiszka Signed-off-by: Luiz Capitulino --- sysemu.h | 5 ++++- vl.c | 10 ++++++---- xen-all.c | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/sysemu.h b/sysemu.h index 7e70daa3da..d3013f5cc4 100644 --- a/sysemu.h +++ b/sysemu.h @@ -34,6 +34,9 @@ void qemu_del_vm_change_state_handler(VMChangeStateEntry *e); #define VMSTOP_LOADVM 7 #define VMSTOP_MIGRATE 8 +#define VMRESET_SILENT false +#define VMRESET_REPORT true + void vm_start(void); void vm_stop(int reason); @@ -50,7 +53,7 @@ int qemu_powerdown_requested(void); void qemu_system_killed(int signal, pid_t pid); void qemu_kill_report(void); extern qemu_irq qemu_system_powerdown; -void qemu_system_reset(void); +void qemu_system_reset(bool report); void qemu_add_exit_notifier(Notifier *notify); void qemu_remove_exit_notifier(Notifier *notify); diff --git a/vl.c b/vl.c index dbdec7199a..52402a2b73 100644 --- a/vl.c +++ b/vl.c @@ -1253,7 +1253,7 @@ void qemu_unregister_reset(QEMUResetHandler *func, void *opaque) } } -void qemu_system_reset(void) +void qemu_system_reset(bool report) { QEMUResetEntry *re, *nre; @@ -1261,7 +1261,9 @@ void qemu_system_reset(void) QTAILQ_FOREACH_SAFE(re, &reset_handlers, entry, nre) { re->func(re->opaque); } - monitor_protocol_event(QEVENT_RESET, NULL); + if (report) { + monitor_protocol_event(QEVENT_RESET, NULL); + } cpu_synchronize_all_post_reset(); } @@ -1403,7 +1405,7 @@ static void main_loop(void) if (qemu_reset_requested()) { pause_all_vcpus(); cpu_synchronize_all_states(); - qemu_system_reset(); + qemu_system_reset(VMRESET_REPORT); resume_all_vcpus(); } if (qemu_powerdown_requested()) { @@ -3293,7 +3295,7 @@ int main(int argc, char **argv, char **envp) qemu_register_reset(qbus_reset_all_fn, sysbus_get_default()); qemu_run_machine_init_done_notifiers(); - qemu_system_reset(); + qemu_system_reset(VMRESET_SILENT); if (loadvm) { if (load_vmstate(loadvm) < 0) { autostart = 0; diff --git a/xen-all.c b/xen-all.c index 0eac202d4e..41fd98aea2 100644 --- a/xen-all.c +++ b/xen-all.c @@ -452,7 +452,7 @@ static void cpu_handle_ioreq(void *opaque) destroy_hvm_domain(); } if (qemu_reset_requested_get()) { - qemu_system_reset(); + qemu_system_reset(VMRESET_REPORT); } } From 5a8a49d7aa78b31a853e8f5d31f5b12811caeb27 Mon Sep 17 00:00:00 2001 From: Jan Kiszka Date: Tue, 14 Jun 2011 18:29:45 +0200 Subject: [PATCH 3/3] Reset system before loadvm In case we load the vmstate during incoming migration, we start from a clean, default machine state as we went through system reset before. But if we load from a snapshot, the machine can be in any state. That can cause troubles if loading an older image which does not carry all state information the executing QEMU requires. Hardly any device takes care of this scenario. However, fixing this is trivial. We just need to issue a system reset during loadvm as well. Signed-off-by: Jan Kiszka Signed-off-by: Luiz Capitulino --- savevm.c | 1 + 1 file changed, 1 insertion(+) diff --git a/savevm.c b/savevm.c index 939845c825..8139bc7e29 100644 --- a/savevm.c +++ b/savevm.c @@ -2073,6 +2073,7 @@ int load_vmstate(const char *name) return -EINVAL; } + qemu_system_reset(VMRESET_SILENT); ret = qemu_loadvm_state(f); qemu_fclose(f);