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

[win-pv-devel] [PATCH 1/5] Move util.h from include to src/xenvif



It should be co-located with headers such as assert.h and names.h

Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
 include/util.h           | 343 -----------------------------------------------
 src/xenvif/bus.c         |   2 +-
 src/xenvif/checksum.c    |   3 +-
 src/xenvif/driver.c      |   2 +-
 src/xenvif/fdo.c         |   2 +-
 src/xenvif/frontend.c    |   2 +-
 src/xenvif/link.c        |   2 +-
 src/xenvif/mac.c         |   2 +-
 src/xenvif/parse.c       |   3 +-
 src/xenvif/pdo.c         |   3 +-
 src/xenvif/receiver.c    |   7 +-
 src/xenvif/registry.c    |   2 +-
 src/xenvif/thread.c      |   2 +-
 src/xenvif/transmitter.c |   7 +-
 src/xenvif/util.h        | 343 +++++++++++++++++++++++++++++++++++++++++++++++
 src/xenvif/vif.c         |   2 +-
 16 files changed, 366 insertions(+), 361 deletions(-)
 delete mode 100644 include/util.h
 create mode 100644 src/xenvif/util.h

diff --git a/include/util.h b/include/util.h
deleted file mode 100644
index c008960..0000000
--- a/include/util.h
+++ /dev/null
@@ -1,343 +0,0 @@
-/* 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 _UTIL_H
-#define _UTIL_H
-
-#include <ntddk.h>
-
-#include "assert.h"
-
-#define        P2ROUNDUP(_x, _a)   \
-        (-(-(_x) & -(_a)))
-
-static FORCEINLINE LONG
-__ffs(
-    IN  unsigned long long  mask
-    )
-{
-    unsigned char           *array = (unsigned char *)&mask;
-    unsigned int            byte;
-    unsigned int            bit;
-    unsigned char           val;
-
-    val = 0;
-
-    byte = 0;
-    while (byte < 8) {
-        val = array[byte];
-
-        if (val != 0)
-            break;
-
-        byte++;
-    }
-    if (byte == 8)
-        return -1;
-
-    bit = 0;
-    while (bit < 8) {
-        if (val & 0x01)
-            break;
-
-        val >>= 1;
-        bit++;
-    }
-
-    return (byte * 8) + bit;
-}
-
-#define __ffu(_mask)  \
-        __ffs(~(_mask))
-
-static FORCEINLINE VOID
-__CpuId(
-    IN  ULONG   Leaf,
-    OUT PULONG  EAX OPTIONAL,
-    OUT PULONG  EBX OPTIONAL,
-    OUT PULONG  ECX OPTIONAL,
-    OUT PULONG  EDX OPTIONAL
-    )
-{
-    ULONG       Value[4] = {0};
-
-    __cpuid(Value, Leaf);
-
-    if (EAX)
-        *EAX = Value[0];
-
-    if (EBX)
-        *EBX = Value[1];
-
-    if (ECX)
-        *ECX = Value[2];
-
-    if (EDX)
-        *EDX = Value[3];
-}
-
-static FORCEINLINE LONG
-__InterlockedAdd(
-    IN  LONG    *Value,
-    IN  LONG    Delta
-    )
-{
-    LONG        New;
-    LONG        Old;
-
-    do {
-        Old = *Value;
-        New = Old + Delta;
-    } while (InterlockedCompareExchange(Value, New, Old) != Old);
-
-    return New;
-}
-
-static FORCEINLINE LONG
-__InterlockedSubtract(
-    IN  LONG    *Value,
-    IN  LONG    Delta
-    )
-{
-    LONG        New;
-    LONG        Old;
-
-    do {
-        Old = *Value;
-        New = Old - Delta;
-    } while (InterlockedCompareExchange(Value, New, Old) != Old);
-
-    return New;
-}
-
-typedef struct _NON_PAGED_BUFFER_HEADER {
-    SIZE_T  Length;
-    ULONG   Tag;
-} NON_PAGED_BUFFER_HEADER, *PNON_PAGED_BUFFER_HEADER;
-
-typedef struct _NON_PAGED_BUFFER_TRAILER {
-    ULONG   Tag;
-} NON_PAGED_BUFFER_TRAILER, *PNON_PAGED_BUFFER_TRAILER;
-
-static FORCEINLINE PVOID
-__AllocateNonPagedPoolWithTag(
-    IN  SIZE_T                  Length,
-    IN  ULONG                   Tag
-    )
-{
-    PUCHAR                      Buffer;
-    PNON_PAGED_BUFFER_HEADER    Header;
-    PNON_PAGED_BUFFER_TRAILER   Trailer;
-
-    ASSERT(Length != 0);
-
-    Buffer = ExAllocatePoolWithTag(NonPagedPool,
-                                   sizeof (NON_PAGED_BUFFER_HEADER) +
-                                   Length +
-                                   sizeof (NON_PAGED_BUFFER_TRAILER),
-                                   Tag);
-    if (Buffer == NULL)
-        goto done;
-
-    RtlZeroMemory(Buffer, 
-                  sizeof (NON_PAGED_BUFFER_HEADER) +
-                  Length +
-                  sizeof (NON_PAGED_BUFFER_TRAILER));
-
-    Header = (PNON_PAGED_BUFFER_HEADER)Buffer;
-    Header->Length = Length;
-    Header->Tag = Tag;
-
-    Buffer += sizeof (NON_PAGED_BUFFER_HEADER);
-
-    Trailer = (PNON_PAGED_BUFFER_TRAILER)(Buffer + Length);
-    Trailer->Tag = Tag;
-
-done:
-    return Buffer;
-}
-
-static FORCEINLINE VOID
-__FreePoolWithTag(
-    IN  PVOID                   _Buffer,
-    IN  ULONG                   Tag
-    )
-{
-    PUCHAR                      Buffer = _Buffer;
-    SIZE_T                      Length;
-    PNON_PAGED_BUFFER_HEADER    Header;
-    PNON_PAGED_BUFFER_TRAILER   Trailer;
-
-    ASSERT(Buffer != NULL);
-
-    Buffer -= sizeof (NON_PAGED_BUFFER_HEADER);
-
-    Header = (PNON_PAGED_BUFFER_HEADER)Buffer;
-    ASSERT3U(Tag, ==, Header->Tag);
-    Length = Header->Length;
-
-    Buffer += sizeof (NON_PAGED_BUFFER_HEADER);
-
-    Trailer = (PNON_PAGED_BUFFER_TRAILER)(Buffer + Length);
-    ASSERT3U(Tag, ==, Trailer->Tag);
-
-    Buffer -= sizeof (NON_PAGED_BUFFER_HEADER);
-
-    RtlFillMemory(Buffer, 
-                  sizeof (NON_PAGED_BUFFER_HEADER) +
-                  Length +
-                  sizeof (NON_PAGED_BUFFER_TRAILER),
-                  0xAA);
-
-    ExFreePoolWithTag(Buffer, Tag);
-}
-
-static FORCEINLINE PMDL
-__AllocatePage(
-    VOID
-    )
-{
-    PHYSICAL_ADDRESS    LowAddress;
-    PHYSICAL_ADDRESS    HighAddress;
-    LARGE_INTEGER       SkipBytes;
-    SIZE_T              TotalBytes;
-    PMDL                Mdl;
-    PUCHAR              MdlMappedSystemVa;
-    NTSTATUS            status;
-
-    LowAddress.QuadPart = 0ull;
-    HighAddress.QuadPart = ~0ull;
-    SkipBytes.QuadPart = 0ull;
-    TotalBytes = (SIZE_T)PAGE_SIZE;
-
-    Mdl = MmAllocatePagesForMdlEx(LowAddress,
-                                  HighAddress,
-                                  SkipBytes,
-                                  TotalBytes,
-                                  MmCached,
-                                  0);
-
-    status = STATUS_NO_MEMORY;
-    if (Mdl == NULL)
-        goto fail1;
-
-    ASSERT((Mdl->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA |
-                             MDL_PARTIAL_HAS_BEEN_MAPPED |
-                             MDL_PARTIAL |
-                             MDL_PARENT_MAPPED_SYSTEM_VA |
-                             MDL_SOURCE_IS_NONPAGED_POOL |
-                             MDL_IO_SPACE)) == 0);
-
-    MdlMappedSystemVa = MmMapLockedPagesSpecifyCache(Mdl,
-                                                     KernelMode,
-                                                                            
MmCached,   
-                                                                            
NULL,
-                                                                            
FALSE,
-                                                                            
NormalPagePriority);
-
-    status = STATUS_UNSUCCESSFUL;
-    if (MdlMappedSystemVa == NULL)
-        goto fail2;
-
-    ASSERT3P(MdlMappedSystemVa, ==, Mdl->MappedSystemVa);
-
-    RtlZeroMemory(MdlMappedSystemVa, PAGE_SIZE);
-
-    return Mdl;
-
-fail2:
-    Error("fail2\n");
-
-    MmFreePagesFromMdl(Mdl);
-    ExFreePool(Mdl);
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return NULL;
-}
-
-static FORCEINLINE VOID
-__FreePage(
-    IN PMDL    Mdl
-    )
-{
-    PUCHAR     MdlMappedSystemVa;
-
-    ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
-    MdlMappedSystemVa = Mdl->MappedSystemVa;
-
-    RtlFillMemory(MdlMappedSystemVa, PAGE_SIZE, 0xAA);
-    
-    MmUnmapLockedPages(MdlMappedSystemVa, Mdl);
-
-    MmFreePagesFromMdl(Mdl);
-}
-
-static FORCEINLINE PCHAR
-__strtok_r(
-    IN      PCHAR   Buffer,
-    IN      PCHAR   Delimiter,
-    IN OUT  PCHAR   *Context
-    )
-{
-    PCHAR           Token;
-    PCHAR           End;
-
-    if (Buffer != NULL)
-        *Context = Buffer;
-
-    Token = *Context;
-
-    if (Token == NULL)
-        return NULL;
-
-    while (*Token != L'\0' &&
-           strchr(Delimiter, *Token) != NULL)
-        Token++;
-
-    if (*Token == L'\0')
-        return NULL;
-
-    End = Token + 1;
-    while (*End != L'\0' &&
-           strchr(Delimiter, *End) == NULL)
-        End++;
-
-    if (*End != L'\0')
-        *End++ = L'\0';
-
-    *Context = End;
-
-    return Token;
-}
-
-#endif  // _UTIL_H
diff --git a/src/xenvif/bus.c b/src/xenvif/bus.c
index 07229ed..9190535 100644
--- a/src/xenvif/bus.c
+++ b/src/xenvif/bus.c
@@ -32,13 +32,13 @@
 #include <ntddk.h>
 #include <stdarg.h>
 #include <xen.h>
-#include <util.h>
 
 #include "bus.h"
 #include "fdo.h"
 #include "pdo.h"
 #include "dbg_print.h"
 #include "assert.h"
+#include "util.h"
 
 typedef struct _XENVIF_BUS_CONTEXT {
     LONG                    References;
diff --git a/src/xenvif/checksum.c b/src/xenvif/checksum.c
index 19a9616..ad375f6 100644
--- a/src/xenvif/checksum.c
+++ b/src/xenvif/checksum.c
@@ -32,14 +32,15 @@
 #include <ntddk.h>
 #include <ntstrsafe.h>
 #include <stdlib.h>
-#include <util.h>
 #include <ethernet.h>
 #include <tcpip.h>
+
 #include <vif_interface.h>
 
 #include "checksum.h"
 #include "dbg_print.h"
 #include "assert.h"
+#include "util.h"
 
 static FORCEINLINE VOID
 __AccumulateChecksum(
diff --git a/src/xenvif/driver.c b/src/xenvif/driver.c
index 083fa19..589bee9 100644
--- a/src/xenvif/driver.c
+++ b/src/xenvif/driver.c
@@ -30,7 +30,6 @@
  */
 
 #include <ntddk.h>
