]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg SmmLockBoxSmmLib: Add DESTRUCTOR SmmLockBoxSmmDestructor
authorStar Zeng <star.zeng@intel.com>
Thu, 26 May 2016 05:21:08 +0000 (13:21 +0800)
committerStar Zeng <star.zeng@intel.com>
Tue, 7 Jun 2016 02:01:09 +0000 (10:01 +0800)
SmmLockBoxSmmLib is linked to SMM modules. If the module entry-point
function returns error, the module will be unloaded and the global
variables will point to undefined memory.

This patch is to add DESTRUCTOR SmmLockBoxSmmDestructor to uninstall
SmmLockBoxCommunication configuration table if it has been installed
in Constructor.

Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Laszlo Ersek <lersek@redhat.com>
MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxSmmLib.c
MdeModulePkg/Library/SmmLockBoxLib/SmmLockBoxSmmLib.inf

index 38be18560fe9a2050495302ade0f2fffcabf7f0e..4960df755534da4fdbb9fc72bfc561e6ffa101b3 100644 (file)
@@ -30,6 +30,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 SMM_LOCK_BOX_CONTEXT mSmmLockBoxContext;\r
 LIST_ENTRY           mLockBoxQueue = INITIALIZE_LIST_HEAD_VARIABLE (mLockBoxQueue);\r
 \r
+BOOLEAN              mSmmConfigurationTableInstalled = FALSE;\r
+\r
 /**\r
   This function return SmmLockBox context from SMST.\r
 \r
@@ -114,6 +116,7 @@ SmmLockBoxSmmConstructor (
                     sizeof(mSmmLockBoxContext)\r
                     );\r
   ASSERT_EFI_ERROR (Status);\r
+  mSmmConfigurationTableInstalled = TRUE;\r
 \r
   DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SmmLockBoxContext - %x\n", (UINTN)&mSmmLockBoxContext));\r
   DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib LockBoxDataAddress - %x\n", (UINTN)&mLockBoxQueue));\r
@@ -122,6 +125,42 @@ SmmLockBoxSmmConstructor (
   return Status;\r
 }\r
 \r
+/**\r
+  Destructor for SmmLockBox library.\r
+  This is used to uninstall SmmLockBoxCommunication configuration table\r
+  if it has been installed in Constructor.\r
+\r
+  @param[in] ImageHandle    Image handle of this driver.\r
+  @param[in] SystemTable    A Pointer to the EFI System Table.\r
+\r
+  @retval EFI_SUCEESS       The destructor always returns EFI_SUCCESS.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmmLockBoxSmmDestructor (\r
+  IN EFI_HANDLE         ImageHandle,\r
+  IN EFI_SYSTEM_TABLE   *SystemTable\r
+  )\r
+{\r
+  EFI_STATUS            Status;\r
+\r
+  DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib SmmLockBoxSmmDestructor in %a module\n", gEfiCallerBaseName));\r
+\r
+  if (mSmmConfigurationTableInstalled) {\r
+    Status = gSmst->SmmInstallConfigurationTable (\r
+                      gSmst,\r
+                      &gEfiSmmLockBoxCommunicationGuid,\r
+                      NULL,\r
+                      0\r
+                      );\r
+    ASSERT_EFI_ERROR (Status);\r
+    DEBUG ((EFI_D_INFO, "SmmLockBoxSmmLib uninstall SmmLockBoxCommunication configuration table\n"));\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
 /**\r
   This function return SmmLockBox queue address.\r
 \r
index d722f57a66bd331e0202b3f18deb26ce9129f222..eb7ba0bb2e895a0da79f0d7b5fddb5fe9b200dc7 100644 (file)
@@ -23,6 +23,7 @@
   VERSION_STRING                 = 1.0\r
   LIBRARY_CLASS                  = LockBoxLib|DXE_SMM_DRIVER\r
   CONSTRUCTOR                    = SmmLockBoxSmmConstructor\r
+  DESTRUCTOR                     = SmmLockBoxSmmDestructor\r
 \r
 #\r
 # The following information is for reference only and not required by the build tools.\r