qemu_set_fd_handler(xenstore_fd(), xenstore_process_event, NULL, NULL);
while (1) {
- while (!(vm_running && xen_pause_requested))
+ while (!(vm_running && (xen_pause_requested || suspend_requested)))
/* Wait up to 10 msec. */
main_loop_wait(10);
do_savevm(qemu_file);
free(qemu_file);
+ if (suspend_requested)
+ return 0;
+
xenstore_record_dm_state("paused");
/* Wait to be allowed to continue */
#endif /* !CONFIG_DM */
+void suspend(int sig)
+{
+ fprintf(stderr, "suspend sig handler called with requested=%d!\n",
+ suspend_requested);
+ if (sig != SIGUSR1)
+ fprintf(stderr, "suspend signal dismatch, get sig=%d!\n", sig);
+ suspend_requested = 1;
+}
+
void do_delvm(const char *name)
{
BlockDriverState *bs, *bs1;
static int reset_requested;
static int shutdown_requested;
static int powerdown_requested;
+int suspend_requested = 0;
int qemu_shutdown_requested(void)
{
dom0_driver_init(dom0_input);
xenstore_dm_finished_startup();
+#ifndef CONFIG_STUBDOM
+ /* register signal for the suspend request when save */
+ {
+ struct sigaction act;
+ sigset_t set;
+ act.sa_handler = suspend;
+ act.sa_flags = SA_RESTART;
+ sigemptyset(&act.sa_mask);
+
+ sigaction(SIGUSR1, &act, NULL);
+
+ /* control panel mask some signals when spawn qemu, need unmask here*/
+ sigemptyset(&set);
+ sigaddset(&set, SIGUSR1);
+ sigaddset(&set, SIGTERM);
+ if (sigprocmask(SIG_UNBLOCK, &set, NULL) == -1)
+ fprintf(stderr, "unblock signal fail, possible issue for HVM save!\n");
+
+ }
+#endif
main_loop();
quit_timers();