mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-27 07:34:06 +02:00
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:
parent
3b36aa96de
commit
7339bfeffa
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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) \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user