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

[win-pv-devel] [PATCH 1/3] Apply new PDO revision numbering policy



This patch also removes XENFILT_UNPLUG_INTERFACE from the set that can
be queried by a child driver. No child driver ever used it.

Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
 include/revision.h |  50 +++++++++
 src/xenbus/pdo.c   | 294 +++++++++++++++++++++--------------------------------
 2 files changed, 167 insertions(+), 177 deletions(-)
 create mode 100644 include/revision.h

diff --git a/include/revision.h b/include/revision.h
new file mode 100644
index 0000000..9a91a33
--- /dev/null
+++ b/include/revision.h
@@ -0,0 +1,50 @@
+/* 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 _REVISION_H
+#define _REVISION_H
+
+// Key:
+// S  - XENBUS_SUSPEND_INTERFACE
+// SI - XENBUS_SHARED_INFO_INTERFACE
+// E  - XENBUS_EVTCHN_INTERFACE
+// D  - XENBUS_DEBUG_INTEFACE
+// ST - XENBUS_STORE_INTERFACE
+// R  - XENBUS_RANGE_SET_INTERFACE
+// C  - XENBUS_CACHE_INTERFACE
+// G  - XENBUS_GNTTAB_INTERFACE
+// EM - XENFILT_EMULATED_INTERFACE
+
+//                    REVISION   S  SI   E   D  ST   R   C   G  EM
+#define DEFINE_REVISION_TABLE                                      \
+    DEFINE_REVISION(0x08000008,  1,  2,  4,  1,  1,  1,  1,  1,  1)
+
+#endif  // _REVISION_H
diff --git a/src/xenbus/pdo.c b/src/xenbus/pdo.c
index 58150d0..f305bb7 100644
--- a/src/xenbus/pdo.c
+++ b/src/xenbus/pdo.c
@@ -36,7 +36,6 @@
 #include <ntstrsafe.h>
 
 #include <emulated_interface.h>
-#include <unplug_interface.h>
 
 #include "names.h"
 #include "fdo.h"
@@ -49,6 +48,7 @@
 #include "assert.h"
 #include "util.h"
 #include "version.h"
+#include "revision.h"
 
 #define PDO_TAG 'ODP'
 
@@ -69,9 +69,6 @@ struct _XENBUS_PDO {
     BOOLEAN                     Removable;
     BOOLEAN                     Ejectable;
 
-    PULONG                      Revision;
-    ULONG                       Count;
-
     BUS_INTERFACE_STANDARD      BusInterface;
 
     XENBUS_SUSPEND_INTERFACE    SuspendInterface;
@@ -355,155 +352,108 @@ PdoGetFdo(
     return __PdoGetFdo(Pdo);
 }
 
-static NTSTATUS
-PdoAddRevision(
-    IN  PXENBUS_PDO Pdo,
-    IN  ULONG       Revision
-    )
-{
-    PVOID           Buffer;
-    ULONG           Count;
-    NTSTATUS        status;
-
-    Count = Pdo->Count + 1;
-
-    Buffer = __PdoAllocate(sizeof (ULONG) * Count);
-
-    status = STATUS_NO_MEMORY;
-    if (Buffer == NULL)
-        goto fail1;
-
-    if (Pdo->Revision != NULL) {
-        RtlCopyMemory(Buffer,
-                      Pdo->Revision,
-                      sizeof (ULONG) * Pdo->Count);
-        __PdoFree(Pdo->Revision);
-    }
-
-    Pdo->Revision = Buffer;
-    Pdo->Revision[Pdo->Count] = Revision;
-
-    Pdo->Count++;
-    ASSERT3U(Pdo->Count, <=, 64);
-
-    return STATUS_SUCCESS;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
+typedef struct _XENBUS_PDO_REVISION {
+    ULONG   Number;
+    ULONG   SuspendInterfaceVersion;
+    ULONG   SharedInfoInterfaceVersion;
+    ULONG   EvtchnInterfaceVersion;
+    ULONG   DebugInterfaceVersion;
+    ULONG   StoreInterfaceVersion;
+    ULONG   RangeSetInterfaceVersion;
+    ULONG   CacheInterfaceVersion;
+    ULONG   GnttabInterfaceVersion;
+    ULONG   EmulatedInterfaceVersion;
+} XENBUS_PDO_REVISION, *PXENBUS_PDO_REVISION;
+
+#define DEFINE_REVISION(_N, _S, _SI, _E, _D, _ST, _R, _C, _G, _EM) \
+    { (_N), (_S), (_SI), (_E), (_D), (_ST), (_R), (_C), (_G), (_EM) }
+
+static XENBUS_PDO_REVISION PdoRevision[] = {
+    DEFINE_REVISION_TABLE
+};
 
-    return status;
-}
+#undef DEFINE_REVISION
 
-static NTSTATUS
-PdoSetRevisions(
+static VOID
+PdoDumpRevisions(
     IN  PXENBUS_PDO Pdo
     )
 {
-    ULONG           Suspend;
-    ULONG           Revision;
-    NTSTATUS        status;
-
-    Revision = MAJOR_VERSION << 24;
+    ULONG           Index;
 
-    // Enumerate all possible combinations of exported interface versions 
since v1
-    // and add a PDO revsion for each combination that's currently supported. 
Note that
-    // the exported interfaces include any interface queries we pass through.
-    // We must enumerate from v1 to ensure that revision numbers don't change
-    // even when a particular combination of interface versions becomes
-    // unsupported. (See README.md for API versioning policy).
-
-    for (Suspend = 1; Suspend <= XENBUS_SUSPEND_INTERFACE_VERSION_MAX; 
Suspend++) {
-        ULONG   SharedInfo;
-        
-        for (SharedInfo = 1; SharedInfo <= 
XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX; SharedInfo++) {
-            ULONG   Evtchn;
-            
-            for (Evtchn = 1; Evtchn <= XENBUS_EVTCHN_INTERFACE_VERSION_MAX; 
Evtchn++) {
-                ULONG   Debug;
-
-                for (Debug = 1; Debug <= XENBUS_DEBUG_INTERFACE_VERSION_MAX; 
Debug++) {
-                    ULONG   Store;
-
-                    for (Store = 1; Store <= 
XENBUS_STORE_INTERFACE_VERSION_MAX; Store++) {
-                        ULONG   RangeSet;
-
-                        for (RangeSet = 1; RangeSet <= 
XENBUS_RANGE_SET_INTERFACE_VERSION_MAX; RangeSet++) {
-                            ULONG   Cache;
-                            
-                            for (Cache = 1; Cache <= 
XENBUS_CACHE_INTERFACE_VERSION_MAX; Cache++) {
-                                ULONG   Gnttab;
-                            
-                                for (Gnttab = 1; Gnttab <= 
XENBUS_GNTTAB_INTERFACE_VERSION_MAX; Gnttab++) {
-                                    ULONG   Emulated;
-                                
-                                    for (Emulated = 1; Emulated <= 
XENFILT_EMULATED_INTERFACE_VERSION_MAX; Emulated++) {
-                                        ULONG   Unplug;
-
-                                        for (Unplug = 1; Unplug <= 
XENFILT_UNPLUG_INTERFACE_VERSION_MAX; Unplug++) {
-                                            Revision++;
-
-                                            if (Suspend >= 
XENBUS_SUSPEND_INTERFACE_VERSION_MIN &&
-                                                SharedInfo >= 
XENBUS_SHARED_INFO_INTERFACE_VERSION_MIN &&
-                                                Evtchn >= 
XENBUS_EVTCHN_INTERFACE_VERSION_MIN &&
-                                                Debug >= 
XENBUS_DEBUG_INTERFACE_VERSION_MIN &&
-                                                Store >= 
XENBUS_STORE_INTERFACE_VERSION_MIN &&
-                                                RangeSet >= 
XENBUS_RANGE_SET_INTERFACE_VERSION_MIN &&
-                                                Cache >= 
XENBUS_CACHE_INTERFACE_VERSION_MIN &&
-                                                Gnttab >= 
XENBUS_GNTTAB_INTERFACE_VERSION_MIN &&
-                                                Emulated >= 
XENFILT_EMULATED_INTERFACE_VERSION_MIN &&
-                                                Unplug >= 
XENFILT_UNPLUG_INTERFACE_VERSION_MIN) {
-                                                Info("%08X -> "
-                                                     "SUSPEND v%u "
-                                                     "SHARED_INFO v%u "
-                                                     "EVTCHN v%u "
-                                                     "DEBUG v%u "
-                                                     "STORE v%u "
-                                                     "RANGE_SET v%u "
-                                                     "CACHE v%u "
-                                                     "GNTTAB v%u "
-                                                     "EMULATED v%u "
-                                                     "UNPLUG v%u\n",
-                                                     Revision,
-                                                     Suspend,
-                                                     SharedInfo,
-                                                     Evtchn,
-                                                     Debug,
-                                                     Store,
-                                                     RangeSet,
-                                                     Cache,
-                                                     Gnttab,
-                                                     Emulated,
-                                                     Unplug);
-
-                                                status = PdoAddRevision(Pdo, 
Revision);
-                                                if (!NT_SUCCESS(status))
-                                                    goto fail1;
-                                            }   
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }   
-        }
-    }                             
-
-    ASSERT(Pdo->Count > 0);
-    return STATUS_SUCCESS;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
+    UNREFERENCED_PARAMETER(Pdo);
 
-    if (Pdo->Revision != NULL) {
-        __PdoFree(Pdo->Revision);
-        Pdo->Revision = NULL;
+    for (Index = 0; Index < ARRAYSIZE(PdoRevision); Index++) {
+        PXENBUS_PDO_REVISION Revision = &PdoRevision[Index];
+
+        ASSERT3U(Revision->SuspendInterfaceVersion, >=, 
XENBUS_SUSPEND_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->SuspendInterfaceVersion, <=, 
XENBUS_SUSPEND_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->SuspendInterfaceVersion == 
XENBUS_SUSPEND_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->SharedInfoInterfaceVersion, >=, 
XENBUS_SHARED_INFO_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->SharedInfoInterfaceVersion, <=, 
XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->SharedInfoInterfaceVersion == 
XENBUS_SHARED_INFO_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->EvtchnInterfaceVersion, >=, 
XENBUS_EVTCHN_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->EvtchnInterfaceVersion, <=, 
XENBUS_EVTCHN_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->EvtchnInterfaceVersion == 
XENBUS_EVTCHN_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->DebugInterfaceVersion, >=, 
XENBUS_DEBUG_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->DebugInterfaceVersion, <=, 
XENBUS_DEBUG_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->DebugInterfaceVersion == 
XENBUS_DEBUG_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->StoreInterfaceVersion, >=, 
XENBUS_STORE_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->StoreInterfaceVersion, <=, 
XENBUS_STORE_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->StoreInterfaceVersion == 
XENBUS_STORE_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->RangeSetInterfaceVersion, >=, 
XENBUS_RANGE_SET_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->RangeSetInterfaceVersion, <=, 
XENBUS_RANGE_SET_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->RangeSetInterfaceVersion == 
XENBUS_RANGE_SET_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->CacheInterfaceVersion, >=, 
XENBUS_CACHE_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->CacheInterfaceVersion, <=, 
XENBUS_CACHE_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->CacheInterfaceVersion == 
XENBUS_CACHE_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->GnttabInterfaceVersion, >=, 
XENBUS_GNTTAB_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->GnttabInterfaceVersion, <=, 
XENBUS_GNTTAB_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->GnttabInterfaceVersion == 
XENBUS_GNTTAB_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->EmulatedInterfaceVersion, >=, 
XENFILT_EMULATED_INTERFACE_VERSION_MIN);
+        ASSERT3U(Revision->EmulatedInterfaceVersion, <=, 
XENFILT_EMULATED_INTERFACE_VERSION_MAX);
+        ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+                     Revision->EmulatedInterfaceVersion == 
XENFILT_EMULATED_INTERFACE_VERSION_MAX));
+
+        ASSERT3U(Revision->Number >> 24, ==, MAJOR_VERSION);
+
+        Info("%08X -> "
+             "SUSPEND v%u "
+             "SHARED_INFO v%u "
+             "EVTCHN v%u "
+             "DEBUG v%u "
+             "STORE v%u "
+             "RANGE_SET v%u "
+             "CACHE v%u "
+             "GNTTAB v%u "
+             "EMULATED v%u\n",
+             Revision->Number,
+             Revision->SuspendInterfaceVersion,
+             Revision->SharedInfoInterfaceVersion,
+             Revision->EvtchnInterfaceVersion,
+             Revision->DebugInterfaceVersion,
+             Revision->StoreInterfaceVersion,
+             Revision->RangeSetInterfaceVersion,
+             Revision->CacheInterfaceVersion,
+             Revision->GnttabInterfaceVersion,
+             Revision->EmulatedInterfaceVersion);
     }
-
-    Pdo->Count = 0;
-
-    return status;
 }
 
 static FORCEINLINE PDEVICE_OBJECT
@@ -1078,7 +1028,6 @@ static struct _INTERFACE_ENTRY PdoInterfaceTable[] = {
     { &GUID_XENBUS_CACHE_INTERFACE, "CACHE_INTERFACE", PdoQueryCacheInterface 
},
     { &GUID_XENBUS_GNTTAB_INTERFACE, "GNTTAB_INTERFACE", 
PdoQueryGnttabInterface },
     { &GUID_XENFILT_EMULATED_INTERFACE, "EMULATED_INTERFACE", PdoDelegateIrp },
-    { &GUID_XENFILT_UNPLUG_INTERFACE, "UNPLUG_INTERFACE", PdoDelegateIrp },
     { NULL, NULL, NULL }
 };
 
@@ -1405,12 +1354,12 @@ PdoQueryId(
 
     case BusQueryHardwareIDs:
         Trace("BusQueryHardwareIDs\n");
-        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * Pdo->Count) * sizeof 
(WCHAR);
+        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * 
ARRAYSIZE(PdoRevision)) * sizeof (WCHAR);
         break;
 
     case BusQueryCompatibleIDs:
         Trace("BusQueryCompatibleIDs\n");
-        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * Pdo->Count) * sizeof 
(WCHAR);
+        Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * 
ARRAYSIZE(PdoRevision)) * sizeof (WCHAR);
         break;
 
     default:
@@ -1440,17 +1389,19 @@ PdoQueryId(
         break;
 
     case BusQueryDeviceID: {
-        ULONG   Index;
+        ULONG                   Index;
+        PXENBUS_PDO_REVISION    Revision;
 
         Type = REG_SZ;
-        Index = Pdo->Count - 1;
+        Index = ARRAYSIZE(PdoRevision) - 1;
+        Revision = &PdoRevision[Index];
 
         status = RtlStringCbPrintfW(Buffer,
                                     Id.MaximumLength,
                                     L"XENBUS\\VEN_%hs&DEV_%hs&REV_%08X",
                                     __PdoGetVendorName(Pdo),
                                     __PdoGetName(Pdo),
-                                    Pdo->Revision[Index]);
+                                    Revision->Number);
         ASSERT(NT_SUCCESS(status));
 
         Buffer += wcslen(Buffer);
@@ -1465,13 +1416,15 @@ PdoQueryId(
         Type = REG_MULTI_SZ;
         Length = Id.MaximumLength;
 
-        for (Index = 0; Index < Pdo->Count; Index++) {
-            status = RtlStringCbPrintfW(Buffer,
-                                        Length,
-                                        L"XENBUS\\VEN_%hs&DEV_%hs&REV_%08X",
-                                        __PdoGetVendorName(Pdo),
-                                        __PdoGetName(Pdo),
-                                        Pdo->Revision[Index]);
+        for (Index = 0; Index < ARRAYSIZE(PdoRevision); Index++) {
+            PXENBUS_PDO_REVISION Revision = &PdoRevision[Index];
+
+           status = RtlStringCbPrintfW(Buffer,
+                                       Length,
+                                       L"XENBUS\\VEN_%hs&DEV_%hs&REV_%08X",
+                                       __PdoGetVendorName(Pdo),
+                                       __PdoGetName(Pdo),
+                                       Revision->Number);
             ASSERT(NT_SUCCESS(status));
 
             Buffer += wcslen(Buffer);
@@ -2126,13 +2079,9 @@ PdoCreate(
     __PdoSetRemovable(Pdo);
     __PdoSetEjectable(Pdo);
 
-    status = PdoSetRevisions(Pdo);
-    if (!NT_SUCCESS(status))
-        goto fail5;
-
     status = BusInitialize(Pdo, &Pdo->BusInterface);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail5;
 
     status = SuspendGetInterface(FdoGetSuspendContext(Fdo),
                                  XENBUS_SUSPEND_INTERFACE_VERSION_MAX,
@@ -2141,10 +2090,11 @@ PdoCreate(
     ASSERT(NT_SUCCESS(status));
     ASSERT(Pdo->SuspendInterface.Interface.Context != NULL);
 
-    Info("%p (%s: Highest Revision = %08X)\n",
+    Info("%p (%s)\n",
          PhysicalDeviceObject,
-         __PdoGetName(Pdo),
-         Pdo->Revision[Pdo->Count - 1]);
+         __PdoGetName(Pdo));
+
+    PdoDumpRevisions(Pdo);
 
     Dx->Pdo = Pdo;
     PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
@@ -2153,16 +2103,10 @@ PdoCreate(
 
     return STATUS_SUCCESS;
 
-fail6:
-    Error("fail6\n");
-
-    __PdoFree(Pdo->Revision);
-    Pdo->Revision = NULL;
-    Pdo->Count = 0;
-
 fail5:
     Error("fail5\n");
 
+    Pdo->Ejectable = FALSE;
     Pdo->Removable = FALSE;
 
     ThreadAlert(Pdo->DevicePowerThread);
@@ -2225,10 +2169,6 @@ PdoDestroy(
 
     BusTeardown(&Pdo->BusInterface);
 
-    __PdoFree(Pdo->Revision);
-    Pdo->Revision = NULL;
-    Pdo->Count = 0;
-
     Pdo->Ejectable = FALSE;
     Pdo->Removable = FALSE;
 
-- 
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®.