ULONG Count;
} XENBUS_VIRQ, *PXENBUS_VIRQ;
+typedef struct _XENBUS_HOLE {
+ PXENBUS_RANGE_SET RangeSet;
+ PVOID VirtualAddress;
+ PHYSICAL_ADDRESS PhysicalAddress;
+} XENBUS_HOLE, *PXENBUS_HOLE;
+
struct _XENBUS_FDO {
PXENBUS_DX Dx;
PDEVICE_OBJECT LowerDeviceObject;
XENBUS_RANGE_SET_INTERFACE RangeSetInterface;
XENBUS_BALLOON_INTERFACE BalloonInterface;
- PUCHAR Buffer;
PMDL Mdl;
- PXENBUS_RANGE_SET RangeSet;
+ XENBUS_HOLE Hole;
LIST_ENTRY InterruptList;
LIST_ENTRY VirqList;
IN PXENBUS_FDO Fdo
)
{
+ PXENBUS_HOLE Hole = &Fdo->Hole;
PMDL Mdl;
PFN_NUMBER Pfn;
- LONGLONG Start;
ULONG Count;
NTSTATUS status;
status = XENBUS_RANGE_SET(Create,
&Fdo->RangeSetInterface,
"hole",
- &Fdo->RangeSet);
+ &Hole->RangeSet);
if (!NT_SUCCESS(status))
goto fail1;
Mdl = Fdo->Mdl;
+ Hole->VirtualAddress = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
Pfn = MmGetMdlPfnArray(Mdl)[0];
+ Hole->PhysicalAddress.QuadPart = (ULONGLONG)Pfn << PAGE_SHIFT;
- Start = Pfn;
Count = BYTES_TO_PAGES(Mdl->ByteCount);
+ ASSERT3U(Count, ==, 1u << PAGE_ORDER_2M);
status = XENBUS_RANGE_SET(Put,
&Fdo->RangeSetInterface,
- Fdo->RangeSet,
- Start,
+ Hole->RangeSet,
+ 0,
Count);
if (!NT_SUCCESS(status))
goto fail2;
if (MemoryDecreaseReservation(PAGE_ORDER_2M, 1, &Pfn) != 1)
goto fail3;
- Trace("%08x - %08x\n", Start, Start + Count - 1);
+ Info("%08x - %08x\n", Pfn, Pfn + Count - 1);
return STATUS_SUCCESS;
XENBUS_RANGE_SET(Get,
&Fdo->RangeSetInterface,
- Fdo->RangeSet,
- Start,
+ Hole->RangeSet,
+ 0,
Count);
fail2:
Error("fail2\n");
+ Hole->PhysicalAddress.QuadPart = 0;
+ Hole->VirtualAddress = NULL;
+
XENBUS_RANGE_SET(Destroy,
&Fdo->RangeSetInterface,
- Fdo->RangeSet);
- Fdo->RangeSet = NULL;
+ Hole->RangeSet);
+ Hole->RangeSet = NULL;
fail1:
Error("fail1 (%08x)\n", status);
OUT PPHYSICAL_ADDRESS PhysicalAddress
)
{
- LONGLONG Start;
+ PXENBUS_HOLE Hole = &Fdo->Hole;
+ LONGLONG Index;
NTSTATUS status;
status = XENBUS_RANGE_SET(Pop,
&Fdo->RangeSetInterface,
- Fdo->RangeSet,
+ Hole->RangeSet,
Count,
- &Start);
+ &Index);
if (!NT_SUCCESS(status))
goto fail1;
- Trace("%08x - %08x\n", Start, Start + Count - 1);
-
- if (VirtualAddress != NULL) {
- PUCHAR StartVa = Fdo->Buffer;
- PMDL Mdl = Fdo->Mdl;
- ULONG Index;
- ULONG ByteOffset;
+ if (VirtualAddress != NULL)
+ *VirtualAddress = (PUCHAR)Hole->VirtualAddress +
+ (Index << PAGE_SHIFT);
- Index = (ULONG)((PFN_NUMBER)Start - MmGetMdlPfnArray(Mdl)[0]);
- ByteOffset = Index * PAGE_SIZE;
- ASSERT3U(ByteOffset, <=, Mdl->ByteCount);
-
- *VirtualAddress = StartVa + ByteOffset;
- }
-
- PhysicalAddress->QuadPart = Start << PAGE_SHIFT;
+ PhysicalAddress->QuadPart = Hole->PhysicalAddress.QuadPart +
+ (Index << PAGE_SHIFT);
return STATUS_SUCCESS;;
IN ULONG Count
)
{
- LONGLONG Start;
+ PXENBUS_HOLE Hole = &Fdo->Hole;
+ LONGLONG Index;
NTSTATUS status;
- ASSERT3U(PhysicalAddress.QuadPart & (PAGE_SIZE - 1), ==, 0);
- Start = PhysicalAddress.QuadPart >> PAGE_SHIFT;
-
- Trace("%08x - %08x\n", Start, Start + Count - 1);
+ Index = PhysicalAddress.QuadPart - Hole->PhysicalAddress.QuadPart;
+ ASSERT3U(Index & (PAGE_SIZE - 1), ==, 0);
+ Index >>= PAGE_SHIFT;
status = XENBUS_RANGE_SET(Put,
&Fdo->RangeSetInterface,
- Fdo->RangeSet,
- Start,
+ Hole->RangeSet,
+ Index,
Count);
ASSERT(NT_SUCCESS(status));
}
IN PXENBUS_FDO Fdo
)
{
+ PXENBUS_HOLE Hole = &Fdo->Hole;
PMDL Mdl;
PFN_NUMBER Pfn;
- LONGLONG Start;
ULONG Count;
ULONG Index;
NTSTATUS status;
Mdl = Fdo->Mdl;
-
Pfn = MmGetMdlPfnArray(Mdl)[0];
-
- Start = Pfn;
Count = BYTES_TO_PAGES(Mdl->ByteCount);
+ ASSERT3U(Count, ==, 1u << PAGE_ORDER_2M);
- Trace("%08x - %08x\n", Start, Start + Count - 1);
-
- ASSERT3U(Count & ((1u << PAGE_ORDER_2M) - 1), ==, 0);
if (MemoryPopulatePhysmap(PAGE_ORDER_2M, 1, &Pfn) == 1)
goto done;
done:
status = XENBUS_RANGE_SET(Get,
&Fdo->RangeSetInterface,
- Fdo->RangeSet,
- Start,
+ Hole->RangeSet,
+ 0,
Count);
ASSERT(NT_SUCCESS(status));
+ Hole->PhysicalAddress.QuadPart = 0;
+ Hole->VirtualAddress = NULL;
+
XENBUS_RANGE_SET(Destroy,
&Fdo->RangeSetInterface,
- Fdo->RangeSet);
- Fdo->RangeSet = NULL;
+ Hole->RangeSet);
+ Hole->RangeSet = NULL;
}
static VOID
IN PXENBUS_FDO Fdo
)
{
+ ULONG Count;
ULONG Size;
PHYSICAL_ADDRESS Low;
PHYSICAL_ADDRESS High;
PMDL Mdl;
NTSTATUS status;
- Size = 2 << 20;
+ Count = 1u << PAGE_ORDER_2M;
+ Size = Count << PAGE_SHIFT;
Low.QuadPart = 0;
High = SystemMaximumPhysicalAddress();
ASSERT3U(Mdl->ByteOffset, ==, 0);
ASSERT3U(Mdl->ByteCount, ==, Size);
- Fdo->Buffer = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
Fdo->Mdl = Mdl;
return STATUS_SUCCESS;
IN PXENBUS_FDO Fdo
)
{
- ExFreePool(Fdo->Mdl);
+ PMDL Mdl;
+ PVOID Buffer;
+
+ Mdl = Fdo->Mdl;
Fdo->Mdl = NULL;
- MmFreeContiguousMemory(Fdo->Buffer);
- Fdo->Buffer = NULL;
+ ExFreePool(Mdl);
+
+ Buffer = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
+ MmFreeContiguousMemory(Buffer);
}
static NTSTATUS