On Fri, 6 Dec 2019 at 15:29, Ard Biesheuvel <ard.biesheu...@arm.com> wrote: > > From: Ard Biesheuvel <ard.biesheu...@linaro.org> > > The MM communicate 2 protocol was introduced to factor out the mismatch > between traditional MM, which requires the physical address of the MM > buffer to be passed, and standalone MM, which copies the MM communicate > buffer data into a separate buffer, requiring the virtual address. For > this reason, MM communicate 2 carries both addresses, allowing the > implementation to decide which address it needs. > > This hides this implementation detail from the callers of the protocol, > which simply passes both addresses without having to reason about what the > implementation of the protocol actually needs. > > Note that the old version of the protocol is retained, in order to support > existing implementations that don't require this flexibility. > > Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org> > --- > MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c | 79 ++++++++++++++++++++ > MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf | 1 + > 2 files changed, 80 insertions(+) >
The following hunk needs to be added to this patch, but it got lost somehow. Apologies. --- a/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c +++ b/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c @@ -1837,6 +1837,7 @@ SmmIplEntry ( &mSmmIplHandle, &gEfiSmmBase2ProtocolGuid, &mSmmBase2, &gEfiSmmCommunicationProtocolGuid, &mSmmCommunication, + &gEfiMmCommunication2ProtocolGuid, &mMmCommunication2, NULL ); ASSERT_EFI_ERROR (Status); > diff --git a/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c > b/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c > index 1cf8c93227a3..d86b8b4a6a29 100644 > --- a/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c > +++ b/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.c > @@ -10,6 +10,7 @@ > > #include <Protocol/SmmBase2.h> > #include <Protocol/SmmCommunication.h> > +#include <Protocol/MmCommunication2.h> > #include <Protocol/SmmAccess2.h> > #include <Protocol/SmmConfiguration.h> > #include <Protocol/SmmControl2.h> > @@ -118,6 +119,39 @@ SmmCommunicationCommunicate ( > IN OUT UINTN *CommSize OPTIONAL > ); > > +/** > + Communicates with a registered handler. > + > + This function provides a service to send and receive messages from a > registered UEFI service. > + > + @param[in] This The EFI_MM_COMMUNICATION_PROTOCOL instance. > + @param[in] CommBufferPhysical Physical address of the MM communication > buffer > + @param[in] CommBufferVirtual Virtual address of the MM communication > buffer > + @param[in] CommSize The size of the data buffer being passed > in. On exit, the size of data > + being returned. Zero if the handler does > not wish to reply with any data. > + This parameter is optional and may be NULL. > + > + @retval EFI_SUCCESS The message was successfully posted. > + @retval EFI_INVALID_PARAMETER The CommBuffer was NULL. > + @retval EFI_BAD_BUFFER_SIZE The buffer is too large for the MM > implementation. > + If this error is returned, the > MessageLength field > + in the CommBuffer header or the integer > pointed by > + CommSize, are updated to reflect the > maximum payload > + size the implementation can accommodate. > + @retval EFI_ACCESS_DENIED The CommunicateBuffer parameter or CommSize > parameter, > + if not omitted, are in address range that > cannot be > + accessed by the MM environment. > + > +**/ > +EFI_STATUS > +EFIAPI > +SmmCommunicationMmCommunicate2 ( > + IN CONST EFI_MM_COMMUNICATION2_PROTOCOL *This, > + IN OUT VOID *CommBufferPhysical, > + IN OUT VOID *CommBufferVirtual, > + IN OUT UINTN *CommSize OPTIONAL > + ); > + > /** > Event notification that is fired every time a gEfiSmmConfigurationProtocol > installs. > > @@ -240,6 +274,13 @@ EFI_SMM_COMMUNICATION_PROTOCOL mSmmCommunication = { > SmmCommunicationCommunicate > }; > > +// > +// PI 1.7 MM Communication Protocol 2 instance > +// > +EFI_MM_COMMUNICATION2_PROTOCOL mMmCommunication2 = { > + SmmCommunicationMmCommunicate2 > +}; > + > // > // SMM Core Private Data structure that contains the data shared between > // the SMM IPL and the SMM Core. > @@ -576,6 +617,44 @@ SmmCommunicationCommunicate ( > return (Status == EFI_SUCCESS) ? EFI_SUCCESS : EFI_NOT_FOUND; > } > > +/** > + Communicates with a registered handler. > + > + This function provides a service to send and receive messages from a > registered UEFI service. > + > + @param[in] This The EFI_MM_COMMUNICATION_PROTOCOL instance. > + @param[in] CommBufferPhysical Physical address of the MM communication > buffer > + @param[in] CommBufferVirtual Virtual address of the MM communication > buffer > + @param[in] CommSize The size of the data buffer being passed > in. On exit, the size of data > + being returned. Zero if the handler does > not wish to reply with any data. > + This parameter is optional and may be NULL. > + > + @retval EFI_SUCCESS The message was successfully posted. > + @retval EFI_INVALID_PARAMETER The CommBuffer was NULL. > + @retval EFI_BAD_BUFFER_SIZE The buffer is too large for the MM > implementation. > + If this error is returned, the > MessageLength field > + in the CommBuffer header or the integer > pointed by > + CommSize, are updated to reflect the > maximum payload > + size the implementation can accommodate. > + @retval EFI_ACCESS_DENIED The CommunicateBuffer parameter or CommSize > parameter, > + if not omitted, are in address range that > cannot be > + accessed by the MM environment. > + > +**/ > +EFI_STATUS > +EFIAPI > +SmmCommunicationMmCommunicate2 ( > + IN CONST EFI_MM_COMMUNICATION2_PROTOCOL *This, > + IN OUT VOID *CommBufferPhysical, > + IN OUT VOID *CommBufferVirtual, > + IN OUT UINTN *CommSize OPTIONAL > + ) > +{ > + return SmmCommunicationCommunicate (&mSmmCommunication, > + CommBufferPhysical, > + CommSize); > +} > + > /** > Event notification that is fired when GUIDed Event Group is signaled. > > diff --git a/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf > b/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf > index b6b1bbcdac51..0a05d593522e 100644 > --- a/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf > +++ b/MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf > @@ -50,6 +50,7 @@ [LibraryClasses] > [Protocols] > gEfiSmmBase2ProtocolGuid ## PRODUCES > gEfiSmmCommunicationProtocolGuid ## PRODUCES > + gEfiMmCommunication2ProtocolGuid ## PRODUCES > gEfiSmmAccess2ProtocolGuid ## CONSUMES > ## NOTIFY > ## CONSUMES > -- > 2.17.1 > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#51992): https://edk2.groups.io/g/devel/message/51992 Mute This Topic: https://groups.io/mt/67497118/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-