@@ -764,27 +764,12 @@ void xen_shutdown_fatal_error(const char *fmt, ...)
qemu_system_shutdown_request(SHUTDOWN_CAUSE_HOST_ERROR);
}
-void xen_register_ioreq(XenIOState *state, unsigned int max_cpus,
- MemoryListener xen_memory_listener)
+static void xen_do_ioreq_register(XenIOState *state,
+ unsigned int max_cpus,
+ MemoryListener xen_memory_listener)
{
int i, rc;
- setup_xen_backend_ops();
-
- state->xce_handle = qemu_xen_evtchn_open();
- if (state->xce_handle == NULL) {
- perror("xen: event channel open");
- goto err;
- }
-
- state->xenstore = xs_daemon_open();
- if (state->xenstore == NULL) {
- perror("xen: xenstore open");
- goto err;
- }
-
- xen_create_ioreq_server(xen_domid, &state->ioservid);
-
state->exit.notify = xen_exit_notifier;
qemu_add_exit_notifier(&state->exit);
@@ -849,12 +834,46 @@ void xen_register_ioreq(XenIOState *state, unsigned int max_cpus,
QLIST_INIT(&state->dev_list);
device_listener_register(&state->device_listener);
+ return;
+
+err:
+ error_report("xen hardware virtual machine initialisation failed");
+ exit(1);
+}
+
+void xen_register_ioreq(XenIOState *state, unsigned int max_cpus,
+ MemoryListener xen_memory_listener)
+{
+ int rc;
+
+ setup_xen_backend_ops();
+
+ state->xce_handle = qemu_xen_evtchn_open();
+ if (state->xce_handle == NULL) {
+ perror("xen: event channel open");
+ goto err;
+ }
+
+ state->xenstore = xs_daemon_open();
+ if (state->xenstore == NULL) {
+ perror("xen: xenstore open");
+ goto err;
+ }
+
+ rc = xen_create_ioreq_server(xen_domid, &state->ioservid);
+ if (!rc) {
+ xen_do_ioreq_register(state, max_cpus, xen_memory_listener);
+ } else {
+ warn_report("xen: failed to create ioreq server");
+ }
+
xen_bus_init();
xen_be_init();
return;
+
err:
- error_report("xen hardware virtual machine initialisation failed");
+ error_report("xen hardware virtual machine backend registration failed");
exit(1);
}