Change the EfiAquireLock with RaiseTPL as the call to Boot Service UnloadImage can...
[mirror_edk2.git] / EdkModulePkg / Core / Dxe / Image / Image.c
index f1b2c7a..3696400 100644 (file)
@@ -24,9 +24,6 @@ Abstract:
 // Module Globals\r
 //\r
 \r
-EFI_LOCK mBsExitLock        = EFI_INITIALIZE_LOCK_VARIABLE(EFI_TPL_NOTIFY);\r
-EFI_LOCK mBsUnloadImageLock = EFI_INITIALIZE_LOCK_VARIABLE(EFI_TPL_NOTIFY);\r
-\r
 LOADED_IMAGE_PRIVATE_DATA  *mCurrentImage = NULL;\r
 \r
 LOAD_PE32_IMAGE_PRIVATE_DATA  mLoadPe32PrivateData = {\r
@@ -1221,9 +1218,14 @@ Returns:
 --*/\r
 {\r
   LOADED_IMAGE_PRIVATE_DATA  *Image;\r
+  EFI_TPL                    OldTpl;\r
 \r
-  EfiAcquireLock (&mBsExitLock);\r
-  \r
+  //\r
+  // Prevent possible reentrance to this function\r
+  // for the same ImageHandle\r
+  // \r
+  OldTpl = CoreRaiseTpl (EFI_TPL_NOTIFY); \r
\r
   Image = CoreLoadedImageInfo (ImageHandle);\r
   if (Image == NULL_HANDLE) {\r
     Status = EFI_INVALID_PARAMETER;\r
@@ -1266,7 +1268,7 @@ Returns:
     CopyMem (Image->ExitData, ExitData, Image->ExitDataSize);\r
   }\r
 \r
-  EfiReleaseLock (&mBsExitLock);\r
+  CoreRestoreTpl (OldTpl);\r
   //\r
   // return to StartImage\r
   //\r
@@ -1278,7 +1280,7 @@ Returns:
   ASSERT (FALSE);\r
   Status = EFI_ACCESS_DENIED;\r
 Done:\r
-  EfiReleaseLock (&mBsExitLock);\r
+  CoreRestoreTpl (OldTpl);\r
   return Status;\r
 }\r
 \r
@@ -1309,9 +1311,14 @@ Returns:
 {\r
   EFI_STATUS                 Status;\r
   LOADED_IMAGE_PRIVATE_DATA  *Image;\r
+  EFI_TPL                    OldTpl;\r
 \r
-  EfiAcquireLock (&mBsUnloadImageLock);\r
-  \r
+  //\r
+  // Prevent possible reentrance to this function\r
+  // for the same ImageHandle\r
+  // \r
+  OldTpl = CoreRaiseTpl (EFI_TPL_NOTIFY);\r
\r
   Image = CoreLoadedImageInfo (ImageHandle);\r
   if (Image == NULL ) {\r
     //\r
@@ -1346,7 +1353,7 @@ Returns:
   }\r
 \r
 Done:\r
-  EfiReleaseLock (&mBsUnloadImageLock);\r
+  CoreRestoreTpl (OldTpl);\r
   return Status;\r
 }\r
 \r