StandaloneMmPkg: StandaloneMmCore: Parsing new MM communicate header

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3398
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3430

MM communicate protocols are expanded with EFI_MM_COMMUNICATE_HEADER_V3
structure that cooperates with updated field types and flexible array.
The PiSmmCore implementation is updated to detect and process incoming
data accordingly.

Two checks are also performed to prevent legacy communicate data or
unsupported data is fed into MM core under agreed header guid.

Signed-off-by: Kun Qin <kuqin12@gmail.com>
This commit is contained in:
Kun Qin
2025-03-12 22:45:06 -07:00
committed by mergify[bot]
parent 9dec81092b
commit 249ca10af0
2 changed files with 34 additions and 16 deletions

View File

@ -502,11 +502,15 @@ MmEntryPoint (
IN CONST EFI_MM_ENTRY_CONTEXT *MmEntryContext
)
{
EFI_STATUS Status;
EFI_MM_COMMUNICATE_HEADER *CommunicateHeader;
MM_COMM_BUFFER_STATUS *CommunicationStatus;
UINTN BufferSize;
EFI_HANDLE MmHandle;
EFI_STATUS Status;
EFI_MM_COMMUNICATE_HEADER_V3 *CommunicateHeader;
EFI_MM_COMMUNICATE_HEADER *LegacyCommunicateHeader;
MM_COMM_BUFFER_STATUS *CommunicationStatus;
UINTN BufferSize;
EFI_HANDLE MmHandle;
EFI_GUID *CommGuid;
UINTN CommGuidOffset;
UINTN CommHeaderSize;
DEBUG ((DEBUG_INFO, "MmEntryPoint ...\n"));
@ -543,8 +547,22 @@ MmEntryPoint (
//
// Synchronous MMI for MM Core or request from Communicate protocol
//
CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)(UINTN)mMmCommunicationBuffer->PhysicalStart;
BufferSize = OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, Data) + CommunicateHeader->MessageLength;
CommGuid = &((EFI_MM_COMMUNICATE_HEADER_V3 *)(UINTN)mMmCommunicationBuffer->PhysicalStart)->HeaderGuid;
//
// Check if the signature matches EFI_MM_COMMUNICATE_HEADER_V3 definition
//
if (CompareGuid (CommGuid, &gEfiMmCommunicateHeaderV3Guid)) {
CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER_V3 *)(UINTN)mMmCommunicationBuffer->PhysicalStart;
CommGuidOffset = OFFSET_OF (EFI_MM_COMMUNICATE_HEADER_V3, MessageGuid);
CommHeaderSize = sizeof (EFI_MM_COMMUNICATE_HEADER_V3);
BufferSize = CommunicateHeader->BufferSize;
} else {
LegacyCommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)(UINTN)mMmCommunicationBuffer->PhysicalStart;
CommGuidOffset = OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, HeaderGuid);
CommHeaderSize = OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, Data);
BufferSize = OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, Data) + LegacyCommunicateHeader->MessageLength;
}
if (BufferSize <= EFI_PAGES_TO_SIZE (mMmCommunicationBuffer->NumberOfPages)) {
//
// Shadow the data from MM Communication Buffer to internal buffer
@ -559,16 +577,15 @@ MmEntryPoint (
EFI_PAGES_TO_SIZE (mMmCommunicationBuffer->NumberOfPages) - BufferSize
);
CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)mInternalCommBufferCopy;
BufferSize = CommunicateHeader->MessageLength;
Status = MmiManage (
&CommunicateHeader->HeaderGuid,
NULL,
CommunicateHeader->Data,
&BufferSize
);
BufferSize -= CommHeaderSize;
Status = MmiManage (
(EFI_GUID *)((UINT8 *)mInternalCommBufferCopy + CommGuidOffset),
NULL,
(UINT8 *)mInternalCommBufferCopy + CommHeaderSize,
&BufferSize
);
BufferSize = BufferSize + OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, Data);
BufferSize = BufferSize + CommHeaderSize;
if (BufferSize <= EFI_PAGES_TO_SIZE (mMmCommunicationBuffer->NumberOfPages)) {
//
// Copy the data back to MM Communication Buffer

View File

@ -84,6 +84,7 @@
gEfiSmmSmramMemoryGuid
gEdkiiPiSmmMemoryAttributesTableGuid
gEfiMmPeiMmramMemoryReserveGuid
gEfiMmCommunicateHeaderV3Guid ## CONSUMES ## GUID # Communicate header
[Pcd]
gStandaloneMmPkgTokenSpaceGuid.PcdFwVolMmMaxEncapsulationDepth ##CONSUMES