]> xenbits.xensource.com Git - pvdrivers/win/xenbus.git/commitdiff
Don't veto everything on InitSafeModeMode
authorPaul Durrant <paul.durrant@citrix.com>
Tue, 1 Mar 2016 14:04:00 +0000 (14:04 +0000)
committerPaul Durrant <paul.durrant@citrix.com>
Tue, 1 Mar 2016 14:12:44 +0000 (14:12 +0000)
In safe mode we want to fall back to using emulated devices (which have
in-box drivers) just in case there is a problem using PV devices. However,
the current scheme of bailing very early in DriverEntry() hence not
supplying an AddDevice() entry point, hence not creating any FDOs and hence
no PDOs is problematic. This is because, when no child FDOs are created,
un-installing a child driver does not invoke the child driver co-installer
and thus cleanup, such as removing unplug registry keys, does not occur.
This then leads to a potential 0x7B BSOD on reboot if XENVBD was removed in
safe mode.

This patch gets rid of the global veto and instead simply vetoes unplug of
emulated devices. This should be sufficient for other PV drivers to
deactivate and let Windows use the emulated devices, but won't get in the
way of normal driver un-install behaviour.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
src/xen/driver.c
src/xenbus/driver.c
src/xenfilt/driver.c

index adc1a00de894a5fe110cc19dd7106a664112fa02..6119c7cbc5ecc1008751980ac89032c72487cf7c 100644 (file)
@@ -49,8 +49,6 @@
 #include "assert.h"
 #include "version.h"
 
-extern PULONG   InitSafeBootMode;
-
 typedef struct _XEN_DRIVER {
     PLOG_DISPOSITION    TraceDisposition;
     PLOG_DISPOSITION    InfoDisposition;
@@ -60,6 +58,16 @@ typedef struct _XEN_DRIVER {
 
 static XEN_DRIVER   Driver;
 
+extern PULONG   InitSafeBootMode;
+
+static FORCEINLINE BOOLEAN
+__DriverSafeMode(
+    VOID
+    )
+{
+    return (*InitSafeBootMode > 0) ? TRUE : FALSE;
+}
+
 static FORCEINLINE VOID
 __DriverSetUnplugKey(
     IN  HANDLE  Key
@@ -202,9 +210,6 @@ DllInitialize(
 
     Trace("====>\n");
 
-    if (*InitSafeBootMode > 0)
-        goto done;
-
     status = LogInitialize();
     if (!NT_SUCCESS(status))
         goto fail1;
@@ -234,6 +239,9 @@ DllInitialize(
          MONTH,
          YEAR);
 
+    if (__DriverSafeMode())
+        Info("SAFE MODE\n");
+
     status = RegistryInitialize(RegistryPath);
     if (!NT_SUCCESS(status))
         goto fail2;
@@ -290,7 +298,6 @@ DllInitialize(
 
     RegistryCloseKey(ServiceKey);
 
-done:
     Trace("<====\n");
 
     return STATUS_SUCCESS;
@@ -376,9 +383,6 @@ DllUnload(
 
     Trace("====>\n");
 
-    if (*InitSafeBootMode > 0)
-        goto done;
-
     UnplugTeardown();
 
     ProcessTeardown();
@@ -420,7 +424,6 @@ DllUnload(
 
     LogTeardown();
 
-done:
     ASSERT(IsZeroMemory(&Driver, sizeof (XEN_DRIVER)));
 
     Trace("<====\n");
index cd22a727e9fe756b8e39cfa4535713e43f8de0ad..24f06f55bcb24cf21923f253c5651ba99110b0eb 100644 (file)
@@ -45,8 +45,6 @@
 #include "util.h"
 #include "version.h"
 
-extern PULONG       InitSafeBootMode;
-
 typedef struct _XENBUS_DRIVER {
     PDRIVER_OBJECT      DriverObject;
     HANDLE              ParametersKey;
@@ -518,9 +516,6 @@ DriverUnload(
 
     Trace("====>\n");
 
-    if (*InitSafeBootMode > 0)
-        goto done;
-
     ASSERT(IsListEmpty(&Driver.List));
     ASSERT3U(Driver.References, ==, 1);
     --Driver.References;
@@ -549,7 +544,6 @@ DriverUnload(
          MONTH,
          YEAR);
 
-done:
     __DriverSetDriverObject(NULL);
 
     ASSERT(IsZeroMemory(&Driver, sizeof (XENBUS_DRIVER)));
@@ -662,9 +656,6 @@ DriverEntry(
 
     Driver.DriverObject->DriverUnload = DriverUnload;
 
-    if (*InitSafeBootMode > 0)
-        goto done;
-
     Info("%d.%d.%d (%d) (%02d.%02d.%04d)\n",
          MAJOR_VERSION,
          MINOR_VERSION,
index d46630f38e4bceb018d481457eae0b582074eab2..c96f4062f7e69e85216485525bcf257eb1523897 100644 (file)
@@ -45,8 +45,6 @@
 #include "util.h"
 #include "version.h"
 
-extern PULONG       InitSafeBootMode;
-
 typedef struct _XENFILT_DRIVER {
     PDRIVER_OBJECT              DriverObject;
     HANDLE                      ParametersKey;
@@ -81,6 +79,16 @@ __DriverFree(
     __FreePoolWithTag(Buffer, XENFILT_DRIVER_TAG);
 }
 
+extern PULONG   InitSafeBootMode;
+
+static FORCEINLINE BOOLEAN
+__DriverSafeMode(
+    VOID
+    )
+{
+    return (*InitSafeBootMode > 0) ? TRUE : FALSE;
+}
+
 static FORCEINLINE VOID
 __DriverSetDriverObject(
     IN  PDRIVER_OBJECT  DriverObject
@@ -355,7 +363,8 @@ DriverSetFilterState(
         if (DriverIsActivePresent()) {
             Info("ACTIVE DEVICE %sPRESENT\n", (!Present) ? "NOT " : "");
 
-            UnplugDevices();
+            if (!__DriverSafeMode())
+                UnplugDevices();
         }
 
         Info("PENDING\n");
@@ -405,9 +414,6 @@ DriverUnload(
 
     Trace("====>\n");
 
-    if (*InitSafeBootMode > 0)
-        goto done;
-
     ASSERT(IsListEmpty(&Driver.List));
     ASSERT3U(Driver.References, ==, 1);
     --Driver.References;
@@ -436,7 +442,6 @@ DriverUnload(
          MONTH,
          YEAR);
 
-done:
     __DriverSetDriverObject(NULL);
 
     ASSERT(IsZeroMemory(&Driver, sizeof (XENFILT_DRIVER)));
@@ -694,9 +699,6 @@ DriverEntry(
 
     DriverObject->DriverUnload = DriverUnload;
 
-    if (*InitSafeBootMode > 0)
-        goto done;
-
     Info("%d.%d.%d (%d) (%02d.%02d.%04d)\n",
          MAJOR_VERSION,
          MINOR_VERSION,