-#include <util.h>
 #include <version.h>
 
 #include "registry.h"
@@ -40,6 +39,7 @@
 #include "driver.h"
 #include "dbg_print.h"
 #include "assert.h"
+#include "util.h"
 
 extern PULONG       InitSafeBootMode;
 
diff --git a/src/xenvif/fdo.c b/src/xenvif/fdo.c
index 6b1aeff..4b40777 100644
--- a/src/xenvif/fdo.c
+++ b/src/xenvif/fdo.c
@@ -35,7 +35,6 @@
 #include <wdmguid.h>
 #include <ntstrsafe.h>
 #include <stdlib.h>
-#include <util.h>
 
 #include <evtchn_interface.h>
 #include <debug_interface.h>
@@ -54,6 +53,7 @@
 #include "names.h"
 #include "dbg_print.h"
 #include "assert.h"
+#include "util.h"
 
 #define FDO_POOL 'ODF'
 
diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index 88e387f..12b9789 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -33,7 +33,6 @@
 #include <ntstrsafe.h>
 #include <stdlib.h>
 #include <netioapi.h>
-#include <util.h>
 #include <xen.h>
 
 #include "driver.h"
@@ -50,6 +49,7 @@
 #include "link.h"
 #include "dbg_print.h"
 #include "assert.h"
