]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BaseIoLibIntrinsic/IoLib.c
MdePkg/IoLib: Filter/trace port IO/MMIO access
[mirror_edk2.git] / MdePkg / Library / BaseIoLibIntrinsic / IoLib.c
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