MdeModulePkg/FaultTolerantWriteDxe: implement standalone MM version

Implement a new version of the fault tolerant write driver that can
be used in the context of a standalone MM implementation.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
Reviewed-by: Star Zeng <star.zeng@intel.com>
This commit is contained in:
Ard Biesheuvel 2019-01-03 19:28:23 +01:00
parent 22cedf5bbd
commit d0def00d33
2 changed files with 186 additions and 0 deletions

View File

@ -0,0 +1,96 @@
/** @file
Parts of the SMM/MM implementation that are specific to standalone MM
Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2018, Linaro, Ltd. 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 <Library/SmmMemLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include "FaultTolerantWrite.h"
#include "FaultTolerantWriteSmmCommon.h"
/**
This function checks if the buffer is valid per processor architecture and
does not overlap with SMRAM.
@param Buffer The buffer start address to be checked.
@param Length The buffer length to be checked.
@retval TRUE This buffer is valid per processor architecture and does not
overlap with SMRAM.
@retval FALSE This buffer is not valid per processor architecture or overlaps
with SMRAM.
**/
BOOLEAN
FtwSmmIsBufferOutsideSmmValid (
IN EFI_PHYSICAL_ADDRESS Buffer,
IN UINT64 Length
)
{
return TRUE;
}
/**
Internal implementation of CRC32. Depending on the execution context
(standalone SMM or DXE vs standalone MM), this function is implemented
via a call to the CalculateCrc32 () boot service, or via a library
call.
If Buffer is NULL, then ASSERT().
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
@param[in] Buffer A pointer to the buffer on which the 32-bit CRC is to be computed.
@param[in] Length The number of bytes in the buffer Data.
@retval Crc32 The 32-bit CRC was computed for the data buffer.
**/
UINT32
FtwCalculateCrc32 (
IN VOID *Buffer,
IN UINTN Length
)
{
return CalculateCrc32 (Buffer, Length);
}
/**
Notify the system that the SMM FTW driver is ready
**/
VOID
FtwNotifySmmReady (
VOID
)
{
}
/**
This function is the entry point of the Fault Tolerant Write driver.
@param[in] ImageHandle A handle for the image that is initializing this driver
@param[in] MmSystemTable A pointer to the MM system table
@retval EFI_SUCCESS The initialization finished successfully.
@retval EFI_OUT_OF_RESOURCES Allocate memory error
@retval EFI_INVALID_PARAMETER Workspace or Spare block does not exist
**/
EFI_STATUS
EFIAPI
StandaloneMmFaultTolerantWriteInitialize (
IN EFI_HANDLE ImageHandle,
IN EFI_MM_SYSTEM_TABLE *MmSystemTable
)
{
return MmFaultTolerantWriteInitialize ();
}

View File

@ -0,0 +1,90 @@
## @file
# Fault Tolerant Write Smm Driver.
#
# This driver installs SMM Fault Tolerant Write (FTW) protocol, which provides fault
# tolerant write capability in SMM environment for block devices. Its implementation
# depends on the full functionality SMM FVB protocol that support read, write/erase
# flash access.
#
# Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
# Copyright (c) 2018, Linaro, Ltd. 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 = 0x0001001B
BASE_NAME = FaultTolerantWriteStandaloneMm
FILE_GUID = 3aade4ec-63cc-4a48-a928-5a374dd463eb
MODULE_TYPE = MM_STANDALONE
VERSION_STRING = 1.0
PI_SPECIFICATION_VERSION = 0x00010032
ENTRY_POINT = StandaloneMmFaultTolerantWriteInitialize
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64
#
[Sources]
FtwMisc.c
UpdateWorkingBlock.c
FaultTolerantWrite.c
FaultTolerantWriteStandaloneMm.c
FaultTolerantWriteSmm.c
FaultTolerantWrite.h
FaultTolerantWriteSmmCommon.h
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
StandaloneMmPkg/StandaloneMmPkg.dec
[LibraryClasses]
BaseLib
BaseMemoryLib
DebugLib
MemoryAllocationLib
MmServicesTableLib
PcdLib
ReportStatusCodeLib
StandaloneMmDriverEntryPoint
[Guids]
#
# Signature in EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER
#
## CONSUMES ## GUID
## PRODUCES ## GUID
gEdkiiWorkingBlockSignatureGuid
[Protocols]
gEfiSmmSwapAddressRangeProtocolGuid | gEfiMdeModulePkgTokenSpaceGuid.PcdFullFtwServiceEnable ## SOMETIMES_CONSUMES
## NOTIFY
## CONSUMES
gEfiSmmFirmwareVolumeBlockProtocolGuid
## PRODUCES
## UNDEFINED # SmiHandlerRegister
gEfiSmmFaultTolerantWriteProtocolGuid
gEfiMmEndOfDxeProtocolGuid ## CONSUMES
[FeaturePcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdFullFtwServiceEnable ## CONSUMES
[Pcd]
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64 ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64 ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize ## CONSUMES
[Depex]
TRUE