+#include "util.h"
 
 struct _XENVIF_FRONTEND {
     PXENVIF_PDO                 Pdo;
diff --git a/src/xenvif/link.c b/src/xenvif/link.c
index 27a502b..0319767 100644
--- a/src/xenvif/link.c
+++ b/src/xenvif/link.c
@@ -32,11 +32,11 @@
 #include <ntddk.h>
 #include <ntstrsafe.h>
 #include <aux_klib.h>
-#include <util.h>
 
 #include "link.h"
 #include "dbg_print.h"
 #include "assert.h"
+#include "util.h"
 
 #define LINK_TAG    'KNIL'
 
diff --git a/src/xenvif/mac.c b/src/xenvif/mac.c
index b745625..1d60a1f 100644
--- a/src/xenvif/mac.c
+++ b/src/xenvif/mac.c
@@ -32,7 +32,6 @@
 #include <ntddk.h>
 #include <ntstrsafe.h>
 #include <stdlib.h>
-#include <util.h>
 #include <ethernet.h>
 
 #include "pdo.h"
@@ -41,6 +40,7 @@
 #include "thread.h"
 #include "dbg_print.h"
 #include "assert.h"
+#include "util.h"
 
 struct _XENVIF_MAC {
     PXENVIF_FRONTEND        Frontend;
diff --git a/src/xenvif/parse.c b/src/xenvif/parse.c
index 491f834..4e70ed4 100644
--- a/src/xenvif/parse.c
+++ b/src/xenvif/parse.c
@@ -31,16 +31,17 @@
 
 #include <ntddk.h>
 #include <ntstrsafe.h>
-#include <util.h>
 #include <ethernet.h>
 #include <tcpip.h>
 #include <llc.h>
 #include <ipx.h>
+
 #include <vif_interface.h>
 
 #include "parse.h"
 #include "dbg_print.h"
 #include "assert.h"
+#include "util.h"
 
 static FORCEINLINE NTSTATUS
 __ParseTcpHeader(
diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 5ce6c50..369efb0 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -38,8 +38,8 @@
 #include <stdlib.h>
 #include <netioapi.h>
 #include <bcrypt.h>
-#include <util.h>
 #include <xen.h>
+
 #include <store_interface.h>
 #include <emulated_interface.h>
 
@@ -55,6 +55,7 @@
 #include "link.h"
 #include "dbg_print.h"
 #include "assert.h"
+#include "util.h"
 
 #define PDO_POOL 'ODP'
 
diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c
index 5318baf..6f45627 100644
--- a/src/xenvif/receiver.c
+++ b/src/xenvif/receiver.c
@@ -32,8 +32,10 @@
 #include <ntddk.h>
 #include <ntstrsafe.h>
 #include <stdlib.h>
-#include <util.h>
 #include <xen.h>
+#include <ethernet.h>
+#include <tcpip.h>
+
 #include <debug_interface.h>
 #include <store_interface.h>
 #include <cache_interface.h>
@@ -44,8 +46,6 @@
 #define _NETRXF_gso_prefix     (4)
 #define  NETRXF_gso_prefix     (1U<<_NETRXF_gso_prefix)
 
-#include "ethernet.h"
-#include "tcpip.h"
 #include "pdo.h"
 #include "registry.h"
 #include "frontend.h"
@@ -59,6 +59,7 @@
 #include "driver.h"
 #include "dbg_print.h"
 #include "assert.h"
+#include "util.h"
 
 #define MAXNAMELEN  128
 
diff --git a/src/xenvif/registry.c b/src/xenvif/registry.c
index 519d3f6..7f1c4cc 100644
--- a/src/xenvif/registry.c
+++ b/src/xenvif/registry.c
@@ -30,10 +30,10 @@
  */
 
 #include <ntddk.h>
-#include <util.h>
 
 #include "registry.h"
 #include "assert.h"
+#include "util.h"
 
 #define REGISTRY_POOL 'GERX'
 
diff --git a/src/xenvif/thread.c b/src/xenvif/thread.c
index 12aa40e..2fa0c1c 100644
--- a/src/xenvif/thread.c
+++ b/src/xenvif/thread.c
@@ -30,11 +30,11 @@
  */
 
 #include <ntddk.h>
-#include <util.h>
 
 #include "thread.h"
 #include "dbg_print.h"
 #include "assert.h"
+#include "util.h"
 
 #define THREAD_POOL 'ERHT'
 
diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index 8fd7d2d..9f81ca1 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -33,8 +33,10 @@
 #include <ntstrsafe.h>
 #include <stdlib.h>
 #include <netioapi.h>
-#include <util.h>
 #include <xen.h>
+#include <ethernet.h>
+#include <tcpip.h>
+
 #include <debug_interface.h>
 #include <store_interface.h>
 #include <cache_interface.h>
@@ -42,8 +44,6 @@
 #include <range_set_interface.h>
 #include <evtchn_interface.h>
 
-#include "ethernet.h"
-#include "tcpip.h"
 #include "pdo.h"
 #include "frontend.h"
 #include "checksum.h"
@@ -55,6 +55,7 @@
 #include "registry.h"
 #include "dbg_print.h"
 #include "assert.h"
+#include "util.h"
 
 #ifndef XEN_NETIF_GSO_TYPE_TCPV6
 #define XEN_NETIF_GSO_TYPE_TCPV6    2
diff --git a/src/xenvif/util.h b/src/xenvif/util.h
new file mode 100644
index 0000000..c008960
--- /dev/null
+++ b/src/xenvif/util.h
@@ -0,0 +1,343 @@
+/* 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 _UTIL_H
+#define _UTIL_H
+
+#include <ntddk.h>
+
+#include "assert.h"
+
+#define        P2ROUNDUP(_x, _a)   \
+        (-(-(_x) & -(_a)))
+
+static FORCEINLINE LONG
+__ffs(
+    IN  unsigned long long  mask
+    )
+{
+    unsigned char           *array = (unsigned char *)&mask;
+    unsigned int            byte;
+    unsigned int            bit;
+    unsigned char           val;
+
+    val = 0;
+
+    byte = 0;
+    while (byte < 8) {
+        val = array[byte];
+
+        if (val != 0)
+            break;
+
+        byte++;
+    }
+    if (byte == 8)
+        return -1;
+
+    bit = 0;
+    while (bit < 8) {
+        if (val & 0x01)
+            break;
+
+        val >>= 1;
+        bit++;
+    }
+
+    return (byte * 8) + bit;
+}
+
+#define __ffu(_mask)  \
+        __ffs(~(_mask))
+
+static FORCEINLINE VOID
+__CpuId(
+    IN  ULONG   Leaf,
+    OUT PULONG  EAX OPTIONAL,
+    OUT PULONG  EBX OPTIONAL,
+    OUT PULONG  ECX OPTIONAL,
+    OUT PULONG  EDX OPTIONAL
+    )
+{
+    ULONG       Value[4] = {0};
+
+    __cpuid(Value, Leaf);
+
+    if (EAX)
+        *EAX = Value[0];
+
+    if (EBX)
+        *EBX = Value[1];
+
+    if (ECX)
+        *ECX = Value[2];
+
+    if (EDX)
+        *EDX = Value[3];
+}
+
+static FORCEINLINE LONG
+__InterlockedAdd(
+    IN  LONG    *Value,
+    IN  LONG    Delta
+    )
+{
+    LONG        New;
+    LONG        Old;
+
+    do {
+        Old = *Value;
+        New = Old + Delta;
+    } while (InterlockedCompareExchange(Value, New, Old) != Old);
+
+    return New;
+}
+
+static FORCEINLINE LONG
+__InterlockedSubtract(
+    IN  LONG    *Value,
+    IN  LONG    Delta
+    )
+{
+    LONG        New;
+    LONG        Old;
+
+    do {
+        Old = *Value;
+        New = Old - Delta;
+    } while (InterlockedCompareExchange(Value, New, Old) != Old);
+
+    return New;
+}
+
+typedef struct _NON_PAGED_BUFFER_HEADER {
+    SIZE_T  Length;
+    ULONG   Tag;
+} NON_PAGED_BUFFER_HEADER, *PNON_PAGED_BUFFER_HEADER;
+
+typedef struct _NON_PAGED_BUFFER_TRAILER {
+    ULONG   Tag;
+} NON_PAGED_BUFFER_TRAILER, *PNON_PAGED_BUFFER_TRAILER;
+
+static FORCEINLINE PVOID
+__AllocateNonPagedPoolWithTag(
+    IN  SIZE_T                  Length,
+    IN  ULONG                   Tag
+    )
+{
+    PUCHAR                      Buffer;
+    PNON_PAGED_BUFFER_HEADER    Header;
+    PNON_PAGED_BUFFER_TRAILER   Trailer;
+
+    ASSERT(Length != 0);
+
+    Buffer = ExAllocatePoolWithTag(NonPagedPool,
+                                   sizeof (NON_PAGED_BUFFER_HEADER) +
+                                   Length +
+                                   sizeof (NON_PAGED_BUFFER_TRAILER),
+                                   Tag);
+    if (Buffer == NULL)
+        goto done;
+
+    RtlZeroMemory(Buffer, 
+                  sizeof (NON_PAGED_BUFFER_HEADER) +
+                  Length +
+                  sizeof (NON_PAGED_BUFFER_TRAILER));
+
+    Header = (PNON_PAGED_BUFFER_HEADER)Buffer;
+    Header->Length = Length;
+    Header->Tag = Tag;
+
+    Buffer += sizeof (NON_PAGED_BUFFER_HEADER);
+
+    Trailer = (PNON_PAGED_BUFFER_TRAILER)(Buffer + Length);
+    Trailer->Tag = Tag;
+
+done:
+    return Buffer;
+}
+
+static FORCEINLINE VOID
+__FreePoolWithTag(
+    IN  PVOID                   _Buffer,
+    IN  ULONG                   Tag
+    )
+{
+    PUCHAR                      Buffer = _Buffer;
+    SIZE_T                      Length;
+    PNON_PAGED_BUFFER_HEADER    Header;
+    PNON_PAGED_BUFFER_TRAILER   Trailer;
+
+    ASSERT(Buffer != NULL);
+
+    Buffer -= sizeof (NON_PAGED_BUFFER_HEADER);
+
+    Header = (PNON_PAGED_BUFFER_HEADER)Buffer;
+    ASSERT3U(Tag, ==, Header->Tag);
+    Length = Header->Length;
+
+    Buffer += sizeof (NON_PAGED_BUFFER_HEADER);
+
+    Trailer = (PNON_PAGED_BUFFER_TRAILER)(Buffer + Length);
+    ASSERT3U(Tag, ==, Trailer->Tag);
+
+    Buffer -= sizeof (NON_PAGED_BUFFER_HEADER);
+
+    RtlFillMemory(Buffer, 
+                  sizeof (NON_PAGED_BUFFER_HEADER) +
+                  Length +
+                  sizeof (NON_PAGED_BUFFER_TRAILER),
+                  0xAA);
+
+    ExFreePoolWithTag(Buffer, Tag);
+}
+
+static FORCEINLINE PMDL
+__AllocatePage(
+    VOID
+    )
+{
+    PHYSICAL_ADDRESS    LowAddress;
+    PHYSICAL_ADDRESS    HighAddress;
+    LARGE_INTEGER       SkipBytes;
+    SIZE_T              TotalBytes;
+    PMDL                Mdl;
+    PUCHAR              MdlMappedSystemVa;
+    NTSTATUS            status;
+
+    LowAddress.QuadPart = 0ull;
+    HighAddress.QuadPart = ~0ull;
+    SkipBytes.QuadPart = 0ull;
+    TotalBytes = (SIZE_T)PAGE_SIZE;
+
+    Mdl = MmAllocatePagesForMdlEx(LowAddress,
+                                  HighAddress,
+                                  SkipBytes,
+                                  TotalBytes,
+                                  MmCached,
+                                  0);
+
+    status = STATUS_NO_MEMORY;
+    if (Mdl == NULL)
+        goto fail1;
+
+    ASSERT((Mdl->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA |
+                             MDL_PARTIAL_HAS_BEEN_MAPPED |
+                             MDL_PARTIAL |
+                             MDL_PARENT_MAPPED_SYSTEM_VA |
+                             MDL_SOURCE_IS_NONPAGED_POOL |
+                             MDL_IO_SPACE)) == 0);
+
+    MdlMappedSystemVa = MmMapLockedPagesSpecifyCache(Mdl,
+                                                     KernelMode,
+                                                                            
MmCached,   
+                                                                            
NULL,
+                                                                            
FALSE,
+                                                                            
NormalPagePriority);
+
+    status = STATUS_UNSUCCESSFUL;
+    if (MdlMappedSystemVa == NULL)
+        goto fail2;
+
+    ASSERT3P(MdlMappedSystemVa, ==, Mdl->MappedSystemVa);
+
+    RtlZeroMemory(MdlMappedSystemVa, PAGE_SIZE);
+
+    return Mdl;
+
+fail2:
+    Error("fail2\n");
+
+    MmFreePagesFromMdl(Mdl);
+    ExFreePool(Mdl);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return NULL;
+}
+
+static FORCEINLINE VOID
+__FreePage(
+    IN PMDL    Mdl
+    )
+{
+    PUCHAR     MdlMappedSystemVa;
+
+    ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+    MdlMappedSystemVa = Mdl->MappedSystemVa;
+
+    RtlFillMemory(MdlMappedSystemVa, PAGE_SIZE, 0xAA);
+    
+    MmUnmapLockedPages(MdlMappedSystemVa, Mdl);
+
+    MmFreePagesFromMdl(Mdl);
+}
+
+static FORCEINLINE PCHAR
+__strtok_r(
+    IN      PCHAR   Buffer,
+    IN      PCHAR   Delimiter,
+    IN OUT  PCHAR   *Context
+    )
+{
+    PCHAR           Token;
+    PCHAR           End;
+
+    if (Buffer != NULL)
+        *Context = Buffer;
+
+    Token = *Context;
+
+    if (Token == NULL)
+        return NULL;
+
+    while (*Token != L'\0' &&
+           strchr(Delimiter, *Token) != NULL)
+        Token++;
+
+    if (*Token == L'\0')
+        return NULL;
+
+    End = Token + 1;
+    while (*End != L'\0' &&
+           strchr(Delimiter, *End) == NULL)
+        End++;
+
+    if (*End != L'\0')
+        *End++ = L'\0';
+
+    *Context = End;
+
+    return Token;
+}
+
+#endif  // _UTIL_H
diff --git a/src/xenvif/vif.c b/src/xenvif/vif.c
index 2375d82..35af384 100644
--- a/src/xenvif/vif.c
+++ b/src/xenvif/vif.c
@@ -33,7 +33,6 @@
 #include <ntstrsafe.h>
 #include <stdarg.h>
 #include <xen.h>
-#include <util.h>
 
 #include "pdo.h"
 #include "vif.h"
@@ -41,6 +40,7 @@
 #include "thread.h"
 #include "dbg_print.h"
 #include "assert.h"
+#include "util.h"
 
 struct _XENVIF_VIF_CONTEXT {
     PXENVIF_PDO                 Pdo;
-- 
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®.