mirror of https://github.com/acidanthera/audk.git
IntelFrameworkModulePkg: Add DxeCapsuleLib
Signed-off-by: jljusten Reviewed-by: rsun3 Reviewed-by: lgao4 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12274 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
352892190a
commit
cf7958f7f9
|
@ -136,6 +136,7 @@
|
||||||
IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
|
IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf
|
||||||
IntelFrameworkModulePkg/Library/PlatformBdsLibNull/PlatformBdsLibNull.inf
|
IntelFrameworkModulePkg/Library/PlatformBdsLibNull/PlatformBdsLibNull.inf
|
||||||
IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
|
IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
|
||||||
|
IntelFrameworkModulePkg/Library/DxeCapsuleLib/DxeCapsuleLib.inf
|
||||||
|
|
||||||
IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/IdeBusDxe.inf
|
IntelFrameworkModulePkg/Bus/Pci/IdeBusDxe/IdeBusDxe.inf
|
||||||
IntelFrameworkModulePkg/Bus/Isa/IsaBusDxe/IsaBusDxe.inf
|
IntelFrameworkModulePkg/Bus/Isa/IsaBusDxe/IsaBusDxe.inf
|
||||||
|
|
|
@ -0,0 +1,141 @@
|
||||||
|
/** @file
|
||||||
|
Capsule Library instance to update capsule image to flash.
|
||||||
|
|
||||||
|
Copyright (c) 2007 - 2010, 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/Capsule.h>
|
||||||
|
#include <Library/DebugLib.h>
|
||||||
|
#include <Library/BaseMemoryLib.h>
|
||||||
|
#include <Library/DxeServicesTableLib.h>
|
||||||
|
#include <Library/MemoryAllocationLib.h>
|
||||||
|
#include <Library/CapsuleLib.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
Those capsules supported by the firmwares.
|
||||||
|
|
||||||
|
@param CapsuleHeader Points to a capsule header.
|
||||||
|
|
||||||
|
@retval EFI_SUCESS Input capsule is supported by firmware.
|
||||||
|
@retval EFI_UNSUPPORTED Input capsule is not supported by the firmware.
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
SupportCapsuleImage (
|
||||||
|
IN EFI_CAPSULE_HEADER *CapsuleHeader
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (CompareGuid (&gEfiCapsuleGuid, &CapsuleHeader->CapsuleGuid)) {
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
The firmware implements to process the capsule image.
|
||||||
|
|
||||||
|
@param CapsuleHeader Points to a capsule header.
|
||||||
|
|
||||||
|
@retval EFI_SUCESS Process Capsule Image successfully.
|
||||||
|
@retval EFI_UNSUPPORTED Capsule image is not supported by the firmware.
|
||||||
|
@retval EFI_VOLUME_CORRUPTED FV volume in the capsule is corrupted.
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Not enough memory.
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ProcessCapsuleImage (
|
||||||
|
IN EFI_CAPSULE_HEADER *CapsuleHeader
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINT32 Length;
|
||||||
|
EFI_FIRMWARE_VOLUME_HEADER *FvImage;
|
||||||
|
EFI_FIRMWARE_VOLUME_HEADER *ProcessedFvImage;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_HANDLE FvProtocolHandle;
|
||||||
|
UINT32 FvAlignment;
|
||||||
|
|
||||||
|
FvImage = NULL;
|
||||||
|
ProcessedFvImage = NULL;
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
|
if (SupportCapsuleImage (CapsuleHeader) != EFI_SUCCESS) {
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Skip the capsule header, move to the Firware Volume
|
||||||
|
//
|
||||||
|
FvImage = (EFI_FIRMWARE_VOLUME_HEADER *) ((UINT8 *) CapsuleHeader + CapsuleHeader->HeaderSize);
|
||||||
|
Length = CapsuleHeader->CapsuleImageSize - CapsuleHeader->HeaderSize;
|
||||||
|
|
||||||
|
while (Length != 0) {
|
||||||
|
//
|
||||||
|
// Point to the next firmware volume header, and then
|
||||||
|
// call the DXE service to process it.
|
||||||
|
//
|
||||||
|
if (FvImage->FvLength > (UINTN) Length) {
|
||||||
|
//
|
||||||
|
// Notes: need to stuff this status somewhere so that the
|
||||||
|
// error can be detected at OS runtime
|
||||||
|
//
|
||||||
|
Status = EFI_VOLUME_CORRUPTED;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
FvAlignment = 1 << ((FvImage->Attributes & EFI_FVB2_ALIGNMENT) >> 16);
|
||||||
|
//
|
||||||
|
// FvAlignment must be more than 8 bytes required by FvHeader structure.
|
||||||
|
//
|
||||||
|
if (FvAlignment < 8) {
|
||||||
|
FvAlignment = 8;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Check FvImage Align is required.
|
||||||
|
//
|
||||||
|
if (((UINTN) FvImage % FvAlignment) == 0) {
|
||||||
|
ProcessedFvImage = FvImage;
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// Allocate new aligned buffer to store FvImage.
|
||||||
|
//
|
||||||
|
ProcessedFvImage = (EFI_FIRMWARE_VOLUME_HEADER *) AllocateAlignedPages ((UINTN) EFI_SIZE_TO_PAGES (FvImage->FvLength), (UINTN) FvAlignment);
|
||||||
|
if (ProcessedFvImage == NULL) {
|
||||||
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
CopyMem (ProcessedFvImage, FvImage, (UINTN) FvImage->FvLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = gDS->ProcessFirmwareVolume (
|
||||||
|
(VOID *) ProcessedFvImage,
|
||||||
|
(UINTN) ProcessedFvImage->FvLength,
|
||||||
|
&FvProtocolHandle
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Call the dispatcher to dispatch any drivers from the produced firmware volume
|
||||||
|
//
|
||||||
|
gDS->Dispatch ();
|
||||||
|
//
|
||||||
|
// On to the next FV in the capsule
|
||||||
|
//
|
||||||
|
Length -= (UINT32) FvImage->FvLength;
|
||||||
|
FvImage = (EFI_FIRMWARE_VOLUME_HEADER *) ((UINT8 *) FvImage + FvImage->FvLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
## @file
|
||||||
|
# Capsule library instance for DXE_DRIVER, DXE_RUNTIME_DRIVER
|
||||||
|
#
|
||||||
|
# Copyright (c) 2007 - 2011, 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.
|
||||||
|
#
|
||||||
|
##
|
||||||
|
|
||||||
|
[Defines]
|
||||||
|
INF_VERSION = 0x00010005
|
||||||
|
BASE_NAME = DxeCapsuleLib
|
||||||
|
FILE_GUID = 654950df-1ede-4b04-b144-6b77845736ad
|
||||||
|
MODULE_TYPE = DXE_DRIVER
|
||||||
|
VERSION_STRING = 1.0
|
||||||
|
LIBRARY_CLASS = CapsuleLib|DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_APPLICATION
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# The following information is for reference only and not required by the build tools.
|
||||||
|
#
|
||||||
|
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||||
|
#
|
||||||
|
|
||||||
|
[Sources]
|
||||||
|
DxeCapsuleLib.c
|
||||||
|
|
||||||
|
[Packages]
|
||||||
|
MdePkg/MdePkg.dec
|
||||||
|
IntelFrameworkPkg/IntelFrameworkPkg.dec
|
||||||
|
MdeModulePkg/MdeModulePkg.dec
|
||||||
|
|
||||||
|
[LibraryClasses]
|
||||||
|
BaseMemoryLib
|
||||||
|
DebugLib
|
||||||
|
MemoryAllocationLib
|
||||||
|
DxeServicesTableLib
|
||||||
|
|
||||||
|
[Guids]
|
||||||
|
gEfiCapsuleGuid # SOMETIMES_CONSUMED
|
||||||
|
|
Loading…
Reference in New Issue