#pragma warning(pop)
+#define EVTCHN_DESCRIPTOR_MAGIC 'DTVE'
+
struct _XENBUS_EVTCHN_DESCRIPTOR {
+ ULONG Magic;
LIST_ENTRY ListEntry;
PVOID Caller;
PKSERVICE_ROUTINE Callback;
if (Descriptor == NULL)
goto fail1;
+ Descriptor->Magic = EVTCHN_DESCRIPTOR_MAGIC;
+
(VOID) RtlCaptureStackBackTrace(1, 1, &Descriptor->Caller, NULL);
Descriptor->Type = Type;
LocalPort = Descriptor->LocalPort;
+ ASSERT3U(LocalPort, <, sizeof (Context->Descriptor) / sizeof (Context->Descriptor[0]));
+
(VOID) __AcquireInterruptLock(Context->InterruptObject);
ASSERT3P(Context->Descriptor[LocalPort], ==, NULL);
Descriptor->Caller = NULL;
+ Descriptor->Magic = 0;
+
ASSERT(IsZeroMemory(Descriptor, sizeof (XENBUS_EVTCHN_DESCRIPTOR)));
__EvtchnFree(Descriptor);
KIRQL Irql;
BOOLEAN Pending;
+ ASSERT3U(Descriptor->Magic, ==, EVTCHN_DESCRIPTOR_MAGIC);
+
if (!Locked)
Irql = __AcquireInterruptLock(Context->InterruptObject);
UNREFERENCED_PARAMETER(Context);
+ ASSERT3U(Descriptor->Magic, ==, EVTCHN_DESCRIPTOR_MAGIC);
+
// Make sure we don't suspend
KeRaiseIrql(DISPATCH_LEVEL, &Irql);
KIRQL Irql;
BOOLEAN DoneSomething;
+ ASSERT3U(Descriptor->Magic, ==, EVTCHN_DESCRIPTOR_MAGIC);
+
Irql = __AcquireInterruptLock(Context->InterruptObject);
if (Descriptor->Active) {
{
KIRQL Irql;
+ ASSERT3U(Descriptor->Magic, ==, EVTCHN_DESCRIPTOR_MAGIC);
+
Irql = __AcquireInterruptLock(Context->InterruptObject);
RemoveEntryList(&Descriptor->ListEntry);
if (Descriptor->Active) {
ULONG LocalPort = Descriptor->LocalPort;
+ ASSERT3U(LocalPort, <, sizeof (Context->Descriptor) / sizeof (Context->Descriptor[0]));
+
Descriptor->Active = FALSE;
SHARED_INFO(EvtchnMask,
Descriptor->Caller = NULL;
+ Descriptor->Magic = 0;
+
ASSERT(IsZeroMemory(Descriptor, sizeof (XENBUS_EVTCHN_DESCRIPTOR)));
__EvtchnFree(Descriptor);
}
{
UNREFERENCED_PARAMETER(Context);
+ ASSERT3U(Descriptor->Magic, ==, EVTCHN_DESCRIPTOR_MAGIC);
ASSERT(Descriptor->Active);
return Descriptor->LocalPort;
if (Descriptor->Active) {
ULONG LocalPort = Descriptor->LocalPort;
+ ASSERT3U(LocalPort, <, sizeof (Context->Descriptor) / sizeof (Context->Descriptor[0]));
+
Descriptor->Active = FALSE;
ASSERT(Context->Descriptor[LocalPort] != NULL);
// we also reserve 1 entry for the crash kernel
#define GNTTAB_RESERVED_ENTRY_COUNT 9
+#define GNTTAB_DESCRIPTOR_MAGIC 'DTNG'
+
struct _XENBUS_GNTTAB_DESCRIPTOR {
+ ULONG Magic;
ULONG Reference;
grant_entry_v1_t Entry;
};
{
ULONG FrameIndex;
PFN_NUMBER Pfn;
- ULONGLONG Start;
- ULONGLONG End;
+ LONGLONG Start;
+ LONGLONG End;
NTSTATUS status;
FrameIndex = Context->FrameCount;
Start = __max(GNTTAB_RESERVED_ENTRY_COUNT, FrameIndex * GNTTAB_ENTRY_PER_FRAME);
End = (Context->FrameCount * GNTTAB_ENTRY_PER_FRAME) - 1;
- Trace("adding refrences [%08llx - %08llx]\n", Start, End);
+ Info("adding refrences [%08llx - %08llx]\n", Start, End);
RangeSetPut(Context->RangeSet, Start, End);
if (!NT_SUCCESS(status))
goto fail2;
+ Descriptor->Magic = GNTTAB_DESCRIPTOR_MAGIC;
Descriptor->Reference = (ULONG)Reference;
+ ASSERT3U(Descriptor->Reference, >=, GNTTAB_RESERVED_ENTRY_COUNT);
+ ASSERT3U(Descriptor->Reference, <, Context->FrameCount * GNTTAB_ENTRY_PER_FRAME);
+
return STATUS_SUCCESS;
fail2:
PXENBUS_GNTTAB_DESCRIPTOR Descriptor = Object;
NTSTATUS status;
+ ASSERT3U(Descriptor->Magic, ==, GNTTAB_DESCRIPTOR_MAGIC);
+
status = RangeSetPut(Context->RangeSet,
- (ULONGLONG)Descriptor->Reference,
- (ULONGLONG)Descriptor->Reference);
+ (LONGLONG)Descriptor->Reference,
+ (LONGLONG)Descriptor->Reference);
ASSERT(NT_SUCCESS(status));
}
IN PXENBUS_GNTTAB_CONTEXT Context
)
{
- ULONGLONG Entry;
+ LONGLONG Entry;
PoolTeardown(Context->DescriptorPool);
Context->DescriptorPool = NULL;
for (Entry = GNTTAB_RESERVED_ENTRY_COUNT;
- Entry < Context->FrameCount * GNTTAB_ENTRY_PER_FRAME;
+ Entry < (LONGLONG)(Context->FrameCount * GNTTAB_ENTRY_PER_FRAME);
Entry++) {
NTSTATUS status;
if (Descriptor == NULL)
(VOID) InterlockedIncrement(&Context->GetFailed);
+ else
+ ASSERT3U(Descriptor->Magic, ==, GNTTAB_DESCRIPTOR_MAGIC);
return Descriptor;
}
IN PXENBUS_GNTTAB_DESCRIPTOR Descriptor
)
{
+ ASSERT3U(Descriptor->Magic, ==, GNTTAB_DESCRIPTOR_MAGIC);
+
PoolPut(Context->DescriptorPool, Descriptor, FALSE);
}
va_list Arguments;
NTSTATUS status;
+ ASSERT3U(Descriptor->Magic, ==, GNTTAB_DESCRIPTOR_MAGIC);
+ ASSERT3U(Descriptor->Reference, >=, GNTTAB_RESERVED_ENTRY_COUNT);
+ ASSERT3U(Descriptor->Reference, <, Context->FrameCount * GNTTAB_ENTRY_PER_FRAME);
+
va_start(Arguments, Type);
switch (Type) {
case GNTTAB_ENTRY_FULL_PAGE:
ULONG Attempt;
NTSTATUS status;
+ ASSERT3U(Descriptor->Magic, ==, GNTTAB_DESCRIPTOR_MAGIC);
+ ASSERT3U(Descriptor->Reference, >=, GNTTAB_RESERVED_ENTRY_COUNT);
+ ASSERT3U(Descriptor->Reference, <, Context->FrameCount * GNTTAB_ENTRY_PER_FRAME);
+
Entry = &Context->Entry[Descriptor->Reference];
Flags = (volatile SHORT *)&Entry->flags;
{
UNREFERENCED_PARAMETER(Context);
+ ASSERT3U(Descriptor->Magic, ==, GNTTAB_DESCRIPTOR_MAGIC);
+ ASSERT3U(Descriptor->Reference, >=, GNTTAB_RESERVED_ENTRY_COUNT);
+ ASSERT3U(Descriptor->Reference, <, Context->FrameCount * GNTTAB_ENTRY_PER_FRAME);
+
return (ULONG)Descriptor->Reference;
}