[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[win-pv-devel] [PATCH 07/10] Separate event channel ABI from core evtchn interface code



The event channel ABI now known as two-level is implemented using the
domain shared info. Use of the SHARED_INFO interface is therefore baked
into the EVTCHN interface.
Xen has recently acquired a new event channel ABI called fifo, which
improves on both scalability and performance as compared to two-level.
Hence this patch separates the ABI code from the core EVTCHN interface
code so that a subsequent patch can add support for the fifo ABI on
capable versions of Xen.

Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
 src/xenbus/evtchn.c          | 180 +++++++++++++++++++++-----
 src/xenbus/evtchn_2l.c       | 293 +++++++++++++++++++++++++++++++++++++++++++
 src/xenbus/evtchn_2l.h       |  59 +++++++++
 src/xenbus/evtchn_abi.h      | 109 ++++++++++++++++
 vs2012/xenbus/xenbus.vcxproj |   1 +
 vs2013/xenbus/xenbus.vcxproj |   1 +
 6 files changed, 609 insertions(+), 34 deletions(-)
 create mode 100644 src/xenbus/evtchn_2l.c
 create mode 100644 src/xenbus/evtchn_2l.h
 create mode 100644 src/xenbus/evtchn_abi.h

diff --git a/src/xenbus/evtchn.c b/src/xenbus/evtchn.c
index 5a0822d..f13667e 100644
--- a/src/xenbus/evtchn.c
+++ b/src/xenbus/evtchn.c
@@ -35,6 +35,7 @@
 #include <util.h>
 
 #include "evtchn.h"
+#include "evtchn_2l.h"
 #include "fdo.h"
 #include "hash_table.h"
 #include "dbg_print.h"
@@ -89,9 +90,12 @@ struct _XENBUS_EVTCHN_CONTEXT {
     BOOLEAN                         Enabled;
     XENBUS_SUSPEND_INTERFACE        SuspendInterface;
     PXENBUS_SUSPEND_CALLBACK        SuspendCallbackEarly;
+    PXENBUS_SUSPEND_CALLBACK        SuspendCallbackLate;
     XENBUS_DEBUG_INTERFACE          DebugInterface;
     PXENBUS_DEBUG_CALLBACK          DebugCallback;
     XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
+    PXENBUS_EVTCHN_ABI_CONTEXT      EvtchnTwoLevelContext;
+    XENBUS_EVTCHN_ABI               EvtchnAbi;
     PXENBUS_HASH_TABLE              Table;
     LIST_ENTRY                      List;
 };
@@ -345,11 +349,17 @@ EvtchnOpen(
 
     LocalPort = Channel->LocalPort;
 
+    status = XENBUS_EVTCHN_ABI(PortEnable,
+                               &Context->EvtchnAbi,
+                               LocalPort);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
     status = HashTableAdd(Context->Table,
                           LocalPort,
                           (ULONG_PTR)Channel);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail4;
 
     Channel->Active = TRUE;
 
@@ -368,6 +378,13 @@ EvtchnOpen(
 
     return Channel;
 
+fail4:
+    Error("fail4\n");
+
+    XENBUS_EVTCHN_ABI(PortDisable,
+                      &Context->EvtchnAbi,
+                      LocalPort);
+
 fail3:
     Error("fail3\n");
 
@@ -415,14 +432,14 @@ EvtchnUnmask(
     ASSERT3U(KeGetCurrentIrql(), >=, DISPATCH_LEVEL);
 
     if (Channel->Active) {
-        Pending = XENBUS_SHARED_INFO(EvtchnUnmask,
-                                     &Context->SharedInfoInterface,
-                                     Channel->LocalPort);
+        Pending = XENBUS_EVTCHN_ABI(PortUnmask,
+                                    &Context->EvtchnAbi,
+                                    Channel->LocalPort);
 
         if (Pending && Channel->Mask)
-            XENBUS_SHARED_INFO(EvtchnMask,
-                               &Context->SharedInfoInterface,
-                               Channel->LocalPort);
+            XENBUS_EVTCHN_ABI(PortMask,
+                              &Context->EvtchnAbi,
+                              Channel->LocalPort);
     }
 
     if (!InCallback)
@@ -538,9 +555,9 @@ EvtchnClose(
 
         Channel->Active = FALSE;
 
-        XENBUS_SHARED_INFO(EvtchnMask,
-                           &Context->SharedInfoInterface,
-                           LocalPort);
+        XENBUS_EVTCHN_ABI(PortMask,
+                          &Context->EvtchnAbi,
+                          LocalPort);
 
         if (Channel->Type != XENBUS_EVTCHN_TYPE_FIXED)
             (VOID) EventChannelClose(LocalPort);
@@ -598,22 +615,22 @@ EvtchnPollCallback(
     if (!NT_SUCCESS(status)) {
         Warning("[%d]: INVALID PORT\n", LocalPort);
 
-        XENBUS_SHARED_INFO(EvtchnMask,
-                           &Context->SharedInfoInterface,
-                           LocalPort);
+        XENBUS_EVTCHN_ABI(PortMask,
+                          &Context->EvtchnAbi,
+                          LocalPort);
 
         DoneSomething = FALSE;
         goto done;
     }
 
     if (Channel->Mask)
-        XENBUS_SHARED_INFO(EvtchnMask,
-                           &Context->SharedInfoInterface,
-                           LocalPort);
+        XENBUS_EVTCHN_ABI(PortMask,
+                          &Context->EvtchnAbi,
+                          LocalPort);
 
-    XENBUS_SHARED_INFO(EvtchnAck,
-                       &Context->SharedInfoInterface,
-                       LocalPort);
+    XENBUS_EVTCHN_ABI(PortAck,
+                      &Context->EvtchnAbi,
+                      LocalPort);
 
     DoneSomething = EvtchnCallback(Context, Channel);
 
@@ -633,15 +650,47 @@ EvtchnInterrupt(
     while (XENBUS_SHARED_INFO(UpcallPending,
                               &Context->SharedInfoInterface,
                               0))
-        DoneSomething |= XENBUS_SHARED_INFO(EvtchnPoll,
-                                            &Context->SharedInfoInterface,
-                                            0,
-                                            EvtchnPollCallback,
-                                            Context);
+        DoneSomething |= XENBUS_EVTCHN_ABI(Poll,
+                                           &Context->EvtchnAbi,
+                                           0,
+                                           EvtchnPollCallback,
+                                           Context);
 
     return DoneSomething;
 }
 
+static NTSTATUS
+EvtchnAbiAcquire(
+    IN  PXENBUS_EVTCHN_CONTEXT  Context
+    )
+{
+    NTSTATUS                    status;
+
+    EvtchnTwoLevelGetAbi(Context->EvtchnTwoLevelContext,
+                         &Context->EvtchnAbi);
+
+    status = XENBUS_EVTCHN_ABI(Acquire, &Context->EvtchnAbi);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+static VOID
+EvtchnAbiRelease(
+    IN  PXENBUS_EVTCHN_CONTEXT  Context
+    )
+{
+    XENBUS_EVTCHN_ABI(Release, &Context->EvtchnAbi);
+
+    RtlZeroMemory(&Context->EvtchnAbi, sizeof (XENBUS_EVTCHN_ABI));
+}
+
 static VOID
 EvtchnSuspendCallbackEarly(
     IN  PVOID               Argument
@@ -667,6 +716,20 @@ EvtchnSuspendCallbackEarly(
             ASSERT(NT_SUCCESS(status));
         }
     }
+}
+
+static VOID
+EvtchnSuspendCallbackLate(
+    IN  PVOID               Argument
+    )
+{
+    PXENBUS_EVTCHN_CONTEXT  Context = Argument;
+    NTSTATUS                status;
+
+    EvtchnAbiRelease(Context);
+
+    status = EvtchnAbiAcquire(Context);
+    ASSERT(NT_SUCCESS(status));
 
     if (Context->Enabled)
         EvtchnInterruptEnable(Context);
@@ -772,6 +835,8 @@ EvtchnAcquire(
 
     Trace("====>\n");
 
+    Context->Vector = FdoGetInterruptVector(Fdo);
+
     status = XENBUS_SUSPEND(Acquire, &Context->SuspendInterface);
     if (!NT_SUCCESS(status))
         goto fail1;
@@ -785,10 +850,19 @@ EvtchnAcquire(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    status = XENBUS_DEBUG(Acquire, &Context->DebugInterface);
+    status = XENBUS_SUSPEND(Register,
+                            &Context->SuspendInterface,
+                            SUSPEND_CALLBACK_LATE,
+                            EvtchnSuspendCallbackLate,
+                            Context,
+                            &Context->SuspendCallbackLate);
     if (!NT_SUCCESS(status))
         goto fail3;
 
+    status = XENBUS_DEBUG(Acquire, &Context->DebugInterface);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
     status = XENBUS_DEBUG(Register,
                           &Context->DebugInterface,
                           __MODULE__ "|EVTCHN",
@@ -796,13 +870,15 @@ EvtchnAcquire(
                           Context,
                           &Context->DebugCallback);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail5;
 
     status = XENBUS_SHARED_INFO(Acquire, &Context->SharedInfoInterface);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail6;
 
-    Context->Vector = FdoGetInterruptVector(Fdo);
+    status = EvtchnAbiAcquire(Context);
+    if (!NT_SUCCESS(status))
+        goto fail7;
 
     Trace("<====\n");
 
@@ -811,18 +887,31 @@ done:
 
     return STATUS_SUCCESS;
 
-fail5:
-    Error("fail5\n");
+fail7:
+    Error("fail7\n");
+
+    XENBUS_SHARED_INFO(Release, &Context->SharedInfoInterface);
+
+fail6:
+    Error("fail6\n");
 
     XENBUS_DEBUG(Deregister,
                  &Context->DebugInterface,
                  Context->DebugCallback);
     Context->DebugCallback = NULL;
 
+fail5:
+    Error("fail5\n");
+
+    XENBUS_DEBUG(Release, &Context->DebugInterface);
+
 fail4:
     Error("fail4\n");
 
-    XENBUS_DEBUG(Release, &Context->DebugInterface);
+    XENBUS_SUSPEND(Deregister,
+                   &Context->SuspendInterface,
+                   Context->SuspendCallbackLate);
+    Context->SuspendCallbackLate = NULL;
 
 fail3:
     Error("fail3\n");
@@ -837,6 +926,8 @@ fail2:
 
     XENBUS_SUSPEND(Release, &Context->SuspendInterface);
 
+    Context->Vector = 0;
+
 fail1:
     Error("fail1 (%08x)\n", status);
 
@@ -865,7 +956,7 @@ EvtchnRelease(
     if (!IsListEmpty(&Context->List))
         BUG("OUTSTANDING EVENT CHANNELS");
 
-    Context->Vector = 0;
+    EvtchnAbiRelease(Context);
 
     XENBUS_SHARED_INFO(Release, &Context->SharedInfoInterface);
 
@@ -878,11 +969,18 @@ EvtchnRelease(
 
     XENBUS_SUSPEND(Deregister,
                    &Context->SuspendInterface,
+                   Context->SuspendCallbackLate);
+    Context->SuspendCallbackLate = NULL;
+
+    XENBUS_SUSPEND(Deregister,
+                   &Context->SuspendInterface,
                    Context->SuspendCallbackEarly);
     Context->SuspendCallbackEarly = NULL;
 
     XENBUS_SUSPEND(Release, &Context->SuspendInterface);
 
+    Context->Vector = 0;
+
     Trace("<====\n");
 
 done:
@@ -921,6 +1019,11 @@ EvtchnInitialize(
     if (!NT_SUCCESS(status))
         goto fail2;
 
+    status = EvtchnTwoLevelInitialize(Fdo,
+                                      &(*Context)->EvtchnTwoLevelContext);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
     status = SuspendGetInterface(FdoGetSuspendContext(Fdo),
                                  XENBUS_SUSPEND_INTERFACE_VERSION_MAX,
                                  (PINTERFACE)&(*Context)->SuspendInterface,
@@ -951,11 +1054,17 @@ EvtchnInitialize(
 
     return STATUS_SUCCESS;
 
+fail3:
+    Error("fail3\n");
+
+    HashTableDestroy((*Context)->Table);
+    (*Context)->Table = NULL;
+
 fail2:
     Error("fail2\n");
 
-    ASSERT(IsZeroMemory(Context, sizeof (XENBUS_EVTCHN_CONTEXT)));
-    __EvtchnFree(Context);
+    ASSERT(IsZeroMemory(*Context, sizeof (XENBUS_EVTCHN_CONTEXT)));
+    __EvtchnFree(*Context);
 
 fail1:
     Error("fail1 (%08x)\n", status);
@@ -1022,6 +1131,9 @@ EvtchnTeardown(
     RtlZeroMemory(&Context->SuspendInterface,
                   sizeof (XENBUS_SUSPEND_INTERFACE));
 
+    EvtchnTwoLevelTeardown(Context->EvtchnTwoLevelContext);
+    Context->EvtchnTwoLevelContext = NULL;
+
     HashTableDestroy(Context->Table);
     Context->Table = NULL;
 
diff --git a/src/xenbus/evtchn_2l.c b/src/xenbus/evtchn_2l.c
new file mode 100644
index 0000000..0f839ee
--- /dev/null
+++ b/src/xenbus/evtchn_2l.c
@@ -0,0 +1,293 @@
+/* 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.
+ */
+
+#include <ntddk.h>
+#include <stdarg.h>
+#include <xen.h>
+#include <util.h>
+
+#include "evtchn_2l.h"
+#include "shared_info.h"
+#include "fdo.h"
+#include "dbg_print.h"
+#include "assert.h"
+
+typedef struct _XENBUS_EVTCHN_TWO_LEVEL_CONTEXT {
+    PXENBUS_FDO                     Fdo;
+    KSPIN_LOCK                      Lock;
+    LONG                            References;
+    XENBUS_SHARED_INFO_INTERFACE    SharedInfoInterface;
+} XENBUS_EVTCHN_TWO_LEVEL_CONTEXT, *PXENBUS_EVTCHN_TWO_LEVEL_CONTEXT;
+
+#define XENBUS_EVTCHN_TWO_LEVEL_TAG  'L2'
+
+static FORCEINLINE PVOID
+__EvtchnTwoLevelAllocate(
+    IN  ULONG   Length
+    )
+{
+    return __AllocatePoolWithTag(NonPagedPool, Length, 
XENBUS_EVTCHN_TWO_LEVEL_TAG);
+}
+
+static FORCEINLINE VOID
+__EvtchnTwoLevelFree(
+    IN  PVOID   Buffer
+    )
+{
+    ExFreePoolWithTag(Buffer, XENBUS_EVTCHN_TWO_LEVEL_TAG);
+}
+
+static BOOLEAN
+EvtchnTwoLevelPoll(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT      _Context,
+    IN  ULONG                           Cpu,
+    IN  XENBUS_EVTCHN_ABI_EVENT         Event,
+    IN  PVOID                           Argument
+    )
+{
+    PXENBUS_EVTCHN_TWO_LEVEL_CONTEXT    Context = (PVOID)_Context;
+
+    return XENBUS_SHARED_INFO(EvtchnPoll,
+                              &Context->SharedInfoInterface,
+                              Cpu,
+                              Event,
+                              Argument);
+}
+
+static NTSTATUS
+EvtchnTwoLevelPortEnable(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT      _Context,
+    IN  ULONG                           Port
+    )
+{
+    UNREFERENCED_PARAMETER(_Context);
+    UNREFERENCED_PARAMETER(Port);
+
+    return STATUS_SUCCESS;
+}
+
+static VOID
+EvtchnTwoLevelPortDisable(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT      _Context,
+    IN  ULONG                           Port
+    )
+{
+    PXENBUS_EVTCHN_TWO_LEVEL_CONTEXT    Context = (PVOID)_Context;
+
+    XENBUS_SHARED_INFO(EvtchnMask,
+                       &Context->SharedInfoInterface,
+                       Port);
+}
+
+static VOID
+EvtchnTwoLevelPortAck(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT      _Context,
+    IN  ULONG                           Port
+    )
+{
+    PXENBUS_EVTCHN_TWO_LEVEL_CONTEXT    Context = (PVOID)_Context;
+
+    XENBUS_SHARED_INFO(EvtchnAck,
+                       &Context->SharedInfoInterface,
+                       Port);
+}
+
+static VOID
+EvtchnTwoLevelPortMask(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT      _Context,
+    IN  ULONG                           Port
+    )
+{
+    PXENBUS_EVTCHN_TWO_LEVEL_CONTEXT    Context = (PVOID)_Context;
+
+    XENBUS_SHARED_INFO(EvtchnMask,
+                       &Context->SharedInfoInterface,
+                       Port);
+}
+
+static BOOLEAN
+EvtchnTwoLevelPortUnmask(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT      _Context,
+    IN  ULONG                           Port
+    )
+{
+    PXENBUS_EVTCHN_TWO_LEVEL_CONTEXT    Context = (PVOID)_Context;
+
+    return XENBUS_SHARED_INFO(EvtchnUnmask,
+                              &Context->SharedInfoInterface,
+                              Port);
+}
+
+static NTSTATUS
+EvtchnTwoLevelAcquire(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT      _Context
+    )
+{
+    PXENBUS_EVTCHN_TWO_LEVEL_CONTEXT    Context = (PVOID)_Context;
+    KIRQL                               Irql;
+    NTSTATUS                            status;
+
+    KeAcquireSpinLock(&Context->Lock, &Irql);
+
+    if (Context->References++ != 0)
+        goto done;
+
+    Trace("====>\n");
+
+    status = XENBUS_SHARED_INFO(Acquire, &Context->SharedInfoInterface);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    Trace("<====\n");
+
+done:
+    KeReleaseSpinLock(&Context->Lock, Irql);
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    XENBUS_SHARED_INFO(Release, &Context->SharedInfoInterface);
+
+    --Context->References;
+    ASSERT3U(Context->References, ==, 0);
+    KeReleaseSpinLock(&Context->Lock, Irql);
+
+    return status;
+}
+
+VOID
+EvtchnTwoLevelRelease(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT      _Context
+    )
+{
+    PXENBUS_EVTCHN_TWO_LEVEL_CONTEXT    Context = (PVOID)_Context;
+    KIRQL                               Irql;
+
+    KeAcquireSpinLock(&Context->Lock, &Irql);
+
+    if (--Context->References > 0)
+        goto done;
+
+    Trace("====>\n");
+
+    XENBUS_SHARED_INFO(Release, &Context->SharedInfoInterface);
+
+    Trace("<====\n");
+
+done:
+    KeReleaseSpinLock(&Context->Lock, Irql);
+}
+
+static XENBUS_EVTCHN_ABI EvtchnAbiTwoLevel = {
+    NULL,
+    EvtchnTwoLevelAcquire,
+    EvtchnTwoLevelRelease,
+    EvtchnTwoLevelPoll,
+    EvtchnTwoLevelPortEnable,
+    EvtchnTwoLevelPortDisable,
+    EvtchnTwoLevelPortAck,
+    EvtchnTwoLevelPortMask,
+    EvtchnTwoLevelPortUnmask
+};
+
+NTSTATUS
+EvtchnTwoLevelInitialize(
+    IN  PXENBUS_FDO                     Fdo,
+    OUT PXENBUS_EVTCHN_ABI_CONTEXT      *_Context
+    )
+{
+    PXENBUS_EVTCHN_TWO_LEVEL_CONTEXT    Context;
+    NTSTATUS                            status;
+
+    Trace("====>\n");
+
+    Context = __EvtchnTwoLevelAllocate(sizeof 
(XENBUS_EVTCHN_TWO_LEVEL_CONTEXT));
+
+    status = STATUS_NO_MEMORY;
+    if (Context == NULL)
+        goto fail1;
+
+    status = SharedInfoGetInterface(FdoGetSharedInfoContext(Fdo),
+                                    XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX,
+                                    (PINTERFACE)&Context->SharedInfoInterface,
+                                    sizeof (Context->SharedInfoInterface));
+    ASSERT(NT_SUCCESS(status));
+    ASSERT(Context->SharedInfoInterface.Interface.Context != NULL);
+
+    KeInitializeSpinLock(&Context->Lock);
+
+    Context->Fdo = Fdo;
+
+    *_Context = (PVOID)Context;
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+VOID
+EvtchnTwoLevelGetAbi(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT      _Context,
+    OUT PXENBUS_EVTCHN_ABI              Abi)
+{
+    *Abi = EvtchnAbiTwoLevel;
+
+    Abi->Context = (PVOID)_Context;
+}
+
+VOID
+EvtchnTwoLevelTeardown(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT      _Context
+    )
+{
+    PXENBUS_EVTCHN_TWO_LEVEL_CONTEXT    Context = (PVOID)_Context;
+
+    Trace("====>\n");
+
+    Context->Fdo = NULL;
+
+    RtlZeroMemory(&Context->Lock, sizeof (KSPIN_LOCK));
+
+    RtlZeroMemory(&Context->SharedInfoInterface,
+                  sizeof (XENBUS_SHARED_INFO_INTERFACE));
+
+    ASSERT(IsZeroMemory(Context, sizeof (XENBUS_EVTCHN_TWO_LEVEL_CONTEXT)));
+    __EvtchnTwoLevelFree(Context);
+
+    Trace("<====\n");
+}
diff --git a/src/xenbus/evtchn_2l.h b/src/xenbus/evtchn_2l.h
new file mode 100644
index 0000000..c69c555
--- /dev/null
+++ b/src/xenbus/evtchn_2l.h
@@ -0,0 +1,59 @@
+/* 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 _XENBUS_EVTCHN_2L_H
+#define _XENBUS_EVTCHN_2L_H
+
+#include <ntddk.h>
+#include <xen.h>
+
+#include "evtchn_abi.h"
+#include "fdo.h"
+
+extern NTSTATUS
+EvtchnTwoLevelInitialize(
+    IN  PXENBUS_FDO                 Fdo,
+    OUT PXENBUS_EVTCHN_ABI_CONTEXT  *Context
+    );
+
+extern VOID
+EvtchnTwoLevelGetAbi(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT  Context,
+    OUT PXENBUS_EVTCHN_ABI          Abi
+    );
+
+extern VOID
+EvtchnTwoLevelTeardown(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT  Context
+    );
+
+#endif  // _XENBUS_EVTCHN_H
+
diff --git a/src/xenbus/evtchn_abi.h b/src/xenbus/evtchn_abi.h
new file mode 100644
index 0000000..237ce7d
--- /dev/null
+++ b/src/xenbus/evtchn_abi.h
@@ -0,0 +1,109 @@
+/* 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 WARRAN4TIES, 
+ * 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 _XENBUS_EVTCHN_ABI_H
+#define _XENBUS_EVTCHN_ABI_H
+
+#include <ntddk.h>
+#include <xen.h>
+
+typedef PVOID *PXENBUS_EVTCHN_ABI_CONTEXT;
+
+typedef NTSTATUS
+(*XENBUS_EVTCHN_ABI_ACQUIRE)(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT  Context
+    );
+
+typedef VOID
+(*XENBUS_EVTCHN_ABI_RELEASE)(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT  Context
+    );
+
+typedef BOOLEAN
+(*XENBUS_EVTCHN_ABI_EVENT)(
+    IN  PVOID   Argument,
+    IN  ULONG   Port
+    );
+
+typedef BOOLEAN
+(*XENBUS_EVTCHN_ABI_POLL)(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT  Context,
+    IN  ULONG                       Cpu,
+    IN  XENBUS_EVTCHN_ABI_EVENT     Event,
+    IN  PVOID                       Argument
+    );
+
+typedef NTSTATUS
+(*XENBUS_EVTCHN_ABI_PORT_ENABLE)(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT  Context,
+    IN  ULONG                       Port
+    );
+
+typedef VOID
+(*XENBUS_EVTCHN_ABI_PORT_DISABLE)(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT  Context,
+    IN  ULONG                       Port
+    );
+
+typedef VOID
+(*XENBUS_EVTCHN_ABI_PORT_ACK)(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT  Context,
+    IN  ULONG                       Port
+    );
+
+typedef VOID
+(*XENBUS_EVTCHN_ABI_PORT_MASK)(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT  Context,
+    IN  ULONG                       Port
+    );
+
+typedef BOOLEAN
+(*XENBUS_EVTCHN_ABI_PORT_UNMASK)(
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT  Context,
+    IN  ULONG                       Port
+    );
+
+typedef struct _XENBUS_EVTCHN_ABI {
+    PXENBUS_EVTCHN_ABI_CONTEXT      Context;
+    XENBUS_EVTCHN_ABI_ACQUIRE       EvtchnAbiAcquire;
+    XENBUS_EVTCHN_ABI_RELEASE       EvtchnAbiRelease;
+    XENBUS_EVTCHN_ABI_POLL          EvtchnAbiPoll;
+    XENBUS_EVTCHN_ABI_PORT_ENABLE   EvtchnAbiPortEnable;
+    XENBUS_EVTCHN_ABI_PORT_DISABLE  EvtchnAbiPortDisable;
+    XENBUS_EVTCHN_ABI_PORT_ACK      EvtchnAbiPortAck;
+    XENBUS_EVTCHN_ABI_PORT_MASK     EvtchnAbiPortMask;
+    XENBUS_EVTCHN_ABI_PORT_UNMASK   EvtchnAbiPortUnmask;
+} XENBUS_EVTCHN_ABI, *PXENBUS_EVTCHN_ABI;
+
+#define XENBUS_EVTCHN_ABI(_Method, _Abi, ...)   \
+    (_Abi)->EvtchnAbi ## _Method((_Abi)->Context, __VA_ARGS__)
+
+#endif  // _XENBUS_EVTCHN_ABI_H
diff --git a/vs2012/xenbus/xenbus.vcxproj b/vs2012/xenbus/xenbus.vcxproj
index a648bce..6cd12d1 100644
--- a/vs2012/xenbus/xenbus.vcxproj
+++ b/vs2012/xenbus/xenbus.vcxproj
@@ -88,6 +88,7 @@
                <ClCompile Include="..\..\src\xenbus\debug.c" />
                <ClCompile Include="..\..\src\xenbus\driver.c" />
                <ClCompile Include="..\..\src\xenbus\evtchn.c" />
+               <ClCompile Include="..\..\src\xenbus\evtchn_2l.c" />
                <ClCompile Include="..\..\src\xenbus\fdo.c" />
                <ClCompile Include="..\..\src\xenbus\gnttab.c" />
                <ClCompile Include="..\..\src\xenbus\pdo.c" />
diff --git a/vs2013/xenbus/xenbus.vcxproj b/vs2013/xenbus/xenbus.vcxproj
index 2c34ed1..0f37f68 100644
--- a/vs2013/xenbus/xenbus.vcxproj
+++ b/vs2013/xenbus/xenbus.vcxproj
@@ -128,6 +128,7 @@
     <ClCompile Include="..\..\src\xenbus\debug.c" />
     <ClCompile Include="..\..\src\xenbus\driver.c" />
     <ClCompile Include="..\..\src\xenbus\evtchn.c" />
+    <ClCompile Include="..\..\src\xenbus\evtchn_2l.c" />
     <ClCompile Include="..\..\src\xenbus\fdo.c" />
     <ClCompile Include="..\..\src\xenbus\gnttab.c" />
     <ClCompile Include="..\..\src\xenbus\pdo.c" />
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.