Reviewed-by: Abner Chang <abner.ch...@hpe.com> Thanks for adding description of return values.
> -----Original Message----- > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of > Dandan Bi > Sent: Monday, March 22, 2021 4:09 PM > To: devel@edk2.groups.io > Cc: Michael D Kinney <michael.d.kin...@intel.com>; Liming Gao > <gaolim...@byosoft.com.cn>; Zhiguang Liu <zhiguang....@intel.com> > Subject: [edk2-devel] [patch V2 01/29] MdePkg: Add RegisterFilterLib class > and NULL instance > > REF: INVALID URI REMOVED > 3A__bugzilla.tianocore.org_show-5Fbug.cgi-3Fid- > 3D3246&d=DwIBAg&c=C5b8zRQO1miGmBeVZ2LFWg&r=_SN6FZBN4Vgi4Ulks > kz6qU3NYRO03nHp9P7Z5q59A3E&m=0EinCfro8QrVJOUHqC9SQrGFKTLw_fpn > ApwpgZrJTFI&s=fInsRu_7K_UxMpaoSvL_C5dtlLIZ8c8g12wuPvHoi-4&e= > > 1. Add a new library class (RegisterFilterLib) to filter > and trace port IO/MMIO/MSR access. > 2. Add a NULL instance (RegisterFilterLibNull) can be used > to keep current behavior. > > Cc: Michael D Kinney <michael.d.kin...@intel.com> > Cc: Liming Gao <gaolim...@byosoft.com.cn> > Cc: Zhiguang Liu <zhiguang....@intel.com> > Signed-off-by: Dandan Bi <dandan...@intel.com> > --- > MdePkg/Include/Library/RegisterFilterLib.h | 243 ++++++++++++++++ > .../RegisterFilterLibNull.c | 271 ++++++++++++++++++ > .../RegisterFilterLibNull.inf | 23 ++ > .../RegisterFilterLibNull.uni | 13 + > MdePkg/MdePkg.dec | 7 +- > MdePkg/MdePkg.dsc | 4 +- > 6 files changed, 559 insertions(+), 2 deletions(-) > create mode 100644 MdePkg/Include/Library/RegisterFilterLib.h > create mode 100644 > MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNull.c > create mode 100644 > MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNull.inf > create mode 100644 > MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNull.uni > > diff --git a/MdePkg/Include/Library/RegisterFilterLib.h > b/MdePkg/Include/Library/RegisterFilterLib.h > new file mode 100644 > index 0000000000..c4402da7d8 > --- /dev/null > +++ b/MdePkg/Include/Library/RegisterFilterLib.h > @@ -0,0 +1,243 @@ > +/** @file > + Public include file for the Port IO/MMIO/MSR RegisterFilterLib. > + > +Copyright (c) 2021, Intel Corporation. All rights reserved.<BR> > + > +SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef REGISTER_FILTER_LIB_H_ > +#define REGISTER_FILTER_LIB_H_ > + > +typedef enum { > + FilterWidth8, > + FilterWidth16, > + FilterWidth32, > + FilterWidth64 > +} FILTER_IO_WIDTH; > + > +/** > + Filter IO read operation before read IO port. > + It is used to filter IO read operation. > + > + It will return the flag to decide whether require read real IO port. > + It can be used for emulation environment. > + > + @param[in] Width Signifies the width of the I/O operation. > + @param[in] Address The base address of the I/O operation. > + @param[in] Buffer The destination buffer to store the results. > + > + @retval TRUE Need to excute the IO read. > + @retval FALSE Skip the IO read. > + > +**/ > +BOOLEAN > +EFIAPI > +FilterBeforeIoRead ( > + IN FILTER_IO_WIDTH Width, > + IN UINTN Address, > + IN OUT VOID *Buffer > + ); > + > +/** > + Trace IO read operation after read IO port. > + It is used to trace IO operation. > + > + @param[in] Width Signifies the width of the I/O operation. > + @param[in] Address The base address of the I/O operation. > + @param[in] Buffer The destination buffer to store the results. > + > +**/ > +VOID > +EFIAPI > +FilterAfterIoRead ( > + IN FILTER_IO_WIDTH Width, > + IN UINTN Address, > + IN VOID *Buffer > + ); > +/** > + Filter IO Write operation before wirte IO port. > + It is used to filter IO operation. > + > + It will return the flag to decide whether require read write IO port. > + It can be used for emulation environment. > + > + @param[in] Width Signifies the width of the I/O operation. > + @param[in] Address The base address of the I/O operation. > + @param[in] Buffer The source buffer from which to BeforeWrite data. > + > + @retval TRUE Need to excute the IO write. > + @retval FALSE Skip the IO write. > + > +**/ > +BOOLEAN > +EFIAPI > +FilterBeforeIoWrite ( > + IN FILTER_IO_WIDTH Width, > + IN UINTN Address, > + IN VOID *Buffer > + ); > + > + /** > + Trace IO Write operation after wirte IO port. > + It is used to trace IO operation. > + > + @param[in] Width Signifies the width of the I/O operation. > + @param[in] Address The base address of the I/O operation. > + @param[in] Buffer The source buffer from which to BeforeWrite data. > + > +**/ > +VOID > +EFIAPI > +FilterAfterIoWrite ( > + IN FILTER_IO_WIDTH Width, > + IN UINTN Address, > + IN VOID *Buffer > + ); > + > +/** > + Filter memory IO before Read operation. > + > + It will return the flag to decide whether require read real MMIO. > + It can be used for emulation environment. > + > + @param[in] Width Signifies the width of the memory I/O operation. > + @param[in] Address The base address of the memory I/O operation. > + @param[in] Buffer The destination buffer to store the results. > + > + @retval TRUE Need to excute the MMIO read. > + @retval FALSE Skip the MMIO read. > + > +**/ > +BOOLEAN > +EFIAPI > +FilterBeforeMmIoRead ( > + IN FILTER_IO_WIDTH Width, > + IN UINTN Address, > + IN OUT VOID *Buffer > + ); > + > +/** > + Tracer memory IO after read operation > + > + @param[in] Width Signifies the width of the memory I/O operation. > + @param[in] Address The base address of the memory I/O operation. > + @param[in] Buffer The destination buffer to store the results. > + > +**/ > +VOID > +EFIAPI > +FilterAfterMmIoRead ( > + IN FILTER_IO_WIDTH Width, > + IN UINTN Address, > + IN VOID *Buffer > + ); > + > +/** > + Filter memory IO before write operation > + > + It will return the flag to decide whether require wirte real MMIO. > + It can be used for emulation environment. > + > + @param[in] Width Signifies the width of the memory I/O operation. > + @param[in] Address The base address of the memory I/O operation. > + @param[in] Buffer The source buffer from which to BeforeWrite data. > + > + @retval TRUE Need to excute the MMIO write. > + @retval FALSE Skip the MMIO write. > + > +**/ > +BOOLEAN > +EFIAPI > +FilterBeforeMmIoWrite ( > + IN FILTER_IO_WIDTH Width, > + IN UINTN Address, > + IN VOID *Buffer > + ); > + > +/** > + Tracer memory IO after write operation > + > + @param[in] Width Signifies the width of the memory I/O operation. > + @param[in] Address The base address of the memory I/O operation. > + @param[in] Buffer The source buffer from which to BeforeWrite data. > + > +**/ > +VOID > +EFIAPI > +FilterAfterMmIoWrite ( > + IN FILTER_IO_WIDTH Width, > + IN UINTN Address, > + IN VOID *Buffer > + ); > + > +/** > + Filter MSR before read operation. > + > + It will return the flag to decide whether require read real MSR. > + It can be used for emulation environment. > + > + @param Index The 8-bit Machine Specific Register > index to > BeforeWrite. > + @param Value The 64-bit value to BeforeRead from the > Machine Specific Register. > + > + @retval TRUE Need to excute the MSR read. > + @retval FALSE Skip the MSR read. > + > +**/ > +BOOLEAN > +EFIAPI > +FilterBeforeMsrRead ( > + IN UINT32 Index, > + IN OUT UINT64 *Value > + ); > + > +/** > + Trace MSR after read operation > + > + @param Index The 8-bit Machine Specific Register > index to > BeforeWrite. > + @param Value The 64-bit value to BeforeRead from the > Machine Specific Register. > + > +**/ > +VOID > +EFIAPI > +FilterAfterMsrRead ( > + IN UINT32 Index, > + IN UINT64 *Value > + ); > + > +/** > + Filter MSR before write operation > + > + It will return the flag to decide whether require write real MSR. > + It can be used for emulation environment. > + > + @param Index The 8-bit Machine Specific Register > index to > BeforeWrite. > + @param Value The 64-bit value to BeforeWrite to the > Machine > Specific Register. > + > + @retval TRUE Need to excute the MSR write. > + @retval FALSE Skip the MSR write. > + > +**/ > +BOOLEAN > +EFIAPI > +FilterBeforeMsrWrite ( > + IN UINT32 Index, > + IN UINT64 *Value > + ); > + > +/** > + Trace MSR after write operation > + > + @param Index The 8-bit Machine Specific Register > index to > BeforeWrite. > + @param Value The 64-bit value to BeforeWrite to the > Machine > Specific Register. > + > +**/ > +VOID > +EFIAPI > +FilterAfterMsrWrite ( > + IN UINT32 Index, > + IN UINT64 *Value > + ); > + > +#endif // REGISTER_FILTER_LIB_H_ > diff --git a/MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNull.c > b/MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNull.c > new file mode 100644 > index 0000000000..7150f1ed5f > --- /dev/null > +++ b/MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNull.c > @@ -0,0 +1,271 @@ > +/** @file > + Null instance of RegisterFilterLib. > + > + Copyright (c) 2021 Intel Corporation. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <Library/RegisterFilterLib.h> > + > +/** > + Filter IO read operation before read IO port. > + It is used to filter IO read operation. > + > + It will return the flag to decide whether require read real IO port. > + It can be used for emulation environment. > + > + @param[in] Width Signifies the width of the I/O operation. > + @param[in] Address The base address of the I/O operation. > + @param[in,out] Buffer The destination buffer to store the results. > + > + @retval TRUE Need to excute the IO read. > + @retval FALSE Skip the IO read. > + > +**/ > +BOOLEAN > +EFIAPI > +FilterBeforeIoRead ( > + IN FILTER_IO_WIDTH Width, > + IN UINTN Address, > + IN OUT VOID *Buffer > + ) > +{ > + return TRUE; > +} > + > +/** > + Trace IO read operation after read IO port. > + It is used to trace IO operation. > + > + @param[in] Width Signifies the width of the I/O operation. > + @param[in] Address The base address of the I/O operation. > + @param[in] Buffer The destination buffer to store the results. > + > +**/ > +VOID > +EFIAPI > +FilterAfterIoRead ( > + IN FILTER_IO_WIDTH Width, > + IN UINTN Address, > + IN VOID *Buffer > + ) > +{ > + return; > +} > + > +/** > + Filter IO Write operation before wirte IO port. > + It is used to filter IO operation. > + > + It will return the flag to decide whether require read write IO port. > + It can be used for emulation environment. > + > + @param[in] Width Signifies the width of the I/O operation. > + @param[in] Address The base address of the I/O operation. > + @param[in] Buffer The source buffer from which to write data. > + > + @retval TRUE Need to excute the IO write. > + @retval FALSE Skip the IO write. > + > +**/ > +BOOLEAN > +EFIAPI > +FilterBeforeIoWrite ( > + IN FILTER_IO_WIDTH Width, > + IN UINTN Address, > + IN VOID *Buffer > + ) > +{ > + return TRUE; > +} > + > + /** > + Trace IO Write operation after wirte IO port. > + It is used to trace IO operation. > + > + @param[in] Width Signifies the width of the I/O operation. > + @param[in] Address The base address of the I/O operation. > + @param[in] Buffer The source buffer from which to Write data. > + > +**/ > +VOID > +EFIAPI > +FilterAfterIoWrite ( > + IN FILTER_IO_WIDTH Width, > + IN UINTN Address, > + IN VOID *Buffer > + ) > +{ > + return; > +} > + > +/** > + Filter memory IO before Read operation. > + > + It will return the flag to decide whether require read real MMIO. > + It can be used for emulation environment. > + > + @param[in] Width Signifies the width of the memory I/O operation. > + @param[in] Address The base address of the memory I/O operation. > + @param[in,out] Buffer The destination buffer to store the results. > + > + @retval TRUE Need to excute the MMIO read. > + @retval FALSE Skip the MMIO read. > + > +**/ > +BOOLEAN > +EFIAPI > +FilterBeforeMmIoRead ( > + IN FILTER_IO_WIDTH Width, > + IN UINTN Address, > + IN OUT VOID *Buffer > + ) > +{ > + return TRUE; > +} > + > +/** > + Tracer memory IO after read operation. > + > + @param[in] Width Signifies the width of the memory I/O operation. > + @param[in] Address The base address of the memory I/O operation. > + @param[in] Buffer The destination buffer to store the results. > + > +**/ > +VOID > +EFIAPI > +FilterAfterMmIoRead ( > + IN FILTER_IO_WIDTH Width, > + IN UINTN Address, > + IN VOID *Buffer > + ) > +{ > + return; > +} > + > +/** > + Filter memory IO before write operation. > + > + It will return the flag to decide whether require wirte real MMIO. > + It can be used for emulation environment. > + > + @param[in] Width Signifies the width of the memory I/O operation. > + @param[in] Address The base address of the memory I/O operation. > + @param[in] Buffer The source buffer from which to write data. > + > + @retval TRUE Need to excute the MMIO write. > + @retval FALSE Skip the MMIO write. > + > +**/ > +BOOLEAN > +EFIAPI > +FilterBeforeMmIoWrite ( > + IN FILTER_IO_WIDTH Width, > + IN UINTN Address, > + IN VOID *Buffer > + ) > +{ > + return TRUE; > +} > + > +/** > + Tracer memory IO after write operation. > + > + @param[in] Width Signifies the width of the memory I/O operation. > + @param[in] Address The base address of the memory I/O operation. > + @param[in] Buffer The source buffer from which to write data. > + > +**/ > +VOID > +EFIAPI > +FilterAfterMmIoWrite ( > + IN FILTER_IO_WIDTH Width, > + IN UINTN Address, > + IN VOID *Buffer > + ) > +{ > + return; > +} > + > +/** > + Filter MSR before read operation. > + > + It will return the flag to decide whether require read real MSR. > + It can be used for emulation environment. > + > + @param Index The Register index of the MSR. > + @param Value Point to the data will be read from the > MSR. > + > + @retval TRUE Need to excute the MSR read. > + @retval FALSE Skip the MSR read. > + > +**/ > +BOOLEAN > +EFIAPI > +FilterBeforeMsrRead ( > + IN UINT32 Index, > + IN OUT UINT64 *Value > + ) > +{ > + return TRUE; > +} > + > +/** > + Trace MSR after read operation. > + > + @param Index The Register index of the MSR. > + @param Value Point to the data has been be read from > the MSR. > + > +**/ > +VOID > +EFIAPI > +FilterAfterMsrRead ( > + IN UINT32 Index, > + IN UINT64 *Value > + ) > +{ > + return; > +} > + > +/** > + Filter MSR before write operation. > + > + It will return the flag to decide whether require write real MSR. > + It can be used for emulation environment. > + > + @param Index The Register index of the MSR. > + @param Value Point to the data want to be written to > the MSR. > + > + @retval TRUE Need to excute the MSR write. > + @retval FALSE Skip the MSR write. > + > +**/ > +BOOLEAN > +EFIAPI > +FilterBeforeMsrWrite ( > + IN UINT32 Index, > + IN UINT64 *Value > + ) > +{ > + return TRUE; > +} > + > +/** > + Trace MSR after write operation. > + > + @param Index The Register index of the MSR. > + @param Value Point to the data has been be written to > the MSR. > + > +**/ > +VOID > +EFIAPI > +FilterAfterMsrWrite ( > + IN UINT32 Index, > + IN UINT64 *Value > + ) > +{ > + return; > +} > + > diff --git a/MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNull.inf > b/MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNull.inf > new file mode 100644 > index 0000000000..a7fc7497ed > --- /dev/null > +++ b/MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNull.inf > @@ -0,0 +1,23 @@ > +## @file > +# Null instance of RegisterFilterLib. > +# > +# Copyright (c) 2021, Intel Corporation. All rights reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = FilterLibNull > + MODULE_UNI_FILE = FilterLibNull.uni > + FILE_GUID = 9F555194-A410-4AD6-B3FC-53F6E10FA793 > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = RegisterFilterLib > + > +[Sources] > + RegisterFilterLibNull.c > + > +[Packages] > + MdePkg/MdePkg.dec > diff --git a/MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNull.uni > b/MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNull.uni > new file mode 100644 > index 0000000000..ed64c7e63d > --- /dev/null > +++ b/MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNull.uni > @@ -0,0 +1,13 @@ > +// /** @file > +// Null instance of RegisterFilterLib. > +// > +// Copyright (c) 2021, Intel Corporation. All rights reserved.<BR> > +// > +// SPDX-License-Identifier: BSD-2-Clause-Patent > +// > +// **/ > + > + > +#string STR_MODULE_ABSTRACT #language en-US "Null instance of > RegisterFilterLib." > +#string STR_MODULE_DESCRIPTION #language en-US "Null instance of > RegisterFilterLib." > + > diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec > index 1d2637acc2..65de5c4052 100644 > --- a/MdePkg/MdePkg.dec > +++ b/MdePkg/MdePkg.dec > @@ -2,11 +2,11 @@ > # This Package provides all definitions, library classes and libraries > instances. > # > # It also provides the definitions(including PPIs/PROTOCOLs/GUIDs) of > # EFI1.10/UEFI2.7/PI1.7 and some Industry Standards. > # > -# Copyright (c) 2007 - 2020, Intel Corporation. All rights reserved.<BR> > +# Copyright (c) 2007 - 2021, Intel Corporation. All rights reserved.<BR> > # Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> > # (C) Copyright 2016 - 2020 Hewlett Packard Enterprise Development LP<BR> > # > # SPDX-License-Identifier: BSD-2-Clause-Patent > # > @@ -260,10 +260,15 @@ [LibraryClasses] > ## @libraryclass This library provides an interface to request non-MMRAM > pages to be mapped > # or unblocked from inside MM environment. > # > MmUnblockMemoryLib|Include/Library/MmUnblockMemoryLib.h > > + ## @libraryclass This library provides interfances to filter and trace > port > IO/MMIO/MSR access. > + # > + # > + RegisterFilterLib|Include/Library/RegisterFilterLib.h > + > [LibraryClasses.IA32, LibraryClasses.X64] > ## @libraryclass Abstracts both S/W SMI generation and detection. > ## > SmmLib|Include/Library/SmmLib.h > > diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc > index 79629e3f93..be89e28eef 100644 > --- a/MdePkg/MdePkg.dsc > +++ b/MdePkg/MdePkg.dsc > @@ -1,9 +1,9 @@ > ## @file > # EFI/PI MdePkg Package > # > -# Copyright (c) 2007 - 2020, Intel Corporation. All rights reserved.<BR> > +# Copyright (c) 2007 - 2021, Intel Corporation. All rights reserved.<BR> > # Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> > # (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR> > # > # SPDX-License-Identifier: BSD-2-Clause-Patent > # > @@ -125,10 +125,12 @@ [Components] > > MdePkg/Library/BaseExtractGuidedSectionLib/BaseExtractGuidedSectionLib. > inf > > > MdePkg/Library/StandaloneMmDriverEntryPoint/StandaloneMmDriverEntry > Point.inf > > MdePkg/Library/StandaloneMmServicesTableLib/StandaloneMmServicesTab > leLib.inf > > + MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNull.inf > + > [Components.IA32, Components.X64, Components.ARM, > Components.AARCH64] > # > # Add UEFI Target Based Unit Tests > # > MdePkg/Test/UnitTest/Library/BaseLib/BaseLibUnitTestsUefi.inf > -- > 2.18.0.windows.1 > > > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#73166): https://edk2.groups.io/g/devel/message/73166 Mute This Topic: https://groups.io/mt/81519238/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-