]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/MptScsiDxe: Reset device on ExitBootServices()
authorNikita Leshenko <nikita.leshchenko@oracle.com>
Mon, 4 May 2020 21:06:07 +0000 (00:06 +0300)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Tue, 5 May 2020 20:43:02 +0000 (20:43 +0000)
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>

OvmfPkg/MptScsiDxe/MptScsi.c

index 8be38f6cdb88833e2332f39de00f2471837204a7..9ed1831bac6dcf051b0a9e7bcb4ff07e6a93bb3a 100644 (file)
@@ -59,6 +59,7 @@ typedef struct {
   UINT32                          StallPerPollUsec;\r
   EFI_PCI_IO_PROTOCOL             *PciIo;\r
   UINT64                          OriginalPciAttributes;\r
   UINT32                          StallPerPollUsec;\r
   EFI_PCI_IO_PROTOCOL             *PciIo;\r
   UINT64                          OriginalPciAttributes;\r
+  EFI_EVENT                       ExitBoot;\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
@@ -762,6 +763,20 @@ MptScsiResetChannel (
   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
@@ -955,6 +970,17 @@ MptScsiControllerStart (
     goto Unmap;\r
   }\r
 \r
     goto Unmap;\r
   }\r
 \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
@@ -979,11 +1005,14 @@ MptScsiControllerStart (
                   &Dev->PassThru\r
                   );\r
   if (EFI_ERROR (Status)) {\r
                   &Dev->PassThru\r
                   );\r
   if (EFI_ERROR (Status)) {\r
-    goto UninitDev;\r
+    goto CloseExitBoot;\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
@@ -1059,6 +1088,8 @@ MptScsiControllerStop (
     return Status;\r
   }\r
 \r
     return Status;\r
   }\r
 \r
+  gBS->CloseEvent (Dev->ExitBoot);\r
+\r
   MptScsiReset (Dev);\r
 \r
   Dev->PciIo->Unmap (\r
   MptScsiReset (Dev);\r
 \r
   Dev->PciIo->Unmap (\r