]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Dxe/Image/Image.c
Using Spin lock instead of using RaiseTpl() to prevent UnloadImage() re-entrance.
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / Image / Image.c
index dbb662519fb749867e8b00c8642a7f9849657123..477eaa3417e824108201718aa1db7291fc5e7946 100644 (file)
@@ -17,6 +17,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 // Module Globals\r
 //\r
 \r
+SPIN_LOCK                  mUnloadImageLock;\r
+\r
 LOADED_IMAGE_PRIVATE_DATA  *mCurrentImage = NULL;\r
 \r
 LOAD_PE32_IMAGE_PRIVATE_DATA  mLoadPe32PrivateData = {\r
@@ -137,6 +139,11 @@ CoreInitializeImageServices (
 \r
   mCurrentImage = Image;\r
 \r
+  //\r
+  // Initialize spin lock\r
+  //\r
+  InitializeSpinLock (&mUnloadImageLock);\r
+\r
   //\r
   // Fill in DXE globals\r
   //\r
@@ -1362,13 +1369,14 @@ CoreUnloadImage (
 {\r
   EFI_STATUS                 Status;\r
   LOADED_IMAGE_PRIVATE_DATA  *Image;\r
-  EFI_TPL                    OldTpl;\r
 \r
   //\r
   // Prevent possible reentrance to this function\r
   // for the same ImageHandle\r
   //\r
-  OldTpl = CoreRaiseTpl (TPL_NOTIFY);\r
+  if (!AcquireSpinLockOrFail (&mUnloadImageLock)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
 \r
   Image = CoreLoadedImageInfo (ImageHandle);\r
   if (Image == NULL ) {\r
@@ -1404,7 +1412,7 @@ CoreUnloadImage (
   }\r
 \r
 Done:\r
-  CoreRestoreTpl (OldTpl);\r
+  ReleaseSpinLock (&mUnloadImageLock);\r
   return Status;\r
 }\r
 \r