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]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to