[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [win-pv-devel] [PATCH 08/14 v2] Hide console access behind an interface
> -----Original Message----- > From: win-pv-devel [mailto:win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx] On > Behalf Of owen.smith@xxxxxxxxxx > Sent: 23 February 2018 14:22 > To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx > Cc: Owen Smith <owen.smith@xxxxxxxxxx> > Subject: [win-pv-devel] [PATCH 08/14 v2] Hide console access behind an > interface > > From: Owen Smith <owen.smith@xxxxxxxxxx> > > * Allows a different implementation of the console protocol for > non-default consoles > > Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> Acked-by: Paul Durrant <paul.durrant@xxxxxxxxxx> > --- > src/xencons/console.c | 174 > +++++++++++++++++++++++++++++++++++++--------- > src/xencons/console.h | 40 +---------- > src/xencons/console_abi.h | 99 ++++++++++++++++++++++++++ > src/xencons/pdo.c | 72 +++++++++---------- > 4 files changed, 279 insertions(+), 106 deletions(-) > create mode 100755 src/xencons/console_abi.h > > diff --git a/src/xencons/console.c b/src/xencons/console.c > index b9abe83..50fe145 100755 > --- a/src/xencons/console.c > +++ b/src/xencons/console.c > @@ -53,11 +53,12 @@ typedef struct _CONSOLE_HANDLE { > PXENCONS_STREAM Stream; > } CONSOLE_HANDLE, *PCONSOLE_HANDLE; > > -struct _XENCONS_CONSOLE { > +typedef struct _XENCONS_CONSOLE { > + LONG RefCount; > PXENCONS_FDO Fdo; > LIST_ENTRY List; > KSPIN_LOCK Lock; > -}; > +} XENCONS_CONSOLE, *PXENCONS_CONSOLE; > > static FORCEINLINE PVOID > __ConsoleAllocate( > @@ -136,7 +137,7 @@ fail1: > return NULL; > } > > -NTSTATUS > +static NTSTATUS > ConsoleOpen( > IN PXENCONS_CONSOLE Console, > IN PFILE_OBJECT FileObject > @@ -178,7 +179,7 @@ fail1: > return status; > } > > -NTSTATUS > +static NTSTATUS > ConsoleClose( > IN PXENCONS_CONSOLE Console, > IN PFILE_OBJECT FileObject > @@ -317,7 +318,7 @@ fail1: > return status; > } > > -NTSTATUS > +static NTSTATUS > ConsolePutQueue( > IN PXENCONS_CONSOLE Console, > IN PIRP Irp > @@ -347,7 +348,7 @@ ConsolePutQueue( > return status; > } > > -NTSTATUS > +static NTSTATUS > ConsoleD3ToD0( > IN PXENCONS_CONSOLE Console > ) > @@ -361,7 +362,7 @@ ConsoleD3ToD0( > return STATUS_SUCCESS; > } > > -VOID > +static VOID > ConsoleD0ToD3( > IN PXENCONS_CONSOLE Console > ) > @@ -400,52 +401,157 @@ ConsoleD0ToD3( > Trace("<====\n"); > } > > -NTSTATUS > -ConsoleCreate( > - IN PXENCONS_FDO Fdo, > - OUT PXENCONS_CONSOLE *Console > +static VOID > +ConsoleDestroy( > + IN PXENCONS_CONSOLE Console > ) > -{ > - NTSTATUS status; > - > +{ > Trace("====>\n"); > > - *Console = __ConsoleAllocate(sizeof(XENCONS_CONSOLE)); > + ASSERT(IsListEmpty(&Console->List)); > + RtlZeroMemory(&Console->List, sizeof(LIST_ENTRY)); > > - status = STATUS_NO_MEMORY; > - if (*Console == NULL) > - goto fail1; > + RtlZeroMemory(&Console->Lock, sizeof(KSPIN_LOCK)); > + > + Console->Fdo = NULL; > > - (*Console)->Fdo = Fdo; > - InitializeListHead(&(*Console)->List); > - KeInitializeSpinLock(&(*Console)->Lock); > + ASSERT(IsZeroMemory(Console, sizeof(XENCONS_CONSOLE))); > + __ConsoleFree(Console); > > Trace("<====\n"); > +} > + > +static NTSTATUS > +ConsoleAbiAcquire( > + IN PXENCONS_CONSOLE_CONTEXT Context > + ) > +{ > + PXENCONS_CONSOLE Console = (PXENCONS_CONSOLE)Context; > + > + InterlockedIncrement(&Console->RefCount); > > return STATUS_SUCCESS; > +} > > -fail1: > - Error("fail1 (%08x)\n", status); > +static VOID > +ConsoleAbiRelease( > + IN PXENCONS_CONSOLE_CONTEXT Context > + ) > +{ > + PXENCONS_CONSOLE Console = (PXENCONS_CONSOLE)Context; > + LONG Count; > > - return status; > + Count = InterlockedDecrement(&Console->RefCount); > + > + if (Count == 0) > + ConsoleDestroy(Console); > } > > -VOID > -ConsoleDestroy( > - IN PXENCONS_CONSOLE Console > +static BOOLEAN > +ConsoleAbiIsDefault( > + IN PXENCONS_CONSOLE_CONTEXT Context > ) > -{ > +{ > + UNREFERENCED_PARAMETER(Context); > + return TRUE; > +} > + > +static NTSTATUS > +ConsoleAbiD3ToD0( > + IN PXENCONS_CONSOLE_CONTEXT Context > + ) > +{ > + PXENCONS_CONSOLE Console = (PXENCONS_CONSOLE)Context; > + > + return ConsoleD3ToD0(Console); > +} > + > +static VOID > +ConsoleAbiD0ToD3( > + IN PXENCONS_CONSOLE_CONTEXT Context > + ) > +{ > + PXENCONS_CONSOLE Console = (PXENCONS_CONSOLE)Context; > + > + ConsoleD0ToD3(Console); > +} > + > +static NTSTATUS > +ConsoleAbiOpen( > + IN PXENCONS_CONSOLE_CONTEXT Context, > + IN PFILE_OBJECT FileObject > + ) > +{ > + PXENCONS_CONSOLE Console = (PXENCONS_CONSOLE)Context; > + > + return ConsoleOpen(Console, FileObject); > +} > + > +static NTSTATUS > +ConsoleAbiClose( > + IN PXENCONS_CONSOLE_CONTEXT Context, > + IN PFILE_OBJECT FileObject > + ) > +{ > + PXENCONS_CONSOLE Console = (PXENCONS_CONSOLE)Context; > + > + return ConsoleClose(Console, FileObject); > +} > + > +static NTSTATUS > +ConsoleAbiPutQueue( > + IN PXENCONS_CONSOLE_CONTEXT Context, > + IN PIRP Irp > + ) > +{ > + PXENCONS_CONSOLE Console = (PXENCONS_CONSOLE)Context; > + > + return ConsolePutQueue(Console, Irp); > +} > + > +static XENCONS_CONSOLE_ABI ConsoleAbiV1 = { > + NULL, > + ConsoleAbiAcquire, > + ConsoleAbiRelease, > + ConsoleAbiIsDefault, > + ConsoleAbiD3ToD0, > + ConsoleAbiD0ToD3, > + ConsoleAbiOpen, > + ConsoleAbiClose, > + ConsoleAbiPutQueue > +}; > + > +NTSTATUS > +ConsoleCreate( > + IN PXENCONS_FDO Fdo, > + IN PXENCONS_CONSOLE_ABI ConsoleAbi > + ) > +{ > + PXENCONS_CONSOLE Console; > + NTSTATUS status; > + > Trace("====>\n"); > > - ASSERT(IsListEmpty(&Console->List)); > - RtlZeroMemory(&Console->List, sizeof(LIST_ENTRY)); > + Console = __ConsoleAllocate(sizeof(XENCONS_CONSOLE)); > > - RtlZeroMemory(&Console->Lock, sizeof(KSPIN_LOCK)); > + status = STATUS_NO_MEMORY; > + if (Console == NULL) > + goto fail1; > > - Console->Fdo = NULL; > + Console->RefCount = 1; > + Console->Fdo = Fdo; > + InitializeListHead(&Console->List); > + KeInitializeSpinLock(&Console->Lock); > > - ASSERT(IsZeroMemory(Console, sizeof(XENCONS_CONSOLE))); > - __ConsoleFree(Console); > + *ConsoleAbi = ConsoleAbiV1; > + ConsoleAbi->Context = (PXENCONS_CONSOLE_CONTEXT)Console; > > Trace("<====\n"); > + > + return STATUS_SUCCESS; > + > +fail1: > + Error("fail1 (%08x)\n", status); > + > + return status; > } > diff --git a/src/xencons/console.h b/src/xencons/console.h > index 1094f82..81a7c13 100755 > --- a/src/xencons/console.h > +++ b/src/xencons/console.h > @@ -35,46 +35,12 @@ > #include <ntddk.h> > > #include "driver.h" > - > -typedef struct _XENCONS_CONSOLE XENCONS_CONSOLE, > *PXENCONS_CONSOLE; > +#include "console_abi.h" > > extern NTSTATUS > ConsoleCreate( > - IN PXENCONS_FDO Fdo, > - OUT PXENCONS_CONSOLE *Console > - ); > - > -extern VOID > -ConsoleDestroy( > - IN PXENCONS_CONSOLE Console > - ); > - > -extern NTSTATUS > -ConsoleD3ToD0( > - IN PXENCONS_CONSOLE Console > - ); > - > -extern VOID > -ConsoleD0ToD3( > - IN PXENCONS_CONSOLE Console > - ); > - > -extern NTSTATUS > -ConsoleOpen( > - IN PXENCONS_CONSOLE Console, > - IN PFILE_OBJECT FileObject > - ); > - > -extern NTSTATUS > -ConsoleClose( > - IN PXENCONS_CONSOLE Console, > - IN PFILE_OBJECT FileObject > - ); > - > -extern NTSTATUS > -ConsolePutQueue( > - IN PXENCONS_CONSOLE Console, > - IN PIRP Irp > + IN PXENCONS_FDO Fdo, > + IN PXENCONS_CONSOLE_ABI ConsoleAbi > ); > > #endif // _XENCONS_CONSOLE_H > diff --git a/src/xencons/console_abi.h b/src/xencons/console_abi.h > new file mode 100755 > index 0000000..ab8d800 > --- /dev/null > +++ b/src/xencons/console_abi.h > @@ -0,0 +1,99 @@ > +/* Copyright (c) Citrix Systems Inc. > +* All rights reserved. > +* > +* Redistribution and use in source and binary forms, > +* with or without modification, are permitted provided > +* that the following conditions are met: > +* > +* * Redistributions of source code must retain the above > +* copyright notice, this list of conditions and the > +* following disclaimer. > +* * Redistributions in binary form must reproduce the above > +* copyright notice, this list of conditions and the > +* following disclaimer in the documentation and/or other > +* materials provided with the distribution. > +* > +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND > +* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, > +* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF > +* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE > +* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR > +* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, > +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, > +* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR > +* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS > +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, > +* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING > +* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE > +* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF > +* SUCH DAMAGE. > +*/ > + > +#ifndef _XENCONS_CONSOLE_ABI_H > +#define _XENCONS_CONSOLE_ABI_H > + > +#include <ntddk.h> > + > +#include "driver.h" > + > +typedef PVOID *PXENCONS_CONSOLE_CONTEXT; > + > +typedef NTSTATUS > +(*XENCONS_CONSOLE_ABI_ACQUIRE)( > + IN PXENCONS_CONSOLE_CONTEXT Context > + ); > + > +typedef VOID > +(*XENCONS_CONSOLE_ABI_RELEASE)( > + IN PXENCONS_CONSOLE_CONTEXT Context > + ); > + > +typedef BOOLEAN > +(*XENCONS_CONSOLE_ABI_IS_DEFAULT)( > + IN PXENCONS_CONSOLE_CONTEXT Context > + ); > + > +typedef NTSTATUS > +(*XENCONS_CONSOLE_ABI_D3TOD0)( > + IN PXENCONS_CONSOLE_CONTEXT Context > + ); > + > +typedef VOID > +(*XENCONS_CONSOLE_ABI_D0TOD3)( > + IN PXENCONS_CONSOLE_CONTEXT Context > + ); > + > +typedef NTSTATUS > +(*XENCONS_CONSOLE_ABI_OPEN)( > + IN PXENCONS_CONSOLE_CONTEXT Context, > + IN PFILE_OBJECT FileObject > + ); > + > +typedef NTSTATUS > +(*XENCONS_CONSOLE_ABI_CLOSE)( > + IN PXENCONS_CONSOLE_CONTEXT Context, > + IN PFILE_OBJECT FileObject > + ); > + > +typedef NTSTATUS > +(*XENCONS_CONSOLE_ABI_PUT_QUEUE)( > + IN PXENCONS_CONSOLE_CONTEXT Context, > + IN PIRP Irp > + ); > + > +typedef struct _XENCONS_CONSOLE_ABI { > + PXENCONS_CONSOLE_CONTEXT Context; > + XENCONS_CONSOLE_ABI_ACQUIRE ConsoleAbiAcquire; > + XENCONS_CONSOLE_ABI_RELEASE ConsoleAbiRelease; > + XENCONS_CONSOLE_ABI_IS_DEFAULT ConsoleAbiIsDefault; > + XENCONS_CONSOLE_ABI_D3TOD0 ConsoleAbiD3ToD0; > + XENCONS_CONSOLE_ABI_D0TOD3 ConsoleAbiD0ToD3; > + XENCONS_CONSOLE_ABI_OPEN ConsoleAbiOpen; > + XENCONS_CONSOLE_ABI_CLOSE ConsoleAbiClose; > + XENCONS_CONSOLE_ABI_PUT_QUEUE ConsoleAbiPutQueue; > +} XENCONS_CONSOLE_ABI, *PXENCONS_CONSOLE_ABI; > + > +#define XENCONS_CONSOLE_ABI(_Method, _Abi, ...) \ > + (_Abi)->ConsoleAbi ## _Method((_Abi)->Context, __VA_ARGS__) > + > +#endif // _XENCONS_CONSOLE_ABI_H > diff --git a/src/xencons/pdo.c b/src/xencons/pdo.c > index 2acd86a..74be759 100755 > --- a/src/xencons/pdo.c > +++ b/src/xencons/pdo.c > @@ -44,6 +44,7 @@ > #include "names.h" > #include "fdo.h" > #include "pdo.h" > +#include "console_abi.h" > #include "console.h" > #include "thread.h" > #include "dbg_print.h" > @@ -71,8 +72,7 @@ struct _XENCONS_PDO { > XENBUS_SUSPEND_INTERFACE SuspendInterface; > PXENBUS_SUSPEND_CALLBACK SuspendCallbackLate; > > - BOOLEAN IsDefault; > - PXENCONS_CONSOLE Console; > + XENCONS_CONSOLE_ABI ConsoleAbi; > }; > > static FORCEINLINE PVOID > @@ -308,7 +308,7 @@ __PdoIsDefault( > IN PXENCONS_PDO Pdo > ) > { > - return Pdo->IsDefault; > + return XENCONS_CONSOLE_ABI(IsDefault, &Pdo->ConsoleAbi); > } > > BOOLEAN > @@ -466,10 +466,7 @@ PdoD3ToD0( > > KeLowerIrql(Irql); > > - if (__PdoIsDefault(Pdo)) > - status = ConsoleD3ToD0(Pdo->Console); > - else > - status = STATUS_SUCCESS; > + status = XENCONS_CONSOLE_ABI(D3ToD0, &Pdo->ConsoleAbi); > if (!NT_SUCCESS(status)) > goto fail4; > > @@ -523,8 +520,7 @@ PdoD0ToD3( > #pragma prefast(suppress:28123) > (VOID) IoSetDeviceInterfaceState(&Pdo->Dx->Link, FALSE); > > - if (__PdoIsDefault(Pdo)) > - ConsoleD0ToD3(Pdo->Console); > + XENCONS_CONSOLE_ABI(D0ToD3, &Pdo->ConsoleAbi); > > KeRaiseIrql(DISPATCH_LEVEL, &Irql); > > @@ -1718,10 +1714,9 @@ PdoDispatchCreate( > > StackLocation = IoGetCurrentIrpStackLocation(Irp); > > - if (__PdoIsDefault(Pdo)) > - status = ConsoleOpen(Pdo->Console, StackLocation->FileObject); > - else > - status = STATUS_SUCCESS; > + status = XENCONS_CONSOLE_ABI(Open, > + &Pdo->ConsoleAbi, > + StackLocation->FileObject); > > Irp->IoStatus.Status = status; > IoCompleteRequest(Irp, IO_NO_INCREMENT); > @@ -1740,10 +1735,9 @@ PdoDispatchCleanup( > > StackLocation = IoGetCurrentIrpStackLocation(Irp); > > - if (__PdoIsDefault(Pdo)) > - status = ConsoleClose(Pdo->Console, StackLocation->FileObject); > - else > - status = STATUS_SUCCESS; > + status = XENCONS_CONSOLE_ABI(Close, > + &Pdo->ConsoleAbi, > + StackLocation->FileObject); > > Irp->IoStatus.Status = status; > IoCompleteRequest(Irp, IO_NO_INCREMENT); > @@ -1777,12 +1771,12 @@ PdoDispatchReadWriteControl( > { > NTSTATUS status; > > - if (__PdoIsDefault(Pdo)) > - status = ConsolePutQueue(Pdo->Console, Irp); > - else > - status = STATUS_DEVICE_NOT_READY; > + status = XENCONS_CONSOLE_ABI(PutQueue, > + &Pdo->ConsoleAbi, > + Irp); > if (status == STATUS_SUCCESS) > goto done; > + > if (status != STATUS_PENDING) > goto fail1; > > @@ -1865,9 +1859,21 @@ PdoResume( > IN PXENCONS_PDO Pdo > ) > { > + NTSTATUS status; > + > Trace("(%s) ====>\n", __PdoGetName(Pdo)); > + > + status = XENCONS_CONSOLE_ABI(Acquire, &Pdo->ConsoleAbi); > + if (!NT_SUCCESS(status)) > + goto fail1; > + > Trace("(%s) <====\n", __PdoGetName(Pdo)); > return STATUS_SUCCESS; > + > +fail1: > + Error("fail1 (%08x)\n", status); > + > + return status; > } > > VOID > @@ -1876,6 +1882,9 @@ PdoSuspend( > ) > { > Trace("(%s) ====>\n", __PdoGetName(Pdo)); > + > + XENCONS_CONSOLE_ABI(Release, &Pdo->ConsoleAbi); > + > Trace("(%s) <====\n", __PdoGetName(Pdo)); > } > > @@ -1933,11 +1942,10 @@ PdoCreate( > > Dx->Pdo = Pdo; > > - Pdo->IsDefault = (Device == NULL); > - if (Pdo->IsDefault) > - status = ConsoleCreate(Fdo, &Pdo->Console); > + if (Device == NULL) > + status = ConsoleCreate(Fdo, &Pdo->ConsoleAbi); > else > - status = STATUS_SUCCESS; > + status = STATUS_SUCCESS;// TODO: create frontend > if (!NT_SUCCESS(status)) > goto fail5; > > @@ -1967,11 +1975,8 @@ fail6: > > (VOID)__PdoClearEjectRequested(Pdo); > > - if (__PdoIsDefault(Pdo)) > - ConsoleDestroy(Pdo->Console); > - Pdo->Console = NULL; > - > - Pdo->IsDefault = FALSE; > + XENCONS_CONSOLE_ABI(Release, &Pdo->ConsoleAbi); > + RtlZeroMemory(&Pdo->ConsoleAbi, sizeof(XENCONS_CONSOLE_ABI)); > > fail5: > Error("fail5\n"); > @@ -2039,11 +2044,8 @@ PdoDestroy( > > Dx->Pdo = NULL; > > - if (__PdoIsDefault(Pdo)) > - ConsoleDestroy(Pdo->Console); > - Pdo->Console = NULL; > - > - Pdo->IsDefault = FALSE; > + XENCONS_CONSOLE_ABI(Release, &Pdo->ConsoleAbi); > + RtlZeroMemory(&Pdo->ConsoleAbi, sizeof(XENCONS_CONSOLE_ABI)); > > RtlFreeUnicodeString(&Pdo->Dx->Link); > > -- > 2.8.3 > > > _______________________________________________ > win-pv-devel mailing list > win-pv-devel@xxxxxxxxxxxxxxxxxxxx > https://lists.xenproject.org/mailman/listinfo/win-pv-devel _______________________________________________ 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 |