public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Leif Lindholm" <leif@nuviainc.com>
To: Ard Biesheuvel <ard.biesheuvel@arm.com>
Cc: devel@edk2.groups.io,
	Michael D Kinney <michael.d.kinney@intel.com>,
	Liming Gao <liming.gao@intel.com>,
	Jian J Wang <jian.j.wang@intel.com>,
	Hao A Wu <hao.a.wu@intel.com>,
	Sami Mujawar <sami.mujawar@arm.com>,
	Jiewen Yao <jiewen.yao@intel.com>
Subject: Re: [PATCH resend 3/7] ArmPkg/MmCommunicationDxe: expose MM Communicate 2 protocol
Date: Tue, 12 May 2020 10:30:35 +0100	[thread overview]
Message-ID: <20200512093035.GX21486@vanye> (raw)
In-Reply-To: <20200506172734.2475-4-ard.biesheuvel@arm.com>

On Wed, May 06, 2020 at 19:27:30 +0200, Ard Biesheuvel wrote:
> Implement the new MmCommunication2 protocol which supports the use
> of standalone MM at runtime inside an address space that has been
> virtually remapped by the OS.
> 
> Note that the implementation of the old MM Communicate protocol is
> removed: it never worked correctly so there is no point in keeping it.
> 
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@arm.com>

Reviewed-by: Leif Lindholm <leif@nuviainc.com>
I agree the old protocol should be dropped. Any current users would be
well warned that their foundation is a swamp.

/
    Leif

