]> 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 577c44c3af38025253619d37e01d47b047854b32..d0d7044f0901fd95e30a7b2e766d371f437dc1ab 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
   Common I/O Library routines.\r
 \r
-  Copyright (c) 2006 - 2008, Intel Corporation<BR>\r
-  All rights reserved. This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -88,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
@@ -107,7 +106,7 @@ MmioRead8 (
 \r
   @param  Address The MMIO register to write.\r
   @param  Value   The value to write to the MMIO register.\r
-  \r
+\r
   @return Value.\r
 \r
 **/\r
@@ -118,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
@@ -147,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
@@ -169,7 +178,7 @@ MmioRead16 (
 \r
   @param  Address The MMIO register to write.\r
   @param  Value   The value to write to the MMIO register.\r
-  \r
+\r
   @return Value.\r
 \r
 **/\r
@@ -180,12 +189,18 @@ 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
-  \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
@@ -211,13 +226,18 @@ 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
-  \r
+\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
@@ -233,7 +253,7 @@ MmioRead32 (
 \r
   @param  Address The MMIO register to write.\r
   @param  Value   The value to write to the MMIO register.\r
-  \r
+\r
   @return Value.\r
 \r
 **/\r
@@ -244,12 +264,18 @@ 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
-  \r
+\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
@@ -275,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
+\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
@@ -306,12 +337,18 @@ 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
-  \r
+\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