if (Controller->Mdl == NULL)
goto fail7;
- ASSERT(Controller->Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Controller->Mdl->MdlFlags
+ & (MDL_MAPPED_TO_SYSTEM_VA
+ | MDL_SOURCE_IS_NONPAGED_POOL));
Controller->Shared = Controller->Mdl->MappedSystemVa;
ASSERT(Controller->Shared != NULL);
if (Mdl == NULL)
goto fail1;
- ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Mdl->MdlFlags
+ & (MDL_MAPPED_TO_SYSTEM_VA
+ | MDL_SOURCE_IS_NONPAGED_POOL));
Buffer = Mdl->MappedSystemVa;
ASSERT(Buffer != NULL);
if (Mdl == NULL)
goto fail2;
- ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Mdl->MdlFlags
+ & (MDL_MAPPED_TO_SYSTEM_VA
+ | MDL_SOURCE_IS_NONPAGED_POOL));
Buffer = Mdl->MappedSystemVa;
ASSERT(Buffer != NULL);
Packet->Mdl.Size = sizeof (MDL) + sizeof (PFN_NUMBER);
Packet->Mdl.MdlFlags = Mdl->MdlFlags;
- ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Mdl->MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
Packet->Mdl.StartVa = Mdl->StartVa;
Packet->Mdl.MappedSystemVa = Mdl->MappedSystemVa;
PayloadLength = Packet->Length - Info->Length;
- ASSERT(Packet->Mdl.MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Packet->Mdl.MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
BaseVa = Packet->Mdl.MappedSystemVa;
ASSERT(BaseVa != NULL);
if (Info->IpHeader.Length == 0)
return;
- ASSERT(Packet->Mdl.MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Packet->Mdl.MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
BaseVa = Packet->Mdl.MappedSystemVa;
ASSERT(BaseVa != NULL);
PUCHAR SourceVa;
ULONG CopyLength;
- ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Mdl->MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
SourceVa = Mdl->MappedSystemVa;
ASSERT(SourceVa != NULL);
XENVIF_PACKET_PAYLOAD Payload;
ULONG Length;
- ASSERT(Packet->Mdl.MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Packet->Mdl.MdlFlags
+ & (MDL_MAPPED_TO_SYSTEM_VA
+ | MDL_SOURCE_IS_NONPAGED_POOL));
BaseVa = Packet->Mdl.MappedSystemVa;
ASSERT(BaseVa != NULL);
Info = &Packet->Info;
- ASSERT(Packet->Mdl.MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Packet->Mdl.MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
InfoVa = Packet->Mdl.MappedSystemVa;
ASSERT(InfoVa != NULL);
Mdl = &Segment->Mdl;
- ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Mdl->MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
BaseVa = Mdl->MappedSystemVa;
ASSERT(BaseVa != NULL);
Mdl = Mdl->Next;
- ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Mdl->MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
BaseVa = Mdl->MappedSystemVa;
ASSERT(BaseVa != NULL);
Packet->Mdl.Next = NULL;
- ASSERT(Packet->Mdl.MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Packet->Mdl.MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
InfoVa = Packet->Mdl.MappedSystemVa;
ASSERT(InfoVa != NULL);
if (Mdl == NULL)
goto fail2;
- ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Mdl->MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
BaseVa = Mdl->MappedSystemVa;
ASSERT(BaseVa != NULL);
// Override offset to align
Packet->Offset = Receiver->IpAlignOffset;
- ASSERT(Packet->Mdl.MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Packet->Mdl.MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
BaseVa = Packet->Mdl.MappedSystemVa;
ASSERT(BaseVa != NULL);
XENVIF_RECEIVER_PACKET,
ListEntry);
- ASSERT(Packet->Mdl.MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Packet->Mdl.MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
BaseVa = Packet->Mdl.MappedSystemVa;
ASSERT(BaseVa != NULL);
ASSERT3U(rsp->id, ==, id);
- ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Mdl->MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
BaseVa = Mdl->MappedSystemVa;
ASSERT(BaseVa != NULL);
if (Ring->Mdl == NULL)
goto fail3;
- ASSERT(Ring->Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Ring->Mdl->MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
Ring->Shared = Ring->Mdl->MappedSystemVa;
ASSERT(Ring->Shared != NULL);
Length = __min(Payload.Length, PAGE_SIZE);
- ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Mdl->MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
BaseVa = Mdl->MappedSystemVa;
ASSERT(BaseVa != NULL);
Mdl = Buffer->Mdl;
- ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Mdl->MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
BaseVa = Mdl->MappedSystemVa;
ASSERT(BaseVa != NULL);
ASSERT3U(Mdl->ByteCount, <=, PAGE_SIZE - Trailer);
- ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Mdl->MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
BaseVa = Mdl->MappedSystemVa;
ASSERT(BaseVa != NULL);
Mdl = Buffer->Mdl;
- ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Mdl->MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
BaseVa = Mdl->MappedSystemVa;
ASSERT(BaseVa != NULL);
Mdl = Buffer->Mdl;
- ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Mdl->MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
BaseVa = Mdl->MappedSystemVa;
ASSERT(BaseVa != NULL);
if (Ring->Mdl == NULL)
goto fail3;
- ASSERT(Ring->Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+ ASSERT(Ring->Mdl->MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
Ring->Shared = Ring->Mdl->MappedSystemVa;
ASSERT(Ring->Shared != NULL);
return NULL;
}
-#define __AllocatePage() __AllocatePages(1)
+
+static FORCEINLINE PMDL
+__AllocatePage()
+{
+ PHYSICAL_ADDRESS LowAddress;
+ PHYSICAL_ADDRESS HighAddress;
+ PHYSICAL_ADDRESS Align;
+ SIZE_T TotalBytes;
+ PMDL Mdl;
+ PUCHAR MdlMappedSystemVa;
+ NTSTATUS status;
+
+ ASSERT3U(KeGetCurrentIrql(), <=, DISPATCH_LEVEL);
+
+ LowAddress.QuadPart = 0ull;
+ HighAddress.QuadPart = ~0ull;
+ Align.QuadPart = PAGE_SIZE;
+ TotalBytes = (SIZE_T)PAGE_SIZE;
+
+ MdlMappedSystemVa = MmAllocateContiguousMemorySpecifyCache(
+ TotalBytes,
+ LowAddress,
+ HighAddress,
+ Align,
+ MmCached);
+
+ status = STATUS_NO_MEMORY;
+ if (MdlMappedSystemVa == NULL)
+ goto fail1;
+
+ Mdl = IoAllocateMdl(MdlMappedSystemVa,
+ (ULONG)TotalBytes,
+ FALSE,
+ FALSE,
+ NULL);
+ if (Mdl == NULL)
+ goto fail2;
+
+ MmBuildMdlForNonPagedPool(Mdl);
+
+ ASSERT3U(Mdl->ByteOffset, ==, 0);
+ ASSERT3P(Mdl->StartVa, ==, MdlMappedSystemVa);
+ ASSERT3P(Mdl->MappedSystemVa, ==, MdlMappedSystemVa);
+
+ RtlZeroMemory(MdlMappedSystemVa, Mdl->ByteCount);
+
+ return Mdl;
+
+fail2:
+ Error("fail2\n");
+
+ MmFreeContiguousMemory(MdlMappedSystemVa);
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return NULL;
+}
static FORCEINLINE VOID
__FreePages(
ExFreePool(Mdl);
}
-#define __FreePage(_Mdl) __FreePages(_Mdl)
+static FORCEINLINE VOID
+__FreePage(
+ IN PMDL Mdl
+ )
+{
+ PUCHAR MdlMappedSystemVa;
+
+ ASSERT(Mdl->MdlFlags &
+ (MDL_MAPPED_TO_SYSTEM_VA |
+ MDL_SOURCE_IS_NONPAGED_POOL));
+
+ MdlMappedSystemVa = Mdl->MappedSystemVa;
+
+ IoFreeMdl(Mdl);
+
+ MmFreeContiguousMemory(MdlMappedSystemVa);
+}
static FORCEINLINE PCHAR
__strtok_r(