|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 04/14 v2] Move console handler to static Pdo
From: Owen Smith <owen.smith@xxxxxxxxxx>
Changes the Fdo into a simple bus driver that only enumerates
the single static Pdo.Moves the interface and all console operations
to the static Pdo.
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
src/xencons/fdo.c | 151 +------------------------------------------------
src/xencons/pdo.c | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 161 insertions(+), 154 deletions(-)
diff --git a/src/xencons/fdo.c b/src/xencons/fdo.c
index 1c5323c..45a1fdd 100644
--- a/src/xencons/fdo.c
+++ b/src/xencons/fdo.c
@@ -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;
@@ -2484,85 +2469,6 @@ done:
}
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,
IN PIRP Irp
@@ -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)
diff --git a/src/xencons/pdo.c b/src/xencons/pdo.c
index 5e90844..077c7e2 100755
--- a/src/xencons/pdo.c
+++ b/src/xencons/pdo.c
@@ -37,12 +37,14 @@
#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);
@@ -1639,6 +1679,85 @@ PdoDispatchPower(
}
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,
IN PIRP Irp
@@ -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));
--
2.8.3
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |