public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH 0/2] EFI_MM_COMMUNICATION_PROTOCOL as defined in PI v1.5 Vol 4
@ 2017-06-12 19:37 Supreeth Venkatesh
  2017-06-12 19:37 ` [PATCH 1/2] MdePkg: Initial Version of MM Communication Protocol Supreeth Venkatesh
  2017-06-12 19:37 ` [PATCH 2/2] MdePkg: Maintain backwards compatibility between MM/SMM Supreeth Venkatesh
  0 siblings, 2 replies; 3+ messages in thread
From: Supreeth Venkatesh @ 2017-06-12 19:37 UTC (permalink / raw)
  To: edk2-devel
  Cc: leif.lindholm, michael.d.kinney, liming.gao, achin.gupta,
	supreeth.venkatesh

***
5.7 MM Communication Protocol

EFI_MM_COMMUNICATION_PROTOCOL

Summary
This protocol provides a means of communicating between drivers outside of
MM and MMI handlers inside of MM.

GUID
#define EFI_MM_COMMUNICATION_PROTOCOL_GUID \
{ 0xc68ed8e2, 0x9dc6, 0x4cbd, 0x9d, 0x94, 0xdb, 0x65, 0xac, 0xc5, 0xc3, 0x32 }

Prototype
typedef struct _EFI_MM_COMMUNICATION_PROTOCOL {
EFI_MM_COMMUNICATE Communicate;
} EFI_MM_COMMUNICATION_PROTOCOL;

Members
Communicate - Sends/receives a message for a registered handler. See the
Communicate() function description.

Description
This protocol provides runtime services for communicating between DXE drivers
and a registered MMI handler.

EFI_MM_COMMUNICATION_PROTOCOL.Communicate()

Summary
Communicates with a registered handler.

Prototype
typedef
EFI_STATUS
(EFIAPI *EFI_MM_COMMUNICATE) (
IN CONST EFI_MM_COMMUNICATION_PROTOCOL *This,
IN OUT VOID *CommBuffer,
IN OUT UINTN *CommSize OPTIONAL
);

Parameters
This - The EFI_MM_COMMUNICATION_PROTOCOL instance.
CommBuffer - Pointer to the buffer to convey into MMRAM.
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.

Description
This function provides a service to send and receive messages from a registered
UEFI service. The EFI_MM_COMMUNICATION_PROTOCOL driver is responsible for
doing any of the copies such that the data lives in boot-service-accessible RAM.
A given implementation of the EFI_MM_COMMUNICATION_PROTOCOL may choose
to use the EFI_MM_CONTROL_PROTOCOL for effecting the mode transition, or it may
use some other method.
The agent invoking the communication interface at runtime may be
virtually mapped.
The MM infrastructure code and handlers, on the other hand, execute
in physical mode.
As a result, the non-MM agent, which may be executing in the virtual-mode
OS context (as a result of an OS invocation of the UEFI
SetVirtualAddressMap() service), should use a contiguous
memory buffer with a physical address before invoking this service.
If the virtual address of the buffer is used, the MM Driver may
not know how to do the appropriate virtual-to-physical conversion.
To avoid confusion in interpreting frames, the CommunicateBuffer
parameter should always begin with EFI_MM_COMMUNICATE_HEADER,
which is defined in Related Definitions below.
The header data is mandatory for messages sent into the MM agent.
If the CommSize parameter is omitted the MessageLength field in the
EFI_MM_COMMUNICATE_HEADER, in conjunction with the size of the header itself,
can be used to ascertain the total size of the communication payload.
If the MessageLength is zero, or too large for the MM implementation to manage,
the MM implementation must update the MessageLength to reflect the size of the
Data buffer that it can tolerate.
If the CommSize parameter is passed into the call, but the integer it points to,
has a value of 0, then this must be updated to reflect the maximum size of the
CommBuffer that the implementation can tolerate.
Once inside of MM, the MM infrastructure will call all registered handlers with
the same HandlerType as the GUID specified by HeaderGuid and the
CommBuffer pointing to Data.
This function is not reentrant.
The standard header is used at the beginning of the
EFI_MM_INITIALIATION_HEADER structure during
MM initialization.
See "Related Definitions" below for more information.

