]> xenbits.xensource.com Git - pvdrivers/win/xencons.git/commitdiff
Move console handler to static Pdo
authorOwen Smith <owen.smith@citrix.com>
Thu, 1 Mar 2018 09:26:53 +0000 (09:26 +0000)
committerPaul Durrant <paul.durrant@citrix.com>
Thu, 1 Mar 2018 09:26:53 +0000 (09:26 +0000)
Moves the interface and all console operations to the static Pdo.

Signed-off-by: Owen Smith <owen.smith@citrix.com>
Modified commit comment slightly since the static Pdo was introduced by a
previous patch.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
src/xencons/fdo.c
src/xencons/pdo.c

index 1c5323c2778c83e5c75cb2d7c4fc08facd7371fa..45a1fddc45ed36dd78d89419a96b4079c87d8700 100644 (file)
@@ -41,7 +41,6 @@
 #include <suspend_interface.h>
 #include <store_interface.h>
 #include <console_interface.h>
-#include <xencons_device.h>
 #include <version.h>
 
 #include "driver.h"
@@ -49,7 +48,6 @@
 #include "fdo.h"
 #include "pdo.h"
 #include "mutex.h"
-#include "console.h"
 #include "thread.h"
 #include "names.h"
 #include "dbg_print.h"
@@ -92,8 +90,6 @@ struct _XENCONS_FDO {
 
     FDO_RESOURCE                Resource[RESOURCE_COUNT];
 
-    PXENCONS_CONSOLE            Console;
-
     XENBUS_DEBUG_INTERFACE      DebugInterface;
     XENBUS_SUSPEND_INTERFACE    SuspendInterface;
     XENBUS_STORE_INTERFACE      StoreInterface;
@@ -1096,12 +1092,6 @@ FdoD3ToD0(
 
     __FdoReleaseMutex(Fdo);
 
-    status = ConsoleD3ToD0(Fdo->Console);
-    ASSERT(NT_SUCCESS(status));
-
-#pragma prefast(suppress:28123)
-    (VOID) IoSetDeviceInterfaceState(&Fdo->Dx->Link, TRUE);
-
     Trace("<====\n");
 
     return STATUS_SUCCESS;
@@ -1144,11 +1134,6 @@ FdoD0ToD3(
 
     Trace("====>\n");
 
-#pragma prefast(suppress:28123)
-    (VOID) IoSetDeviceInterfaceState(&Fdo->Dx->Link, FALSE);
-
-    ConsoleD0ToD3(Fdo->Console);
-
     __FdoAcquireMutex(Fdo);
 
     for (ListEntry = Fdo->Dx->ListEntry.Flink;
@@ -2483,85 +2468,6 @@ done:
     return status;
 }
 
-static DECLSPEC_NOINLINE NTSTATUS
-FdoDispatchCreate(
-    IN  PXENCONS_FDO    Fdo,
-    IN  PIRP            Irp
-    )
-{
-    PIO_STACK_LOCATION  StackLocation;
-    NTSTATUS            status;
-
-    StackLocation = IoGetCurrentIrpStackLocation(Irp);
-
-    status = ConsoleOpen(Fdo->Console, StackLocation->FileObject);
-
-    Irp->IoStatus.Status = status;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-    return status;
-}
-
-static DECLSPEC_NOINLINE NTSTATUS
-FdoDispatchCleanup(
-    IN  PXENCONS_FDO    Fdo,
-    IN  PIRP            Irp
-    )
-{
-    PIO_STACK_LOCATION  StackLocation;
-    NTSTATUS            status;
-
-    StackLocation = IoGetCurrentIrpStackLocation(Irp);
-
-    status = ConsoleClose(Fdo->Console, StackLocation->FileObject);
-
-    Irp->IoStatus.Status = status;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-    return status;
-}
-
-static DECLSPEC_NOINLINE NTSTATUS
-FdoDispatchClose(
-    IN  PXENCONS_FDO    Fdo,
-    IN  PIRP            Irp
-    )
-{
-    NTSTATUS            status;
-
-    UNREFERENCED_PARAMETER(Fdo);
-
-    status = STATUS_SUCCESS;
-
-    Irp->IoStatus.Status = status;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-    return status;
-}
-
-static DECLSPEC_NOINLINE NTSTATUS
-FdoDispatchReadWrite(
-    IN  PXENCONS_FDO    Fdo,
-    IN  PIRP            Irp
-    )
-{
-    NTSTATUS            status;
-
-    status = ConsolePutQueue(Fdo->Console, Irp);
-    if (status != STATUS_PENDING)
-        goto fail1;
-
-    return STATUS_PENDING;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    Irp->IoStatus.Status = status;
-    IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
-    return status;
-}
-
 static DECLSPEC_NOINLINE NTSTATUS
 FdoDispatchDefault(
     IN  PXENCONS_FDO    Fdo,
@@ -2602,23 +2508,6 @@ FdoDispatch(
         status = FdoDispatchPower(Fdo, Irp);
         break;
 
-    case IRP_MJ_CREATE:
-        status = FdoDispatchCreate(Fdo, Irp);
-        break;
-
-    case IRP_MJ_CLEANUP:
-        status = FdoDispatchCleanup(Fdo, Irp);
-        break;
-
-    case IRP_MJ_CLOSE:
-        status = FdoDispatchClose(Fdo, Irp);
-        break;
-
-    case IRP_MJ_READ:
-    case IRP_MJ_WRITE:
-        status = FdoDispatchReadWrite(Fdo, Irp);
-        break;
-
     default:
         status = FdoDispatchDefault(Fdo, Irp);
         break;
@@ -2734,9 +2623,6 @@ DEFINE_FDO_GET_INTERFACE(Suspend, PXENBUS_SUSPEND_INTERFACE)
 DEFINE_FDO_GET_INTERFACE(Store, PXENBUS_STORE_INTERFACE)
 DEFINE_FDO_GET_INTERFACE(Console, PXENBUS_CONSOLE_INTERFACE)
 
-#pragma warning(push)
-#pragma warning(disable:6014) // Leaking memory '&Dx->Link'
-
 NTSTATUS
 FdoCreate(
     IN  PDEVICE_OBJECT      PhysicalDeviceObject
@@ -2762,13 +2648,6 @@ FdoCreate(
     Dx = (PXENCONS_DX)FunctionDeviceObject->DeviceExtension;
     RtlZeroMemory(Dx, sizeof (XENCONS_DX));
 
-    status = IoRegisterDeviceInterface(PhysicalDeviceObject,
-                                       &GUID_XENCONS_DEVICE,
-                                       NULL,
-                                       &Dx->Link);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
     Dx->Type = FUNCTION_DEVICE_OBJECT;
     Dx->DeviceObject = FunctionDeviceObject;
     Dx->DevicePnpState = Added;
@@ -2845,12 +2724,6 @@ FdoCreate(
     if (!NT_SUCCESS(status))
         goto fail11;
 
-    status = ConsoleCreate(Fdo, &Fdo->Console);
-    if (!NT_SUCCESS(status))
-        goto fail12;
-
-    FunctionDeviceObject->Flags |= DO_BUFFERED_IO;
-
     Dx->Fdo = Fdo;
 
     InitializeMutex(&Fdo->Mutex);
@@ -2863,13 +2736,13 @@ FdoCreate(
 
     status = PdoCreate(Fdo, NULL);
     if (!NT_SUCCESS(status))
-        goto fail13;
+        goto fail12;
 
     FunctionDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
     return STATUS_SUCCESS;
 
-fail13:
-    Error("fail13\n");
+fail12:
+    Error("fail12\n");
 
     Dx->Fdo = Fdo;
 
@@ -2877,12 +2750,6 @@ fail13:
     RtlZeroMemory(&Dx->ListEntry, sizeof(LIST_ENTRY));
     Fdo->References = 0;
 
-    ConsoleDestroy(Fdo->Console);
-    Fdo->Console = NULL;
-
-fail12:
-    Error("fail12\n");
-
     RtlZeroMemory(&Fdo->ConsoleInterface,
                   sizeof(XENBUS_CONSOLE_INTERFACE));
 
@@ -2944,11 +2811,6 @@ fail4:
 fail3:
     Error("fail3\n");
 
-    RtlFreeUnicodeString(&Dx->Link);
-
-fail2:
-    Error("fail2\n");
-
     IoDeleteDevice(FunctionDeviceObject);
 
 fail1:
@@ -2979,9 +2841,6 @@ FdoDestroy(
 
     Dx->Fdo = NULL;
 
-    ConsoleDestroy(Fdo->Console);
-    Fdo->Console = NULL;
-
     RtlZeroMemory(&Fdo->ConsoleInterface,
                   sizeof (XENBUS_CONSOLE_INTERFACE));
 
@@ -3016,9 +2875,5 @@ FdoDestroy(
     ASSERT(IsZeroMemory(Fdo, sizeof (XENCONS_FDO)));
     __FdoFree(Fdo);
 
-    RtlFreeUnicodeString(&Dx->Link);
-
     IoDeleteDevice(FunctionDeviceObject);
 }
-
-#pragma warning(pop)
index 5e90844a0562bc2d6ae9543674de6ec33bb042ed..077c7e2ff6f62ce3b73b3ed697ef079aba58841c 100644 (file)
 #include <stdlib.h>
 
 #include <suspend_interface.h>
+#include <xencons_device.h>
 #include <version.h>
 
 #include "driver.h"
 #include "names.h"
 #include "fdo.h"
 #include "pdo.h"
+#include "console.h"
 #include "thread.h"
 #include "dbg_print.h"
 #include "assert.h"
@@ -68,6 +70,8 @@ struct _XENCONS_PDO {
 
     XENBUS_SUSPEND_INTERFACE    SuspendInterface;
     PXENBUS_SUSPEND_CALLBACK    SuspendCallbackLate;
+
+    PXENCONS_CONSOLE            Console;
 };
 
 static FORCEINLINE PVOID
@@ -437,10 +441,27 @@ PdoD3ToD0(
 
     KeLowerIrql(Irql);
 
+    status = ConsoleD3ToD0(Pdo->Console);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+#pragma prefast(suppress:28123)
+    (VOID) IoSetDeviceInterfaceState(&Pdo->Dx->Link, TRUE);
+
     Trace("(%s) <====\n", __PdoGetName(Pdo));
 
     return STATUS_SUCCESS;
 
+fail4:
+    Error("fail4\n");
+
+    KeRaiseIrql(DISPATCH_LEVEL, &Irql);
+
+    XENBUS_SUSPEND(Deregister,
+                   &Pdo->SuspendInterface,
+                   Pdo->SuspendCallbackLate);
+    Pdo->SuspendCallbackLate = NULL;
+
 fail3:
     Error("fail3\n");
 
@@ -471,6 +492,11 @@ PdoD0ToD3(
 
     ASSERT3U(KeGetCurrentIrql(), == , PASSIVE_LEVEL);
 
+#pragma prefast(suppress:28123)
+    (VOID) IoSetDeviceInterfaceState(&Pdo->Dx->Link, FALSE);
+
+    ConsoleD0ToD3(Pdo->Console);
+
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
     XENBUS_SUSPEND(Deregister,
@@ -527,10 +553,21 @@ PdoStartDevice(
 {
     NTSTATUS            status;
 
-    status = PdoD3ToD0(Pdo);
+    if (Pdo->Dx->Link.Length != 0)
+        goto done;
+
+    status = IoRegisterDeviceInterface(__PdoGetDeviceObject(Pdo),
+                                       &GUID_XENCONS_DEVICE,
+                                       NULL,
+                                       &Pdo->Dx->Link);
     if (!NT_SUCCESS(status))
         goto fail1;
 
+done:
+    status = PdoD3ToD0(Pdo);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
     __PdoSetDevicePnpState(Pdo, Started);
 
     Irp->IoStatus.Status = STATUS_SUCCESS;
@@ -538,6 +575,9 @@ PdoStartDevice(
 
     return STATUS_SUCCESS;
 
+fail2:
+    Error("fail2\n");
+
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -1638,6 +1678,85 @@ PdoDispatchPower(
     return status;
 }
 
+static DECLSPEC_NOINLINE NTSTATUS
+PdoDispatchCreate(
+    IN  PXENCONS_PDO    Pdo,
+    IN  PIRP            Irp
+    )
+{
+    PIO_STACK_LOCATION  StackLocation;
+    NTSTATUS            status;
+
+    StackLocation = IoGetCurrentIrpStackLocation(Irp);
+
+    status = ConsoleOpen(Pdo->Console, StackLocation->FileObject);
+
+    Irp->IoStatus.Status = status;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+    return status;
+}
+
+static DECLSPEC_NOINLINE NTSTATUS
+PdoDispatchCleanup(
+    IN  PXENCONS_PDO    Pdo,
+    IN  PIRP            Irp
+    )
+{
+    PIO_STACK_LOCATION  StackLocation;
+    NTSTATUS            status;
+
+    StackLocation = IoGetCurrentIrpStackLocation(Irp);
+
+    status = ConsoleClose(Pdo->Console, StackLocation->FileObject);
+
+    Irp->IoStatus.Status = status;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+    return status;
+}
+
+static DECLSPEC_NOINLINE NTSTATUS
+PdoDispatchClose(
+    IN  PXENCONS_PDO    Pdo,
+    IN  PIRP            Irp
+    )
+{
+    NTSTATUS            status;
+
+    UNREFERENCED_PARAMETER(Pdo);
+
+    status = STATUS_SUCCESS;
+
+    Irp->IoStatus.Status = status;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+    return status;
+}
+
+static DECLSPEC_NOINLINE NTSTATUS
+PdoDispatchReadWrite(
+    IN  PXENCONS_PDO    Pdo,
+    IN  PIRP            Irp
+    )
+{
+    NTSTATUS            status;
+
+    status = ConsolePutQueue(Pdo->Console, Irp);
+    if (status != STATUS_PENDING)
+        goto fail1;
+
+    return STATUS_PENDING;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    Irp->IoStatus.Status = status;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+    return status;
+}
+
 static DECLSPEC_NOINLINE NTSTATUS
 PdoDispatchDefault(
     IN  PXENCONS_PDO    Pdo,
@@ -1674,6 +1793,23 @@ PdoDispatch(
         status = PdoDispatchPower(Pdo, Irp);
         break;
 
+    case IRP_MJ_CREATE:
+        status = PdoDispatchCreate(Pdo, Irp);
+        break;
+
+    case IRP_MJ_CLEANUP:
+        status = PdoDispatchCleanup(Pdo, Irp);
+        break;
+
+    case IRP_MJ_CLOSE:
+        status = PdoDispatchClose(Pdo, Irp);
+        break;
+
+    case IRP_MJ_READ:
+    case IRP_MJ_WRITE:
+        status = PdoDispatchReadWrite(Pdo, Irp);
+        break;
+
     default:
         status = PdoDispatchDefault(Pdo, Irp);
         break;
@@ -1755,31 +1891,42 @@ PdoCreate(
 
     Dx->Pdo = Pdo;
 
-    status = FdoAddPhysicalDeviceObject(Fdo, Pdo);
+    status = ConsoleCreate(Fdo, &Pdo->Console);
     if (!NT_SUCCESS(status))
         goto fail5;
 
+    status = FdoAddPhysicalDeviceObject(Fdo, Pdo);
+    if (!NT_SUCCESS(status))
+        goto fail6;
+
     status = STATUS_UNSUCCESSFUL;
     if (__PdoIsEjectRequested(Pdo))
-        goto fail6;
+        goto fail7;
 
     Info("%p (%s)\n",
          PhysicalDeviceObject,
          __PdoGetName(Pdo));
 
+    PhysicalDeviceObject->Flags |= DO_BUFFERED_IO;
     PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
     return STATUS_SUCCESS;
 
+fail7:
+    Error("fail7\n");
+
+    FdoRemovePhysicalDeviceObject(Fdo, Pdo);
+
 fail6:
     Error("fail6\n");
 
-    FdoRemovePhysicalDeviceObject(Fdo, Pdo);
+    (VOID)__PdoClearEjectRequested(Pdo);
+
+    ConsoleDestroy(Pdo->Console);
+    Pdo->Console = NULL;
 
 fail5:
     Error("fail5\n");
 
-    (VOID)__PdoClearEjectRequested(Pdo);
-
     Dx->Pdo = NULL;
 
     RtlZeroMemory(&Pdo->SuspendInterface,
@@ -1843,6 +1990,11 @@ PdoDestroy(
 
     Dx->Pdo = NULL;
 
+    ConsoleDestroy(Pdo->Console);
+    Pdo->Console = NULL;
+
+    RtlFreeUnicodeString(&Pdo->Dx->Link);
+
     RtlZeroMemory(&Pdo->SuspendInterface,
                   sizeof(XENBUS_SUSPEND_INTERFACE));