]> 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
 #  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
 #  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
 [LibraryClasses]\r
   DebugLib\r
   BaseLib\r
+  RegisterFilterLib\r
 \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
 ## @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
 #  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
 [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
 \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
    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/IoLib.h>\r
 #include <Library/BaseLib.h>\r
 #include <Library/DebugLib.h>\r
+#include <Library/RegisterFilterLib.h>\r
 \r
 #endif\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
 #  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
 #  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
 [LibraryClasses]\r
   DebugLib\r
   BaseLib\r
+  RegisterFilterLib\r
 \r
 \r
index a6bbc925462b2c1c1172d0cc702af4484e442aef..d0d7044f0901fd95e30a7b2e766d371f437dc1ab 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Common I/O Library routines.\r
 \r
 /** @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
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
@@ -82,10 +82,15 @@ MmioRead8 (
   )\r
 {\r
   UINT8                             Value;\r
   )\r
 {\r
   UINT8                             Value;\r
+  BOOLEAN                           Flag;\r
 \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
 \r
   return Value;\r
 }\r
@@ -112,9 +117,15 @@ MmioWrite8 (
   IN      UINT8                     Value\r
   )\r
 {\r
   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
 \r
   return Value;\r
 }\r
@@ -141,12 +152,16 @@ MmioRead16 (
   )\r
 {\r
   UINT16                            Value;\r
   )\r
 {\r
   UINT16                            Value;\r
+  BOOLEAN                           Flag;\r
 \r
   ASSERT ((Address & 1) == 0);\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
 \r
   return Value;\r
 }\r
@@ -174,11 +189,17 @@ MmioWrite16 (
   IN      UINT16                    Value\r
   )\r
 {\r
   IN      UINT16                    Value\r
   )\r
 {\r
+  BOOLEAN                           Flag;\r
+\r
   ASSERT ((Address & 1) == 0);\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
 \r
   return Value;\r
 }\r
@@ -205,12 +226,17 @@ MmioRead32 (
   )\r
 {\r
   UINT32                            Value;\r
   )\r
 {\r
   UINT32                            Value;\r
+  BOOLEAN                           Flag;\r
 \r
   ASSERT ((Address & 3) == 0);\r
 \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
 \r
   return Value;\r
 }\r
@@ -238,11 +264,17 @@ MmioWrite32 (
   IN      UINT32                    Value\r
   )\r
 {\r
   IN      UINT32                    Value\r
   )\r
 {\r
+  BOOLEAN                           Flag;\r
+\r
   ASSERT ((Address & 3) == 0);\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
 \r
   return Value;\r
 }\r
@@ -269,12 +301,17 @@ MmioRead64 (
   )\r
 {\r
   UINT64                            Value;\r
   )\r
 {\r
   UINT64                            Value;\r
+  BOOLEAN                           Flag;\r
 \r
   ASSERT ((Address & 7) == 0);\r
 \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
 \r
   return Value;\r
 }\r
@@ -300,11 +337,17 @@ MmioWrite64 (
   IN      UINT64                    Value\r
   )\r
 {\r
   IN      UINT64                    Value\r
   )\r
 {\r
+  BOOLEAN                           Flag;\r
+\r
   ASSERT ((Address & 7) == 0);\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
 \r
   return Value;\r
 }\r
index 9715705ee0369638cc32f6f6324ad630a3a9dfab..61408407698fd032b780ea4a5a24fd4ffefea926 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   I/O Library for ARM.\r
 \r
 /** @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
   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
   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
 }\r
 \r
 /**\r
@@ -569,7 +578,14 @@ MmioWrite8 (
   IN      UINT8                     Value\r
   )\r
 {\r
   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
   return Value;\r
 }\r
 \r
@@ -593,9 +609,18 @@ MmioRead16 (
   IN      UINTN                     Address\r
   )\r
 {\r
   IN      UINTN                     Address\r
   )\r
 {\r
+  BOOLEAN    Flag;\r
+  UINT16     Value;\r
+\r
   ASSERT ((Address & 1) == 0);\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
 }\r
 \r
 /**\r
@@ -618,9 +643,16 @@ MmioWrite16 (
   IN      UINT16                    Value\r
   )\r
 {\r
   IN      UINT16                    Value\r
   )\r
 {\r
+  BOOLEAN    Flag;\r
+\r
   ASSERT ((Address & 1) == 0);\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
   return Value;\r
 }\r
 \r
@@ -644,9 +676,18 @@ MmioRead32 (
   IN      UINTN                     Address\r
   )\r
 {\r
   IN      UINTN                     Address\r
   )\r
 {\r
+  BOOLEAN   Flag;\r
+  UINT32    Value;\r
+\r
   ASSERT ((Address & 3) == 0);\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
 }\r
 \r
 /**\r
@@ -669,9 +710,16 @@ MmioWrite32 (
   IN      UINT32                    Value\r
   )\r
 {\r
   IN      UINT32                    Value\r
   )\r
 {\r
+  BOOLEAN   Flag;\r
+\r
   ASSERT ((Address & 3) == 0);\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
   return Value;\r
 }\r
 \r
@@ -695,9 +743,18 @@ MmioRead64 (
   IN      UINTN                     Address\r
   )\r
 {\r
   IN      UINTN                     Address\r
   )\r
 {\r
+  BOOLEAN   Flag;\r
+  UINT64    Value;\r
+\r
   ASSERT ((Address & 7) == 0);\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
 }\r
 \r
 /**\r
@@ -720,8 +777,15 @@ MmioWrite64 (
   IN      UINT64                    Value\r
   )\r
 {\r
   IN      UINT64                    Value\r
   )\r
 {\r
+  BOOLEAN   Flag;\r
+\r
   ASSERT ((Address & 7) == 0);\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
   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
   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
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
@@ -39,8 +39,14 @@ IoRead8 (
   )\r
 {\r
   UINT8   Data;\r
   )\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
 \r
-  __asm__ __volatile__ ("inb %w1,%b0" : "=a" (Data) : "d" ((UINT16)Port));\r
   return Data;\r
 }\r
 \r
   return Data;\r
 }\r
 \r
@@ -66,7 +72,14 @@ IoWrite8 (
   IN      UINT8                     Value\r
   )\r
 {\r
   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
   return Value;;\r
 }\r
 \r
@@ -92,9 +105,16 @@ IoRead16 (
   )\r
 {\r
   UINT16   Data;\r
   )\r
 {\r
   UINT16   Data;\r
+  BOOLEAN  Flag;\r
 \r
   ASSERT ((Port & 1) == 0);\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
   return Data;\r
 }\r
 \r
@@ -121,8 +141,17 @@ IoWrite16 (
   IN      UINT16                    Value\r
   )\r
 {\r
   IN      UINT16                    Value\r
   )\r
 {\r
+\r
+  BOOLEAN Flag;\r
+\r
   ASSERT ((Port & 1) == 0);\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
   return Value;;\r
 }\r
 \r
@@ -148,9 +177,16 @@ IoRead32 (
   )\r
 {\r
   UINT32   Data;\r
   )\r
 {\r
   UINT32   Data;\r
+  BOOLEAN  Flag;\r
 \r
   ASSERT ((Port & 3) == 0);\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
   return Data;\r
 }\r
 \r
@@ -177,8 +213,16 @@ IoWrite32 (
   IN      UINT32                    Value\r
   )\r
 {\r
   IN      UINT32                    Value\r
   )\r
 {\r
+  BOOLEAN  Flag;\r
+\r
   ASSERT ((Port & 3) == 0);\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
   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
   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
   SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
@@ -66,10 +66,16 @@ IoRead8 (
   )\r
 {\r
   UINT8                             Value;\r
   )\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
 \r
-  _ReadWriteBarrier ();\r
-  Value = (UINT8)_inp ((UINT16)Port);\r
-  _ReadWriteBarrier ();\r
   return Value;\r
 }\r
 \r
   return Value;\r
 }\r
 \r
@@ -95,9 +101,16 @@ IoWrite8 (
   IN      UINT8                     Value\r
   )\r
 {\r
   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
   return Value;\r
 }\r
 \r
@@ -123,11 +136,18 @@ IoRead16 (
   )\r
 {\r
   UINT16                            Value;\r
   )\r
 {\r
   UINT16                            Value;\r
+  BOOLEAN                           Flag;\r
 \r
   ASSERT ((Port & 1) == 0);\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
   return Value;\r
 }\r
 \r
@@ -154,10 +174,18 @@ IoWrite16 (
   IN      UINT16                    Value\r
   )\r
 {\r
   IN      UINT16                    Value\r
   )\r
 {\r
+  BOOLEAN                           Flag;\r
+\r
   ASSERT ((Port & 1) == 0);\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
   return Value;\r
 }\r
 \r
@@ -183,11 +211,18 @@ IoRead32 (
   )\r
 {\r
   UINT32                            Value;\r
   )\r
 {\r
   UINT32                            Value;\r
+  BOOLEAN                           Flag;\r
 \r
   ASSERT ((Port & 3) == 0);\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
   return Value;\r
 }\r
 \r
@@ -214,9 +249,17 @@ IoWrite32 (
   IN      UINT32                    Value\r
   )\r
 {\r
   IN      UINT32                    Value\r
   )\r
 {\r
+  BOOLEAN                           Flag;\r
+\r
   ASSERT ((Port & 3) == 0);\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
   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
   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
   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
   )\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
 \r
-  Value = *(volatile UINT8*)Address;\r
   return Value;\r
 }\r
 \r
   return Value;\r
 }\r
 \r
@@ -433,7 +439,14 @@ MmioWrite8 (
   IN      UINT8                     Value\r
   )\r
 {\r
   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
   return Value;\r
 }\r
 \r
@@ -458,9 +471,16 @@ MmioRead16 (
   )\r
 {\r
   UINT16                            Value;\r
   )\r
 {\r
   UINT16                            Value;\r
+  BOOLEAN                           Flag;\r
 \r
   ASSERT ((Address & 1) == 0);\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
   return Value;\r
 }\r
 \r
@@ -484,8 +504,16 @@ MmioWrite16 (
   IN      UINT16                    Value\r
   )\r
 {\r
   IN      UINT16                    Value\r
   )\r
 {\r
+  BOOLEAN                           Flag;\r
+\r
   ASSERT ((Address & 1) == 0);\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
   return Value;\r
 }\r
 \r
@@ -510,9 +538,16 @@ MmioRead32 (
   )\r
 {\r
   UINT32                            Value;\r
   )\r
 {\r
   UINT32                            Value;\r
+  BOOLEAN                           Flag;\r
 \r
   ASSERT ((Address & 3) == 0);\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
   return Value;\r
 }\r
 \r
@@ -536,8 +571,16 @@ MmioWrite32 (
   IN      UINT32                    Value\r
   )\r
 {\r
   IN      UINT32                    Value\r
   )\r
 {\r
+  BOOLEAN                           Flag;\r
+\r
   ASSERT ((Address & 3) == 0);\r
   ASSERT ((Address & 3) == 0);\r
+\r
+  Flag = FilterBeforeMmIoWrite (FilterWidth32, Address, &Value);\r
+  if (Flag) {\r
   *(volatile UINT32*)Address = Value;\r
   *(volatile UINT32*)Address = Value;\r
+  }\r
+  FilterAfterMmIoWrite (FilterWidth32, Address, &Value);\r
+\r
   return Value;\r
 }\r
 \r
   return Value;\r
 }\r
 \r
@@ -562,9 +605,16 @@ MmioRead64 (
   )\r
 {\r
   UINT64                            Value;\r
   )\r
 {\r
   UINT64                            Value;\r
+  BOOLEAN                           Flag;\r
 \r
   ASSERT ((Address & 7) == 0);\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
   return Value;\r
 }\r
 \r
@@ -588,8 +638,16 @@ MmioWrite64 (
   IN      UINT64                    Value\r
   )\r
 {\r
   IN      UINT64                    Value\r
   )\r
 {\r
+  BOOLEAN                           Flag;\r
+\r
   ASSERT ((Address & 7) == 0);\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
   return Value;\r
 }\r
 \r