Related Definitions
typedef struct {
EFI_GUID HeaderGuid;
UINTN MessageLength;
UINT8 Data[ANYSIZE_ARRAY];
} EFI_MM_COMMUNICATE_HEADER;

HeaderGuid - Allows for disambiguation of the message format. Type EFI_GUID is
defined in InstallProtocolInterface() in the UEFI Specification.
MessageLength - Describes the size of Data (in bytes) and does not include
the size of the header.
Data - Designates an array of bytes that is MessageLength in size.

typedef struct {
EFI_MM_COMMUNICATE_HEADER Header;
EFI_SYSTEM_TABLE *SystemTable;
} EFI_MM_INITIALIZATION_HEADER;

#define EFI_MM_INITIALIZATION_GUID \
{0x99be0d8f, 0x3548, 0x48aa, {0xb5, 0x77, 0xfc, 0xfb, 0xa5, 0x6a, 0x67, 0xf7}}

Header - A standard MM communication buffer header, where
HeaderGuid is set to EFI_MM_INITIALIZATION_GUID.
SystemTable - A pointer to the UEFI System Table. As with DXE driver
initialization, there is no guarantee that the entries in this structure
which rely on architectural protocols are implemented at the time
when this event is generated.

Status Codes Returned
EFI_SUCCESS - The message was successfully posted
EFI_INVALID_PARAMETER - The buffer was NULL.
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.
See the function description above for more details.
EFI_ACCESS_DENIED - The CommunicateBuffer parameter or CommSize parameter,
if not omitted, are in address range that cannot be accessed by the MM environment.
***

Supreeth Venkatesh (2):
  MdePkg: Initial Version of MM Communication Protocol.
  MdePkg: Maintain backwards compatibility between MM/SMM.

 MdePkg/Include/Protocol/MmCommunication.h  | 75 ++++++++++++++++++++++++++++++
 MdePkg/Include/Protocol/SmmCommunication.h | 52 +++++----------------
 MdePkg/Include/Uefi/UefiAcpiDataTable.h    |  4 +-
 MdePkg/MdePkg.dec                          |  3 ++
 4 files changed, 93 insertions(+), 41 deletions(-)
 create mode 100644 MdePkg/Include/Protocol/MmCommunication.h

--
2.7.4



^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 1/2] MdePkg: Initial Version of MM Communication Protocol.
  2017-06-12 19:37 [PATCH 0/2] EFI_MM_COMMUNICATION_PROTOCOL as defined in PI v1.5 Vol 4 Supreeth Venkatesh
@ 2017-06-12 19:37 ` Supreeth Venkatesh
  2017-06-12 19:37 ` [PATCH 2/2] MdePkg: Maintain backwards compatibility between MM/SMM Supreeth Venkatesh
  1 sibling, 0 replies; 3+ messages in thread
From: Supreeth Venkatesh @ 2017-06-12 19:37 UTC (permalink / raw)
  To: edk2-devel
  Cc: leif.lindholm, michael.d.kinney, liming.gao, achin.gupta,
	supreeth.venkatesh

This patch adds initial version of MM Communication Protocol as defined
in PI v1.5 Specification Volume 4.
Also, It includes MM Communication Protocol in MdePkg dec file.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Supreeth Venkatesh <supreeth.venkatesh@arm.com>
---
 MdePkg/Include/Protocol/MmCommunication.h | 75 +++++++++++++++++++++++++++++++
 MdePkg/MdePkg.dec                         |  3 ++
 2 files changed, 78 insertions(+)
 create mode 100644 MdePkg/Include/Protocol/MmCommunication.h

