From: Owen Smith Date: Thu, 1 Mar 2018 09:26:53 +0000 (+0000) Subject: Move console handler to static Pdo X-Git-Tag: 9.0.0-rc1~26 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=44824eca2d77dbc2418279f1ecb27ed2332c8fe0;p=pvdrivers%2Fwin%2Fxencons.git Move console handler to static Pdo Moves the interface and all console operations to the static Pdo. Signed-off-by: Owen Smith Modified commit comment slightly since the static Pdo was introduced by a previous patch. Signed-off-by: Paul Durrant --- 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 #include #include -#include #include #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) diff --git a/src/xencons/pdo.c b/src/xencons/pdo.c index 5e90844..077c7e2 100644 --- a/src/xencons/pdo.c +++ b/src/xencons/pdo.c @@ -37,12 +37,14 @@ #include #include +#include #include #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));