From: Paul Durrant Date: Thu, 18 Nov 2021 21:05:45 +0000 (+0000) Subject: The PV console may not always be available X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=0965ba862807d433375f73844ffd22e3cfe633c6;p=pvdrivers%2Fwin%2Fxenbus.git The PV console may not always be available In some Xen deployments the tool-stack may not allocate a PV console ring and event channel to the guest, so XENBUS should deal with this situation gracefully. Signed-off-by: Paul Durrant --- diff --git a/src/xenbus/console.c b/src/xenbus/console.c index 8573ea7..e638b3f 100644 --- a/src/xenbus/console.c +++ b/src/xenbus/console.c @@ -331,7 +331,7 @@ ConsoleDisable( Context->Channel = NULL; } -static VOID +static NTSTATUS ConsoleEnable( IN PXENBUS_CONSOLE_CONTEXT Context ) @@ -340,8 +340,10 @@ ConsoleEnable( 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; @@ -369,6 +371,13 @@ ConsoleEnable( // Trigger an initial poll if (KeInsertQueueDpc(&Context->Dpc, NULL, NULL)) Context->Dpcs++; + + return STATUS_SUCCESS; + +fail1: + Error("fail1 (%08x)\n", status); + + return status; } static @@ -702,11 +711,13 @@ ConsoleAcquire( 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, @@ -715,11 +726,11 @@ ConsoleAcquire( 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, @@ -728,7 +739,7 @@ ConsoleAcquire( Context, &Context->DebugCallback); if (!NT_SUCCESS(status)) - goto fail8; + goto fail9; Trace("<====\n"); @@ -737,29 +748,32 @@ done: 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: diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c index ac86020..e2b2702 100644 --- a/src/xenbus/fdo.c +++ b/src/xenbus/fdo.c @@ -166,6 +166,7 @@ struct _XENBUS_FDO { PXENBUS_DEBUG_CALLBACK DebugCallback; PXENBUS_SUSPEND_CALLBACK SuspendCallbackLate; + BOOLEAN ConsoleAcquired; PLOG_DISPOSITION LogDisposition; }; @@ -3057,11 +3058,13 @@ __FdoD3ToD0( 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, @@ -3137,8 +3140,10 @@ fail3: fail2: Error("fail2\n"); - LogRemoveDisposition(Fdo->LogDisposition); - Fdo->LogDisposition = NULL; + if (Fdo->ConsoleAcquired) { + LogRemoveDisposition(Fdo->LogDisposition); + Fdo->LogDisposition = NULL; + } FdoVirqTeardown(Fdo); @@ -3186,8 +3191,10 @@ __FdoD0ToD3( Fdo->ScanWatch); Fdo->ScanWatch = NULL; - LogRemoveDisposition(Fdo->LogDisposition); - Fdo->LogDisposition = NULL; + if (Fdo->ConsoleAcquired) { + LogRemoveDisposition(Fdo->LogDisposition); + Fdo->LogDisposition = NULL; + } FdoVirqTeardown(Fdo); @@ -3569,18 +3576,18 @@ FdoD3ToD0( 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, @@ -3589,7 +3596,7 @@ FdoD3ToD0( Fdo, &Fdo->SuspendCallbackLate); if (!NT_SUCCESS(status)) - goto fail10; + goto fail9; status = XENBUS_DEBUG(Register, &Fdo->DebugInterface, @@ -3598,7 +3605,7 @@ FdoD3ToD0( Fdo, &Fdo->DebugCallback); if (!NT_SUCCESS(status)) - goto fail11; + goto fail10; KeLowerIrql(Irql); @@ -3629,33 +3636,33 @@ not_active: 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: @@ -3780,7 +3787,10 @@ FdoD0ToD3( 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);