]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/PvScsiDxe: Reset device on ExitBootServices()
authorLiran Alon <liran.alon@oracle.com>
Sat, 28 Mar 2020 20:00:59 +0000 (23:00 +0300)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Mon, 30 Mar 2020 16:45:07 +0000 (16:45 +0000)
This causes the device to forget about the request/completion rings.
We allocated said rings in EfiBootServicesData type memory, and code
executing after ExitBootServices() is permitted to overwrite it.

Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2567
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Liran Alon <liran.alon@oracle.com>
Message-Id: <20200328200100.60786-17-liran.alon@oracle.com>
Reviewed-by: Nikita Leshenko <nikita.leshchenko@oracle.com>
OvmfPkg/PvScsiDxe/PvScsi.c
OvmfPkg/PvScsiDxe/PvScsi.h

index da3535c75220a55dc3b4fa203f674c26dc2fdd97..d7f0d3c8790c93e465947c3e67d2a268c52c69d1 100644 (file)
@@ -1221,6 +1221,31 @@ PvScsiUninit (
   PvScsiRestorePciAttributes (Dev);\r
 }\r
 \r
+/**\r
+  Event notification called by ExitBootServices()\r
+**/\r
+STATIC\r
+VOID\r
+EFIAPI\r
+PvScsiExitBoot (\r
+  IN  EFI_EVENT Event,\r
+  IN  VOID      *Context\r
+  )\r
+{\r
+  PVSCSI_DEV *Dev;\r
+\r
+  Dev = Context;\r
+  DEBUG ((DEBUG_VERBOSE, "%a: Context=0x%p\n", __FUNCTION__, Context));\r
+\r
+  //\r
+  // Reset the device to stop device usage of the rings.\r
+  //\r
+  // We allocated said rings in EfiBootServicesData type memory, and code\r
+  // executing after ExitBootServices() is permitted to overwrite it.\r
+  //\r
+  PvScsiResetAdapter (Dev);\r
+}\r
+\r
 //\r
 // Driver Binding\r
 //\r
@@ -1314,6 +1339,17 @@ PvScsiDriverBindingStart (
     goto ClosePciIo;\r
   }\r
 \r
+  Status = gBS->CreateEvent (\r
+                  EVT_SIGNAL_EXIT_BOOT_SERVICES,\r
+                  TPL_CALLBACK,\r
+                  &PvScsiExitBoot,\r
+                  Dev,\r
+                  &Dev->ExitBoot\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    goto UninitDev;\r
+  }\r
+\r
   //\r
   // Setup complete, attempt to export the driver instance's PassThru interface\r
   //\r
@@ -1325,11 +1361,14 @@ PvScsiDriverBindingStart (
                   &Dev->PassThru\r
                   );\r
   if (EFI_ERROR (Status)) {\r
-    goto UninitDev;\r
+    goto CloseExitBoot;\r
   }\r
 \r
   return EFI_SUCCESS;\r
 \r
+CloseExitBoot:\r
+  gBS->CloseEvent (Dev->ExitBoot);\r
+\r
 UninitDev:\r
   PvScsiUninit (Dev);\r
 \r
@@ -1384,6 +1423,8 @@ PvScsiDriverBindingStop (
     return Status;\r
   }\r
 \r
+  gBS->CloseEvent (Dev->ExitBoot);\r
+\r
   PvScsiUninit (Dev);\r
 \r
   gBS->CloseProtocol (\r
index 02feac734743d7239c9a9378c63fa795591a57d7..544359ebc05cefd0cac0def7a85da7bc36320918 100644 (file)
@@ -51,6 +51,7 @@ typedef struct {
 typedef struct {\r
   UINT32                          Signature;\r
   EFI_PCI_IO_PROTOCOL             *PciIo;\r
+  EFI_EVENT                       ExitBoot;\r
   UINT64                          OriginalPciAttributes;\r
   PVSCSI_RING_DESC                RingDesc;\r
   PVSCSI_DMA_BUFFER               *DmaBuf;\r