summaryrefslogtreecommitdiffstats
path: root/OvmfPkg/QemuVideoDxe/Driver.c
diff options
context:
space:
mode:
authorLaszlo Ersek <lersek@redhat.com>2014-03-22 07:13:44 +0000
committerjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>2014-03-22 07:13:44 +0000
commit9c08bbe59ca1e1667ffa4d0cf4d98b2a5d3a58f8 (patch)
tree648c453b1048f7f384ec7270e75a7928db63134a /OvmfPkg/QemuVideoDxe/Driver.c
parentbc4c536628c619f1625fefb974d5cf189ce3e7ba (diff)
downloadedk2-9c08bbe59ca1e1667ffa4d0cf4d98b2a5d3a58f8.tar.gz
edk2-9c08bbe59ca1e1667ffa4d0cf4d98b2a5d3a58f8.tar.bz2
edk2-9c08bbe59ca1e1667ffa4d0cf4d98b2a5d3a58f8.zip
OvmfPkg: QemuVideoDxe: serialize Start() against callbacks
If Start() succeeds, the callback is only executed when the setup is complete (on the stack of RestoreTPL()), rather than on the stack of InstallMultipleProtocolInterfaces(), when the driver setup may yet be theoretically incomplete. If Start() fails, the protocol interface will have been uninstalled (rolled back) by the time the callback runs (again, on the stack of RestoreTPL()). Since protocol notification callbacks begin with locating the protocol interface in question, such attempts to locate will fail immediately and save some work in the callback. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Jordan Justen <jordan.l.justen@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15371 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'OvmfPkg/QemuVideoDxe/Driver.c')
-rw-r--r--OvmfPkg/QemuVideoDxe/Driver.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/OvmfPkg/QemuVideoDxe/Driver.c b/OvmfPkg/QemuVideoDxe/Driver.c
index e71af6e850..c44b8b2603 100644
--- a/OvmfPkg/QemuVideoDxe/Driver.c
+++ b/OvmfPkg/QemuVideoDxe/Driver.c
@@ -170,6 +170,7 @@ QemuVideoControllerDriverStart (
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
)
{
+ EFI_TPL OldTpl;
EFI_STATUS Status;
QEMU_VIDEO_PRIVATE_DATA *Private;
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
@@ -178,12 +179,15 @@ QemuVideoControllerDriverStart (
QEMU_VIDEO_CARD *Card;
EFI_PCI_IO_PROTOCOL *ChildPciIo;
+ OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
+
//
// Allocate Private context data for GOP inteface.
//
Private = AllocateZeroPool (sizeof (QEMU_VIDEO_PRIVATE_DATA));
if (Private == NULL) {
- return EFI_OUT_OF_RESOURCES;
+ Status = EFI_OUT_OF_RESOURCES;
+ goto RestoreTpl;
}
//
@@ -394,6 +398,7 @@ QemuVideoControllerDriverStart (
goto UninstallGop;
}
+ gBS->RestoreTPL (OldTpl);
return EFI_SUCCESS;
UninstallGop:
@@ -424,6 +429,9 @@ ClosePciIo:
FreePrivate:
FreePool (Private);
+RestoreTpl:
+ gBS->RestoreTPL (OldTpl);
+
return Status;
}