Пример #1
0
static VOID
GnttabDestroyCache(
    IN  PINTERFACE              Interface,
    IN  PXENBUS_GNTTAB_CACHE    Cache
    )
{
    PXENBUS_GNTTAB_CONTEXT      Context = Interface->Context;
    KIRQL                       Irql;

    KeAcquireSpinLock(&Context->Lock, &Irql);
    RemoveEntryList(&Cache->ListEntry);
    KeReleaseSpinLock(&Context->Lock, Irql);

    RtlZeroMemory(&Cache->ListEntry, sizeof (LIST_ENTRY));

    XENBUS_CACHE(Destroy,
                 &Context->CacheInterface,
                 Cache->Cache);
    Cache->Cache = NULL;

    Cache->Argument = NULL;
    Cache->ReleaseLock = NULL;
    Cache->AcquireLock = NULL;

    RtlZeroMemory(Cache->Name, sizeof (Cache->Name));
    
    Cache->Context = NULL;

    ASSERT(IsZeroMemory(Cache, sizeof (XENBUS_GNTTAB_CACHE)));
    __GnttabFree(Cache);
}
Пример #2
0
VOID
GnttabTeardown(
    IN  PXENBUS_GNTTAB_CONTEXT  Context
    )
{
    Trace("====>\n");

    Context->Fdo = NULL;

    HashTableDestroy(Context->MapTable);
    Context->MapTable = NULL;

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

    RtlZeroMemory(&Context->DebugInterface,
                  sizeof (XENBUS_DEBUG_INTERFACE));

    RtlZeroMemory(&Context->SuspendInterface,
                  sizeof (XENBUS_SUSPEND_INTERFACE));

    RtlZeroMemory(&Context->CacheInterface,
                  sizeof (XENBUS_CACHE_INTERFACE));

    RtlZeroMemory(&Context->RangeSetInterface,
                  sizeof (XENBUS_RANGE_SET_INTERFACE));

    ASSERT(IsZeroMemory(Context, sizeof (XENBUS_GNTTAB_CONTEXT)));
    __GnttabFree(Context);

    Trace("<====\n");
}
Пример #3
0
static NTSTATUS
GnttabUnmapForeignPages(
    IN  PINTERFACE              Interface,
    IN  PHYSICAL_ADDRESS        Address
    )
{
    PXENBUS_GNTTAB_CONTEXT      Context = Interface->Context;
    ULONG                       PageIndex;
    PHYSICAL_ADDRESS            PageAddress;
    PXENBUS_GNTTAB_MAP_ENTRY    MapEntry;
    NTSTATUS                    status;

    status = HashTableLookup(Context->MapTable,
                             (ULONG_PTR)Address.QuadPart,
                             (PULONG_PTR)&MapEntry);
    if (!NT_SUCCESS(status))
        goto fail1;

    status = HashTableRemove(Context->MapTable,
                             (ULONG_PTR)Address.QuadPart);
    if (!NT_SUCCESS(status))
        goto fail2;

    PageAddress.QuadPart = Address.QuadPart;

    for (PageIndex = 0; PageIndex < MapEntry->NumberPages; PageIndex++) {
        status = GrantTableUnmapForeignPage(MapEntry->MapHandles[PageIndex],
                                            PageAddress);
        BUG_ON(!NT_SUCCESS(status));

        PageAddress.QuadPart += PAGE_SIZE;
    }

    FdoFreeIoSpace(Context->Fdo,
                   Address,
                   MapEntry->NumberPages * PAGE_SIZE);

    __GnttabFree(MapEntry);

    return STATUS_SUCCESS;

fail2:
    Error("fail2\n");

fail1:
    Error("fail1: (%08x)\n", status);

    return status;
}
Пример #4
0
static VOID
GnttabDestroyCache(
    IN  PXENBUS_GNTTAB_CONTEXT  Context,
    IN  PXENBUS_GNTTAB_CACHE    Cache
)
{
    CACHE(Destroy,
          Context->CacheInterface,
          Cache->Cache);
    Cache->Cache = NULL;

    Cache->Argument = NULL;
    Cache->ReleaseLock = NULL;
    Cache->AcquireLock = NULL;

    RtlZeroMemory(Cache->Name, sizeof (Cache->Name));

    Cache->Context = NULL;

    ASSERT(IsZeroMemory(Cache, sizeof (XENBUS_GNTTAB_CACHE)));
    __GnttabFree(Cache);
}
Пример #5
0
static NTSTATUS
GnttabMapForeignPages(
    IN  PINTERFACE              Interface,
    IN  USHORT                  Domain,
    IN  ULONG                   NumberPages,
    IN  PULONG                  References,
    IN  BOOLEAN                 ReadOnly,
    OUT PHYSICAL_ADDRESS        *Address
    )
{
    PXENBUS_GNTTAB_CONTEXT      Context = Interface->Context;
    LONG                        PageIndex;
    PHYSICAL_ADDRESS            PageAddress;
    PXENBUS_GNTTAB_MAP_ENTRY    MapEntry;
    NTSTATUS                    status;

    status = FdoAllocateIoSpace(Context->Fdo,
                                NumberPages * PAGE_SIZE,
                                Address);
    if (!NT_SUCCESS(status))
        goto fail1;

    MapEntry = __GnttabAllocate(FIELD_OFFSET(XENBUS_GNTTAB_MAP_ENTRY,
                                             MapHandles) +
                                (NumberPages * sizeof (ULONG)));

    status = STATUS_NO_MEMORY;
    if (MapEntry == NULL)
        goto fail2;

    PageAddress.QuadPart = Address->QuadPart;
    MapEntry->NumberPages = NumberPages;

    for (PageIndex = 0; PageIndex < (LONG)NumberPages; PageIndex++) {
        status = GrantTableMapForeignPage(Domain,
                                          References[PageIndex],
                                          PageAddress,
                                          ReadOnly,
                                          &MapEntry->MapHandles[PageIndex]);
        if (!NT_SUCCESS(status))
            goto fail3;

        PageAddress.QuadPart += PAGE_SIZE;
    }

    status = HashTableAdd(Context->MapTable,
                          (ULONG_PTR)Address->QuadPart,
                          (ULONG_PTR)MapEntry);
    if (!NT_SUCCESS(status))
        goto fail4;

    return STATUS_SUCCESS;

fail4:
    Error("fail4\n");

fail3:
    Error("fail3\n");

    while (--PageIndex >= 0) {
        PageAddress.QuadPart -= PAGE_SIZE;
        (VOID) GrantTableUnmapForeignPage(MapEntry->MapHandles[PageIndex],
                                          PageAddress);
    }

    __GnttabFree(MapEntry);

fail2:
    Error("fail2\n");

    FdoFreeIoSpace(Context->Fdo, *Address, NumberPages * PAGE_SIZE);

fail1:
    Error("fail1: (%08x)\n", status);

    return status;
}
Пример #6
0
static NTSTATUS
GnttabCreateCache(
    IN  PINTERFACE              Interface,
    IN  const CHAR              *Name,
    IN  ULONG                   Reservation,
    IN  VOID                    (*AcquireLock)(PVOID),
    IN  VOID                    (*ReleaseLock)(PVOID),
    IN  PVOID                   Argument,
    OUT PXENBUS_GNTTAB_CACHE    *Cache
    )
{
    PXENBUS_GNTTAB_CONTEXT      Context = Interface->Context;
    KIRQL                       Irql;
    NTSTATUS                    status;

    *Cache = __GnttabAllocate(sizeof (XENBUS_GNTTAB_CACHE));

    status = STATUS_NO_MEMORY;
    if (*Cache == NULL)
        goto fail1;

    (*Cache)->Context = Context;

    status = RtlStringCbPrintfA((*Cache)->Name,
                                sizeof ((*Cache)->Name),
                                "%s_gnttab",
                                Name);
    if (!NT_SUCCESS(status))
        goto fail2;

    (*Cache)->AcquireLock = AcquireLock;
    (*Cache)->ReleaseLock = ReleaseLock;
    (*Cache)->Argument = Argument;

    status = XENBUS_CACHE(Create,
                          &Context->CacheInterface,
                          (*Cache)->Name,
                          sizeof (XENBUS_GNTTAB_ENTRY),
                          Reservation,
                          GnttabEntryCtor,
                          GnttabEntryDtor,
                          GnttabAcquireLock,
                          GnttabReleaseLock,
                          *Cache,
                          &(*Cache)->Cache);
    if (!NT_SUCCESS(status))
        goto fail3;

    KeAcquireSpinLock(&Context->Lock, &Irql);
    InsertTailList(&Context->List, &(*Cache)->ListEntry);
    KeReleaseSpinLock(&Context->Lock, Irql);

    return STATUS_SUCCESS;

fail3:
    Error("fail3\n");

    (*Cache)->Argument = NULL;
    (*Cache)->ReleaseLock = NULL;
    (*Cache)->AcquireLock = NULL;

    RtlZeroMemory((*Cache)->Name, sizeof ((*Cache)->Name));
    
fail2:
    Error("fail2\n");

    (*Cache)->Context = NULL;

    ASSERT(IsZeroMemory(*Cache, sizeof (XENBUS_GNTTAB_CACHE)));
    __GnttabFree(*Cache);

fail1:
    Error("fail1 (%08x)\n", status);

    return status;
}
Пример #7
0
static NTSTATUS
GnttabCreateCache(
    IN  PXENBUS_GNTTAB_CONTEXT  Context,
    IN  const CHAR              *Name,
    IN  ULONG                   Reservation,
    IN  VOID                    (*AcquireLock)(PVOID),
    IN  VOID                    (*ReleaseLock)(PVOID),
    IN  PVOID                   Argument,
    OUT PXENBUS_GNTTAB_CACHE    *Cache
)
{
    NTSTATUS                    status;

    *Cache = __GnttabAllocate(sizeof (XENBUS_GNTTAB_CACHE));

    status = STATUS_NO_MEMORY;
    if (*Cache == NULL)
        goto fail1;

    (*Cache)->Context = Context;

    status = RtlStringCbPrintfA((*Cache)->Name,
                                sizeof ((*Cache)->Name),
                                "%s_gnttab",
                                Name);
    if (!NT_SUCCESS(status))
        goto fail2;

    (*Cache)->AcquireLock = AcquireLock;
    (*Cache)->ReleaseLock = ReleaseLock;
    (*Cache)->Argument = Argument;

    status = CACHE(Create,
                   Context->CacheInterface,
                   (*Cache)->Name,
                   sizeof (XENBUS_GNTTAB_DESCRIPTOR),
                   Reservation,
                   GnttabDescriptorCtor,
                   GnttabDescriptorDtor,
                   GnttabAcquireLock,
                   GnttabReleaseLock,
                   *Cache,
                   &(*Cache)->Cache);
    if (!NT_SUCCESS(status))
        goto fail3;

    return STATUS_SUCCESS;

fail3:
    Error("fail3\n");

    (*Cache)->Argument = NULL;
    (*Cache)->ReleaseLock = NULL;
    (*Cache)->AcquireLock = NULL;

    RtlZeroMemory((*Cache)->Name, sizeof ((*Cache)->Name));

fail2:
    Error("fail2\n");

    (*Cache)->Context = NULL;

    ASSERT(IsZeroMemory(*Cache, sizeof (XENBUS_GNTTAB_CACHE)));
    __GnttabFree(*Cache);

fail1:
    Error("fail1 (%08x)\n", status);

    return status;
}