/** @file
The common header file for SMM FTW module and SMM FTW DXE Module.
Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef __SMM_FTW_COMMON_H__
#define __SMM_FTW_COMMON_H__
#include
#include
#define FTW_FUNCTION_GET_MAX_BLOCK_SIZE 1
#define FTW_FUNCTION_ALLOCATE 2
#define FTW_FUNCTION_WRITE 3
#define FTW_FUNCTION_RESTART 4
#define FTW_FUNCTION_ABORT 5
#define FTW_FUNCTION_GET_LAST_WRITE 6
typedef struct {
UINTN Function;
EFI_STATUS ReturnStatus;
UINT8 Data[1];
} SMM_FTW_COMMUNICATE_FUNCTION_HEADER;
///
/// Size of SMM communicate header, without including the payload.
///
#define SMM_COMMUNICATE_HEADER_SIZE (OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data))
///
/// Size of SMM FTW communicate function header, without including the payload.
///
#define SMM_FTW_COMMUNICATE_HEADER_SIZE (OFFSET_OF (SMM_FTW_COMMUNICATE_FUNCTION_HEADER, Data))
typedef struct {
UINTN BlockSize;
} SMM_FTW_GET_MAX_BLOCK_SIZE_HEADER;
typedef struct {
EFI_GUID CallerId;
UINTN PrivateDataSize;
UINTN NumberOfWrites;
} SMM_FTW_ALLOCATE_HEADER;
typedef struct {
EFI_LBA Lba;
UINTN Offset;
UINTN PrivateDataSize;
EFI_PHYSICAL_ADDRESS FvbBaseAddress;
EFI_FVB_ATTRIBUTES_2 FvbAttributes;
UINTN Length;
UINT8 Data[1];
} SMM_FTW_WRITE_HEADER;
typedef struct {
EFI_PHYSICAL_ADDRESS FvbBaseAddress;
EFI_FVB_ATTRIBUTES_2 FvbAttributes;
} SMM_FTW_RESTART_HEADER;
typedef struct {
EFI_GUID CallerId;
EFI_LBA Lba;
UINTN Offset;
UINTN Length;
UINTN PrivateDataSize;
BOOLEAN Complete;
UINT8 Data[1];
} SMM_FTW_GET_LAST_WRITE_HEADER;
/**
Shared entry point of the module.
@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
MmFaultTolerantWriteInitialize (
VOID
);
/**
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
);
/**
Notify the system that the SMM FTW driver is ready.
**/
VOID
FtwNotifySmmReady (
VOID
);
#endif