Context->Channel = NULL;
}
-static VOID
+static NTSTATUS
ConsoleEnable(
IN PXENBUS_CONSOLE_CONTEXT Context
)
ULONG Port;
NTSTATUS status;
+ /* In some Xen deployments the tool-stack may not set up the console */
status = HvmGetParam(HVM_PARAM_CONSOLE_EVTCHN, &Value);
- ASSERT(NT_SUCCESS(status));
+ if (!NT_SUCCESS(status))
+ goto fail1;
Port = (ULONG)Value;
// Trigger an initial poll
if (KeInsertQueueDpc(&Context->Dpc, NULL, NULL))
Context->Dpcs++;
+
+ return STATUS_SUCCESS;
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return status;
}
static
if (!NT_SUCCESS(status))
goto fail4;
- ConsoleEnable(Context);
+ status = ConsoleEnable(Context);
+ if (!NT_SUCCESS(status))
+ goto fail5;
status = XENBUS_SUSPEND(Acquire, &Context->SuspendInterface);
if (!NT_SUCCESS(status))
- goto fail5;
+ goto fail6;
status = XENBUS_SUSPEND(Register,
&Context->SuspendInterface,
Context,
&Context->SuspendCallbackLate);
if (!NT_SUCCESS(status))
- goto fail6;
+ goto fail7;
status = XENBUS_DEBUG(Acquire, &Context->DebugInterface);
if (!NT_SUCCESS(status))
- goto fail7;
+ goto fail8;
status = XENBUS_DEBUG(Register,
&Context->DebugInterface,
Context,
&Context->DebugCallback);
if (!NT_SUCCESS(status))
- goto fail8;
+ goto fail9;
Trace("<====\n");
return STATUS_SUCCESS;
-fail8:
- Error("fail8\n");
+fail9:
+ Error("fail9\n");
XENBUS_DEBUG(Release, &Context->DebugInterface);
-fail7:
- Error("fail7\n");
+fail8:
+ Error("fail8\n");
XENBUS_SUSPEND(Deregister,
&Context->SuspendInterface,
Context->SuspendCallbackLate);
Context->SuspendCallbackLate = NULL;
+fail7:
+ Error("fail7\n");
+
+ XENBUS_SUSPEND(Release, &Context->SuspendInterface);
+
fail6:
Error("fail6\n");
- XENBUS_SUSPEND(Release, &Context->SuspendInterface);
+ ConsoleDisable(Context);
fail5:
Error("fail5\n");
- ConsoleDisable(Context);
-
XENBUS_EVTCHN(Release, &Context->EvtchnInterface);
fail4:
PXENBUS_DEBUG_CALLBACK DebugCallback;
PXENBUS_SUSPEND_CALLBACK SuspendCallbackLate;
+ BOOLEAN ConsoleAcquired;
PLOG_DISPOSITION LogDisposition;
};
if (!NT_SUCCESS(status))
goto fail1;
- status = LogAddDisposition(DriverGetConsoleLogLevel(),
- FdoOutputBuffer,
- Fdo,
- &Fdo->LogDisposition);
- ASSERT(NT_SUCCESS(status));
+ if (Fdo->ConsoleAcquired) {
+ status = LogAddDisposition(DriverGetConsoleLogLevel(),
+ FdoOutputBuffer,
+ Fdo,
+ &Fdo->LogDisposition);
+ ASSERT(NT_SUCCESS(status));
+ }
status = XENBUS_STORE(WatchAdd,
&Fdo->StoreInterface,
fail2:
Error("fail2\n");
- LogRemoveDisposition(Fdo->LogDisposition);
- Fdo->LogDisposition = NULL;
+ if (Fdo->ConsoleAcquired) {
+ LogRemoveDisposition(Fdo->LogDisposition);
+ Fdo->LogDisposition = NULL;
+ }
FdoVirqTeardown(Fdo);
Fdo->ScanWatch);
Fdo->ScanWatch = NULL;
- LogRemoveDisposition(Fdo->LogDisposition);
- Fdo->LogDisposition = NULL;
+ if (Fdo->ConsoleAcquired) {
+ LogRemoveDisposition(Fdo->LogDisposition);
+ Fdo->LogDisposition = NULL;
+ }
FdoVirqTeardown(Fdo);
goto fail6;
status = XENBUS_CONSOLE(Acquire, &Fdo->ConsoleInterface);
- if (!NT_SUCCESS(status))
- goto fail7;
+ if (NT_SUCCESS(status))
+ Fdo->ConsoleAcquired = TRUE;
if (Fdo->BalloonInterface.Interface.Context != NULL) {
status = XENBUS_BALLOON(Acquire, &Fdo->BalloonInterface);
if (!NT_SUCCESS(status))
- goto fail8;
+ goto fail7;
}
status = __FdoD3ToD0(Fdo);
if (!NT_SUCCESS(status))
- goto fail9;
+ goto fail8;
status = XENBUS_SUSPEND(Register,
&Fdo->SuspendInterface,
Fdo,
&Fdo->SuspendCallbackLate);
if (!NT_SUCCESS(status))
- goto fail10;
+ goto fail9;
status = XENBUS_DEBUG(Register,
&Fdo->DebugInterface,
Fdo,
&Fdo->DebugCallback);
if (!NT_SUCCESS(status))
- goto fail11;
+ goto fail10;
KeLowerIrql(Irql);
return STATUS_SUCCESS;
-fail11:
- Error("fail11\n");
+fail10:
+ Error("fail10\n");
XENBUS_SUSPEND(Deregister,
&Fdo->SuspendInterface,
Fdo->SuspendCallbackLate);
Fdo->SuspendCallbackLate = NULL;
-fail10:
- Error("fail10\n");
-
- __FdoD0ToD3(Fdo);
-
fail9:
Error("fail9\n");
- if (Fdo->BalloonInterface.Interface.Context != NULL)
- XENBUS_BALLOON(Release, &Fdo->BalloonInterface);
+ __FdoD0ToD3(Fdo);
fail8:
Error("fail8\n");
- XENBUS_CONSOLE(Release, &Fdo->ConsoleInterface);
+ if (Fdo->BalloonInterface.Interface.Context != NULL)
+ XENBUS_BALLOON(Release, &Fdo->BalloonInterface);
fail7:
Error("fail7\n");
+ if (Fdo->ConsoleAcquired) {
+ XENBUS_CONSOLE(Release, &Fdo->ConsoleInterface);
+ Fdo->ConsoleAcquired = FALSE;
+ }
+
XENBUS_STORE(Release, &Fdo->StoreInterface);
fail6:
if (Fdo->BalloonInterface.Interface.Context != NULL)
XENBUS_BALLOON(Release, &Fdo->BalloonInterface);
- XENBUS_CONSOLE(Release, &Fdo->ConsoleInterface);
+ if (Fdo->ConsoleAcquired) {
+ XENBUS_CONSOLE(Release, &Fdo->ConsoleInterface);
+ Fdo->ConsoleAcquired = FALSE;
+ }
XENBUS_STORE(Release, &Fdo->StoreInterface);