diff --git a/MdePkg/Include/Protocol/MmCommunication.h b/MdePkg/Include/Protocol/MmCommunication.h
new file mode 100644
index 0000000..ea3ba10
--- /dev/null
+++ b/MdePkg/Include/Protocol/MmCommunication.h
@@ -0,0 +1,75 @@
+/** @file
+  EFI MM Communication Protocol as defined in the PI 1.5 specification.
+
+  This protocol provides a means of communicating between drivers outside of MM and MMI
+  handlers inside of MM.
+
+  Copyright (c) 2016 - 2017, ARM Limited. All rights reserved.
+
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _MM_COMMUNICATION_H_
+#define _MM_COMMUNICATION_H_
+
+//
+// Need include this header file for EFI_MM_COMMUNICATE_HEADER data structure.
+//
+#include <Uefi/UefiAcpiDataTable.h>
+
+#define EFI_MM_COMMUNICATION_PROTOCOL_GUID \
+  { \
+    0xc68ed8e2, 0x9dc6, 0x4cbd, { 0x9d, 0x94, 0xdb, 0x65, 0xac, 0xc5, 0xc3, 0x32 } \
+  }
+
+typedef struct _EFI_MM_COMMUNICATION_PROTOCOL  EFI_MM_COMMUNICATION_PROTOCOL;
+
+/**
+  Communicates with a registered handler.
+
+  This function provides a service to send and receive messages to the
+  MM environment from a registered UEFI service. 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().
+
+  @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.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
+**/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_MM_COMMUNICATE)(
+  IN CONST EFI_MM_COMMUNICATION_PROTOCOL   *This,
+  IN OUT VOID                              *CommBuffer,
+  IN OUT UINTN                             *CommSize    OPTIONAL
+  );
+
+//
+// EFI MM Communication Protocol provides runtime services for communicating
+// between DXE drivers and a registered MMI/SMI handler.
+//
+struct _EFI_MM_COMMUNICATION_PROTOCOL {
+  EFI_MM_COMMUNICATE  Communicate;
+};
+
+extern EFI_GUID gEfiMmCommunicationProtocolGuid;
+
+#endif
diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec
index 7a7504b..149783b 100644
--- a/MdePkg/MdePkg.dec
+++ b/MdePkg/MdePkg.dec
@@ -1050,6 +1050,9 @@
   ## Include/Protocol/SmmCommunication.h
   gEfiSmmCommunicationProtocolGuid  = { 0xc68ed8e2, 0x9dc6, 0x4cbd, { 0x9d, 0x94, 0xdb, 0x65, 0xac, 0xc5, 0xc3, 0x32 }}
 
+  ## Include/Protocol/MmCommunication.h
+  gEfiMmCommunicationProtocolGuid  = { 0xc68ed8e2, 0x9dc6, 0x4cbd, { 0x9d, 0x94, 0xdb, 0x65, 0xac, 0xc5, 0xc3, 0x32 }}
+
   ## Include/Protocol/SmmStatusCode.h
   gEfiSmmStatusCodeProtocolGuid   = { 0x6afd2b77, 0x98c1, 0x4acd, { 0xa6, 0xf9, 0x8a, 0x94, 0x39, 0xde, 0xf, 0xb1}}
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/2] MdePkg: Maintain backwards compatibility between MM/SMM.
  2017-06-12 19:37 [PATCH 0/2] EFI_MM_COMMUNICATION_PROTOCOL as defined in PI v1.5 Vol 4 Supreeth Venkatesh
  2017-06-12 19:37 ` [PATCH 1/2] MdePkg: Initial Version of MM Communication Protocol Supreeth Venkatesh
@ 2017-06-12 19:37 ` Supreeth Venkatesh
  1 sibling, 0 replies; 3+ messages in thread
From: Supreeth Venkatesh @ 2017-06-12 19:37 UTC (permalink / raw)
  To: edk2-devel
  Cc: leif.lindholm, michael.d.kinney, liming.gao, achin.gupta,
	supreeth.venkatesh

PI v1.5 Volume 4 replaces EFI_SMM_COMMUNICATION_PROTOCOL with
EFI_MM_COMMUNICATION_PROTOCOL. Hence, modify the SMM Communication
protocol header file to include the EFI_MM_COMMUNICATION_PROTOCOL
header.
Also, PI v1.5 Volume 4 replaces the data structure
EFI_SMM_COMMUNICATE_HEADER with EFI_MM_COMMUNICATE_HEADER.
Hence, modify UefiAcpiDataTable header file
to maintain backwards compatibility.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Supreeth Venkatesh <supreeth.venkatesh@arm.com>
---
 MdePkg/Include/Protocol/SmmCommunication.h | 52 +++++++-----------------------
 MdePkg/Include/Uefi/UefiAcpiDataTable.h    |  4 ++-
 2 files changed, 15 insertions(+), 41 deletions(-)

