]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/PvScsiDxe/PvScsi.c
OvmfPkg/PvScsiDxe: Reset device on ExitBootServices()
[mirror_edk2.git] / OvmfPkg / PvScsiDxe / PvScsi.c
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