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 <kraxel@redhat.com>
This commit is contained in:
Gerd Hoffmann 2024-05-29 17:28:11 +02:00 committed by Ard Biesheuvel
parent 3b36aa96de
commit 7339bfeffa
2 changed files with 11 additions and 3 deletions

View File

@ -156,6 +156,11 @@ VirtioRngGetRNG (
} }
Dev = VIRTIO_ENTROPY_SOURCE_FROM_RNG (This); 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 // Map Buffer's system physical address to device address
// //
@ -382,6 +387,7 @@ VirtioRngInit (
// //
Dev->Rng.GetInfo = VirtioRngGetInfo; Dev->Rng.GetInfo = VirtioRngGetInfo;
Dev->Rng.GetRNG = VirtioRngGetRNG; Dev->Rng.GetRNG = VirtioRngGetRNG;
Dev->Ready = TRUE;
return EFI_SUCCESS; return EFI_SUCCESS;
@ -414,8 +420,8 @@ VirtioRngUninit (
// VIRTIO_CFG_WRITE() returns, the host will have learned to stay away from // VIRTIO_CFG_WRITE() returns, the host will have learned to stay away from
// the old comms area. // the old comms area.
// //
Dev->Ready = FALSE;
Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, 0); Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, 0);
Dev->VirtIo->UnmapSharedBuffer (Dev->VirtIo, Dev->RingMap); Dev->VirtIo->UnmapSharedBuffer (Dev->VirtIo, Dev->RingMap);
VirtioRingUninit (Dev->VirtIo, &Dev->Ring); VirtioRingUninit (Dev->VirtIo, &Dev->Ring);
@ -435,7 +441,7 @@ VirtioRngExitBoot (
{ {
VIRTIO_RNG_DEV *Dev; 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 // Reset the device. This causes the hypervisor to forget about the virtio
// ring. // ring.
@ -443,7 +449,8 @@ VirtioRngExitBoot (
// We allocated said ring in EfiBootServicesData type memory, and code // We allocated said ring in EfiBootServicesData type memory, and code
// executing after ExitBootServices() is permitted to overwrite it. // executing after ExitBootServices() is permitted to overwrite it.
// //
Dev = Context; Dev = Context;
Dev->Ready = FALSE;
Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, 0); Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, 0);
} }

View File

@ -33,6 +33,7 @@ typedef struct {
VRING Ring; // VirtioRingInit 2 VRING Ring; // VirtioRingInit 2
EFI_RNG_PROTOCOL Rng; // VirtioRngInit 1 EFI_RNG_PROTOCOL Rng; // VirtioRngInit 1
VOID *RingMap; // VirtioRingMap 2 VOID *RingMap; // VirtioRingMap 2
BOOLEAN Ready;
} VIRTIO_RNG_DEV; } VIRTIO_RNG_DEV;
#define VIRTIO_ENTROPY_SOURCE_FROM_RNG(RngPointer) \ #define VIRTIO_ENTROPY_SOURCE_FROM_RNG(RngPointer) \