diff --git a/MdePkg/Include/Protocol/SmmCommunication.h b/MdePkg/Include/Protocol/SmmCommunication.h
index c284e55..8edebc2 100644
--- a/MdePkg/Include/Protocol/SmmCommunication.h
+++ b/MdePkg/Include/Protocol/SmmCommunication.h
@@ -5,10 +5,12 @@
   handlers inside of SMM.  
 
   Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
-  This program and the accompanying materials                          
-  are licensed and made available under the terms and conditions of the BSD License         
-  which accompanies this distribution.  The full text of the license may be found at        
-  http://opensource.org/licenses/bsd-license.php                                            
+  Copyright (c) 2016 - 2017, ARM Limited. All rights reserved.<BR>
+
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
 
   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
@@ -19,45 +21,15 @@
 #define _SMM_COMMUNICATION_H_
 
 //
-// Need include this header file for EFI_SMM_COMMUNICATE_HEADER data structure.
+// Include the EFI_MM_COMMUNICATION_PROTOCOL header for actual definitions. This
+// header is used to maintain backwards compatibility.
 //
-#include <Uefi/UefiAcpiDataTable.h>
-
-#define EFI_SMM_COMMUNICATION_PROTOCOL_GUID \
-  { \
-    0xc68ed8e2, 0x9dc6, 0x4cbd, { 0x9d, 0x94, 0xdb, 0x65, 0xac, 0xc5, 0xc3, 0x32 } \
-  }
-
-typedef struct _EFI_SMM_COMMUNICATION_PROTOCOL  EFI_SMM_COMMUNICATION_PROTOCOL;
+#include <Protocol/MmCommunication.h>
 
-/**
-  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_SMM_COMMUNICATION_PROTOCOL instance.
-  @param[in] CommBuffer          A pointer to the buffer to convey into SMRAM.
-  @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.
-
-  @retval EFI_SUCCESS            The message was successfully posted.
-  @retval EFI_INVALID_PARAMETER  The CommBuffer was NULL.
-**/
-typedef
-EFI_STATUS
-(EFIAPI *EFI_SMM_COMMUNICATE2)(
-  IN CONST EFI_SMM_COMMUNICATION_PROTOCOL  *This,
-  IN OUT VOID                              *CommBuffer,
-  IN OUT UINTN                             *CommSize
-  );
+#define EFI_SMM_COMMUNICATION_PROTOCOL_GUID EFI_MM_COMMUNICATION_PROTOCOL_GUID
 
-///
-/// EFI SMM Communication Protocol provides runtime services for communicating
-/// between DXE drivers and a registered SMI handler.
-///
-struct _EFI_SMM_COMMUNICATION_PROTOCOL {
-  EFI_SMM_COMMUNICATE2  Communicate;
-};
+typedef EFI_MM_COMMUNICATION_PROTOCOL       EFI_SMM_COMMUNICATION_PROTOCOL;
+typedef EFI_MM_COMMUNICATE                  EFI_SMM_COMMUNICATE2;
 
 extern EFI_GUID gEfiSmmCommunicationProtocolGuid;
 
diff --git a/MdePkg/Include/Uefi/UefiAcpiDataTable.h b/MdePkg/Include/Uefi/UefiAcpiDataTable.h
index 957721f..f0043a3 100644
--- a/MdePkg/Include/Uefi/UefiAcpiDataTable.h
+++ b/MdePkg/Include/Uefi/UefiAcpiDataTable.h
@@ -52,7 +52,9 @@ typedef struct {
   /// Designates an array of bytes that is MessageLength in size.
   ///
   UINT8     Data[1];
-} EFI_SMM_COMMUNICATE_HEADER;
+} EFI_MM_COMMUNICATE_HEADER;
+
+typedef EFI_MM_COMMUNICATE_HEADER EFI_SMM_COMMUNICATE_HEADER;
 
 #pragma pack()
 
-- 
2.7.4



^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2017-06-12 19:36 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-06-12 19:37 [PATCH 0/2] EFI_MM_COMMUNICATION_PROTOCOL as defined in PI v1.5 Vol 4 Supreeth Venkatesh
2017-06-12 19:37 ` [PATCH 1/2] MdePkg: Initial Version of MM Communication Protocol Supreeth Venkatesh
2017-06-12 19:37 ` [PATCH 2/2] MdePkg: Maintain backwards compatibility between MM/SMM Supreeth Venkatesh

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox