OvmfPkg/MptScsiDxe: Reset device on ExitBootServices()

This causes the device to forget about the reply frame. We allocated the
reply frame in EfiBootServicesData type memory, and code executing after
ExitBootServices() is permitted to overwrite it.

Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2390
Signed-off-by: Nikita Leshenko <nikita.leshchenko@oracle.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20200504210607.144434-13-nikita.leshchenko@oracle.com>
This commit is contained in:
Nikita Leshenko 2020-05-05 00:06:07 +03:00 committed by mergify[bot]
parent 505812ae1d
commit c635a56384

View File

@ -59,6 +59,7 @@ typedef struct {
UINT32 StallPerPollUsec; UINT32 StallPerPollUsec;
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
UINT64 OriginalPciAttributes; UINT64 OriginalPciAttributes;
EFI_EVENT ExitBoot;
MPT_SCSI_DMA_BUFFER *Dma; MPT_SCSI_DMA_BUFFER *Dma;
EFI_PHYSICAL_ADDRESS DmaPhysical; EFI_PHYSICAL_ADDRESS DmaPhysical;
VOID *DmaMapping; VOID *DmaMapping;
@ -762,6 +763,20 @@ MptScsiResetChannel (
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
STATIC
VOID
EFIAPI
MptScsiExitBoot (
IN EFI_EVENT Event,
IN VOID *Context
)
{
MPT_SCSI_DEV *Dev;
Dev = Context;
DEBUG ((DEBUG_VERBOSE, "%a: Context=0x%p\n", __FUNCTION__, Context));
MptScsiReset (Dev);
}
STATIC STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
@ -955,6 +970,17 @@ MptScsiControllerStart (
goto Unmap; goto Unmap;
} }
Status = gBS->CreateEvent (
EVT_SIGNAL_EXIT_BOOT_SERVICES,
TPL_CALLBACK,
&MptScsiExitBoot,
Dev,
&Dev->ExitBoot
);
if (EFI_ERROR (Status)) {
goto UninitDev;
}
// //
// Host adapter channel, doesn't exist // Host adapter channel, doesn't exist
// //
@ -979,11 +1005,14 @@ MptScsiControllerStart (
&Dev->PassThru &Dev->PassThru
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto UninitDev; goto CloseExitBoot;
} }
return EFI_SUCCESS; return EFI_SUCCESS;
CloseExitBoot:
gBS->CloseEvent (Dev->ExitBoot);
UninitDev: UninitDev:
MptScsiReset (Dev); MptScsiReset (Dev);
@ -1059,6 +1088,8 @@ MptScsiControllerStop (
return Status; return Status;
} }
gBS->CloseEvent (Dev->ExitBoot);
MptScsiReset (Dev); MptScsiReset (Dev);
Dev->PciIo->Unmap ( Dev->PciIo->Unmap (