MdeModulePkg/DxeCapsuleLibFmp: Add DxeCapsuleLibFmp instance.
This instance handles Microsoft UX capsule, UEFI defined FMP capsule. This instance should not assume any capsule image format. Cc: Feng Tian <feng.tian@intel.com> Cc: Star Zeng <star.zeng@intel.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Cc: Liming Gao <liming.gao@intel.com> Cc: Chao Zhang <chao.b.zhang@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jiewen Yao <jiewen.yao@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> Reviewed-by: Michael Kinney <michael.d.kinney@intel.com> Tested-by: Michael Kinney <michael.d.kinney@intel.com>
This commit is contained in:
112
MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleRuntime.c
Normal file
112
MdeModulePkg/Library/DxeCapsuleLibFmp/DxeCapsuleRuntime.c
Normal file
@@ -0,0 +1,112 @@
|
||||
/** @file
|
||||
Capsule library runtime support.
|
||||
|
||||
Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <PiDxe.h>
|
||||
|
||||
#include <Guid/FmpCapsule.h>
|
||||
#include <Guid/SystemResourceTable.h>
|
||||
#include <Guid/EventGroup.h>
|
||||
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DxeServicesTableLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/UefiRuntimeServicesTableLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
|
||||
extern EFI_SYSTEM_RESOURCE_TABLE *mEsrtTable;
|
||||
extern BOOLEAN mIsVirtualAddrConverted;
|
||||
|
||||
/**
|
||||
Convert EsrtTable physical address to virtual address.
|
||||
|
||||
@param[in] Event Event whose notification function is being invoked.
|
||||
@param[in] Context The pointer to the notification function's context, which
|
||||
is implementation-dependent.
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
DxeCapsuleLibVirtualAddressChangeEvent (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
EFI_CONFIGURATION_TABLE *ConfigEntry;
|
||||
|
||||
//
|
||||
// Get Esrt table first
|
||||
//
|
||||
ConfigEntry = gST->ConfigurationTable;
|
||||
for (Index = 0; Index < gST->NumberOfTableEntries; Index++) {
|
||||
if (CompareGuid(&gEfiSystemResourceTableGuid, &ConfigEntry->VendorGuid)) {
|
||||
break;
|
||||
}
|
||||
ConfigEntry++;
|
||||
}
|
||||
|
||||
//
|
||||
// If no Esrt table installed in Configure Table
|
||||
//
|
||||
if (Index < gST->NumberOfTableEntries) {
|
||||
//
|
||||
// Search Esrt to check given capsule is qualified
|
||||
//
|
||||
mEsrtTable = (EFI_SYSTEM_RESOURCE_TABLE *) ConfigEntry->VendorTable;
|
||||
|
||||
//
|
||||
// Update protocol pointer to Esrt Table.
|
||||
//
|
||||
gRT->ConvertPointer (0x00, (VOID**) &(mEsrtTable));
|
||||
}
|
||||
|
||||
mIsVirtualAddrConverted = TRUE;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
The constructor function hook VirtualAddressChange event to use ESRT table as capsule routing table.
|
||||
|
||||
@param ImageHandle The firmware allocated handle for the EFI image.
|
||||
@param SystemTable A pointer to the EFI System Table.
|
||||
|
||||
@retval EFI_SUCCESS The constructor successfully .
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
DxeRuntimeCapsuleLibConstructor (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_EVENT Event;
|
||||
|
||||
//
|
||||
// Make sure we can handle virtual address changes.
|
||||
//
|
||||
Event = NULL;
|
||||
Status = gBS->CreateEventEx (
|
||||
EVT_NOTIFY_SIGNAL,
|
||||
TPL_NOTIFY,
|
||||
DxeCapsuleLibVirtualAddressChangeEvent,
|
||||
NULL,
|
||||
&gEfiEventVirtualAddressChangeGuid,
|
||||
&Event
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
Reference in New Issue
Block a user