]> xenbits.xensource.com Git - people/pauldu/xenbus.git/commitdiff
Remove much code duplication involved in interface query
authorPaul Durrant <paul.durrant@citrix.com>
Thu, 29 May 2014 13:24:50 +0000 (14:24 +0100)
committerPaul Durrant <paul.durrant@citrix.com>
Thu, 29 May 2014 13:24:50 +0000 (14:24 +0100)
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
src/xenbus/pdo.c
src/xenfilt/pdo.c

index 594dab3f883a699a03f49bbc700464458e09ed22..d15f777abda1eae67434da6b33730f154e2bc09f 100644 (file)
@@ -1014,11 +1014,11 @@ PdoQueryBusInterface(
     Version = StackLocation->Parameters.QueryInterface.Version;
     BusInterface = (PBUS_INTERFACE_STANDARD)StackLocation->Parameters.QueryInterface.Interface;
 
-    if (StackLocation->Parameters.QueryInterface.Version != 1)
+    if (Version != 1)
         goto done;
 
     status = STATUS_BUFFER_TOO_SMALL;        
-    if (StackLocation->Parameters.QueryInterface.Size < sizeof (BUS_INTERFACE_STANDARD))
+    if (Size < sizeof (BUS_INTERFACE_STANDARD))
         goto done;
 
     *BusInterface = Pdo->BusInterface;
@@ -1031,278 +1031,55 @@ done:
     return status;
 }
 
