Thanks for finding these. I missed the return data type completely and agree that @retval should be used. Will update the patch in v5.
Regards, Kun From: Laszlo Ersek<mailto:ler...@redhat.com> Sent: Wednesday, March 3, 2021 07:34 To: Kun Qin<mailto:ku...@outlook.com>; devel@edk2.groups.io<mailto:devel@edk2.groups.io> Cc: Michael D Kinney<mailto:michael.d.kin...@intel.com>; Liming Gao<mailto:gaolim...@byosoft.com.cn>; Zhiguang Liu<mailto:zhiguang....@intel.com>; Hao A Wu<mailto:hao.a...@intel.com>; Jiewen Yao<mailto:jiewen....@intel.com> Subject: Re: [PATCH v4 1/7] MdePkg: MmUnblockMemoryLib: Added definition and null instance On 03/02/21 21:04, Kun Qin wrote: > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3168 > > This interface provides an abstration layer to allow MM modules to access > requested areas that are outside of MMRAM. On MM model that blocks all > non-MMRAM accesses, areas requested through this API will be mapped or > unblocked for accessibility inside MM environment. > > For MM modules that need to access regions outside of MMRAMs, the agents > that set up these regions are responsible for invoking this API in order > for these memory areas to be accessible from inside MM. > > Example usages: > 1. To enable runtime cache feature for variable service, Variable MM > module will need to access the allocated runtime buffer. Thus the agent > sets up these buffers, VariableSmmRuntimeDxe, will need to invoke this > API to make these regions accessible by Variable MM. > 2. For TPM ACPI table to communicate to physical presence handler, the > corresponding NVS region has to be accessible from inside MM. Once the > NVS region are assigned, it needs to be unblocked thourgh this API. > > Cc: Michael D Kinney <michael.d.kin...@intel.com> > Cc: Liming Gao <gaolim...@byosoft.com.cn> > Cc: Zhiguang Liu <zhiguang....@intel.com> > Cc: Hao A Wu <hao.a...@intel.com> > Cc: Jiewen Yao <jiewen....@intel.com> > Cc: Laszlo Ersek <ler...@redhat.com> > > Signed-off-by: Kun Qin <ku...@outlook.com> > --- > > Notes: > v4: > - Added more commit message [Laszlo] The commit message looks great, thanks for that. However, I notice the only "RETURN_xxx" macro in the patch is the "RETURN_UNSUPPORTED" return code, in the Null library instance. My point was that the *interface* should be downgraded to RETURN_xxx (that is, the lib class header -- the EFI_STATUS return type should be RETURN_STATUS; the documented @retval codes should all be RETURN_xxx, and so on). An example here is the PcdLib class. It uses the RETURN_STATUS return type, and documents the RETURN_INVALID_PARAMETER retval in some spots. And then edk2 provides several lib instances: - MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf - MdePkg/Library/PeiPcdLib/PeiPcdLib.inf - MdePkg/Library/DxePcdLib/DxePcdLib.inf The first of these is "BASE" (with no particular module type restriction), the 2nd is "PEIM" (with PEIM PEI_CORE SEC restrictions), and the 3rd is "DXE_DRIVER" (restricted to all the remaining module types). Every instance uses RETURN_xxx just fine. ... In case I'm wrong, please correct me, of course. Yet another comment: I'm just noticing that "@return" is used with actual constants. That's wrong, "@retval" needs to be used for constants; "@return" is only suitable if you provide a natural language description without a constant. Example: @retval TRUE It is currently raining. @retval FALSE It is currently not raining. vs. @return Whether it's currently raining or not. Thanks! Laszlo > - Added UNI file [Hao] > > v3: > - Move interface to MdePkg [Hao, Liming, Jiewen] > - Remove Dxe prefix [Jiewen] > > v2: > - Resend with practical usage. No change [Hao] > > MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.c | 44 > ++++++++++++++++++++ > MdePkg/Include/Library/MmUnblockMemoryLib.h | 44 > ++++++++++++++++++++ > MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.inf | 34 > +++++++++++++++ > MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.uni | 21 ++++++++++ > MdePkg/MdePkg.dec | 5 +++ > MdePkg/MdePkg.dsc | 1 + > 6 files changed, 149 insertions(+) > > diff --git a/MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.c > b/MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.c > new file mode 100644 > index 000000000000..abdce41f10d1 > --- /dev/null > +++ b/MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.c > @@ -0,0 +1,44 @@ > +/** @file > + Null instance of MM Unblock Page Library. > + > + This library provides an interface to request non-MMRAM pages to be > mapped/unblocked > + from inside MM environment. > + > + For MM modules that need to access regions outside of MMRAMs, the agents > that set up > + these regions are responsible for invoking this API in order for these > memory areas > + to be accessed from inside MM. > + > + Copyright (c) Microsoft Corporation. > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <Uefi.h> > + > +/** > + This API provides a way to unblock certain data pages to be accessible > inside MM environment. > + > + @param UnblockAddress The address of buffer caller requests to > unblock, the address > + has to be page aligned. > + @param NumberOfPages The number of pages requested to be > unblocked from MM > + environment. > + > + @return EFI_SUCCESS The request goes through successfully. > + @return EFI_NOT_AVAILABLE_YET The requested functionality is not > produced yet. > + @return EFI_UNSUPPORTED The requested functionality is not > supported on current platform. > + @return EFI_SECURITY_VIOLATION The requested address failed to pass > security check for > + unblocking. > + @return EFI_INVALID_PARAMETER Input address either NULL pointer or not > page aligned. > + @return EFI_ACCESS_DENIED The request is rejected due to system has > passed certain boot > + phase. > + > +**/ > +EFI_STATUS > +EFIAPI > +MmUnblockMemoryRequest ( > + IN EFI_PHYSICAL_ADDRESS UnblockAddress, > + IN UINT64 NumberOfPages > + ) > +{ > + return RETURN_UNSUPPORTED; > +} > diff --git a/MdePkg/Include/Library/MmUnblockMemoryLib.h > b/MdePkg/Include/Library/MmUnblockMemoryLib.h > new file mode 100644 > index 000000000000..980afe9a5fd3 > --- /dev/null > +++ b/MdePkg/Include/Library/MmUnblockMemoryLib.h > @@ -0,0 +1,44 @@ > +/** @file > + MM Unblock Memory Library Interface. > + > + This library provides an interface to request non-MMRAM pages to be > mapped/unblocked > + from inside MM environment. > + > + For MM modules that need to access regions outside of MMRAMs, the agents > that set up > + these regions are responsible for invoking this API in order for these > memory areas > + to be accessed from inside MM. > + > + Copyright (c) Microsoft Corporation. > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef MM_UNBLOCK_MEMORY_LIB_H_ > +#define MM_UNBLOCK_MEMORY_LIB_H_ > + > +/** > + This API provides a way to unblock certain data pages to be accessible > inside MM environment. > + > + @param UnblockAddress The address of buffer caller requests to > unblock, the address > + has to be page aligned. > + @param NumberOfPages The number of pages requested to be > unblocked from MM > + environment. > + > + @return EFI_SUCCESS The request goes through successfully. > + @return EFI_NOT_AVAILABLE_YET The requested functionality is not > produced yet. > + @return EFI_UNSUPPORTED The requested functionality is not > supported on current platform. > + @return EFI_SECURITY_VIOLATION The requested address failed to pass > security check for > + unblocking. > + @return EFI_INVALID_PARAMETER Input address either NULL pointer or not > page aligned. > + @return EFI_ACCESS_DENIED The request is rejected due to system has > passed certain boot > + phase. > + > +**/ > +EFI_STATUS > +EFIAPI > +MmUnblockMemoryRequest ( > + IN EFI_PHYSICAL_ADDRESS UnblockAddress, > + IN UINT64 NumberOfPages > +); > + > +#endif // MM_UNBLOCK_MEMORY_LIB_H_ > diff --git a/MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.inf > b/MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.inf > new file mode 100644 > index 000000000000..8ecb767ff7bd > --- /dev/null > +++ b/MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.inf > @@ -0,0 +1,34 @@ > +## @file > +# Null instance of MM Unblock Page Library. > +# > +# This library provides an interface to request non-MMRAM pages to be > mapped/unblocked > +# from inside MM environment. > +# > +# For MM modules that need to access regions outside of MMRAMs, the agents > that set up > +# these regions are responsible for invoking this API in order for these > memory areas > +# to be accessed from inside MM. > +# > +# Copyright (c) Microsoft Corporation. > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +# > +## > + > +[Defines] > + INF_VERSION = 0x0001001B > + BASE_NAME = MmUnblockMemoryLibNull > + MODULE_UNI_FILE = MmUnblockMemoryLibNull.uni > + FILE_GUID = 9E890F68-5C95-4C31-95DD-59E6286F85EA > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = MmUnblockMemoryLib > + > +# > +# VALID_ARCHITECTURES = IA32 X64 > +# > + > +[Sources] > + MmUnblockMemoryLibNull.c > + > +[Packages] > + MdePkg/MdePkg.dec > diff --git a/MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.uni > b/MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.uni > new file mode 100644 > index 000000000000..d7f2709a3dce > --- /dev/null > +++ b/MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.uni > @@ -0,0 +1,21 @@ > +// /** @file > +// Null instance of MM Unblock Page Library. > +// > +// This library provides an interface to request non-MMRAM pages to be > mapped/unblocked > +// from inside MM environment. > +// > +// For MM modules that need to access regions outside of MMRAMs, the agents > that set up > +// these regions are responsible for invoking this API in order for these > memory areas > +// to be accessed from inside MM. > +// > +// Copyright (c) Microsoft Corporation. > +// SPDX-License-Identifier: BSD-2-Clause-Patent > +// > +// **/ > + > + > +#string STR_MODULE_ABSTRACT #language en-US "Null instance of MM > Unblock Page Library." > + > +#string STR_MODULE_DESCRIPTION #language en-US "This library > provides an interface to request non-MMRAM pages to be mapped/unblocked from > inside MM environment.\n" > + "For MM modules that > need to access regions outside of MMRAMs, the agents that set up these > regions are responsible for invoking this API in order for these memory areas > to be accessed from inside MM." > + > diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec > index 3928db65d188..32a9e009c813 100644 > --- a/MdePkg/MdePkg.dec > +++ b/MdePkg/MdePkg.dec > @@ -257,6 +257,11 @@ [LibraryClasses] > # > UnitTestHostBaseLib|Test/UnitTest/Include/Library/UnitTestHostBaseLib.h > > + ## @libraryclass This library provides an interface for DXE drivers to > request MM environment > + # to map/unblock a memory region for accessibility inside MM. > + # > + MmUnblockMemoryLib|Include/Library/MmUnblockMemoryLib.h > + > [LibraryClasses.IA32, LibraryClasses.X64] > ## @libraryclass Abstracts both S/W SMI generation and detection. > ## > diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc > index ce009086815f..79629e3f93ba 100644 > --- a/MdePkg/MdePkg.dsc > +++ b/MdePkg/MdePkg.dsc > @@ -168,6 +168,7 @@ [Components.IA32, Components.X64] > MdePkg/Library/SmmPciExpressLib/SmmPciExpressLib.inf > MdePkg/Library/SmiHandlerProfileLibNull/SmiHandlerProfileLibNull.inf > MdePkg/Library/MmServicesTableLib/MmServicesTableLib.inf > + MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.inf > > [Components.EBC] > MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#72403): https://edk2.groups.io/g/devel/message/72403 Mute This Topic: https://groups.io/mt/81035309/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-