A bus driver needs to pay attention whether its Stop() function is being
called on the "main" controller handle (NumberOfChildren == 0) or on the
child handles (NumberOfChildren > 0).

In QemuVideoDxe, all our resources are associated with the one child
handle (and the Private data structure) *except* the top-level PciIo
protocol reference. Be conscious of which mode Stop() is being called for.

Contributed-under: TianoCore Contribution Agreement 1.0
Reviewed-by: Jordan Justen <[email protected]>
Signed-off-by: Laszlo Ersek <[email protected]>
---
 OvmfPkg/QemuVideoDxe/Driver.c | 31 ++++++++++++++++++++-----------
 1 file changed, 20 insertions(+), 11 deletions(-)

diff --git a/OvmfPkg/QemuVideoDxe/Driver.c b/OvmfPkg/QemuVideoDxe/Driver.c
index 508e1ac..48a788f 100644
--- a/OvmfPkg/QemuVideoDxe/Driver.c
+++ b/OvmfPkg/QemuVideoDxe/Driver.c
@@ -454,8 +454,26 @@ QemuVideoControllerDriverStop (
   EFI_STATUS                      Status;
   QEMU_VIDEO_PRIVATE_DATA  *Private;
 
+  if (NumberOfChildren == 0) {
+    //
+    // Close the PCI I/O Protocol
+    //
+    gBS->CloseProtocol (
+          Controller,
+          &gEfiPciIoProtocolGuid,
+          This->DriverBindingHandle,
+          Controller
+          );
+    return EFI_SUCCESS;
+  }
+
+  //
+  // free all resources for whose access we need the child handle, because the
+  // child handle is going away
+  //
+  ASSERT (NumberOfChildren == 1);
   Status = gBS->OpenProtocol (
-                  Controller,
+                  ChildHandleBuffer[0],
                   &gEfiGraphicsOutputProtocolGuid,
                   (VOID **) &GraphicsOutput,
                   This->DriverBindingHandle,
@@ -470,6 +488,7 @@ QemuVideoControllerDriverStop (
   // Get our private context information
   //
   Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (GraphicsOutput);
+  ASSERT (Private->Handle == ChildHandleBuffer[0]);
 
   QemuVideoGraphicsOutputDestructor (Private);
   //
@@ -496,16 +515,6 @@ QemuVideoControllerDriverStop (
                   NULL
                   );
 
-  //
-  // Close the PCI I/O Protocol
-  //
-  gBS->CloseProtocol (
-        Controller,
-        &gEfiPciIoProtocolGuid,
-        This->DriverBindingHandle,
-        Controller
-        );
-
   gBS->CloseProtocol (
         Controller,
         &gEfiPciIoProtocolGuid,
-- 
1.8.3.1



------------------------------------------------------------------------------
Flow-based real-time traffic analytics software. Cisco certified tool.
Monitor traffic, SLAs, QoS, Medianet, WAAS etc. with NetFlow Analyzer
Customize your own dashboards, set traffic alerts and generate reports.
Network behavioral analysis & security monitoring. All-in-one tool.
http://pubads.g.doubleclick.net/gampad/clk?id=126839071&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to