REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3246

1.Purpose:
  Skip port IO/MMIO/MSR access in some emulatoion env.
  Trace port IO/MMIO/MSR access.

2.Plan to do in Edk2:
  Filter and trace in low level APIs in BaseIoLibIntrinsic and BaseLib.
  Add a new library class (RegisterFilterLib) for the filter and trace 
functionality.

3.Plan to filter and trace scope in Edk2 :
  a. Port IO R/W: IA32 X64 (Only filter/trace for IA32 X64)
  b. MMIO R/W: IA32 X64 EBC ARM AARCH64 RISCV64 (Filter/trace for the Arches 
supported in BaseIoLibIntrinsic.inf)
  c. MSR R/W: IA32 X64 (Only filter/trace for IA32 X64, if other ARCH has 
similar use case can add new APIs per needs)

4.RegisterFilterLib Library Class:
  a. Add RegisterFilterLib library class for the filter and trace operation.
  b. Add RegisterFilterLib.h in MdePkg/Include/Library.
  c. 12 APIs will be added to filter and trace port IO, MMIO and MSR access.
  d. Add a NULL instance RegisterFilterLibNull in MdePkg/Library.(Verified that 
null instance will not impact binary size.)
  e. Platform can implement its own RegisterFilterLib instance.

  12 APIs can be divided into 2 categories:
  6 [Before] APIs use to check whether need to execute port IO/MMIO/MSR access 
or do some tracing before access.
  6 [After] APIs use to trace after port IO/MMIO/MSR access.
  The detailed API definitions are included in this patch.

  For port IO access:
  FilterBeforeIoRead 
  FilterAfterIoRead
  FilterBeforeIoWrite 
  FilterAfterIoWrite

  For MMIO access:
  FilterBeforeMmIoRead
  FilterAfterMmIoRead
  FilterBeforeMmIoWrite
  FilterAfterMmIoWrite

  For MSR access:
  FilterBeforeMsrRead 
  FilterAfterMsrRead
  FilterBeforeMsrWrite
  FilterAfterMsrWrite

5.Change and Impact
  a. Add the RegisterFilterLib libary class and RegisterFilterLibNull instance 
firstly.
  b. Update the dsc in edk2 and edk2-platform repo to consume the 
RegisterFilterLibNull instance.
  c. Update the BaseLib and IoLib to consume RegisterFilterLib.
  
  This is an incompatible change.
  No code change in BaseLib and IoLib consumers, only need to change dsc to 
consume new FilterLib instance.
  Update BaseIoLibIntrinsic.inf and BaseIoLibIntrinsicSev.inf to consume 
RegisterFilterLib for all supported Arch
  Update BaseLib.inf to consume RegisterFilterLib only for IA32 and X64

This topic has been reviewed in Tiano Design meeting of 2021/0305
RegisterFilterLib header file and desgin foil can be found in:
https://edk2.groups.io/g/devel/files/Designs/2021/0305


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 | 224 +++++++++++++++++++++
 1 file changed, 224 insertions(+)
 create mode 100644 MdePkg/Include/Library/RegisterFilterLib.h

diff --git a/MdePkg/Include/Library/RegisterFilterLib.h 
b/MdePkg/Include/Library/RegisterFilterLib.h
new file mode 100644
index 0000000000..be111304ba
--- /dev/null
+++ b/MdePkg/Include/Library/RegisterFilterLib.h
@@ -0,0 +1,224 @@
+/** @file
+  Public include file for the Port IO/MMIO/MSR filter Library
+
+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.
+
+**/
+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.
+
+**/
+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.
+
+**/
+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.
+
+**/
+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.
+
+**/
+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.
+
+**/
+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__
-- 
2.18.0.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#72530): https://edk2.groups.io/g/devel/message/72530
Mute This Topic: https://groups.io/mt/81167761/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to