/** @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
\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
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
//\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
)\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