> ---
>  ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c   | 81 +++++++++-----------
>  ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf |  6 +-
>  2 files changed, 41 insertions(+), 46 deletions(-)
> 
> diff --git a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c
> index a9e06be1adc2..9457eaf1d809 100644
> --- a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c
> +++ b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c
> @@ -1,6 +1,6 @@
>  /** @file
>  
> -  Copyright (c) 2016-2018, ARM Limited. All rights reserved.
> +  Copyright (c) 2016-2020, ARM Limited. All rights reserved.
>  
>    SPDX-License-Identifier: BSD-2-Clause-Patent
>  
> @@ -16,7 +16,7 @@
>  #include <Library/UefiBootServicesTableLib.h>
>  #include <Library/UefiRuntimeServicesTableLib.h>
>  
> -#include <Protocol/MmCommunication.h>
> +#include <Protocol/MmCommunication2.h>
>  
>  #include <IndustryStandard/ArmStdSmc.h>
>  
> @@ -39,39 +39,34 @@ STATIC EFI_HANDLE  mMmCommunicateHandle;
>  /**
>    Communicates with a registered handler.
>  
> -  This function provides an interface to send and receive messages to the
> -  Standalone MM environment on behalf of UEFI services.  This function is part
> -  of the MM Communication Protocol that may be called in physical mode prior to
> -  SetVirtualAddressMap() and in virtual mode after SetVirtualAddressMap().
> +  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, out] CommBuffer          A pointer to the buffer to convey
> -                                      into MMRAM.
> -  @param[in, out] CommSize            The size of the data buffer being
> -                                      passed in. This is optional.
> +  @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  CommBufferPhysical was NULL or CommBufferVirtual 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.
>  
> -  @retval EFI_SUCCESS                 The message was successfully posted.
> -  @retval EFI_INVALID_PARAMETER       The CommBuffer was NULL.
> -  @retval EFI_BAD_BUFFER_SIZE         The buffer size is incorrect 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
>  **/
> -STATIC
>  EFI_STATUS
>  EFIAPI
> -MmCommunicationCommunicate (
> -  IN CONST EFI_MM_COMMUNICATION_PROTOCOL  *This,
> -  IN OUT VOID                             *CommBuffer,
> -  IN OUT UINTN                            *CommSize OPTIONAL
> +MmCommunication2Communicate (
> +  IN CONST EFI_MM_COMMUNICATION2_PROTOCOL   *This,
> +  IN OUT VOID                               *CommBufferPhysical,
> +  IN OUT VOID                               *CommBufferVirtual,
> +  IN OUT UINTN                              *CommSize OPTIONAL
>    )
>  {
>    EFI_MM_COMMUNICATE_HEADER   *CommunicateHeader;
> @@ -87,11 +82,11 @@ MmCommunicationCommunicate (
>    //
>    // Check parameters
>    //
> -  if (CommBuffer == NULL) {
> +  if (CommBufferVirtual == NULL) {
>      return EFI_INVALID_PARAMETER;
>    }
>  
> -  CommunicateHeader = CommBuffer;
> +  CommunicateHeader = CommBufferVirtual;
>    // CommBuffer is a mandatory parameter. Hence, Rely on
>    // MessageLength + Header to ascertain the
>    // total size of the communication payload rather than
> @@ -136,7 +131,7 @@ MmCommunicationCommunicate (
>    CommunicateSmcArgs.Arg1 = 0;
>  
>    // Copy Communication Payload
> -  CopyMem ((VOID *)mNsCommBuffMemRegion.VirtualBase, CommBuffer, BufferSize);
> +  CopyMem ((VOID *)mNsCommBuffMemRegion.VirtualBase, CommBufferVirtual, BufferSize);
>  
>    // comm_buffer_address (64-bit physical address)
>    CommunicateSmcArgs.Arg2 = (UINTN)mNsCommBuffMemRegion.PhysicalBase;
> @@ -149,7 +144,7 @@ MmCommunicationCommunicate (
>  
>    switch (CommunicateSmcArgs.Arg0) {
>    case ARM_SMC_MM_RET_SUCCESS:
> -    ZeroMem (CommBuffer, BufferSize);
> +    ZeroMem (CommBufferVirtual, BufferSize);
>      // On successful return, the size of data being returned is inferred from
>      // MessageLength + Header.
>      CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)mNsCommBuffMemRegion.VirtualBase;
> @@ -158,7 +153,7 @@ MmCommunicationCommunicate (
>                   sizeof (CommunicateHeader->MessageLength);
>  
>      CopyMem (
> -      CommBuffer,
> +      CommBufferVirtual,
>        (VOID *)mNsCommBuffMemRegion.VirtualBase,
>        BufferSize
>        );
> @@ -191,8 +186,8 @@ MmCommunicationCommunicate (
>  //
>  // MM Communication Protocol instance
>  //
> -EFI_MM_COMMUNICATION_PROTOCOL  mMmCommunication = {
> -  MmCommunicationCommunicate
> +STATIC EFI_MM_COMMUNICATION2_PROTOCOL  mMmCommunication2 = {
> +  MmCommunication2Communicate
>  };
>  
>  /**
> @@ -293,7 +288,7 @@ MmGuidedEventNotify (
>    Header.Data[0] = 0;
>  
>    Size = sizeof (Header);
> -  MmCommunicationCommunicate (&mMmCommunication, &Header, &Size);
> +  MmCommunication2Communicate (&mMmCommunication2, &Header, &Header, &Size);
>  }
>  
>  /**
> @@ -312,7 +307,7 @@ MmGuidedEventNotify (
>  **/
>  EFI_STATUS
>  EFIAPI
> -MmCommunicationInitialize (
> +MmCommunication2Initialize (
>    IN EFI_HANDLE         ImageHandle,
>    IN EFI_SYSTEM_TABLE  *SystemTable
>    )
> @@ -363,9 +358,9 @@ MmCommunicationInitialize (
>    // Install the communication protocol
>    Status = gBS->InstallProtocolInterface (
>                    &mMmCommunicateHandle,
> -                  &gEfiMmCommunicationProtocolGuid,
> +                  &gEfiMmCommunication2ProtocolGuid,
>                    EFI_NATIVE_INTERFACE,
> -                  &mMmCommunication
> +                  &mMmCommunication2
>                    );
>    if (EFI_ERROR(Status)) {
>      DEBUG ((DEBUG_ERROR, "MmCommunicationInitialize: "
> @@ -402,8 +397,8 @@ MmCommunicationInitialize (
>  UninstallProtocol:
>    gBS->UninstallProtocolInterface (
>           mMmCommunicateHandle,
> -         &gEfiMmCommunicationProtocolGuid,
> -         &mMmCommunication
> +         &gEfiMmCommunication2ProtocolGuid,
> +         &mMmCommunication2
>           );
>  
>  CleanAddedMemorySpace:
> diff --git a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf
> index 505228704ea5..2465fb77c58e 100644
> --- a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf
> +++ b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf
> @@ -2,7 +2,7 @@
>  #
>  #  DXE MM Communicate driver
>  #
> -#  Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
> +#  Copyright (c) 2016 - 2020, ARM Limited. All rights reserved.
>  #
>  #  SPDX-License-Identifier: BSD-2-Clause-Patent
>  #
> @@ -14,7 +14,7 @@ [Defines]
>    FILE_GUID                      = 09EE81D3-F15E-43F4-85B4-CB9873DA5D6B
>    MODULE_TYPE                    = DXE_RUNTIME_DRIVER
>    VERSION_STRING                 = 1.0
> -  ENTRY_POINT                    = MmCommunicationInitialize
> +  ENTRY_POINT                    = MmCommunication2Initialize
>  
>  #
>  # The following is for reference only and not required by
> @@ -40,7 +40,7 @@ [LibraryClasses]
>    UefiDriverEntryPoint
>  
>  [Protocols]
> -  gEfiMmCommunicationProtocolGuid              ## PRODUCES
> +  gEfiMmCommunication2ProtocolGuid              ## PRODUCES
>  
>  [Guids]
>    gEfiEndOfDxeEventGroupGuid
> -- 
> 2.17.1
> 

  reply	other threads:[~2020-05-12  9:30 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-06 17:27 [PATCH resend 0/7] Add support for MM communicate2 protocol (PI 1.7a) Ard Biesheuvel
2020-05-06 17:27 ` [PATCH resend 1/7] MdePkg: introduce MM communicate 2 protocol Ard Biesheuvel
2020-05-12 17:09   ` [edk2-devel] " Sami Mujawar
2020-05-06 17:27 ` [PATCH resend 2/7] MdeModulePkg/SmmIpl: expose " Ard Biesheuvel
2020-05-12 17:09   ` [edk2-devel] " Sami Mujawar
2020-05-06 17:27 ` [PATCH resend 3/7] ArmPkg/MmCommunicationDxe: expose MM Communicate " Ard Biesheuvel
2020-05-12  9:30   ` Leif Lindholm [this message]
2020-05-12 17:21   ` [edk2-devel] " Sami Mujawar
2020-05-06 17:27 ` [PATCH resend 4/7] MdeModulePkg/VariableInfo: switch to MM communicate " Ard Biesheuvel
2020-05-06 17:53   ` [EXTERNAL] [edk2-devel] " Bret Barkelew
2020-05-12 17:10   ` Sami Mujawar
2020-05-06 17:27 ` [PATCH resend 5/7] MdeModulePkg/FaultTolerantWriteSmmDxe: switch to MM communicate 2 Ard Biesheuvel
2020-05-12 17:10   ` [edk2-devel] " Sami Mujawar
2020-05-06 17:27 ` [PATCH resend 6/7] MdeModulePkg/VariableSmmRuntimeDxe: " Ard Biesheuvel
2020-05-12 17:10   ` [edk2-devel] " Sami Mujawar
2020-05-06 17:27 ` [PATCH resend 7/7] StandaloneMmPkg: switch to MM communicate 2 protocol Ard Biesheuvel
2020-05-12 17:10   ` [edk2-devel] " Sami Mujawar
2020-05-11 14:08 ` [edk2-devel] [PATCH resend 0/7] Add support for MM communicate2 protocol (PI 1.7a) Liming Gao
2020-05-11 14:09   ` Ard Biesheuvel
2020-05-11 14:32     ` Liming Gao
2020-05-12 21:52       ` Ard Biesheuvel

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=20200512093035.GX21486@vanye \
    --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