]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdePkg/IoLib: Filter/trace port IO/MMIO access
authorDandan Bi <dandan.bi@intel.com>
Fri, 12 Mar 2021 02:26:10 +0000 (10:26 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Thu, 8 Apr 2021 02:02:57 +0000 (02:02 +0000)
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3246

Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Zhiguang Liu <zhiguang.liu@intel.com>
Signed-off-by: Dandan Bi <dandan.bi@intel.com>
Reviewed-by: Michael D Kinney <michael.d.kinney@intel.com>
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
Acked-by: Ard Biesheuvel <ardb@kernel.org>
MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf
MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsicArmVirt.inf
MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsicInternal.h
MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsicSev.inf
MdePkg/Library/BaseIoLibIntrinsic/IoLib.c
MdePkg/Library/BaseIoLibIntrinsic/IoLibArmVirt.c
MdePkg/Library/BaseIoLibIntrinsic/IoLibGcc.c
MdePkg/Library/BaseIoLibIntrinsic/IoLibMsc.c
MdePkg/Library/BaseIoLibIntrinsic/IoLibNoIo.c

index 690b95d44033b9fe40699213d461fa2c069a4d2b..97eeada0656e9a033f00c698d341459b50f3c6eb 100644 (file)
@@ -7,7 +7,7 @@
 #  ASSERT(). For ARM, AARCH64 and RISCV64, this I/O library only provides non I/O\r
 #  read and write.\r
 #\r
-#  Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+#  Copyright (c) 2007 - 2021, Intel Corporation. All rights reserved.<BR>\r
 #  Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
 #  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>\r
 #  Portions Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>\r
@@ -66,4 +66,5 @@
 [LibraryClasses]\r
   DebugLib\r
   BaseLib\r
+  RegisterFilterLib\r
 \r
index ad68f841fb6bac4f4d67670d7837db2be7472a63..cea6857926b3dec4f6c0593a2ae2289b75f73286 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 #  Instance of I/O Library using KVM/ARM safe assembler routines\r
 #\r
-#  Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>\r
+#  Copyright (c) 2007 - 2021, Intel Corporation. All rights reserved.<BR>\r
 #  Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
 #  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>\r
 #  Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR>\r
@@ -44,3 +44,4 @@
 [LibraryClasses]\r
   DebugLib\r
   BaseLib\r
+  RegisterFilterLib\r
index 1aae45fa8acb9e73f41ab35ed285dd1f5bcb4050..79b2eb3e7b7b1bde9484798d90d37de12371bedf 100644 (file)
@@ -3,7 +3,7 @@
 \r
   This file includes package header files, dependent library classes.\r
 \r
-  Copyright (c) 2007 - 2008, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2007 - 2021, Intel Corporation. All rights reserved.<BR>\r
    SPDX-License-Identifier: BSD-2-Clause-Patent\r
 **/\r
 \r
@@ -17,5 +17,6 @@
 #include <Library/IoLib.h>\r
 #include <Library/BaseLib.h>\r
 #include <Library/DebugLib.h>\r
+#include <Library/RegisterFilterLib.h>\r
 \r
 #endif\r
index 86a07e60f838389febd6f1444731e68e4ecb8c95..34f9d1d1062fae012b32a066bb79ec42e30f0208 100644 (file)
@@ -4,7 +4,7 @@
 #  I/O Library that uses compiler intrinsics to perform IN and OUT instructions\r
 #  for IA-32 and x64.\r
 #\r
-#  Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+#  Copyright (c) 2007 - 2021, Intel Corporation. All rights reserved.<BR>\r
 #  Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
 #  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>\r
 #\r
@@ -49,4 +49,5 @@
 [LibraryClasses]\r
   DebugLib\r
   BaseLib\r
+  RegisterFilterLib\r
 \r
index a6bbc925462b2c1c1172d0cc702af4484e442aef..d0d7044f0901fd95e30a7b2e766d371f437dc1ab 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Common I/O Library routines.\r
 \r
-  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>\r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
@@ -82,10 +82,15 @@ MmioRead8 (
   )\r
 {\r
   UINT8                             Value;\r
+  BOOLEAN                           Flag;\r
 \r
-  MemoryFence ();\r
-  Value = *(volatile UINT8*)Address;\r
-  MemoryFence ();\r
+  Flag = FilterBeforeMmIoRead (FilterWidth8, Address, &Value);\r
+  if (Flag) {\r
+    MemoryFence ();\r
+    Value = *(volatile UINT8*)Address;\r
+    MemoryFence ();\r
+  }\r
+  FilterAfterMmIoRead (FilterWidth8, Address, &Value);\r
 \r
   return Value;\r
 }\r
@@ -112,9 +117,15 @@ MmioWrite8 (
   IN      UINT8                     Value\r
   )\r
 {\r
-  MemoryFence ();\r
-  *(volatile UINT8*)Address = Value;\r
-  MemoryFence ();\r
+  BOOLEAN                           Flag;\r
+\r
+  Flag = FilterBeforeMmIoWrite (FilterWidth8, Address, &Value);\r
+  if (Flag) {\r
+    MemoryFence ();\r
+    *(volatile UINT8*)Address = Value;\r
+    MemoryFence ();\r
+  }\r
+  FilterAfterMmIoWrite (FilterWidth8, Address, &Value);\r
 \r
   return Value;\r
 }\r
@@ -141,12 +152,16 @@ MmioRead16 (
   )\r
 {\r
   UINT16                            Value;\r
+  BOOLEAN                           Flag;\r
 \r
   ASSERT ((Address & 1) == 0);\r
-\r
-  MemoryFence ();\r
-  Value = *(volatile UINT16*)Address;\r
-  MemoryFence ();\r
+  Flag = FilterBeforeMmIoRead (FilterWidth16, Address, &Value);\r
+  if (Flag) {\r
+    MemoryFence ();\r
+    Value = *(volatile UINT16*)Address;\r
+    MemoryFence ();\r
+  }\r
+  FilterAfterMmIoRead (FilterWidth16, Address, &Value);\r
 \r
   return Value;\r
 }\r
@@ -174,11 +189,17 @@ MmioWrite16 (
   IN      UINT16                    Value\r
   )\r
 {\r
+  BOOLEAN                           Flag;\r
+\r
   ASSERT ((Address & 1) == 0);\r
 \r
-  MemoryFence ();\r
-  *(volatile UINT16*)Address = Value;\r
-  MemoryFence ();\r
+  Flag = FilterBeforeMmIoWrite (FilterWidth16, Address, &Value);\r
+  if (Flag) {\r
+    MemoryFence ();\r
+    *(volatile UINT16*)Address = Value;\r
+    MemoryFence ();\r
+  }\r
+  FilterAfterMmIoWrite (FilterWidth16, Address, &Value);\r
 \r
   return Value;\r
 }\r
@@ -205,12 +226,17 @@ MmioRead32 (
   )\r
 {\r
   UINT32                            Value;\r
+  BOOLEAN                           Flag;\r
 \r
   ASSERT ((Address & 3) == 0);\r
 \r
-  MemoryFence ();\r
-  Value = *(volatile UINT32*)Address;\r
-  MemoryFence ();\r
+  Flag = FilterBeforeMmIoRead (FilterWidth32, Address, &Value);\r
+  if (Flag) {\r
+    MemoryFence ();\r
+    Value = *(volatile UINT32*)Address;\r
+    MemoryFence ();\r
+  }\r
+  FilterAfterMmIoRead (FilterWidth32, Address, &Value);\r
 \r
   return Value;\r
 }\r
@@ -238,11 +264,17 @@ MmioWrite32 (
   IN      UINT32                    Value\r
   )\r
 {\r
+  BOOLEAN                           Flag;\r
+\r
   ASSERT ((Address & 3) == 0);\r
 \r
-  MemoryFence ();\r
-  *(volatile UINT32*)Address = Value;\r
-  MemoryFence ();\r
+  Flag = FilterBeforeMmIoWrite (FilterWidth32, Address, &Value);\r
+  if (Flag) {\r
+    MemoryFence ();\r
+    *(volatile UINT32*)Address = Value;\r
+    MemoryFence ();\r
+  }\r
+  FilterAfterMmIoWrite (FilterWidth32, Address, &Value);\r
 \r
   return Value;\r
 }\r
@@ -269,12 +301,17 @@ MmioRead64 (
   )\r
 {\r
   UINT64                            Value;\r
+  BOOLEAN                           Flag;\r
 \r
   ASSERT ((Address & 7) == 0);\r
 \r
-  MemoryFence ();\r
-  Value = *(volatile UINT64*)Address;\r
-  MemoryFence ();\r
+  Flag = FilterBeforeMmIoRead (FilterWidth64, Address, &Value);\r
+  if (Flag) {\r
+    MemoryFence ();\r
+    Value = *(volatile UINT64*)Address;\r
+    MemoryFence ();\r
+  }\r
+  FilterAfterMmIoRead (FilterWidth64, Address, &Value);\r
 \r
   return Value;\r
 }\r
@@ -300,11 +337,17 @@ MmioWrite64 (
   IN      UINT64                    Value\r
   )\r
 {\r
+  BOOLEAN                           Flag;\r
+\r
   ASSERT ((Address & 7) == 0);\r
 \r
-  MemoryFence ();\r
-  *(volatile UINT64*)Address = Value;\r
-  MemoryFence ();\r
+  Flag = FilterBeforeMmIoWrite (FilterWidth64, Address, &Value);\r
+  if (Flag) {\r
+    MemoryFence ();\r
+    *(volatile UINT64*)Address = Value;\r
+    MemoryFence ();\r
+  }\r
+  FilterAfterMmIoWrite (FilterWidth64, Address, &Value);\r
 \r
   return Value;\r
 }\r
index 9715705ee0369638cc32f6f6324ad630a3a9dfab..61408407698fd032b780ea4a5a24fd4ffefea926 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   I/O Library for ARM.\r
 \r
-  Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>\r
   Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
   Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>\r
   Copyright (c) 2018, Linaro, Ltd. All rights reserved.<BR>\r
@@ -546,7 +546,16 @@ MmioRead8 (
   IN      UINTN                     Address\r
   )\r
 {\r
-  return MmioRead8Internal (Address);\r
+  UINT8      Value;\r
+  BOOLEAN    Flag;\r
+\r
+  Flag = FilterBeforeMmIoRead (FilterWidth8, Address, &Value);\r
+  if (Flag) {\r
+    Value = MmioRead8Internal (Address);\r
+  }\r
+  FilterAfterMmIoRead (FilterWidth8, Address, &Value);\r
+\r
+  return Value;\r
 }\r
 \r
 /**\r
@@ -569,7 +578,14 @@ MmioWrite8 (
   IN      UINT8                     Value\r
   )\r
 {\r
-  MmioWrite8Internal (Address, Value);\r
+  BOOLEAN               Flag;\r
+\r
+  Flag = FilterBeforeMmIoWrite (FilterWidth8, Address, &Value);\r
+  if (Flag) {\r
+    MmioWrite8Internal (Address, Value);\r
+  }\r
+  FilterAfterMmIoWrite (FilterWidth8, Address, &Value);\r
+\r
   return Value;\r
 }\r
 \r
@@ -593,9 +609,18 @@ MmioRead16 (
   IN      UINTN                     Address\r
   )\r
 {\r
+  BOOLEAN    Flag;\r
+  UINT16     Value;\r
+\r
   ASSERT ((Address & 1) == 0);\r
 \r
-  return MmioRead16Internal (Address);\r
+  Flag = FilterBeforeMmIoRead (FilterWidth16, Address, &Value);\r
+  if (Flag) {\r
+    Value = MmioRead16Internal (Address);\r
+  }\r
+  FilterAfterMmIoRead (FilterWidth16, Address, &Value);\r
+\r
+  return Value;\r
 }\r
 \r
 /**\r
@@ -618,9 +643,16 @@ MmioWrite16 (
   IN      UINT16                    Value\r
   )\r
 {\r
+  BOOLEAN    Flag;\r
+\r
   ASSERT ((Address & 1) == 0);\r
 \r
-  MmioWrite16Internal (Address, Value);\r
+  Flag = FilterBeforeMmIoWrite (FilterWidth16, Address, &Value);\r
+  if (Flag) {\r
+    MmioWrite16Internal (Address, Value);\r
+  }\r
+  FilterAfterMmIoWrite (FilterWidth16, Address, &Value);\r
+\r
   return Value;\r
 }\r
 \r
@@ -644,9 +676,18 @@ MmioRead32 (
   IN      UINTN                     Address\r
   )\r
 {\r
+  BOOLEAN   Flag;\r
+  UINT32    Value;\r
+\r
   ASSERT ((Address & 3) == 0);\r
 \r
-  return MmioRead32Internal (Address);\r
+  Flag = FilterBeforeMmIoRead (FilterWidth32, Address, &Value);\r
+  if (Flag) {\r
+    Value = MmioRead32Internal (Address);\r
+  }\r
+  FilterAfterMmIoRead (FilterWidth32, Address, &Value);\r
+\r
+  return Value;\r
 }\r
 \r
 /**\r
@@ -669,9 +710,16 @@ MmioWrite32 (
   IN      UINT32                    Value\r
   )\r
 {\r
+  BOOLEAN   Flag;\r
+\r
   ASSERT ((Address & 3) == 0);\r
 \r
-  MmioWrite32Internal (Address, Value);\r
+  Flag = FilterBeforeMmIoWrite (FilterWidth32, Address, &Value);\r
+  if (Flag) {\r
+    MmioWrite32Internal (Address, Value);\r
+  }\r
+  FilterAfterMmIoWrite (FilterWidth32, Address, &Value);\r
+\r
   return Value;\r
 }\r
 \r
@@ -695,9 +743,18 @@ MmioRead64 (
   IN      UINTN                     Address\r
   )\r
 {\r
+  BOOLEAN   Flag;\r
+  UINT64    Value;\r
+\r
   ASSERT ((Address & 7) == 0);\r
 \r
-  return MmioRead64Internal (Address);\r
+  Flag = FilterBeforeMmIoRead (FilterWidth64, Address, &Value);\r
+  if (Flag) {\r
+    Value = MmioRead64Internal (Address);\r
+  }\r
+  FilterAfterMmIoRead (FilterWidth64, Address, &Value);\r
+\r
+  return Value;\r
 }\r
 \r
 /**\r
@@ -720,8 +777,15 @@ MmioWrite64 (
   IN      UINT64                    Value\r
   )\r
 {\r
+  BOOLEAN   Flag;\r
+\r
   ASSERT ((Address & 7) == 0);\r
 \r
-  MmioWrite64Internal (Address, Value);\r
+  Flag = FilterBeforeMmIoWrite (FilterWidth64, Address, &Value);\r
+  if (Flag) {\r
+    MmioWrite64Internal (Address, Value);\r
+  }\r
+  FilterAfterMmIoWrite (FilterWidth64, Address, &Value);\r
+\r
   return Value;\r
 }\r
index b3a1a2025663ba970a9362a2da3624ed330cb487..ecf9ed61911f978c9695a8a2e646f87ad7fc9ad3 100644 (file)
@@ -10,7 +10,7 @@
   We don't advocate putting compiler specifics in libraries or drivers but there\r
   is no other way to make this work.\r
 \r
-  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>\r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
@@ -39,8 +39,14 @@ IoRead8 (
   )\r
 {\r
   UINT8   Data;\r
+  BOOLEAN Flag;\r
+\r
+  Flag = FilterBeforeIoRead (FilterWidth8, Port, &Data);\r
+  if (Flag) {\r
+    __asm__ __volatile__ ("inb %w1,%b0" : "=a" (Data) : "d" ((UINT16)Port));\r
+  }\r
+  FilterAfterIoRead (FilterWidth8, Port, &Data);\r
 \r
-  __asm__ __volatile__ ("inb %w1,%b0" : "=a" (Data) : "d" ((UINT16)Port));\r
   return Data;\r
 }\r
 \r
@@ -66,7 +72,14 @@ IoWrite8 (
   IN      UINT8                     Value\r
   )\r
 {\r
-  __asm__ __volatile__ ("outb %b0,%w1" : : "a" (Value), "d" ((UINT16)Port));\r
+  BOOLEAN Flag;\r
+\r
+  Flag = FilterBeforeIoWrite (FilterWidth8, Port, &Value);\r
+  if (Flag) {\r
+    __asm__ __volatile__ ("outb %b0,%w1" : : "a" (Value), "d" ((UINT16)Port));\r
+  }\r
+  FilterAfterIoWrite (FilterWidth8, Port, &Value);\r
+\r
   return Value;;\r
 }\r
 \r
@@ -92,9 +105,16 @@ IoRead16 (
   )\r
 {\r
   UINT16   Data;\r
+  BOOLEAN  Flag;\r
 \r
   ASSERT ((Port & 1) == 0);\r
-  __asm__ __volatile__ ("inw %w1,%w0" : "=a" (Data) : "d" ((UINT16)Port));\r
+\r
+  Flag = FilterBeforeIoRead (FilterWidth16, Port, &Data);\r
+  if (Flag) {\r
+     __asm__ __volatile__ ("inw %w1,%w0" : "=a" (Data) : "d" ((UINT16)Port));\r
+  }\r
+  FilterAfterIoRead (FilterWidth16, Port, &Data);\r
+\r
   return Data;\r
 }\r
 \r
@@ -121,8 +141,17 @@ IoWrite16 (
   IN      UINT16                    Value\r
   )\r
 {\r
+\r
+  BOOLEAN Flag;\r
+\r
   ASSERT ((Port & 1) == 0);\r
-  __asm__ __volatile__ ("outw %w0,%w1" : : "a" (Value), "d" ((UINT16)Port));\r
+\r
+  Flag = FilterBeforeIoWrite (FilterWidth16, Port, &Value);\r
+  if (Flag) {\r
+    __asm__ __volatile__ ("outw %w0,%w1" : : "a" (Value), "d" ((UINT16)Port));\r
+  }\r
+  FilterAfterIoWrite (FilterWidth16, Port, &Value);\r
+\r
   return Value;;\r
 }\r
 \r
@@ -148,9 +177,16 @@ IoRead32 (
   )\r
 {\r
   UINT32   Data;\r
+  BOOLEAN  Flag;\r
 \r
   ASSERT ((Port & 3) == 0);\r
-  __asm__ __volatile__ ("inl %w1,%0" : "=a" (Data) : "d" ((UINT16)Port));\r
+\r
+  Flag = FilterBeforeIoRead (FilterWidth32, Port, &Data);\r
+  if (Flag) {\r
+    __asm__ __volatile__ ("inl %w1,%0" : "=a" (Data) : "d" ((UINT16)Port));\r
+  }\r
+  FilterAfterIoRead (FilterWidth32, Port, &Data);\r
+\r
   return Data;\r
 }\r
 \r
@@ -177,8 +213,16 @@ IoWrite32 (
   IN      UINT32                    Value\r
   )\r
 {\r
+  BOOLEAN  Flag;\r
+\r
   ASSERT ((Port & 3) == 0);\r
-  __asm__ __volatile__ ("outl %0,%w1" : : "a" (Value), "d" ((UINT16)Port));\r
+\r
+  Flag = FilterBeforeIoWrite (FilterWidth32, Port, &Value);\r
+  if (Flag) {\r
+    __asm__ __volatile__ ("outl %0,%w1" : : "a" (Value), "d" ((UINT16)Port));\r
+  }\r
+  FilterAfterIoWrite (FilterWidth32, Port, &Value);\r
+\r
   return Value;\r
 }\r
 \r
index 769dddfce2073c7c482f34a56d515b6e59e2f22e..d2bc5f527cf67084de7dd373107701dba3ca12d6 100644 (file)
@@ -8,7 +8,7 @@
   We don't advocate putting compiler specifics in libraries or drivers but there\r
   is no other way to make this work.\r
 \r
-  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>\r
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
@@ -66,10 +66,16 @@ IoRead8 (
   )\r
 {\r
   UINT8                             Value;\r
+  BOOLEAN                           Flag;\r
+\r
+  Flag = FilterBeforeIoRead (FilterWidth8, Port, &Value);\r
+  if (Flag) {\r
+    _ReadWriteBarrier ();\r
+    Value = (UINT8)_inp ((UINT16)Port);\r
+    _ReadWriteBarrier ();\r
+  }\r
+  FilterAfterIoRead (FilterWidth8, Port, &Value);\r
 \r
-  _ReadWriteBarrier ();\r
-  Value = (UINT8)_inp ((UINT16)Port);\r
-  _ReadWriteBarrier ();\r
   return Value;\r
 }\r
 \r
@@ -95,9 +101,16 @@ IoWrite8 (
   IN      UINT8                     Value\r
   )\r
 {\r
-  _ReadWriteBarrier ();\r
-  (UINT8)_outp ((UINT16)Port, Value);\r
-  _ReadWriteBarrier ();\r
+  BOOLEAN                           Flag;\r
+\r
+  Flag = FilterBeforeIoWrite(FilterWidth8, Port, &Value);\r
+  if (Flag) {\r
+    _ReadWriteBarrier ();\r
+    (UINT8)_outp ((UINT16)Port, Value);\r
+    _ReadWriteBarrier ();\r
+  }\r
+  FilterAfterIoWrite (FilterWidth8, Port, &Value);\r
+\r
   return Value;\r
 }\r
 \r
@@ -123,11 +136,18 @@ IoRead16 (
   )\r
 {\r
   UINT16                            Value;\r
+  BOOLEAN                           Flag;\r
 \r
   ASSERT ((Port & 1) == 0);\r
-  _ReadWriteBarrier ();\r
-  Value = _inpw ((UINT16)Port);\r
-  _ReadWriteBarrier ();\r
+\r
+  Flag = FilterBeforeIoRead (FilterWidth16, Port, &Value);\r
+  if (Flag) {\r
+    _ReadWriteBarrier ();\r
+    Value = _inpw ((UINT16)Port);\r
+    _ReadWriteBarrier ();\r
+  }\r
+  FilterBeforeIoRead (FilterWidth16, Port, &Value);\r
+\r
   return Value;\r
 }\r
 \r
@@ -154,10 +174,18 @@ IoWrite16 (
   IN      UINT16                    Value\r
   )\r
 {\r
+  BOOLEAN                           Flag;\r
+\r
   ASSERT ((Port & 1) == 0);\r
-  _ReadWriteBarrier ();\r
-  _outpw ((UINT16)Port, Value);\r
-  _ReadWriteBarrier ();\r
+\r
+  Flag = FilterBeforeIoWrite(FilterWidth16, Port, &Value);\r
+  if (Flag) {\r
+    _ReadWriteBarrier ();\r
+    _outpw ((UINT16)Port, Value);\r
+    _ReadWriteBarrier ();\r
+  }\r
+  FilterAfterIoWrite (FilterWidth16, Port, &Value);\r
+\r
   return Value;\r
 }\r
 \r
@@ -183,11 +211,18 @@ IoRead32 (
   )\r
 {\r
   UINT32                            Value;\r
+  BOOLEAN                           Flag;\r
 \r
   ASSERT ((Port & 3) == 0);\r
-  _ReadWriteBarrier ();\r
-  Value = _inpd ((UINT16)Port);\r
-  _ReadWriteBarrier ();\r
+\r
+  Flag = FilterBeforeIoRead(FilterWidth32, Port, &Value);\r
+  if (Flag) {\r
+    _ReadWriteBarrier ();\r
+    Value = _inpd ((UINT16)Port);\r
+    _ReadWriteBarrier ();\r
+  }\r
+  FilterAfterIoRead (FilterWidth32, Port, &Value);\r
+\r
   return Value;\r
 }\r
 \r
@@ -214,9 +249,17 @@ IoWrite32 (
   IN      UINT32                    Value\r
   )\r
 {\r
+  BOOLEAN                           Flag;\r
+\r
   ASSERT ((Port & 3) == 0);\r
-  _ReadWriteBarrier ();\r
-  _outpd ((UINT16)Port, Value);\r
-  _ReadWriteBarrier ();\r
+\r
+  Flag = FilterBeforeIoWrite(FilterWidth32, Port, &Value);\r
+  if (Flag) {\r
+    _ReadWriteBarrier ();\r
+    _outpd ((UINT16)Port, Value);\r
+    _ReadWriteBarrier ();\r
+  }\r
+  FilterAfterIoWrite (FilterWidth32, Port, &Value);\r
+\r
   return Value;\r
 }\r
index a107136a740f5aa5968373ae323c386471170b6e..291cd86eaa46bd64b8cd3230ac02fe2cdbf09d27 100644 (file)
@@ -2,7 +2,7 @@
   I/O library for non I/O read and write access (memory map I/O read and\r
   write only) architecture, such as ARM and RISC-V processor.\r
 \r
-  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>\r
   Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
   Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>\r
   Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>\r
@@ -408,8 +408,14 @@ MmioRead8 (
   )\r
 {\r
   UINT8                             Value;\r
+  BOOLEAN                           Flag;\r
+\r
+  Flag = FilterBeforeMmIoRead (FilterWidth8, Address, &Value);\r
+  if (Flag) {\r
+    Value = *(volatile UINT8*)Address;\r
+  }\r
+  FilterAfterMmIoRead (FilterWidth8, Address, &Value);\r
 \r
-  Value = *(volatile UINT8*)Address;\r
   return Value;\r
 }\r
 \r
@@ -433,7 +439,14 @@ MmioWrite8 (
   IN      UINT8                     Value\r
   )\r
 {\r
-  *(volatile UINT8*)Address = Value;\r
+  BOOLEAN                           Flag;\r
+\r
+  Flag = FilterBeforeMmIoWrite (FilterWidth8, Address, &Value);\r
+  if (Flag) {\r
+    *(volatile UINT8*)Address = Value;\r
+  }\r
+  FilterAfterMmIoWrite (FilterWidth8, Address, &Value);\r
+\r
   return Value;\r
 }\r
 \r
@@ -458,9 +471,16 @@ MmioRead16 (
   )\r
 {\r
   UINT16                            Value;\r
+  BOOLEAN                           Flag;\r
 \r
   ASSERT ((Address & 1) == 0);\r
-  Value = *(volatile UINT16*)Address;\r
+\r
+  Flag = FilterBeforeMmIoRead (FilterWidth16, Address, &Value);\r
+  if (Flag) {\r
+    Value = *(volatile UINT16*)Address;\r
+  }\r
+  FilterAfterMmIoRead (FilterWidth16, Address, &Value);\r
+\r
   return Value;\r
 }\r
 \r
@@ -484,8 +504,16 @@ MmioWrite16 (
   IN      UINT16                    Value\r
   )\r
 {\r
+  BOOLEAN                           Flag;\r
+\r
   ASSERT ((Address & 1) == 0);\r
-  *(volatile UINT16*)Address = Value;\r
+\r
+  Flag = FilterBeforeMmIoWrite (FilterWidth16, Address, &Value);\r
+  if (Flag) {\r
+    *(volatile UINT16*)Address = Value;\r
+  }\r
+  FilterAfterMmIoWrite (FilterWidth16, Address, &Value);\r
+\r
   return Value;\r
 }\r
 \r
@@ -510,9 +538,16 @@ MmioRead32 (
   )\r
 {\r
   UINT32                            Value;\r
+  BOOLEAN                           Flag;\r
 \r
   ASSERT ((Address & 3) == 0);\r
-  Value = *(volatile UINT32*)Address;\r
+\r
+  Flag = FilterBeforeMmIoRead (FilterWidth32, Address, &Value);\r
+  if (Flag) {\r
+    Value = *(volatile UINT32*)Address;\r
+  }\r
+  FilterAfterMmIoRead (FilterWidth32, Address, &Value);\r
+\r
   return Value;\r
 }\r
 \r
@@ -536,8 +571,16 @@ MmioWrite32 (
   IN      UINT32                    Value\r
   )\r
 {\r
+  BOOLEAN                           Flag;\r
+\r
   ASSERT ((Address & 3) == 0);\r
+\r
+  Flag = FilterBeforeMmIoWrite (FilterWidth32, Address, &Value);\r
+  if (Flag) {\r
   *(volatile UINT32*)Address = Value;\r
+  }\r
+  FilterAfterMmIoWrite (FilterWidth32, Address, &Value);\r
+\r
   return Value;\r
 }\r
 \r
@@ -562,9 +605,16 @@ MmioRead64 (
   )\r
 {\r
   UINT64                            Value;\r
+  BOOLEAN                           Flag;\r
 \r
   ASSERT ((Address & 7) == 0);\r
-  Value = *(volatile UINT64*)Address;\r
+\r
+  Flag = FilterBeforeMmIoRead (FilterWidth64, Address, &Value);\r
+  if (Flag) {\r
+    Value = *(volatile UINT64*)Address;\r
+  }\r
+  FilterAfterMmIoRead (FilterWidth64, Address, &Value);\r
+\r
   return Value;\r
 }\r
 \r
@@ -588,8 +638,16 @@ MmioWrite64 (
   IN      UINT64                    Value\r
   )\r
 {\r
+  BOOLEAN                           Flag;\r
+\r
   ASSERT ((Address & 7) == 0);\r
-  *(volatile UINT64*)Address = Value;\r
+\r
+  Flag = FilterBeforeMmIoWrite (FilterWidth64, Address, &Value);\r
+  if (Flag) {\r
+    *(volatile UINT64*)Address = Value;\r
+  }\r
+  FilterAfterMmIoWrite (FilterWidth64, Address, &Value);\r
+\r
   return Value;\r
 }\r
 \r