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>
UINT32 StallPerPollUsec;\r
EFI_PCI_IO_PROTOCOL *PciIo;\r
UINT64 OriginalPciAttributes;\r
UINT32 StallPerPollUsec;\r
EFI_PCI_IO_PROTOCOL *PciIo;\r
UINT64 OriginalPciAttributes;\r
MPT_SCSI_DMA_BUFFER *Dma;\r
EFI_PHYSICAL_ADDRESS DmaPhysical;\r
VOID *DmaMapping;\r
MPT_SCSI_DMA_BUFFER *Dma;\r
EFI_PHYSICAL_ADDRESS DmaPhysical;\r
VOID *DmaMapping;\r
return EFI_UNSUPPORTED;\r
}\r
\r
return EFI_UNSUPPORTED;\r
}\r
\r
+STATIC\r
+VOID\r
+EFIAPI\r
+MptScsiExitBoot (\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
+ )\r
+{\r
+ MPT_SCSI_DEV *Dev;\r
+\r
+ Dev = Context;\r
+ DEBUG ((DEBUG_VERBOSE, "%a: Context=0x%p\n", __FUNCTION__, Context));\r
+ MptScsiReset (Dev);\r
+}\r
STATIC\r
EFI_STATUS\r
EFIAPI\r
STATIC\r
EFI_STATUS\r
EFIAPI\r
+ Status = gBS->CreateEvent (\r
+ EVT_SIGNAL_EXIT_BOOT_SERVICES,\r
+ TPL_CALLBACK,\r
+ &MptScsiExitBoot,\r
+ Dev,\r
+ &Dev->ExitBoot\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto UninitDev;\r
+ }\r
+\r
//\r
// Host adapter channel, doesn't exist\r
//\r
//\r
// Host adapter channel, doesn't exist\r
//\r
&Dev->PassThru\r
);\r
if (EFI_ERROR (Status)) {\r
&Dev->PassThru\r
);\r
if (EFI_ERROR (Status)) {\r
}\r
\r
return EFI_SUCCESS;\r
\r
}\r
\r
return EFI_SUCCESS;\r
\r
+CloseExitBoot:\r
+ gBS->CloseEvent (Dev->ExitBoot);\r
+\r
UninitDev:\r
MptScsiReset (Dev);\r
\r
UninitDev:\r
MptScsiReset (Dev);\r
\r
+ gBS->CloseEvent (Dev->ExitBoot);\r
+\r
MptScsiReset (Dev);\r
\r
Dev->PciIo->Unmap (\r
MptScsiReset (Dev);\r
\r
Dev->PciIo->Unmap (\r