public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Ard Biesheuvel" <ard.biesheuvel@linaro.org>
To: Ard Biesheuvel <ard.biesheuvel@arm.com>
Cc: edk2-devel-groups-io <devel@edk2.groups.io>,
	Michael D Kinney <michael.d.kinney@intel.com>,
	 Leif Lindholm <leif.lindholm@linaro.org>,
	Liming Gao <liming.gao@intel.com>,  Hao A Wu <hao.a.wu@intel.com>,
	Eric Dong <eric.dong@intel.com>, Ray Ni <ray.ni@intel.com>,
	 Achin Gupta <achin.gupta@arm.com>,
	Jiewen Yao <jiewen.yao@intel.com>
Subject: Re: [PATCH 2/7] MdeModulePkg/SmmIpl: expose MM communicate 2 protocol
Date: Fri, 6 Dec 2019 16:01:21 +0000	[thread overview]
Message-ID: <CAKv+Gu8yLer_B2vorWeQd0szo3n8_ye2py3zmAMAnMa33bex+g@mail.gmail.com> (raw)
In-Reply-To: <20191206152946.624-3-ard.biesheuvel@arm.com>

On Fri, 6 Dec 2019 at 15:29, Ard Biesheuvel <ard.biesheuvel@arm.com> wrote:
>
> From: Ard Biesheuvel <ard.biesheuvel@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.biesheuvel@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
>

  reply	other threads:[~2019-12-06 16:01 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-06 15:29 [PATCH 0/7] New implementation of MM communicate for standalone MM Ard Biesheuvel
2019-12-06 15:29 ` [PATCH 1/7] MdePkg: introduce MM communicate 2 protocol Ard Biesheuvel
2019-12-06 15:29 ` [PATCH 2/7] MdeModulePkg/SmmIpl: expose " Ard Biesheuvel
2019-12-06 16:01   ` Ard Biesheuvel [this message]
2019-12-06 15:29 ` [PATCH 3/7] ArmPkg/MmCommunicationDxe: expose MM Communicate " Ard Biesheuvel
2019-12-06 15:29 ` [PATCH 4/7] MdeModulePkg/VariableInfo: switch to MM communicate " Ard Biesheuvel
2019-12-06 15:29 ` [PATCH 5/7] MdeModulePkg/FaultTolerantWriteSmmDxe: " Ard Biesheuvel
2019-12-06 15:29 ` [PATCH 6/7] MdeModulePkg/VariableSmmRuntimeDxe: " Ard Biesheuvel
2019-12-06 15:29 ` [PATCH 7/7] StandaloneMmPkg: " Ard Biesheuvel
2020-01-03 13:03 ` [PATCH 0/7] New implementation of MM communicate for standalone MM Ard Biesheuvel
2020-01-06  1:16   ` Liming Gao
2020-03-06 10:38     ` Ard Biesheuvel
2020-03-11 18:12       ` [piwg] " Doran, Mark
2020-03-11 18:20         ` Ard Biesheuvel
2020-03-11 18:24         ` Shaw, Kevin W

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAKv+Gu8yLer_B2vorWeQd0szo3n8_ye2py3zmAMAnMa33bex+g@mail.gmail.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox