From ced33a87819db5239b58641ed27e30d1770861a8 Mon Sep 17 00:00:00 2001 From: Paul Durrant Date: Fri, 11 Apr 2014 15:00:28 +0100 Subject: [PATCH] Introduce granter abstraction Signed-off-by: Paul Durrant --- proj/xenvif/xenvif.vcxproj | 1 + src/xenvif/frontend.c | 121 +++++++++++++------ src/xenvif/frontend.h | 7 ++ src/xenvif/granter.c | 242 +++++++++++++++++++++++++++++++++++++ src/xenvif/granter.h | 104 ++++++++++++++++ src/xenvif/transmitter.c | 162 +++++++++---------------- 6 files changed, 499 insertions(+), 138 deletions(-) create mode 100644 src/xenvif/granter.c create mode 100644 src/xenvif/granter.h diff --git a/proj/xenvif/xenvif.vcxproj b/proj/xenvif/xenvif.vcxproj index 9b06e12..ac799c7 100644 --- a/proj/xenvif/xenvif.vcxproj +++ b/proj/xenvif/xenvif.vcxproj @@ -85,6 +85,7 @@ + diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c index 33c8f69..d8767f2 100644 --- a/src/xenvif/frontend.c +++ b/src/xenvif/frontend.c @@ -46,6 +46,7 @@ #include "thread.h" #include "frontend.h" #include "names.h" +#include "granter.h" #include "notifier.h" #include "mac.h" #include "tcpip.h" @@ -67,6 +68,7 @@ struct _XENVIF_FRONTEND { PXENBUS_STORE_WATCH Watch; PCHAR BackendPath; USHORT BackendDomain; + PXENVIF_GRANTER Granter; PXENVIF_NOTIFIER Notifier; PXENVIF_MAC Mac; PXENVIF_RECEIVER Receiver; @@ -292,6 +294,22 @@ FrontendGetBackendDomain( return __FrontendGetBackendDomain(Frontend); } +static FORCEINLINE PXENVIF_GRANTER +__FrontendGetGranter( + IN PXENVIF_FRONTEND Frontend + ) +{ + return Frontend->Granter; +} + +PXENVIF_GRANTER +FrontendGetGranter( + IN PXENVIF_FRONTEND Frontend + ) +{ + return __FrontendGetGranter(Frontend); +} + static FORCEINLINE PXENVIF_NOTIFIER __FrontendGetNotifier( IN PXENVIF_FRONTEND Frontend @@ -1043,22 +1061,26 @@ __FrontendConnect( if (!NT_SUCCESS(status)) goto fail1; - status = MacConnect(__FrontendGetMac(Frontend)); + status = GranterConnect(__FrontendGetGranter(Frontend)); if (!NT_SUCCESS(status)) goto fail2; - status = ReceiverConnect(__FrontendGetReceiver(Frontend)); + status = MacConnect(__FrontendGetMac(Frontend)); if (!NT_SUCCESS(status)) goto fail3; - status = TransmitterConnect(__FrontendGetTransmitter(Frontend)); + status = ReceiverConnect(__FrontendGetReceiver(Frontend)); if (!NT_SUCCESS(status)) goto fail4; - status = NotifierConnect(__FrontendGetNotifier(Frontend)); + status = TransmitterConnect(__FrontendGetTransmitter(Frontend)); if (!NT_SUCCESS(status)) goto fail5; + status = NotifierConnect(__FrontendGetNotifier(Frontend)); + if (!NT_SUCCESS(status)) + goto fail6; + Attempt = 0; do { PXENBUS_STORE_TRANSACTION Transaction; @@ -1102,7 +1124,7 @@ abort: } while (status == STATUS_RETRY); if (!NT_SUCCESS(status)) - goto fail6; + goto fail7; status = STORE(Printf, Frontend->StoreInterface, @@ -1112,20 +1134,23 @@ abort: "%u", XenbusStateConnected); if (!NT_SUCCESS(status)) - goto fail7; + goto fail8; State = XenbusStateInitWait; status = __FrontendWaitForStateChange(Frontend, Path, &State); if (!NT_SUCCESS(status)) - goto fail8; + goto fail9; status = STATUS_UNSUCCESSFUL; if (State != XenbusStateConnected) - goto fail9; + goto fail10; Trace("<====\n"); return STATUS_SUCCESS; +fail10: + Error("fail10\n"); + fail9: Error("fail9\n"); @@ -1135,25 +1160,27 @@ fail8: fail7: Error("fail7\n"); + NotifierDisconnect(__FrontendGetNotifier(Frontend)); + fail6: - Error("fail7\n"); + Error("fail6\n"); - NotifierDisconnect(__FrontendGetNotifier(Frontend)); + TransmitterDisconnect(__FrontendGetTransmitter(Frontend)); fail5: Error("fail5\n"); - TransmitterDisconnect(__FrontendGetTransmitter(Frontend)); + ReceiverDisconnect(__FrontendGetReceiver(Frontend)); fail4: Error("fail4\n"); - ReceiverDisconnect(__FrontendGetReceiver(Frontend)); + MacDisconnect(__FrontendGetMac(Frontend)); fail3: Error("fail3\n"); - MacDisconnect(__FrontendGetMac(Frontend)); + GranterDisconnect(__FrontendGetGranter(Frontend)); fail2: Error("fail2\n"); @@ -1184,6 +1211,7 @@ __FrontendDisconnect( TransmitterDisconnect(__FrontendGetTransmitter(Frontend)); ReceiverDisconnect(__FrontendGetReceiver(Frontend)); MacDisconnect(__FrontendGetMac(Frontend)); + GranterDisconnect(__FrontendGetGranter(Frontend)); DEBUG(Deregister, Frontend->DebugInterface, @@ -1205,39 +1233,48 @@ __FrontendEnable( Trace("====>\n"); - status = MacEnable(__FrontendGetMac(Frontend)); + status = GranterEnable(__FrontendGetGranter(Frontend)); if (!NT_SUCCESS(status)) goto fail1; - status = ReceiverEnable(__FrontendGetReceiver(Frontend)); + status = MacEnable(__FrontendGetMac(Frontend)); if (!NT_SUCCESS(status)) goto fail2; - status = TransmitterEnable(__FrontendGetTransmitter(Frontend)); + status = ReceiverEnable(__FrontendGetReceiver(Frontend)); if (!NT_SUCCESS(status)) goto fail3; - status = NotifierEnable(__FrontendGetNotifier(Frontend)); + status = TransmitterEnable(__FrontendGetTransmitter(Frontend)); if (!NT_SUCCESS(status)) goto fail4; + status = NotifierEnable(__FrontendGetNotifier(Frontend)); + if (!NT_SUCCESS(status)) + goto fail5; + Trace("<====\n"); return STATUS_SUCCESS; +fail5: + Error("fail5\n"); + + TransmitterDisable(__FrontendGetTransmitter(Frontend)); + fail4: Error("fail4\n"); - TransmitterDisable(__FrontendGetTransmitter(Frontend)); + ReceiverDisable(__FrontendGetReceiver(Frontend)); fail3: Error("fail3\n"); - ReceiverDisable(__FrontendGetReceiver(Frontend)); + MacDisable(__FrontendGetMac(Frontend)); fail2: Error("fail2\n"); - MacDisable(__FrontendGetMac(Frontend)); + GranterDisable(__FrontendGetGranter(Frontend)); fail1: Error("fail1 (%08x)\n", status); @@ -1256,6 +1293,7 @@ __FrontendDisable( TransmitterDisable(__FrontendGetTransmitter(Frontend)); ReceiverDisable(__FrontendGetReceiver(Frontend)); MacDisable(__FrontendGetMac(Frontend)); + GranterDisable(__FrontendGetGranter(Frontend)); Trace("<====\n"); } @@ -1611,7 +1649,7 @@ FrontendInitialize( if (!NT_SUCCESS(status)) goto fail6; - status = MacInitialize(*Frontend, &(*Frontend)->Mac); + status = GranterInitialize(*Frontend, &(*Frontend)->Granter); if (!NT_SUCCESS(status)) goto fail7; @@ -1619,18 +1657,22 @@ FrontendInitialize( if (!NT_SUCCESS(status)) goto fail8; - status = ReceiverInitialize(*Frontend, 1, &(*Frontend)->Receiver); + status = MacInitialize(*Frontend, &(*Frontend)->Mac); if (!NT_SUCCESS(status)) goto fail9; - status = TransmitterInitialize(*Frontend, 1, &(*Frontend)->Transmitter); + status = ReceiverInitialize(*Frontend, 1, &(*Frontend)->Receiver); if (!NT_SUCCESS(status)) goto fail10; - status = ThreadCreate(FrontendMib, *Frontend, &(*Frontend)->MibThread); + status = TransmitterInitialize(*Frontend, 1, &(*Frontend)->Transmitter); if (!NT_SUCCESS(status)) goto fail11; + status = ThreadCreate(FrontendMib, *Frontend, &(*Frontend)->MibThread); + if (!NT_SUCCESS(status)) + goto fail12; + (*Frontend)->Magic = FRONTEND_MAGIC; _ReadWriteBarrier(); @@ -1641,7 +1683,7 @@ FrontendInitialize( &(*Frontend)->Handle); if (!NT_SUCCESS(status)) { if (status != STATUS_NOT_SUPPORTED) - goto fail12; + goto fail13; // If IP Helper isn't available (as in Windows PE) then // NotifyUnicastIpAddressChange will not be supported @@ -1658,8 +1700,8 @@ FrontendInitialize( return STATUS_SUCCESS; -fail12: - Error("fail12\n"); +fail13: + Error("fail13\n"); (*Frontend)->Magic = 0; @@ -1667,18 +1709,24 @@ fail12: ThreadJoin((*Frontend)->MibThread); (*Frontend)->MibThread = NULL; -fail11: - Error("fail11\n"); +fail12: + Error("fail12\n"); TransmitterTeardown(__FrontendGetTransmitter(*Frontend)); (*Frontend)->Transmitter = NULL; -fail10: - Error("fail10\n"); +fail11: + Error("fail11\n"); ReceiverTeardown(__FrontendGetReceiver(*Frontend)); (*Frontend)->Receiver = NULL; +fail10: + Error("fail10\n"); + + MacTeardown(__FrontendGetMac(*Frontend)); + (*Frontend)->Mac = NULL; + fail9: Error("fail9\n"); @@ -1688,8 +1736,8 @@ fail9: fail8: Error("fail8\n"); - MacTeardown(__FrontendGetMac(*Frontend)); - (*Frontend)->Mac = NULL; + GranterTeardown(__FrontendGetGranter(*Frontend)); + (*Frontend)->Granter = NULL; fail7: Error("fail7\n"); @@ -1792,11 +1840,14 @@ FrontendTeardown( ReceiverTeardown(__FrontendGetReceiver(Frontend)); Frontend->Receiver = NULL; + MacTeardown(__FrontendGetMac(Frontend)); + Frontend->Mac = NULL; + NotifierTeardown(__FrontendGetNotifier(Frontend)); Frontend->Notifier = NULL; - MacTeardown(__FrontendGetMac(Frontend)); - Frontend->Mac = NULL; + GranterTeardown(__FrontendGetGranter(Frontend)); + Frontend->Granter = NULL; ThreadAlert(Frontend->EjectThread); ThreadJoin(Frontend->EjectThread); diff --git a/src/xenvif/frontend.h b/src/xenvif/frontend.h index 22747de..e79ce52 100644 --- a/src/xenvif/frontend.h +++ b/src/xenvif/frontend.h @@ -114,6 +114,13 @@ FrontendGetBackendDomain( IN PXENVIF_FRONTEND Frontend ); +#include "granter.h" + +extern PXENVIF_GRANTER +FrontendGetGranter( + IN PXENVIF_FRONTEND Frontend + ); + #include "notifier.h" extern PXENVIF_NOTIFIER diff --git a/src/xenvif/granter.c b/src/xenvif/granter.c new file mode 100644 index 0000000..4d819ff --- /dev/null +++ b/src/xenvif/granter.c @@ -0,0 +1,242 @@ +/* Copyright (c) Citrix Systems Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, + * with or without modification, are permitted provided + * that the following conditions are met: + * + * * Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include + +#include "pdo.h" +#include "frontend.h" +#include "granter.h" +#include "dbg_print.h" +#include "assert.h" + +struct _XENVIF_GRANTER { + PXENVIF_FRONTEND Frontend; + + PXENBUS_GNTTAB_INTERFACE GnttabInterface; +}; + +#define GRANTER_POOL 'NARG' + +static FORCEINLINE PVOID +__GranterAllocate( + IN ULONG Length + ) +{ + return __AllocateNonPagedPoolWithTag(Length, GRANTER_POOL); +} + +static FORCEINLINE VOID +__GranterFree( + IN PVOID Buffer + ) +{ + __FreePoolWithTag(Buffer, GRANTER_POOL); +} + +NTSTATUS +GranterInitialize( + IN PXENVIF_FRONTEND Frontend, + OUT PXENVIF_GRANTER *Granter + ) +{ + NTSTATUS status; + + *Granter = __GranterAllocate(sizeof (XENVIF_GRANTER)); + + status = STATUS_NO_MEMORY; + if (*Granter == NULL) + goto fail1; + + (*Granter)->Frontend = Frontend; + + return STATUS_SUCCESS; + +fail1: + Error("fail1 (%08x)\n", status); + + return status; +} + +NTSTATUS +GranterConnect( + IN PXENVIF_GRANTER Granter + ) +{ + PXENVIF_FRONTEND Frontend; + + Frontend = Granter->Frontend; + + Granter->GnttabInterface = FrontendGetGnttabInterface(Frontend); + + GNTTAB(Acquire, Granter->GnttabInterface); + + return STATUS_SUCCESS; +} + +NTSTATUS +GranterEnable( + IN PXENVIF_GRANTER Granter + ) +{ + UNREFERENCED_PARAMETER(Granter); + + return STATUS_SUCCESS; +} + +NTSTATUS +GranterGet( + IN PXENVIF_GRANTER Granter, + OUT PXENVIF_GRANTER_HANDLE Handle + ) +{ + ULONG Reference; + NTSTATUS status; + + status = GNTTAB(Get, + Granter->GnttabInterface, + &Reference); + if (!NT_SUCCESS(status)) + goto fail1; + + *Handle = (XENVIF_GRANTER_HANDLE)(ULONG_PTR)Reference; + return STATUS_SUCCESS; + +fail1: + Error("fail1 (%08x)\n", status); + + return status; +} + +NTSTATUS +GranterPermitAccess( + IN PXENVIF_GRANTER Granter, + IN XENVIF_GRANTER_HANDLE Handle, + IN PFN_NUMBER Pfn, + IN BOOLEAN ReadOnly + ) +{ + PXENVIF_FRONTEND Frontend; + ULONG_PTR Reference; + NTSTATUS status; + + Frontend = Granter->Frontend; + + Reference = (ULONG_PTR)Handle; + + status = GNTTAB(PermitForeignAccess, + Granter->GnttabInterface, + (ULONG)Reference, + FrontendGetBackendDomain(Frontend), + GNTTAB_ENTRY_FULL_PAGE, + Pfn, + ReadOnly); + if (!NT_SUCCESS(status)) + goto fail1; + + return STATUS_SUCCESS; + +fail1: + Error("fail1 (%08x)\n", status); + + return status; +} + +VOID +GranterRevokeAccess( + IN PXENVIF_GRANTER Granter, + IN XENVIF_GRANTER_HANDLE Handle + ) +{ + ULONG_PTR Reference; + + Reference = (ULONG_PTR)Handle; + + (VOID) GNTTAB(RevokeForeignAccess, + Granter->GnttabInterface, + (ULONG)Reference); +} + +VOID +GranterPut( + IN PXENVIF_GRANTER Granter, + IN XENVIF_GRANTER_HANDLE Handle + ) +{ + ULONG_PTR Reference; + + Reference = (ULONG_PTR)Handle; + + GNTTAB(Put, + Granter->GnttabInterface, + (ULONG)Reference); +} + +ULONG +GranterGetReference( + IN XENVIF_GRANTER_HANDLE Handle + ) +{ + return (ULONG)(ULONG_PTR)Handle; +} + +VOID +GranterDisable( + IN PXENVIF_GRANTER Granter + ) +{ + UNREFERENCED_PARAMETER(Granter); +} + +VOID +GranterDisconnect( + IN PXENVIF_GRANTER Granter + ) +{ + GNTTAB(Release, Granter->GnttabInterface); + Granter->GnttabInterface = NULL; +} + +VOID +GranterTeardown( + IN PXENVIF_GRANTER Granter + ) +{ + Granter->Frontend = NULL; + + ASSERT(IsZeroMemory(Granter, sizeof (XENVIF_GRANTER))); + + __GranterFree(Granter); +} diff --git a/src/xenvif/granter.h b/src/xenvif/granter.h new file mode 100644 index 0000000..d32303f --- /dev/null +++ b/src/xenvif/granter.h @@ -0,0 +1,104 @@ +/* Copyright (c) Citrix Systems Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, + * with or without modification, are permitted provided + * that the following conditions are met: + * + * * Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _XENVIF_GRANTER_H +#define _XENVIF_GRANTER_H + +#include +#include + +typedef struct _XENVIF_GRANTER XENVIF_GRANTER, *PXENVIF_GRANTER; + +typedef PVOID XENVIF_GRANTER_HANDLE, *PXENVIF_GRANTER_HANDLE; + +NTSTATUS +GranterInitialize( + IN PXENVIF_FRONTEND Frontend, + OUT PXENVIF_GRANTER *Granter + ); + +NTSTATUS +GranterConnect( + IN PXENVIF_GRANTER Granter + ); + +NTSTATUS +GranterEnable( + IN PXENVIF_GRANTER Granter + ); + +NTSTATUS +GranterGet( + IN PXENVIF_GRANTER Granter, + OUT PXENVIF_GRANTER_HANDLE Handle + ); + +NTSTATUS +GranterPermitAccess( + IN PXENVIF_GRANTER Granter, + IN XENVIF_GRANTER_HANDLE Handle, + IN PFN_NUMBER Pfn, + IN BOOLEAN ReadOnly + ); + +VOID +GranterRevokeAccess( + IN PXENVIF_GRANTER Granter, + IN XENVIF_GRANTER_HANDLE Handle + ); + +VOID +GranterPut( + IN PXENVIF_GRANTER Granter, + IN XENVIF_GRANTER_HANDLE Handle + ); + +ULONG +GranterGetReference( + IN XENVIF_GRANTER_HANDLE Handle + ); + +VOID +GranterDisable( + IN PXENVIF_GRANTER Granter + ); + +VOID +GranterDisconnect( + IN PXENVIF_GRANTER Granter + ); + +VOID +GranterTeardown( + IN PXENVIF_GRANTER Granter + ); + +#endif // _XENVIF_GRANTER_H diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c index 3571031..1900732 100644 --- a/src/xenvif/transmitter.c +++ b/src/xenvif/transmitter.c @@ -47,6 +47,7 @@ #include "checksum.h" #include "parse.h" #include "transmitter.h" +#include "granter.h" #include "mac.h" #include "vif.h" #include "thread.h" @@ -77,7 +78,7 @@ typedef struct _TRANSMITTER_TAG { ULONG Next; TRANSMITTER_TAG_TYPE Type; PVOID Context; - ULONG Reference; + XENVIF_GRANTER_HANDLE Handle; ULONG Offset; ULONG Length; } TRANSMITTER_TAG, *PTRANSMITTER_TAG; @@ -122,7 +123,7 @@ typedef struct _TRANSMITTER_RING { PMDL Mdl; netif_tx_front_ring_t Front; netif_tx_sring_t *Shared; - ULONG Reference; + XENVIF_GRANTER_HANDLE Handle; BOOLEAN Connected; BOOLEAN Enabled; BOOLEAN Stopped; @@ -165,7 +166,6 @@ struct _XENVIF_TRANSMITTER { PXENBUS_DEBUG_INTERFACE DebugInterface; PXENBUS_STORE_INTERFACE StoreInterface; - PXENBUS_GNTTAB_INTERFACE GnttabInterface; PXENVIF_VIF_INTERFACE VifInterface; PXENBUS_DEBUG_CALLBACK DebugCallback; @@ -769,13 +769,10 @@ __RingCopyPayload( Pfn = MmGetMdlPfnArray(Mdl)[0]; - status = GNTTAB(PermitForeignAccess, - Transmitter->GnttabInterface, - Tag->Reference, - FrontendGetBackendDomain(Frontend), - GNTTAB_ENTRY_FULL_PAGE, - Pfn, - TRUE); + status = GranterPermitAccess(FrontendGetGranter(Frontend), + Tag->Handle, + Pfn, + TRUE); ASSERT(NT_SUCCESS(status)); Tag->Offset = 0; @@ -810,9 +807,8 @@ fail1: Tag->Length = 0; Tag->Offset = 0; - (VOID) GNTTAB(RevokeForeignAccess, - Transmitter->GnttabInterface, - Tag->Reference); + GranterRevokeAccess(FrontendGetGranter(Frontend), + Tag->Handle); ASSERT3U(Tag->Type, ==, TAG_BUFFER); Buffer = Tag->Context; @@ -889,13 +885,10 @@ __RingGrantPayload( PageOffset = MdlOffset & (PAGE_SIZE - 1); PageLength = __min(MdlLength, PAGE_SIZE - PageOffset); - status = GNTTAB(PermitForeignAccess, - Transmitter->GnttabInterface, - Tag->Reference, - FrontendGetBackendDomain(Frontend), - GNTTAB_ENTRY_FULL_PAGE, - Pfn, - TRUE); + status = GranterPermitAccess(FrontendGetGranter(Frontend), + Tag->Handle, + Pfn, + TRUE); ASSERT(NT_SUCCESS(status)); Tag->Offset = PageOffset; @@ -947,9 +940,8 @@ fail1: Tag->Length = 0; Tag->Offset = 0; - (VOID) GNTTAB(RevokeForeignAccess, - Transmitter->GnttabInterface, - Tag->Reference); + GranterRevokeAccess(FrontendGetGranter(Frontend), + Tag->Handle); Tag->Context = NULL; Tag->Type = TAG_TYPE_INVALID; @@ -1023,13 +1015,10 @@ __RingPrepareHeader( Pfn = MmGetMdlPfnArray(Mdl)[0]; - status = GNTTAB(PermitForeignAccess, - Transmitter->GnttabInterface, - Tag->Reference, - FrontendGetBackendDomain(Frontend), - GNTTAB_ENTRY_FULL_PAGE, - Pfn, - TRUE); + status = GranterPermitAccess(FrontendGetGranter(Frontend), + Tag->Handle, + Pfn, + TRUE); ASSERT(NT_SUCCESS(status)); Tag->Offset = 0; @@ -1225,9 +1214,8 @@ fail3: Tag->Length = 0; Tag->Offset = 0; - (VOID) GNTTAB(RevokeForeignAccess, - Transmitter->GnttabInterface, - Tag->Reference); + GranterRevokeAccess(FrontendGetGranter(Frontend), + Tag->Handle); Tag->Context = NULL; Tag->Type = TAG_TYPE_INVALID; @@ -1275,7 +1263,6 @@ __RingUnprepareTags( PLIST_ENTRY ListEntry; PTRANSMITTER_TAG Tag; PXENVIF_TRANSMITTER_PACKET Packet; - NTSTATUS status; --State->Count; @@ -1289,10 +1276,8 @@ __RingUnprepareTags( Tag->Length = 0; Tag->Offset = 0; - status = GNTTAB(RevokeForeignAccess, - Transmitter->GnttabInterface, - Tag->Reference); - ASSERT(NT_SUCCESS(status)); + GranterRevokeAccess(FrontendGetGranter(Frontend), + Tag->Handle); switch (Tag->Type) { case TAG_BUFFER: { @@ -1615,13 +1600,10 @@ __RingPrepareGratuitousArp( Pfn = MmGetMdlPfnArray(Mdl)[0]; - status = GNTTAB(PermitForeignAccess, - Transmitter->GnttabInterface, - Tag->Reference, - FrontendGetBackendDomain(Frontend), - GNTTAB_ENTRY_FULL_PAGE, - Pfn, - TRUE); + status = GranterPermitAccess(FrontendGetGranter(Frontend), + Tag->Handle, + Pfn, + TRUE); ASSERT(NT_SUCCESS(status)); Tag->Offset = 0; @@ -1764,13 +1746,10 @@ __RingPrepareNeighbourAdvertisement( Pfn = MmGetMdlPfnArray(Mdl)[0]; - status = GNTTAB(PermitForeignAccess, - Transmitter->GnttabInterface, - Tag->Reference, - FrontendGetBackendDomain(Frontend), - GNTTAB_ENTRY_FULL_PAGE, - Pfn, - TRUE); + status = GranterPermitAccess(FrontendGetGranter(Frontend), + Tag->Handle, + Pfn, + TRUE); ASSERT(NT_SUCCESS(status)); Tag->Offset = 0; @@ -1859,7 +1838,7 @@ __RingPostTags( id = (USHORT)(Tag - &Ring->Tag[0]); req->id = id | REQ_ID_INTEGRITY_CHECK; - req->gref = Tag->Reference; + req->gref = GranterGetReference(Tag->Handle); req->offset = (USHORT)Tag->Offset; req->size = (USHORT)Tag->Length; req->flags = NETTXF_more_data; @@ -2030,17 +2009,16 @@ __RingReleaseTag( ) { PXENVIF_TRANSMITTER Transmitter; - NTSTATUS status; + PXENVIF_FRONTEND Frontend; Transmitter = Ring->Transmitter; + Frontend = Transmitter->Frontend; Tag->Length = 0; Tag->Offset = 0; - status = GNTTAB(RevokeForeignAccess, - Transmitter->GnttabInterface, - Tag->Reference); - ASSERT(NT_SUCCESS(status)); + GranterRevokeAccess(FrontendGetGranter(Frontend), + Tag->Handle); __TransmitterPutTag(Ring, Tag); } @@ -2987,13 +2965,8 @@ __RingConnect( FRONT_RING_INIT(&Ring->Front, Ring->Shared, PAGE_SIZE); ASSERT3P(Ring->Front.sring, ==, Ring->Shared); - Transmitter->GnttabInterface = FrontendGetGnttabInterface(Frontend); - - GNTTAB(Acquire, Transmitter->GnttabInterface); - - status = GNTTAB(Get, - Transmitter->GnttabInterface, - &Ring->Reference); + status = GranterGet(FrontendGetGranter(Frontend), + &Ring->Handle); if (!NT_SUCCESS(status)) goto fail2; @@ -3001,9 +2974,8 @@ __RingConnect( for (Index = 0; Index < MAXIMUM_TAG_COUNT; Index++) { PTRANSMITTER_TAG Tag = &Ring->Tag[Index]; - status = GNTTAB(Get, - Transmitter->GnttabInterface, - &Tag->Reference); + status = GranterGet(FrontendGetGranter(Frontend), + &Tag->Handle); if (!NT_SUCCESS(status)) goto fail3; @@ -3013,13 +2985,10 @@ __RingConnect( Pfn = MmGetMdlPfnArray(Ring->Mdl)[0]; - status = GNTTAB(PermitForeignAccess, - Transmitter->GnttabInterface, - Ring->Reference, - FrontendGetBackendDomain(Frontend), - GNTTAB_ENTRY_FULL_PAGE, - Pfn, - FALSE); + status = GranterPermitAccess(FrontendGetGranter(Frontend), + Ring->Handle, + Pfn, + FALSE); ASSERT(NT_SUCCESS(status)); Ring->Connected = TRUE; @@ -3035,24 +3004,19 @@ fail3: Ring->HeadFreeTag = Tag->Next; Tag->Next = 0; - GNTTAB(Put, - Transmitter->GnttabInterface, - Tag->Reference); - Tag->Reference = 0; + GranterPut(FrontendGetGranter(Frontend), + Tag->Handle); + Tag->Handle = NULL; } Ring->HeadFreeTag = 0; - GNTTAB(Put, - Transmitter->GnttabInterface, - Ring->Reference); - Ring->Reference = 0; + GranterPut(FrontendGetGranter(Frontend), + Ring->Handle); + Ring->Handle = NULL; fail2: Error("fail2\n"); - GNTTAB(Release, Transmitter->GnttabInterface); - Transmitter->GnttabInterface = NULL; - RtlZeroMemory(&Ring->Front, sizeof (netif_tx_front_ring_t)); RtlZeroMemory(Ring->Shared, PAGE_SIZE); @@ -3085,7 +3049,7 @@ __RingStoreWrite( FrontendGetPath(Frontend), "tx-ring-ref", "%u", - Ring->Reference); + GranterGetReference(Ring->Handle)); if (!NT_SUCCESS(status)) goto fail1; @@ -3192,7 +3156,6 @@ __RingDisconnect( PXENVIF_TRANSMITTER Transmitter; PXENVIF_FRONTEND Frontend; ULONG Count; - NTSTATUS status; ASSERT(Ring->Connected); Ring->Connected = FALSE; @@ -3207,10 +3170,8 @@ __RingDisconnect( Ring->RequestsPushed = 0; Ring->RequestsPosted = 0; - status = GNTTAB(RevokeForeignAccess, - Transmitter->GnttabInterface, - Ring->Reference); - ASSERT(NT_SUCCESS(status)); + GranterRevokeAccess(FrontendGetGranter(Frontend), + Ring->Handle); Count = 0; while (Ring->HeadFreeTag != TAG_INDEX_INVALID) { @@ -3220,10 +3181,9 @@ __RingDisconnect( Ring->HeadFreeTag = Tag->Next; Tag->Next = 0; - GNTTAB(Put, - Transmitter->GnttabInterface, - Tag->Reference); - Tag->Reference = 0; + GranterPut(FrontendGetGranter(Frontend), + Tag->Handle); + Tag->Handle = NULL; Count++; } @@ -3231,13 +3191,9 @@ __RingDisconnect( Ring->HeadFreeTag = 0; - GNTTAB(Put, - Transmitter->GnttabInterface, - Ring->Reference); - Ring->Reference = 0; - - GNTTAB(Release, Transmitter->GnttabInterface); - Transmitter->GnttabInterface = NULL; + GranterPut(FrontendGetGranter(Frontend), + Ring->Handle); + Ring->Handle = NULL; RtlZeroMemory(&Ring->Front, sizeof (netif_tx_front_ring_t)); RtlZeroMemory(Ring->Shared, PAGE_SIZE); -- 2.39.5