The Tx and Rx rings are accessed by both guest and hypervisor, allocate the rings using newly added VirtIo->AllocateSharedPages() and map it with BusMasterCommonBuffer so that it can be accessed by both guest and hypervisor.
Cc: Ard Biesheuvel <ard.biesheu...@linaro.org> Cc: Jordan Justen <jordan.l.jus...@intel.com> Cc: Tom Lendacky <thomas.lenda...@amd.com> Cc: Laszlo Ersek <ler...@redhat.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Brijesh Singh <brijesh.si...@amd.com> --- OvmfPkg/VirtioNetDxe/VirtioNet.h | 2 ++ OvmfPkg/VirtioNetDxe/Events.c | 14 ++++++++++++++ OvmfPkg/VirtioNetDxe/SnpInitialize.c | 19 +++++++++++++++++++ OvmfPkg/VirtioNetDxe/SnpShutdown.c | 11 +++++++++++ 4 files changed, 46 insertions(+) diff --git a/OvmfPkg/VirtioNetDxe/VirtioNet.h b/OvmfPkg/VirtioNetDxe/VirtioNet.h index 710859bc6115..2964c946e26e 100644 --- a/OvmfPkg/VirtioNetDxe/VirtioNet.h +++ b/OvmfPkg/VirtioNetDxe/VirtioNet.h @@ -82,10 +82,12 @@ typedef struct { EFI_HANDLE MacHandle; // VirtioNetDriverBindingStart VRING RxRing; // VirtioNetInitRing + VOID *RxRingMap; // VirtioNetInitRing UINT8 *RxBuf; // VirtioNetInitRx UINT16 RxLastUsed; // VirtioNetInitRx VRING TxRing; // VirtioNetInitRing + VOID *TxRingMap; // VirtioNetInitRing UINT16 TxMaxPending; // VirtioNetInitTx UINT16 TxCurPending; // VirtioNetInitTx UINT16 *TxFreeStack; // VirtioNetInitTx diff --git a/OvmfPkg/VirtioNetDxe/Events.c b/OvmfPkg/VirtioNetDxe/Events.c index 5be1af6ffbee..9eb129ca2006 100644 --- a/OvmfPkg/VirtioNetDxe/Events.c +++ b/OvmfPkg/VirtioNetDxe/Events.c @@ -88,4 +88,18 @@ VirtioNetExitBoot ( if (Dev->Snm.State == EfiSimpleNetworkInitialized) { Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, 0); } + + // + // If Rx and Tx Ring exist then unmap it so that hypervisor is not able to + // get readable data after device is reset. + // + if (Dev->TxRingMap != NULL) { + VirtioRingUnmap (Dev->VirtIo, &Dev->TxRing, Dev->TxRingMap); + Dev->TxRingMap = NULL; + } + + if (Dev->RxRingMap != NULL) { + VirtioRingUnmap (Dev->VirtIo, &Dev->RxRing, Dev->RxRingMap); + Dev->RxRingMap = NULL; + } } diff --git a/OvmfPkg/VirtioNetDxe/SnpInitialize.c b/OvmfPkg/VirtioNetDxe/SnpInitialize.c index 6d9b81a9f939..cbc9c51cb643 100644 --- a/OvmfPkg/VirtioNetDxe/SnpInitialize.c +++ b/OvmfPkg/VirtioNetDxe/SnpInitialize.c @@ -461,11 +461,21 @@ VirtioNetInitialize ( goto DeviceFailed; } + Status = VirtioRingMap (Dev->VirtIo, &Dev->RxRing, &Dev->RxRingMap); + if (EFI_ERROR (Status)) { + goto ReleaseRxRing; + } + Status = VirtioNetInitRing (Dev, VIRTIO_NET_Q_TX, &Dev->TxRing); if (EFI_ERROR (Status)) { goto ReleaseRxRing; } + Status = VirtioRingMap (Dev->VirtIo, &Dev->TxRing, &Dev->TxRingMap); + if (EFI_ERROR (Status)) { + goto ReleaseTxRing; + } + // // step 5 -- keep only the features we want // @@ -510,9 +520,18 @@ AbortDevice: Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, 0); ReleaseTxRing: + if (Dev->TxRingMap != NULL) { + VirtioRingUnmap (Dev->VirtIo, &Dev->TxRing, Dev->TxRingMap); + Dev->TxRingMap = NULL; + } + VirtioRingUninit (Dev->VirtIo, &Dev->TxRing); ReleaseRxRing: + if (Dev->RxRingMap != NULL) { + VirtioRingUnmap (Dev->VirtIo, &Dev->TxRing, Dev->RxRingMap); + Dev->TxRingMap = NULL; + } VirtioRingUninit (Dev->VirtIo, &Dev->RxRing); DeviceFailed: diff --git a/OvmfPkg/VirtioNetDxe/SnpShutdown.c b/OvmfPkg/VirtioNetDxe/SnpShutdown.c index 5e84191fbbdd..08524ab94006 100644 --- a/OvmfPkg/VirtioNetDxe/SnpShutdown.c +++ b/OvmfPkg/VirtioNetDxe/SnpShutdown.c @@ -65,6 +65,17 @@ VirtioNetShutdown ( } Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, 0); + + if (Dev->RxRingMap != NULL) { + VirtioRingUnmap (Dev->VirtIo, &Dev->RxRing, Dev->RxRingMap); + Dev->RxRingMap = NULL; + } + + if (Dev->TxRingMap != NULL) { + VirtioRingUnmap (Dev->VirtIo, &Dev->TxRing, Dev->TxRingMap); + Dev->TxRingMap = NULL; + } + VirtioNetShutdownRx (Dev); VirtioNetShutdownTx (Dev); VirtioRingUninit (Dev->VirtIo, &Dev->TxRing); -- 2.7.4 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel