Skip to content

Commit

Permalink
ArmPkg/MmCommunicationDxe: relay architected PI events to MM context
Browse files Browse the repository at this point in the history
PI defines a few architected events that have significance in the MM
context as well as in the non-secure DXE context. So register notify
handlers for these events, and relay them into the standalone MM world.

Signed-off-by: Ard Biesheuvel <[email protected]>
Reviewed-by: Jiewen Yao <[email protected]>
Reviewed-by: Achin Gupta <[email protected]>
  • Loading branch information
Ard Biesheuvel authored and mergify[bot] committed Dec 11, 2019
1 parent d3add11 commit 2fe25a7
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 2 deletions.
47 changes: 45 additions & 2 deletions ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,43 @@ GetMmCompatibility ()
return Status;
}

STATIC EFI_GUID* CONST mGuidedEventGuid[] = {
&gEfiEndOfDxeEventGroupGuid,
&gEfiEventExitBootServicesGuid,
&gEfiEventReadyToBootGuid,
};

STATIC EFI_EVENT mGuidedEvent[ARRAY_SIZE (mGuidedEventGuid)];

/**
Event notification that is fired when GUIDed Event Group is signaled.
@param Event The Event that is being processed, not used.
@param Context Event Context, not used.
**/
STATIC
VOID
EFIAPI
MmGuidedEventNotify (
IN EFI_EVENT Event,
IN VOID *Context
)
{
EFI_MM_COMMUNICATE_HEADER Header;
UINTN Size;

//
// Use Guid to initialize EFI_SMM_COMMUNICATE_HEADER structure
//
CopyGuid (&Header.HeaderGuid, Context);
Header.MessageLength = 1;
Header.Data[0] = 0;

Size = sizeof (Header);
MmCommunicationCommunicate (&mMmCommunication, &Header, &Size);
}

/**
The Entry Point for MM Communication
Expand All @@ -281,6 +318,7 @@ MmCommunicationInitialize (
)
{
EFI_STATUS Status;
UINTN Index;

// Check if we can make the MM call
Status = GetMmCompatibility ();
Expand Down Expand Up @@ -345,8 +383,13 @@ MmCommunicationInitialize (
NULL,
&mSetVirtualAddressMapEvent
);
if (Status == EFI_SUCCESS) {
return Status;
ASSERT_EFI_ERROR (Status);

for (Index = 0; Index < ARRAY_SIZE (mGuidedEventGuid); Index++) {
Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_CALLBACK,
MmGuidedEventNotify, mGuidedEventGuid[Index],
mGuidedEventGuid[Index], &mGuidedEvent[Index]);
ASSERT_EFI_ERROR (Status);
}

gBS->UninstallProtocolInterface (
Expand Down
5 changes: 5 additions & 0 deletions ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@
[Protocols]
gEfiMmCommunicationProtocolGuid ## PRODUCES

[Guids]
gEfiEndOfDxeEventGroupGuid
gEfiEventExitBootServicesGuid
gEfiEventReadyToBootGuid

[Pcd.common]
gArmTokenSpaceGuid.PcdMmBufferBase
gArmTokenSpaceGuid.PcdMmBufferSize
Expand Down

0 comments on commit 2fe25a7

Please sign in to comment.