#include "FaultTolerantWriteSmmCommon.h"\r
#include <Protocol/MmEndOfDxe.h>\r
\r
-VOID *mFvbRegistration = NULL;\r
-EFI_FTW_DEVICE *mFtwDevice = NULL;\r
+VOID *mFvbRegistration = NULL;\r
+EFI_FTW_DEVICE *mFtwDevice = NULL;\r
\r
///\r
/// The flag to indicate whether the platform has left the DXE phase of execution.\r
///\r
-BOOLEAN mEndOfDxe = FALSE;\r
+BOOLEAN mEndOfDxe = FALSE;\r
\r
/**\r
Retrieve the SMM FVB protocol interface by HANDLE.\r
return gMmst->MmHandleProtocol (\r
FvBlockHandle,\r
&gEfiSmmFirmwareVolumeBlockProtocolGuid,\r
- (VOID **) FvBlock\r
+ (VOID **)FvBlock\r
);\r
}\r
\r
**/\r
EFI_STATUS\r
FtwGetSarProtocol (\r
- OUT VOID **SarProtocol\r
+ OUT VOID **SarProtocol\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
//\r
// Locate Smm Swap Address Range protocol\r
**/\r
EFI_STATUS\r
GetFvbCountAndBuffer (\r
- OUT UINTN *NumberHandles,\r
- OUT EFI_HANDLE **Buffer\r
+ OUT UINTN *NumberHandles,\r
+ OUT EFI_HANDLE **Buffer\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN BufferSize;\r
+ EFI_STATUS Status;\r
+ UINTN BufferSize;\r
\r
if ((NumberHandles == NULL) || (Buffer == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
BufferSize = 0;\r
*NumberHandles = 0;\r
*Buffer = NULL;\r
- Status = gMmst->MmLocateHandle (\r
- ByProtocol,\r
- &gEfiSmmFirmwareVolumeBlockProtocolGuid,\r
- NULL,\r
- &BufferSize,\r
- *Buffer\r
- );\r
- if (EFI_ERROR(Status) && Status != EFI_BUFFER_TOO_SMALL) {\r
+ Status = gMmst->MmLocateHandle (\r
+ ByProtocol,\r
+ &gEfiSmmFirmwareVolumeBlockProtocolGuid,\r
+ NULL,\r
+ &BufferSize,\r
+ *Buffer\r
+ );\r
+ if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {\r
return EFI_NOT_FOUND;\r
}\r
\r
*Buffer\r
);\r
\r
- *NumberHandles = BufferSize / sizeof(EFI_HANDLE);\r
- if (EFI_ERROR(Status)) {\r
+ *NumberHandles = BufferSize / sizeof (EFI_HANDLE);\r
+ if (EFI_ERROR (Status)) {\r
*NumberHandles = 0;\r
FreePool (*Buffer);\r
*Buffer = NULL;\r
return Status;\r
}\r
\r
-\r
/**\r
Get the handle of the SMM FVB protocol by the FVB base address and attributes.\r
\r
**/\r
EFI_STATUS\r
GetFvbByAddressAndAttribute (\r
- IN EFI_PHYSICAL_ADDRESS Address,\r
- IN EFI_FVB_ATTRIBUTES_2 Attributes,\r
- OUT EFI_HANDLE *SmmFvbHandle\r
+ IN EFI_PHYSICAL_ADDRESS Address,\r
+ IN EFI_FVB_ATTRIBUTES_2 Attributes,\r
+ OUT EFI_HANDLE *SmmFvbHandle\r
)\r
{\r
EFI_STATUS Status;\r
if (EFI_ERROR (Status)) {\r
break;\r
}\r
+\r
//\r
// Compare the address.\r
//\r
if (EFI_ERROR (Status)) {\r
continue;\r
}\r
+\r
if (Address != FvbBaseAddress) {\r
- continue;\r
+ continue;\r
}\r
\r
//\r
if (EFI_ERROR (Status)) {\r
continue;\r
}\r
+\r
if (Attributes != FvbAttributes) {\r
- continue;\r
+ continue;\r
}\r
\r
//\r
EFI_STATUS\r
EFIAPI\r
SmmFaultTolerantWriteHandler (\r
- IN EFI_HANDLE DispatchHandle,\r
- IN CONST VOID *RegisterContext,\r
- IN OUT VOID *CommBuffer,\r
- IN OUT UINTN *CommBufferSize\r
+ IN EFI_HANDLE DispatchHandle,\r
+ IN CONST VOID *RegisterContext,\r
+ IN OUT VOID *CommBuffer,\r
+ IN OUT UINTN *CommBufferSize\r
)\r
{\r
- EFI_STATUS Status;\r
- SMM_FTW_COMMUNICATE_FUNCTION_HEADER *SmmFtwFunctionHeader;\r
- SMM_FTW_GET_MAX_BLOCK_SIZE_HEADER *SmmGetMaxBlockSizeHeader;\r
- SMM_FTW_ALLOCATE_HEADER *SmmFtwAllocateHeader;\r
- SMM_FTW_WRITE_HEADER *SmmFtwWriteHeader;\r
- SMM_FTW_RESTART_HEADER *SmmFtwRestartHeader;\r
- SMM_FTW_GET_LAST_WRITE_HEADER *SmmFtwGetLastWriteHeader;\r
- VOID *PrivateData;\r
- EFI_HANDLE SmmFvbHandle;\r
- UINTN InfoSize;\r
- UINTN CommBufferPayloadSize;\r
- UINTN PrivateDataSize;\r
- UINTN Length;\r
- UINTN TempCommBufferSize;\r
+ EFI_STATUS Status;\r
+ SMM_FTW_COMMUNICATE_FUNCTION_HEADER *SmmFtwFunctionHeader;\r
+ SMM_FTW_GET_MAX_BLOCK_SIZE_HEADER *SmmGetMaxBlockSizeHeader;\r
+ SMM_FTW_ALLOCATE_HEADER *SmmFtwAllocateHeader;\r
+ SMM_FTW_WRITE_HEADER *SmmFtwWriteHeader;\r
+ SMM_FTW_RESTART_HEADER *SmmFtwRestartHeader;\r
+ SMM_FTW_GET_LAST_WRITE_HEADER *SmmFtwGetLastWriteHeader;\r
+ VOID *PrivateData;\r
+ EFI_HANDLE SmmFvbHandle;\r
+ UINTN InfoSize;\r
+ UINTN CommBufferPayloadSize;\r
+ UINTN PrivateDataSize;\r
+ UINTN Length;\r
+ UINTN TempCommBufferSize;\r
\r
//\r
// If input is invalid, stop processing this SMI\r
//\r
- if (CommBuffer == NULL || CommBufferSize == NULL) {\r
+ if ((CommBuffer == NULL) || (CommBufferSize == NULL)) {\r
return EFI_SUCCESS;\r
}\r
\r
DEBUG ((DEBUG_ERROR, "SmmFtwHandler: SMM communication buffer size invalid!\n"));\r
return EFI_SUCCESS;\r
}\r
+\r
CommBufferPayloadSize = TempCommBufferSize - SMM_FTW_COMMUNICATE_HEADER_SIZE;\r
\r
if (!FtwSmmIsBufferOutsideSmmValid ((UINTN)CommBuffer, TempCommBufferSize)) {\r
DEBUG ((DEBUG_ERROR, "GetMaxBlockSize: SMM communication buffer size invalid!\n"));\r
return EFI_SUCCESS;\r
}\r
- SmmGetMaxBlockSizeHeader = (SMM_FTW_GET_MAX_BLOCK_SIZE_HEADER *) SmmFtwFunctionHeader->Data;\r
+\r
+ SmmGetMaxBlockSizeHeader = (SMM_FTW_GET_MAX_BLOCK_SIZE_HEADER *)SmmFtwFunctionHeader->Data;\r
\r
Status = FtwGetMaxBlockSize (\r
&mFtwDevice->FtwInstance,\r
DEBUG ((DEBUG_ERROR, "Allocate: SMM communication buffer size invalid!\n"));\r
return EFI_SUCCESS;\r
}\r
- SmmFtwAllocateHeader = (SMM_FTW_ALLOCATE_HEADER *) SmmFtwFunctionHeader->Data;\r
- Status = FtwAllocate (\r
- &mFtwDevice->FtwInstance,\r
- &SmmFtwAllocateHeader->CallerId,\r
- SmmFtwAllocateHeader->PrivateDataSize,\r
- SmmFtwAllocateHeader->NumberOfWrites\r
- );\r
+\r
+ SmmFtwAllocateHeader = (SMM_FTW_ALLOCATE_HEADER *)SmmFtwFunctionHeader->Data;\r
+ Status = FtwAllocate (\r
+ &mFtwDevice->FtwInstance,\r
+ &SmmFtwAllocateHeader->CallerId,\r
+ SmmFtwAllocateHeader->PrivateDataSize,\r
+ SmmFtwAllocateHeader->NumberOfWrites\r
+ );\r
break;\r
\r
case FTW_FUNCTION_WRITE:\r
DEBUG ((DEBUG_ERROR, "Write: SMM communication buffer size invalid!\n"));\r
return EFI_SUCCESS;\r
}\r
- SmmFtwWriteHeader = (SMM_FTW_WRITE_HEADER *) SmmFtwFunctionHeader->Data;\r
- Length = SmmFtwWriteHeader->Length;\r
- PrivateDataSize = SmmFtwWriteHeader->PrivateDataSize;\r
+\r
+ SmmFtwWriteHeader = (SMM_FTW_WRITE_HEADER *)SmmFtwFunctionHeader->Data;\r
+ Length = SmmFtwWriteHeader->Length;\r
+ PrivateDataSize = SmmFtwWriteHeader->PrivateDataSize;\r
if (((UINTN)(~0) - Length < OFFSET_OF (SMM_FTW_WRITE_HEADER, Data)) ||\r
- ((UINTN)(~0) - PrivateDataSize < OFFSET_OF (SMM_FTW_WRITE_HEADER, Data) + Length)) {\r
+ ((UINTN)(~0) - PrivateDataSize < OFFSET_OF (SMM_FTW_WRITE_HEADER, Data) + Length))\r
+ {\r
//\r
// Prevent InfoSize overflow\r
//\r
Status = EFI_ACCESS_DENIED;\r
break;\r
}\r
+\r
InfoSize = OFFSET_OF (SMM_FTW_WRITE_HEADER, Data) + Length + PrivateDataSize;\r
\r
//\r
} else {\r
PrivateData = (VOID *)&SmmFtwWriteHeader->Data[Length];\r
}\r
+\r
Status = GetFvbByAddressAndAttribute (\r
SmmFtwWriteHeader->FvbBaseAddress,\r
SmmFtwWriteHeader->FvbAttributes,\r
// calling into FtwWrite().\r
//\r
SpeculationBarrier ();\r
- Status = FtwWrite(\r
+ Status = FtwWrite (\r
&mFtwDevice->FtwInstance,\r
SmmFtwWriteHeader->Lba,\r
SmmFtwWriteHeader->Offset,\r
SmmFtwWriteHeader->Data\r
);\r
}\r
+\r
break;\r
\r
case FTW_FUNCTION_RESTART:\r
DEBUG ((DEBUG_ERROR, "Restart: SMM communication buffer size invalid!\n"));\r
return EFI_SUCCESS;\r
}\r
- SmmFtwRestartHeader = (SMM_FTW_RESTART_HEADER *) SmmFtwFunctionHeader->Data;\r
- Status = GetFvbByAddressAndAttribute (\r
- SmmFtwRestartHeader->FvbBaseAddress,\r
- SmmFtwRestartHeader->FvbAttributes,\r
- &SmmFvbHandle\r
- );\r
+\r
+ SmmFtwRestartHeader = (SMM_FTW_RESTART_HEADER *)SmmFtwFunctionHeader->Data;\r
+ Status = GetFvbByAddressAndAttribute (\r
+ SmmFtwRestartHeader->FvbBaseAddress,\r
+ SmmFtwRestartHeader->FvbAttributes,\r
+ &SmmFvbHandle\r
+ );\r
if (!EFI_ERROR (Status)) {\r
Status = FtwRestart (&mFtwDevice->FtwInstance, SmmFvbHandle);\r
}\r
+\r
break;\r
\r
case FTW_FUNCTION_ABORT:\r
DEBUG ((DEBUG_ERROR, "GetLastWrite: SMM communication buffer size invalid!\n"));\r
return EFI_SUCCESS;\r
}\r
- SmmFtwGetLastWriteHeader = (SMM_FTW_GET_LAST_WRITE_HEADER *) SmmFtwFunctionHeader->Data;\r
- PrivateDataSize = SmmFtwGetLastWriteHeader->PrivateDataSize;\r
- if ((UINTN)(~0) - PrivateDataSize < OFFSET_OF (SMM_FTW_GET_LAST_WRITE_HEADER, Data)){\r
+\r
+ SmmFtwGetLastWriteHeader = (SMM_FTW_GET_LAST_WRITE_HEADER *)SmmFtwFunctionHeader->Data;\r
+ PrivateDataSize = SmmFtwGetLastWriteHeader->PrivateDataSize;\r
+ if ((UINTN)(~0) - PrivateDataSize < OFFSET_OF (SMM_FTW_GET_LAST_WRITE_HEADER, Data)) {\r
//\r
// Prevent InfoSize overflow\r
//\r
Status = EFI_ACCESS_DENIED;\r
break;\r
}\r
+\r
InfoSize = OFFSET_OF (SMM_FTW_GET_LAST_WRITE_HEADER, Data) + PrivateDataSize;\r
\r
//\r
return EFI_SUCCESS;\r
}\r
\r
-\r
/**\r
SMM Firmware Volume Block Protocol notification event handler.\r
\r
EFI_STATUS\r
EFIAPI\r
FvbNotificationEvent (\r
- IN CONST EFI_GUID *Protocol,\r
- IN VOID *Interface,\r
- IN EFI_HANDLE Handle\r
+ IN CONST EFI_GUID *Protocol,\r
+ IN VOID *Interface,\r
+ IN EFI_HANDLE Handle\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_SMM_FAULT_TOLERANT_WRITE_PROTOCOL *FtwProtocol;\r
- EFI_HANDLE SmmFtwHandle;\r
+ EFI_STATUS Status;\r
+ EFI_SMM_FAULT_TOLERANT_WRITE_PROTOCOL *FtwProtocol;\r
+ EFI_HANDLE SmmFtwHandle;\r
\r
//\r
// Just return to avoid install SMM FaultTolerantWriteProtocol again\r
Status = gMmst->MmLocateProtocol (\r
&gEfiSmmFaultTolerantWriteProtocolGuid,\r
NULL,\r
- (VOID **) &FtwProtocol\r
+ (VOID **)&FtwProtocol\r
);\r
if (!EFI_ERROR (Status)) {\r
return EFI_SUCCESS;\r
// Found proper FVB protocol and initialize FtwDevice for protocol installation\r
//\r
Status = InitFtwProtocol (mFtwDevice);\r
- if (EFI_ERROR(Status)) {\r
+ if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
EFI_STATUS\r
EFIAPI\r
MmEndOfDxeCallback (\r
- IN CONST EFI_GUID *Protocol,\r
- IN VOID *Interface,\r
- IN EFI_HANDLE Handle\r
+ IN CONST EFI_GUID *Protocol,\r
+ IN VOID *Interface,\r
+ IN EFI_HANDLE Handle\r
)\r
{\r
mEndOfDxe = TRUE;\r
VOID\r
)\r
{\r
- EFI_STATUS Status;\r
- VOID *MmEndOfDxeRegistration;\r
+ EFI_STATUS Status;\r
+ VOID *MmEndOfDxeRegistration;\r
\r
//\r
// Allocate private data structure for SMM FTW protocol and do some initialization\r
//\r
Status = InitFtwDevice (&mFtwDevice);\r
- if (EFI_ERROR(Status)) {\r
+ if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r