From 7339bfeffa3fa30b18dce86409c0112039bacec5 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Wed, 29 May 2024 17:28:11 +0200 Subject: [PATCH] OvmfPkg/VirtioRngDxe: check if device is ready Add a 'Ready' boolean to the driver state struct, use it to track whenever the device is ready to be used. In case it is not ready throw an EFI_DEVICE_ERROR instead of sending a request which will never receive an answer. Signed-off-by: Gerd Hoffmann --- OvmfPkg/VirtioRngDxe/VirtioRng.c | 13 ++++++++++--- OvmfPkg/VirtioRngDxe/VirtioRng.h | 1 + 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/OvmfPkg/VirtioRngDxe/VirtioRng.c b/OvmfPkg/VirtioRngDxe/VirtioRng.c index 069aed148af1..8959e51faf71 100644 --- a/OvmfPkg/VirtioRngDxe/VirtioRng.c +++ b/OvmfPkg/VirtioRngDxe/VirtioRng.c @@ -156,6 +156,11 @@ VirtioRngGetRNG ( } Dev = VIRTIO_ENTROPY_SOURCE_FROM_RNG (This); + if (!Dev->Ready) { + DEBUG ((DEBUG_INFO, "%a: not ready\n", __func__)); + return EFI_DEVICE_ERROR; + } + // // Map Buffer's system physical address to device address // @@ -382,6 +387,7 @@ VirtioRngInit ( // Dev->Rng.GetInfo = VirtioRngGetInfo; Dev->Rng.GetRNG = VirtioRngGetRNG; + Dev->Ready = TRUE; return EFI_SUCCESS; @@ -414,8 +420,8 @@ VirtioRngUninit ( // VIRTIO_CFG_WRITE() returns, the host will have learned to stay away from // the old comms area. // + Dev->Ready = FALSE; Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, 0); - Dev->VirtIo->UnmapSharedBuffer (Dev->VirtIo, Dev->RingMap); VirtioRingUninit (Dev->VirtIo, &Dev->Ring); @@ -435,7 +441,7 @@ VirtioRngExitBoot ( { VIRTIO_RNG_DEV *Dev; - DEBUG ((DEBUG_VERBOSE, "%a: Context=0x%p\n", __func__, Context)); + DEBUG ((DEBUG_INFO, "%a: Context=0x%p\n", __func__, Context)); // // Reset the device. This causes the hypervisor to forget about the virtio // ring. @@ -443,7 +449,8 @@ VirtioRngExitBoot ( // We allocated said ring in EfiBootServicesData type memory, and code // executing after ExitBootServices() is permitted to overwrite it. // - Dev = Context; + Dev = Context; + Dev->Ready = FALSE; Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, 0); } diff --git a/OvmfPkg/VirtioRngDxe/VirtioRng.h b/OvmfPkg/VirtioRngDxe/VirtioRng.h index 2da99540a208..3519521d6ab5 100644 --- a/OvmfPkg/VirtioRngDxe/VirtioRng.h +++ b/OvmfPkg/VirtioRngDxe/VirtioRng.h @@ -33,6 +33,7 @@ typedef struct { VRING Ring; // VirtioRingInit 2 EFI_RNG_PROTOCOL Rng; // VirtioRngInit 1 VOID *RingMap; // VirtioRingMap 2 + BOOLEAN Ready; } VIRTIO_RNG_DEV; #define VIRTIO_ENTROPY_SOURCE_FROM_RNG(RngPointer) \