Exemple #1
0
static FORCEINLINE VOID
__DebugTrigger(
    IN  PXENBUS_DEBUG_CONTEXT   Context,
    IN  BOOLEAN                 Crashing
    )
{
    PLIST_ENTRY                 ListEntry;

    for (ListEntry = Context->List.Flink;
         ListEntry != &Context->List;
         ListEntry = ListEntry->Flink) {
        PXENBUS_DEBUG_CALLBACK  Callback;
        PCHAR                   Name;
        ULONG_PTR               Offset;

        Callback = CONTAINING_RECORD(ListEntry, XENBUS_DEBUG_CALLBACK, ListEntry);

        ModuleLookup((ULONG_PTR)Callback->Function, &Name, &Offset);

        if (Name == NULL) {
            ModuleLookup((ULONG_PTR)Callback->Caller, &Name, &Offset);

            if (Name != NULL) {
                LogQemuPrintf("XEN|DEBUG: SKIPPING %p PREFIX '%s' REGISTERED BY %s + %p\n",
                            Callback->Function,
                            Callback->Prefix,
                            Name,
                            Offset);
            } else {
                LogQemuPrintf("XEN|DEBUG: SKIPPING %p PREFIX '%s' REGISTERED BY %p\n",
                            Callback->Function,
                            Callback->Prefix,
                            Callback->Caller);
            }
        } else {
            LogQemuPrintf("XEN|DEBUG: ====> (%s + %p)\n", Name, Offset);
            Callback->Function(Callback->Argument, Crashing);
            LogQemuPrintf("XEN|DEBUG: <==== (%s + %p)\n", Name, Offset);
        }
    }
}
Exemple #2
0
VOID
DebugTeardown(
    IN OUT  PXENBUS_DEBUG_INTERFACE     Interface
    )
{
    PXENBUS_DEBUG_CONTEXT               Context = Interface->Context;

    Trace("====>\n");

    (VOID) KeDeregisterBugCheckCallback(&Context->BugCheckCallbackRecord);
    RtlZeroMemory(&Context->BugCheckCallbackRecord, sizeof (KBUGCHECK_CALLBACK_RECORD));

    if (!IsListEmpty(&Context->List)) {
        PLIST_ENTRY ListEntry;

        for (ListEntry = Context->List.Flink;
             ListEntry != &Context->List;
             ListEntry = ListEntry->Flink) {
            PXENBUS_DEBUG_CALLBACK  Callback;
            PCHAR                   Name;
            ULONG_PTR               Offset;

            Callback = CONTAINING_RECORD(ListEntry, XENBUS_DEBUG_CALLBACK, ListEntry);

            ModuleLookup((ULONG_PTR)Callback->Caller, &Name, &Offset);

            if (Name != NULL) {
                Error("CALLBACK: %p PREFIX '%s' REGISTERED BY %s + %p\n",
                      Callback->Function,
                      Callback->Prefix,
                      Name,
                      (PVOID)Offset);
            } else {
                Error("CALLBACK: %p PREFIX '%s' REGISTERED BY %p\n",
                      Callback->Function,
                      Callback->Prefix,
                      Callback->Caller);
            }
        }

        BUG("OUTSTANDING CALLBACKS");
    }

    RtlZeroMemory(&Context->Lock, sizeof (KSPIN_LOCK));
    RtlZeroMemory(&Context->List, sizeof (LIST_ENTRY));

    ASSERT(IsZeroMemory(Context, sizeof (XENBUS_DEBUG_CONTEXT)));
    __DebugFree(Context);

    RtlZeroMemory(Interface, sizeof (XENBUS_DEBUG_INTERFACE));

    Trace("<====\n");
}
Exemple #3
0
static VOID
SuspendDebugCallback(
    IN  PVOID               Argument,
    IN  BOOLEAN             Crashing
    )
{
    PXENBUS_SUSPEND_CONTEXT Context = Argument;
    PLIST_ENTRY             ListEntry;

    UNREFERENCED_PARAMETER(Crashing);

    XENBUS_DEBUG(Printf,
                 &Context->DebugInterface,
                 "Count = %u\n",
                 Context->Count);

    for (ListEntry = Context->EarlyList.Flink;
         ListEntry != &Context->EarlyList;
         ListEntry = ListEntry->Flink) {
        PXENBUS_SUSPEND_CALLBACK    Callback;
        PCHAR                       Name;
        ULONG_PTR                   Offset;

        Callback = CONTAINING_RECORD(ListEntry, XENBUS_SUSPEND_CALLBACK, ListEntry);

        ModuleLookup((ULONG_PTR)Callback->Function, &Name, &Offset);

        if (Name == NULL) {
            XENBUS_DEBUG(Printf,
                         &Context->DebugInterface,
                         "EARLY: %p (%p)\n",
                         Callback->Function,
                         Callback->Argument);
        } else {
            XENBUS_DEBUG(Printf,
                         &Context->DebugInterface,
                         "EARLY: %s + %p (%p)\n",
                         Name,
                         (PVOID)Offset,
                         Callback->Argument);
        }
    }

    for (ListEntry = Context->LateList.Flink;
         ListEntry != &Context->LateList;
         ListEntry = ListEntry->Flink) {
        PXENBUS_SUSPEND_CALLBACK    Callback;
        PCHAR                       Name;
        ULONG_PTR                   Offset;

        Callback = CONTAINING_RECORD(ListEntry, XENBUS_SUSPEND_CALLBACK, ListEntry);

        ModuleLookup((ULONG_PTR)Callback->Function, &Name, &Offset);

        if (Name == NULL) {
            XENBUS_DEBUG(Printf,
                         &Context->DebugInterface,
                         "LATE: %p (%p)\n",
                         Callback->Function,
                         Callback->Argument);
        } else {
            XENBUS_DEBUG(Printf,
                         &Context->DebugInterface,
                         "LATE: %s + %p (%p)\n",
                         Name,
                         (PVOID)Offset,
                         Callback->Argument);
        }
    }
}