]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleRuntime.c
MdeModulePkg/DxeCapsuleLibFmp: clone ESRT for runtime access
[mirror_edk2.git] / MdeModulePkg / Library / DxeCapsuleLibFmp / DxeCapsuleRuntime.c
index 880143905aa1f358b478d841e30dcd98a1fb1ee4..f94044a409185fb1def509f6f9eb31c5b3e1ba99 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
   Capsule library runtime support.\r
 \r
-  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -28,6 +22,8 @@
 \r
 extern EFI_SYSTEM_RESOURCE_TABLE *mEsrtTable;\r
 extern BOOLEAN                   mIsVirtualAddrConverted;\r
+EFI_EVENT                 mDxeRuntimeCapsuleLibVirtualAddressChangeEvent  = NULL;\r
+EFI_EVENT                 mDxeRuntimeCapsuleLibReadyToBootEvent  = NULL;\r
 \r
 /**\r
   Convert EsrtTable physical address to virtual address.\r
@@ -43,8 +39,28 @@ DxeCapsuleLibVirtualAddressChangeEvent (
   IN  VOID        *Context\r
   )\r
 {\r
-  UINTN                    Index;\r
-  EFI_CONFIGURATION_TABLE  *ConfigEntry;\r
+  gRT->ConvertPointer (EFI_OPTIONAL_PTR, (VOID **)&mEsrtTable);\r
+  mIsVirtualAddrConverted = TRUE;\r
+}\r
+\r
+/**\r
+  Notify function for event group EFI_EVENT_GROUP_READY_TO_BOOT.\r
+\r
+  @param[in]  Event   The Event that is being processed.\r
+  @param[in]  Context The Event Context.\r
+\r
+**/\r
+STATIC\r
+VOID\r
+EFIAPI\r
+DxeCapsuleLibReadyToBootEventNotify (\r
+  IN EFI_EVENT        Event,\r
+  IN VOID             *Context\r
+  )\r
+{\r
+  UINTN                       Index;\r
+  EFI_CONFIGURATION_TABLE     *ConfigEntry;\r
+  EFI_SYSTEM_RESOURCE_TABLE   *EsrtTable;\r
 \r
   //\r
   // Get Esrt table first\r
@@ -64,16 +80,19 @@ DxeCapsuleLibVirtualAddressChangeEvent (
     //\r
     // Search Esrt to check given capsule is qualified\r
     //\r
-    mEsrtTable = (EFI_SYSTEM_RESOURCE_TABLE *) ConfigEntry->VendorTable;\r
+    EsrtTable = (EFI_SYSTEM_RESOURCE_TABLE *) ConfigEntry->VendorTable;\r
+\r
+    mEsrtTable = AllocateRuntimeCopyPool (\r
+                   sizeof (EFI_SYSTEM_RESOURCE_TABLE) +\r
+                   EsrtTable->FwResourceCount * sizeof (EFI_SYSTEM_RESOURCE_ENTRY),\r
+                   EsrtTable);\r
+    ASSERT (mEsrtTable != NULL);\r
 \r
     //\r
-    // Update protocol pointer to Esrt Table.\r
+    // Set FwResourceCountMax to a sane value.\r
     //\r
-    gRT->ConvertPointer (0x00, (VOID**) &(mEsrtTable));\r
+    mEsrtTable->FwResourceCountMax = mEsrtTable->FwResourceCount;\r
   }\r
-\r
-  mIsVirtualAddrConverted = TRUE;\r
-\r
 }\r
 \r
 /**\r
@@ -92,21 +111,64 @@ DxeRuntimeCapsuleLibConstructor (
   )\r
 {\r
   EFI_STATUS     Status;\r
-  EFI_EVENT      Event;\r
 \r
   //\r
   // Make sure we can handle virtual address changes.\r
   //\r
-  Event = NULL;\r
   Status = gBS->CreateEventEx (\r
                   EVT_NOTIFY_SIGNAL,\r
                   TPL_NOTIFY,\r
                   DxeCapsuleLibVirtualAddressChangeEvent,\r
                   NULL,\r
                   &gEfiEventVirtualAddressChangeGuid,\r
-                  &Event\r
+                  &mDxeRuntimeCapsuleLibVirtualAddressChangeEvent\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  //\r
+  // Register notify function to cache the FMP capsule GUIDs at ReadyToBoot.\r
+  //\r
+  Status = gBS->CreateEventEx (\r
+                  EVT_NOTIFY_SIGNAL,\r
+                  TPL_CALLBACK,\r
+                  DxeCapsuleLibReadyToBootEventNotify,\r
+                  NULL,\r
+                  &gEfiEventReadyToBootGuid,\r
+                  &mDxeRuntimeCapsuleLibReadyToBootEvent\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   return EFI_SUCCESS;\r
 }\r
+\r
+/**\r
+  The destructor function closes the VirtualAddressChange event.\r
+\r
+  @param  ImageHandle   The firmware allocated handle for the EFI image.\r
+  @param  SystemTable   A pointer to the EFI System Table.\r
+\r
+  @retval EFI_SUCCESS   The destructor completed successfully.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DxeRuntimeCapsuleLibDestructor (\r
+  IN EFI_HANDLE         ImageHandle,\r
+  IN EFI_SYSTEM_TABLE   *SystemTable\r
+  )\r
+{\r
+  EFI_STATUS    Status;\r
+\r
+  //\r
+  // Close the VirtualAddressChange event.\r
+  //\r
+  Status = gBS->CloseEvent (mDxeRuntimeCapsuleLibVirtualAddressChangeEvent);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  //\r
+  // Close the ReadyToBoot event.\r
+  //\r
+  Status = gBS->CloseEvent (mDxeRuntimeCapsuleLibReadyToBootEvent);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return EFI_SUCCESS;\r
+}\r