-static NTSTATUS
-PdoQueryDebugInterface(
-    IN  PXENBUS_PDO         Pdo,
-    IN  PIRP                Irp
-    )
-{
-    PIO_STACK_LOCATION      StackLocation;
-    USHORT                  Size;
-    USHORT                  Version;
-    PINTERFACE              Interface;
-    NTSTATUS                status;
-
-    status = Irp->IoStatus.Status;        
-
-    StackLocation = IoGetCurrentIrpStackLocation(Irp);
-    Size = StackLocation->Parameters.QueryInterface.Size;
-    Version = StackLocation->Parameters.QueryInterface.Version;
-    Interface = StackLocation->Parameters.QueryInterface.Interface;
-
-    if (StackLocation->Parameters.QueryInterface.Version != DEBUG_INTERFACE_VERSION)
-        goto done;
-
-    status = STATUS_BUFFER_TOO_SMALL;        
-    if (StackLocation->Parameters.QueryInterface.Size < sizeof (INTERFACE))
-        goto done;
-
-    Interface->Size = sizeof (INTERFACE);
-    Interface->Version = DEBUG_INTERFACE_VERSION;
-    Interface->Context = __PdoGetDebugInterface(Pdo);
-    Interface->InterfaceReference = NULL;
-    Interface->InterfaceDereference = NULL;
-
-    Irp->IoStatus.Information = 0;
-    status = STATUS_SUCCESS;
-
-done:
-    return status;
-}
-
-static NTSTATUS
-PdoQuerySuspendInterface(
-    IN  PXENBUS_PDO             Pdo,
-    IN  PIRP                    Irp
-    )
-{
-    PIO_STACK_LOCATION          StackLocation;
-    USHORT                      Size;
-    USHORT                      Version;
-    PINTERFACE                  Interface;
-    NTSTATUS                    status;
-
-    status = Irp->IoStatus.Status;        
-
-    StackLocation = IoGetCurrentIrpStackLocation(Irp);
-    Size = StackLocation->Parameters.QueryInterface.Size;
-    Version = StackLocation->Parameters.QueryInterface.Version;
-    Interface = StackLocation->Parameters.QueryInterface.Interface;
-
-    if (StackLocation->Parameters.QueryInterface.Version != SUSPEND_INTERFACE_VERSION)
-        goto done;
-
-    status = STATUS_BUFFER_TOO_SMALL;        
-    if (StackLocation->Parameters.QueryInterface.Size < sizeof (INTERFACE))
-        goto done;
-
-    Interface->Size = sizeof (INTERFACE);
-    Interface->Version = SUSPEND_INTERFACE_VERSION;
-    Interface->Context = __PdoGetSuspendInterface(Pdo);
-    Interface->InterfaceReference = NULL;
-    Interface->InterfaceDereference = NULL;
-
-    Irp->IoStatus.Information = 0;
-    status = STATUS_SUCCESS;
-
-done:
-    return status;
-}
-
-static NTSTATUS
-PdoQuerySharedInfoInterface(
-    IN  PXENBUS_PDO                 Pdo,
-    IN  PIRP                        Irp
-    )
-{
-    PIO_STACK_LOCATION              StackLocation;
-    USHORT                          Size;
-    USHORT                          Version;
-    PINTERFACE                      Interface;
-    NTSTATUS                        status;
-
-    status = Irp->IoStatus.Status;        
-
-    StackLocation = IoGetCurrentIrpStackLocation(Irp);
-    Size = StackLocation->Parameters.QueryInterface.Size;
-    Version = StackLocation->Parameters.QueryInterface.Version;
-    Interface = StackLocation->Parameters.QueryInterface.Interface;
-
-    if (StackLocation->Parameters.QueryInterface.Version != SHARED_INFO_INTERFACE_VERSION)
-        goto done;
-
-    status = STATUS_BUFFER_TOO_SMALL;        
-    if (StackLocation->Parameters.QueryInterface.Size < sizeof (INTERFACE))
-        goto done;
-
-    Interface->Size = sizeof (INTERFACE);
-    Interface->Version = SHARED_INFO_INTERFACE_VERSION;
-    Interface->Context = __PdoGetSharedInfoInterface(Pdo);
-    Interface->InterfaceReference = NULL;
-    Interface->InterfaceDereference = NULL;
-
-    Irp->IoStatus.Information = 0;
-    status = STATUS_SUCCESS;
-
-done:
-    return status;
-}
-
-static NTSTATUS
-PdoQueryEvtchnInterface(
-    IN  PXENBUS_PDO             Pdo,
-    IN  PIRP                    Irp
-    )
-{
-    PIO_STACK_LOCATION          StackLocation;
-    USHORT                      Size;
-    USHORT                      Version;
-    PINTERFACE                  Interface;
-    NTSTATUS                    status;
-
-    status = Irp->IoStatus.Status;        
-
-    StackLocation = IoGetCurrentIrpStackLocation(Irp);
-    Size = StackLocation->Parameters.QueryInterface.Size;
-    Version = StackLocation->Parameters.QueryInterface.Version;
-    Interface = StackLocation->Parameters.QueryInterface.Interface;
-
-    if (StackLocation->Parameters.QueryInterface.Version != EVTCHN_INTERFACE_VERSION)
-        goto done;
-
-    status = STATUS_BUFFER_TOO_SMALL;        
-    if (StackLocation->Parameters.QueryInterface.Size < sizeof (INTERFACE))
-        goto done;
-
-    Interface->Size = sizeof (INTERFACE);
-    Interface->Version = EVTCHN_INTERFACE_VERSION;
-    Interface->Context = __PdoGetEvtchnInterface(Pdo);
-    Interface->InterfaceReference = NULL;
-    Interface->InterfaceDereference = NULL;
-
-    Irp->IoStatus.Information = 0;
-    status = STATUS_SUCCESS;
-
-done:
-    return status;
-}
-
-static NTSTATUS
-PdoQueryStoreInterface(
-    IN  PXENBUS_PDO             Pdo,
-    IN  PIRP                    Irp
-    )
-{
-    PIO_STACK_LOCATION          StackLocation;
-    USHORT                      Size;
-    USHORT                      Version;
-    PINTERFACE                  Interface;
-    NTSTATUS                    status;
-
-    status = Irp->IoStatus.Status;        
-
-    StackLocation = IoGetCurrentIrpStackLocation(Irp);
-    Size = StackLocation->Parameters.QueryInterface.Size;
-    Version = StackLocation->Parameters.QueryInterface.Version;
-    Interface = StackLocation->Parameters.QueryInterface.Interface;
-
-    if (StackLocation->Parameters.QueryInterface.Version != STORE_INTERFACE_VERSION)
-        goto done;
-
-    status = STATUS_BUFFER_TOO_SMALL;        
-    if (StackLocation->Parameters.QueryInterface.Size < sizeof (INTERFACE))
-        goto done;
-
-    Interface->Size = sizeof (INTERFACE);
-    Interface->Version = STORE_INTERFACE_VERSION;
-    Interface->Context = __PdoGetStoreInterface(Pdo);
-    Interface->InterfaceReference = NULL;
-    Interface->InterfaceDereference = NULL;
-
-    Irp->IoStatus.Information = 0;
-    status = STATUS_SUCCESS;
-
-done:
-    return status;
-}
-
-static NTSTATUS
-PdoQueryCacheInterface(
-    IN  PXENBUS_PDO             Pdo,
-    IN  PIRP                    Irp
-    )
-{
-    PIO_STACK_LOCATION          StackLocation;
-    USHORT                      Size;
-    USHORT                      Version;
-    PINTERFACE                  Interface;
-    NTSTATUS                    status;
-
-    status = Irp->IoStatus.Status;        
-
-    StackLocation = IoGetCurrentIrpStackLocation(Irp);
-    Size = StackLocation->Parameters.QueryInterface.Size;
-    Version = StackLocation->Parameters.QueryInterface.Version;
-    Interface = StackLocation->Parameters.QueryInterface.Interface;
-
-    if (StackLocation->Parameters.QueryInterface.Version != CACHE_INTERFACE_VERSION)
-        goto done;
-
-    status = STATUS_BUFFER_TOO_SMALL;        
-    if (StackLocation->Parameters.QueryInterface.Size < sizeof (INTERFACE))
-        goto done;
-
-    Interface->Size = sizeof (INTERFACE);
-    Interface->Version = CACHE_INTERFACE_VERSION;
-    Interface->Context = __PdoGetCacheInterface(Pdo);
-    Interface->InterfaceReference = NULL;
-    Interface->InterfaceDereference = NULL;
-
-    Irp->IoStatus.Information = 0;
-    status = STATUS_SUCCESS;
-
-done:
-    return status;
-}
-
-static NTSTATUS
-PdoQueryGnttabInterface(
-    IN  PXENBUS_PDO             Pdo,
-    IN  PIRP                    Irp
-    )
-{
-    PIO_STACK_LOCATION          StackLocation;
-    USHORT                      Size;
-    USHORT                      Version;
-    PINTERFACE                  Interface;
-    NTSTATUS                    status;
-
-    status = Irp->IoStatus.Status;        
-
-    StackLocation = IoGetCurrentIrpStackLocation(Irp);
-    Size = StackLocation->Parameters.QueryInterface.Size;
-    Version = StackLocation->Parameters.QueryInterface.Version;
-    Interface = StackLocation->Parameters.QueryInterface.Interface;
-
-    if (StackLocation->Parameters.QueryInterface.Version != GNTTAB_INTERFACE_VERSION)
-        goto done;
-
-    status = STATUS_BUFFER_TOO_SMALL;        
-    if (StackLocation->Parameters.QueryInterface.Size < sizeof (INTERFACE))
-        goto done;
-
-    Interface->Size = sizeof (INTERFACE);
-    Interface->Version = GNTTAB_INTERFACE_VERSION;
-    Interface->Context = __PdoGetGnttabInterface(Pdo);
-    Interface->InterfaceReference = NULL;
-    Interface->InterfaceDereference = NULL;
-
-    Irp->IoStatus.Information = 0;
-    status = STATUS_SUCCESS;
-
-done:
-    return status;
-}
+#define GET(_Interface) __PdoGet ## _Interface ## Interface
+
+#define DEFINE_HANDLER(_Version, _Interface)                        \
+static NTSTATUS                                                     \
+PdoQuery ## _Interface ## Interface(                                \
+    IN  PXENBUS_PDO             Pdo,                                \
+    IN  PIRP                    Irp                                 \
+    )                                                               \
+{                                                                   \
+    PIO_STACK_LOCATION          StackLocation;                      \
+    USHORT                      Size;                               \
+    USHORT                      Version;                            \
+    PINTERFACE                  Interface;                          \
+    NTSTATUS                    status;                             \
+                                                                    \
+    status = Irp->IoStatus.Status;                                  \
+                                                                    \
+    StackLocation = IoGetCurrentIrpStackLocation(Irp);              \
+    Size = StackLocation->Parameters.QueryInterface.Size;           \
+    Version = StackLocation->Parameters.QueryInterface.Version;     \
+    Interface = StackLocation->Parameters.QueryInterface.Interface; \
+                                                                    \
+    if (Version != (_Version))                                      \
+        goto done;                                                  \
+                                                                    \
+    status = STATUS_BUFFER_TOO_SMALL;                               \
+    if (Size < sizeof (INTERFACE))                                  \
+        goto done;                                                  \
+                                                                    \
+    Interface->Size = sizeof (INTERFACE);                           \
+    Interface->Version = (_Version);                                \
+    Interface->Context = GET(_Interface)(Pdo);                      \
+    Interface->InterfaceReference = NULL;                           \
+    Interface->InterfaceDereference = NULL;                         \
+                                                                    \
+    Irp->IoStatus.Information = 0;                                  \
+    status = STATUS_SUCCESS;                                        \
+                                                                    \
+done:                                                               \
+    return status;                                                  \
+}                                                                   \
+
+DEFINE_HANDLER(DEBUG_INTERFACE_VERSION, Debug)
+DEFINE_HANDLER(SUSPEND_INTERFACE_VERSION, Suspend)
+DEFINE_HANDLER(SHARED_INFO_INTERFACE_VERSION, SharedInfo)
+DEFINE_HANDLER(EVTCHN_INTERFACE_VERSION, Evtchn)
+DEFINE_HANDLER(STORE_INTERFACE_VERSION, Store)
+DEFINE_HANDLER(CACHE_INTERFACE_VERSION, Cache)
+DEFINE_HANDLER(GNTTAB_INTERFACE_VERSION, Gnttab)
 
 struct _INTERFACE_ENTRY {
     const GUID  *Guid;
@@ -1310,18 +1087,20 @@ struct _INTERFACE_ENTRY {
     NTSTATUS    (*Handler)(PXENBUS_PDO, PIRP);
 };
 
-#define DEFINE_HANDLER(_Guid, _Function)    \
-        { &GUID_ ## _Guid, #_Guid, (_Function) }
+#define HANDLER(_Interface) PdoQuery ## _Interface ## Interface
+
+#define DEFINE_ENTRY(_Guid, _Interface)   \
+    { &GUID_ ## _Guid, #_Guid, HANDLER(_Interface) }
 
 struct _INTERFACE_ENTRY PdoInterfaceTable[] = {
-    DEFINE_HANDLER(BUS_INTERFACE_STANDARD, PdoQueryBusInterface),
-    DEFINE_HANDLER(DEBUG_INTERFACE, PdoQueryDebugInterface),
-    DEFINE_HANDLER(SUSPEND_INTERFACE, PdoQuerySuspendInterface),
-    DEFINE_HANDLER(SHARED_INFO_INTERFACE, PdoQuerySharedInfoInterface),
-    DEFINE_HANDLER(EVTCHN_INTERFACE, PdoQueryEvtchnInterface),
-    DEFINE_HANDLER(STORE_INTERFACE, PdoQueryStoreInterface),
-    DEFINE_HANDLER(CACHE_INTERFACE, PdoQueryCacheInterface),
-    DEFINE_HANDLER(GNTTAB_INTERFACE, PdoQueryGnttabInterface),
+    DEFINE_ENTRY(BUS_INTERFACE_STANDARD, Bus),
+    DEFINE_ENTRY(DEBUG_INTERFACE, Debug),
+    DEFINE_ENTRY(SUSPEND_INTERFACE, Suspend),
+    DEFINE_ENTRY(SHARED_INFO_INTERFACE, SharedInfo),
+    DEFINE_ENTRY(EVTCHN_INTERFACE, Evtchn),
+    DEFINE_ENTRY(STORE_INTERFACE, Store),
+    DEFINE_ENTRY(CACHE_INTERFACE, Cache),
+    DEFINE_ENTRY(GNTTAB_INTERFACE, Gnttab),
     { NULL, NULL, NULL }
 };
 
index 3bc5f6fe0c5b1e07e0f6be4233e9c8a7d41cc554..35567709d73215aa8d7a0d2dab3efa31c67342b1 100644 (file)
@@ -832,83 +832,50 @@ __PdoQueryInterface(
     return STATUS_SUCCESS;
 }
 
-static NTSTATUS
-PdoQueryEmulatedInterface(
-    IN  PXENFILT_PDO            Pdo,
-    IN  PIRP                    Irp
-    )
-{
-    PIO_STACK_LOCATION          StackLocation;
-    USHORT                      Size;
-    USHORT                      Version;
-    PINTERFACE                  Interface;
-    NTSTATUS                    status;
-
-    status = Irp->IoStatus.Status;        
-
-    StackLocation = IoGetCurrentIrpStackLocation(Irp);
-    Size = StackLocation->Parameters.QueryInterface.Size;
-    Version = StackLocation->Parameters.QueryInterface.Version;
-    Interface = StackLocation->Parameters.QueryInterface.Interface;
-
-    if (StackLocation->Parameters.QueryInterface.Version != EMULATED_INTERFACE_VERSION)
-        goto done;
-
-    status = STATUS_BUFFER_TOO_SMALL;        
-    if (StackLocation->Parameters.QueryInterface.Size < sizeof (INTERFACE))
-        goto done;
-
-    Interface->Size = sizeof (INTERFACE);
-    Interface->Version = EMULATED_INTERFACE_VERSION;
-    Interface->Context = __PdoGetEmulatedInterface(Pdo);
-    Interface->InterfaceReference = NULL;
-    Interface->InterfaceDereference = NULL;
-
-    Irp->IoStatus.Information = 0;
-    status = STATUS_SUCCESS;
-
-done:
-    return status;
-}
-
-static NTSTATUS
-PdoQueryUnplugInterface(
-    IN  PXENFILT_PDO            Pdo,
-    IN  PIRP                    Irp
-    )
-{
-    PIO_STACK_LOCATION          StackLocation;
-    USHORT                      Size;
-    USHORT                      Version;
-    PINTERFACE                  Interface;
-    NTSTATUS                    status;
-
-    status = Irp->IoStatus.Status;        
-
-    StackLocation = IoGetCurrentIrpStackLocation(Irp);
-    Size = StackLocation->Parameters.QueryInterface.Size;
-    Version = StackLocation->Parameters.QueryInterface.Version;
-    Interface = StackLocation->Parameters.QueryInterface.Interface;
-
-    if (StackLocation->Parameters.QueryInterface.Version != UNPLUG_INTERFACE_VERSION)
-        goto done;
-
-    status = STATUS_BUFFER_TOO_SMALL;        
-    if (StackLocation->Parameters.QueryInterface.Size < sizeof (INTERFACE))
-        goto done;
-
-    Interface->Size = sizeof (INTERFACE);
-    Interface->Version = UNPLUG_INTERFACE_VERSION;
-    Interface->Context = __PdoGetUnplugInterface(Pdo);
-    Interface->InterfaceReference = NULL;
-    Interface->InterfaceDereference = NULL;
-
-    Irp->IoStatus.Information = 0;
-    status = STATUS_SUCCESS;
-
-done:
-    return status;
-}
+#define GET(_Interface) __PdoGet ## _Interface ## Interface
+
+#define DEFINE_HANDLER(_Version, _Interface)                        \
+static NTSTATUS                                                     \
+PdoQuery ## _Interface ## Interface(                                \
+    IN  PXENFILT_PDO            Pdo,                                \
+    IN  PIRP                    Irp                                 \
+    )                                                               \
+{                                                                   \
+    PIO_STACK_LOCATION          StackLocation;                      \
+    USHORT                      Size;                               \
+    USHORT                      Version;                            \
+    PINTERFACE                  Interface;                          \
+    NTSTATUS                    status;                             \
+                                                                    \
+    status = Irp->IoStatus.Status;                                  \
+                                                                    \
+    StackLocation = IoGetCurrentIrpStackLocation(Irp);              \
+    Size = StackLocation->Parameters.QueryInterface.Size;           \
+    Version = StackLocation->Parameters.QueryInterface.Version;     \
+    Interface = StackLocation->Parameters.QueryInterface.Interface; \
+                                                                    \
+    if (Version != (_Version))                                      \
+        goto done;                                                  \
+                                                                    \
+    status = STATUS_BUFFER_TOO_SMALL;                               \
+    if (Size < sizeof (INTERFACE))                                  \
+        goto done;                                                  \
+                                                                    \
+    Interface->Size = sizeof (INTERFACE);                           \
+    Interface->Version = (_Version);                                \
+    Interface->Context = GET(_Interface)(Pdo);                      \
+    Interface->InterfaceReference = NULL;                           \
+    Interface->InterfaceDereference = NULL;                         \
+                                                                    \
+    Irp->IoStatus.Information = 0;                                  \
+    status = STATUS_SUCCESS;                                        \
+                                                                    \
+done:                                                               \
+    return status;                                                  \
+}                                                                   \
+
+DEFINE_HANDLER(EMULATED_INTERFACE_VERSION, Emulated)
+DEFINE_HANDLER(UNPLUG_INTERFACE_VERSION, Unplug)
 
 struct _INTERFACE_ENTRY {
     const GUID  *Guid;
@@ -916,12 +883,14 @@ struct _INTERFACE_ENTRY {
     NTSTATUS    (*Handler)(PXENFILT_PDO, PIRP);
 };
 
-#define DEFINE_HANDLER(_Guid, _Function)    \
-        { &GUID_ ## _Guid, #_Guid, (_Function) }
+#define HANDLER(_Interface) PdoQuery ## _Interface ## Interface
+
+#define DEFINE_ENTRY(_Guid, _Interface)   \
+    { &GUID_ ## _Guid, #_Guid, HANDLER(_Interface) }
 
 struct _INTERFACE_ENTRY PdoInterfaceTable[] = {
-    DEFINE_HANDLER(EMULATED_INTERFACE, PdoQueryEmulatedInterface),
-    DEFINE_HANDLER(UNPLUG_INTERFACE, PdoQueryUnplugInterface),
+    DEFINE_ENTRY(EMULATED_INTERFACE, Emulated),
+    DEFINE_ENTRY(UNPLUG_INTERFACE, Unplug),
     { NULL, NULL, NULL }
 };