done:
spin_unlock(&s->lock);
+
+ /* This check is protected by the domain ioreq server lock. */
+ if ( d->arch.hvm_domain.ioreq_server.waiting )
+ {
+ d->arch.hvm_domain.ioreq_server.waiting = 0;
+ domain_unpause(d);
+ }
}
static void hvm_ioreq_server_disable(struct hvm_ioreq_server *s,
spin_lock_init(&d->arch.hvm_domain.ioreq_server.lock);
INIT_LIST_HEAD(&d->arch.hvm_domain.ioreq_server.list);
+
+ /*
+ * In the case where a stub domain is providing emulation for
+ * the guest, there is no interlock in the toolstack to prevent
+ * the guest from running before the stub domain is ready.
+ * Hence the domain must remain paused until at least one ioreq
+ * server is created and enabled.
+ */
+ if ( !is_pvh_domain(d) )
+ {
+ domain_pause(d);
+ d->arch.hvm_domain.ioreq_server.waiting = 1;
+ }
+
spin_lock_init(&d->arch.hvm_domain.irq_lock);
spin_lock_init(&d->arch.hvm_domain.uc_lock);