|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [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>
---
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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |