From ef949581ea3c622f42ad83337fd2625faa77c17f Mon Sep 17 00:00:00 2001 From: niruiyu Date: Thu, 25 Aug 2011 03:55:39 +0000 Subject: Raise TPL to prevent the BlockIo instance for USB device is removed during the locating the instance and using it. Signed-off-by: niruiyu Reviewed-by: erictian git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12203 6f19259b-4bc3-4df7-8a09-765794883524 --- IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'IntelFrameworkModulePkg/Library/GenericBdsLib') diff --git a/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c b/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c index 1ac2946360..a697fcfda3 100644 --- a/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c +++ b/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsBoot.c @@ -1904,6 +1904,7 @@ BdsLibGetBootableHandle ( ) { EFI_STATUS Status; + EFI_TPL OldTpl; EFI_DEVICE_PATH_PROTOCOL *UpdatedDevicePath; EFI_DEVICE_PATH_PROTOCOL *DupDevicePath; EFI_HANDLE Handle; @@ -1923,6 +1924,12 @@ BdsLibGetBootableHandle ( UpdatedDevicePath = DevicePath; + // + // Enter to critical section to protect the acquired BlockIo instance + // from getting released due to the USB mass storage hotplug event + // + OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + // // Check whether the device is connected // @@ -1950,6 +1957,8 @@ BdsLibGetBootableHandle ( // Get BlockIo protocol and check removable attribute // Status = gBS->HandleProtocol (Handle, &gEfiBlockIoProtocolGuid, (VOID **)&BlockIo); + ASSERT_EFI_ERROR (Status); + // // Issue a dummy read to the device to check for media change. // When the removable media is changed, any Block IO read/write will @@ -2046,6 +2055,8 @@ BdsLibGetBootableHandle ( FreePool(SimpleFileSystemHandles); } + gBS->RestoreTPL (OldTpl); + return ReturnHandle; } -- cgit v1.2.3