|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 3/4] xenvkbd: Read "feature-vkbd-standalone"
From: Owen Smith <owen.smith@xxxxxxxxxx>
Read "feature-vkbd-standalone" and fail connect
if it is not 1. Writes "request-vkbd-standalone" before
transitioning to Connected.
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
src/xenvkbd/frontend.c | 15 +++++++------
src/xenvkbd/hid.c | 14 +++++--------
src/xenvkbd/ring.c | 57 +++++++++++++++++++++++++++++++++++++++++---------
3 files changed, 59 insertions(+), 27 deletions(-)
diff --git a/src/xenvkbd/frontend.c b/src/xenvkbd/frontend.c
index ea85cd2..1d6d360 100644
--- a/src/xenvkbd/frontend.c
+++ b/src/xenvkbd/frontend.c
@@ -795,7 +795,7 @@ FrontendSetState(
IN XENVKBD_FRONTEND_STATE State
)
{
- BOOLEAN Failed;
+ NTSTATUS status;
KIRQL Irql;
KeAcquireSpinLock(&Frontend->Lock, &Irql);
@@ -805,10 +805,8 @@ FrontendSetState(
FrontendStateName(Frontend->State),
FrontendStateName(State));
- Failed = FALSE;
- while (Frontend->State != State && !Failed) {
- NTSTATUS status;
-
+ status = STATUS_SUCCESS;
+ while (Frontend->State != State && NT_SUCCESS(status)) {
switch (Frontend->State) {
case FRONTEND_UNKNOWN:
switch (State) {
@@ -820,8 +818,6 @@ FrontendSetState(
status = FrontendClose(Frontend);
if (NT_SUCCESS(status)) {
Frontend->State = FRONTEND_CLOSED;
- } else {
- Failed = TRUE;
}
break;
@@ -860,6 +856,9 @@ FrontendSetState(
Frontend->State = FRONTEND_CLOSED;
}
break;
+ case FRONTEND_UNKNOWN:
+ Frontend->State = FRONTEND_UNKNOWN;
+ break;
default:
ASSERT(FALSE);
break;
@@ -935,7 +934,7 @@ FrontendSetState(
Info("%s: <=====\n", __FrontendGetPath(Frontend));
- return (!Failed) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
+ return status;
}
static FORCEINLINE VOID
diff --git a/src/xenvkbd/hid.c b/src/xenvkbd/hid.c
index 03fc1a2..8a90dd1 100644
--- a/src/xenvkbd/hid.c
+++ b/src/xenvkbd/hid.c
@@ -109,13 +109,11 @@ HidEnable(
{
PXENVKBD_HID_CONTEXT Context = Interface->Context;
KIRQL Irql;
- BOOLEAN Exclusive;
NTSTATUS status;
Trace("====>\n");
AcquireMrswLockExclusive(&Context->Lock, &Irql);
- Exclusive = TRUE;
if (Context->Enabled)
goto done;
@@ -128,11 +126,12 @@ HidEnable(
KeMemoryBarrier();
status = FrontendSetState(Context->Frontend, FRONTEND_ENABLED);
- if (!NT_SUCCESS(status))
- goto fail1;
+ if (!NT_SUCCESS(status)) {
+ if (status != STATUS_DEVICE_NOT_READY)
+ goto fail1;
+ }
done:
- ASSERT(Exclusive);
ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
Trace("<====\n");
@@ -149,10 +148,7 @@ fail1:
Context->Argument = NULL;
Context->Callback = NULL;
- if (Exclusive)
- ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
- else
- ReleaseMrswLockShared(&Context->Lock);
+ ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
return status;
}
diff --git a/src/xenvkbd/ring.c b/src/xenvkbd/ring.c
index da1bd17..914521c 100644
--- a/src/xenvkbd/ring.c
+++ b/src/xenvkbd/ring.c
@@ -78,6 +78,7 @@ struct _XENVKBD_RING {
BOOLEAN Connected;
BOOLEAN Enabled;
BOOLEAN AbsPointer;
+ BOOLEAN VkbdStandalone;
XENVKBD_HID_KEYBOARD KeyboardReport;
XENVKBD_HID_ABSMOUSE AbsMouseReport;
@@ -497,6 +498,22 @@ RingReadFeatures(
} else {
Ring->AbsPointer = FALSE;
}
+
+ status = XENBUS_STORE(Read,
+ &Ring->StoreInterface,
+ NULL,
+ FrontendGetBackendPath(Ring->Frontend),
+ "feature-vkbd-standalone",
+ &Buffer);
+ if (NT_SUCCESS(status)) {
+ Ring->VkbdStandalone = (BOOLEAN)strtoul(Buffer, NULL, 2);
+
+ XENBUS_STORE(Free,
+ &Ring->StoreInterface,
+ Buffer);
+ } else {
+ Ring->VkbdStandalone = FALSE;
+ }
}
NTSTATUS
@@ -542,11 +559,15 @@ RingConnect(
Ring->AbsMouseReport.ReportId = 2;
RingReadFeatures(Ring);
+ status = STATUS_DEVICE_NOT_READY;
+ if (!Ring->VkbdStandalone)
+ goto fail6;
+
Ring->Mdl = __AllocatePage();
status = STATUS_NO_MEMORY;
if (Ring->Mdl == NULL)
- goto fail6;
+ goto fail7;
ASSERT(Ring->Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
Ring->Shared = Ring->Mdl->MappedSystemVa;
@@ -566,7 +587,7 @@ RingConnect(
FALSE,
&Ring->Entry);
if (!NT_SUCCESS(status))
- goto fail7;
+ goto fail8;
Ring->Channel = XENBUS_EVTCHN(Open,
&Ring->EvtchnInterface,
@@ -578,7 +599,7 @@ RingConnect(
status = STATUS_UNSUCCESSFUL;
if (Ring->Channel == NULL)
- goto fail8;
+ goto fail9;
XENBUS_EVTCHN(Unmask,
&Ring->EvtchnInterface,
@@ -592,13 +613,13 @@ RingConnect(
Ring,
&Ring->DebugCallback);
if (!NT_SUCCESS(status))
- goto fail9;
+ goto fail10;
Ring->Connected = TRUE;
return STATUS_SUCCESS;
-fail9:
- Error("fail9\n");
+fail10:
+ Error("fail10\n");
XENBUS_EVTCHN(Close,
&Ring->EvtchnInterface,
@@ -607,8 +628,8 @@ fail9:
Ring->Events = 0;
-fail8:
- Error("fail8\n");
+fail9:
+ Error("fail9\n");
(VOID) XENBUS_GNTTAB(RevokeForeignAccess,
&Ring->GnttabInterface,
@@ -617,13 +638,16 @@ fail8:
Ring->Entry);
Ring->Entry = NULL;
-fail7:
- Error("fail7\n");
+fail8:
+ Error("fail8\n");
Ring->Shared = NULL;
__FreePage(Ring->Mdl);
Ring->Mdl = NULL;
+fail7:
+ Error("fail7\n");
+
fail6:
Error("fail6\n");
@@ -715,9 +739,21 @@ RingStoreWrite(
if (!NT_SUCCESS(status))
goto fail4;
+ status = XENBUS_STORE(Printf,
+ &Ring->StoreInterface,
+ Transaction,
+ FrontendGetPath(Ring->Frontend),
+ "request-vkbd-standalone",
+ "%u",
+ Ring->VkbdStandalone);
+ if (!NT_SUCCESS(status))
+ goto fail5;
+
Trace("<=====\n");
return STATUS_SUCCESS;
+fail5:
+ Error("fail5\n");
fail4:
Error("fail4\n");
fail3:
@@ -817,6 +853,7 @@ RingTeardown(
Ring->Dpcs = 0;
Ring->AbsPointer = FALSE;
+ Ring->VkbdStandalone = FALSE;
RtlZeroMemory(&Ring->Dpc, sizeof (KDPC));
--
2.8.3
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |