From 99a6dce3c2abd348bba7ae62e25488a2381369f7 Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Mon, 3 Mar 2014 08:40:35 +0000 Subject: OvmfPkg: QemuVideoDxe: disentangle UEFI driver model use in Stop() 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 Signed-off-by: Laszlo Ersek Reviewed-by: Jordan Justen git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15284 6f19259b-4bc3-4df7-8a09-765794883524 --- OvmfPkg/QemuVideoDxe/Driver.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) (limited to 'OvmfPkg/QemuVideoDxe') diff --git a/OvmfPkg/QemuVideoDxe/Driver.c b/OvmfPkg/QemuVideoDxe/Driver.c index 508e1acb10..48a788f6f8 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, -- cgit v1.2.3