]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BaseIoLibIntrinsic/IoLib.c
MdePkg: Support mmio for Tdx guest in BaseIoLibIntrinsic
[mirror_edk2.git] / MdePkg / Library / BaseIoLibIntrinsic / IoLib.c
index 9d42e21a691c6ee9719a6d1d2ab42d14ba07c8eb..5bd02b56a1faa39b4b4ab5161abfd2452aee035e 100644 (file)
@@ -7,6 +7,7 @@
 **/\r
 \r
 #include "BaseIoLibIntrinsicInternal.h"\r
+#include "IoLibTdx.h"\r
 \r
 /**\r
   Reads a 64-bit I/O port.\r
@@ -69,6 +70,8 @@ IoWrite64 (
 \r
   If 8-bit MMIO register operations are not supported, then ASSERT().\r
 \r
+  For Td guest TDVMCALL_MMIO is invoked to read MMIO registers.\r
+\r
   @param  Address The MMIO register to read.\r
 \r
   @return The value read.\r
@@ -86,7 +89,13 @@ MmioRead8 (
   Flag = FilterBeforeMmIoRead (FilterWidth8, Address, &Value);\r
   if (Flag) {\r
     MemoryFence ();\r
-    Value = *(volatile UINT8 *)Address;\r
+\r
+    if (IsTdxGuest ()) {\r
+      Value = TdMmioRead8 (Address);\r
+    } else {\r
+      Value = *(volatile UINT8 *)Address;\r
+    }\r
+\r
     MemoryFence ();\r
   }\r
 \r
@@ -104,6 +113,8 @@ MmioRead8 (
 \r
   If 8-bit MMIO register operations are not supported, then ASSERT().\r
 \r
+  For Td guest TDVMCALL_MMIO is invoked to write MMIO registers.\r
+\r
   @param  Address The MMIO register to write.\r
   @param  Value   The value to write to the MMIO register.\r
 \r
@@ -122,7 +133,13 @@ MmioWrite8 (
   Flag = FilterBeforeMmIoWrite (FilterWidth8, Address, &Value);\r
   if (Flag) {\r
     MemoryFence ();\r
-    *(volatile UINT8 *)Address = Value;\r
+\r
+    if (IsTdxGuest ()) {\r
+      TdMmioWrite8 (Address, Value);\r
+    } else {\r
+      *(volatile UINT8 *)Address = Value;\r
+    }\r
+\r
     MemoryFence ();\r
   }\r
 \r
@@ -141,6 +158,8 @@ MmioWrite8 (
   If 16-bit MMIO register operations are not supported, then ASSERT().\r
   If Address is not aligned on a 16-bit boundary, then ASSERT().\r
 \r
+  For Td guest TDVMCALL_MMIO is invoked to read MMIO registers.\r
+\r
   @param  Address The MMIO register to read.\r
 \r
   @return The value read.\r
@@ -159,7 +178,13 @@ MmioRead16 (
   Flag = FilterBeforeMmIoRead (FilterWidth16, Address, &Value);\r
   if (Flag) {\r
     MemoryFence ();\r
-    Value = *(volatile UINT16 *)Address;\r
+\r
+    if (IsTdxGuest ()) {\r
+      Value = TdMmioRead16 (Address);\r
+    } else {\r
+      Value = *(volatile UINT16 *)Address;\r
+    }\r
+\r
     MemoryFence ();\r
   }\r
 \r
@@ -178,6 +203,8 @@ MmioRead16 (
   If 16-bit MMIO register operations are not supported, then ASSERT().\r
   If Address is not aligned on a 16-bit boundary, then ASSERT().\r
 \r
+  For Td guest TDVMCALL_MMIO is invoked to write MMIO registers.\r
+\r
   @param  Address The MMIO register to write.\r
   @param  Value   The value to write to the MMIO register.\r
 \r
@@ -198,7 +225,13 @@ MmioWrite16 (
   Flag = FilterBeforeMmIoWrite (FilterWidth16, Address, &Value);\r
   if (Flag) {\r
     MemoryFence ();\r
-    *(volatile UINT16 *)Address = Value;\r
+\r
+    if (IsTdxGuest ()) {\r
+      TdMmioWrite16 (Address, Value);\r
+    } else {\r
+      *(volatile UINT16 *)Address = Value;\r
+    }\r
+\r
     MemoryFence ();\r
   }\r
 \r
@@ -217,6 +250,8 @@ MmioWrite16 (
   If 32-bit MMIO register operations are not supported, then ASSERT().\r
   If Address is not aligned on a 32-bit boundary, then ASSERT().\r
 \r
+  For Td guest TDVMCALL_MMIO is invoked to read MMIO registers.\r
+\r
   @param  Address The MMIO register to read.\r
 \r
   @return The value read.\r
@@ -236,7 +271,13 @@ MmioRead32 (
   Flag = FilterBeforeMmIoRead (FilterWidth32, Address, &Value);\r
   if (Flag) {\r
     MemoryFence ();\r
-    Value = *(volatile UINT32 *)Address;\r
+\r
+    if (IsTdxGuest ()) {\r
+      Value = TdMmioRead32 (Address);\r
+    } else {\r
+      Value = *(volatile UINT32 *)Address;\r
+    }\r
+\r
     MemoryFence ();\r
   }\r
 \r
@@ -255,6 +296,8 @@ MmioRead32 (
   If 32-bit MMIO register operations are not supported, then ASSERT().\r
   If Address is not aligned on a 32-bit boundary, then ASSERT().\r
 \r
+  For Td guest TDVMCALL_MMIO is invoked to write MMIO registers.\r
+\r
   @param  Address The MMIO register to write.\r
   @param  Value   The value to write to the MMIO register.\r
 \r
@@ -275,7 +318,13 @@ MmioWrite32 (
   Flag = FilterBeforeMmIoWrite (FilterWidth32, Address, &Value);\r
   if (Flag) {\r
     MemoryFence ();\r
-    *(volatile UINT32 *)Address = Value;\r
+\r
+    if (IsTdxGuest ()) {\r
+      TdMmioWrite32 (Address, Value);\r
+    } else {\r
+      *(volatile UINT32 *)Address = Value;\r
+    }\r
+\r
     MemoryFence ();\r
   }\r
 \r
@@ -294,6 +343,8 @@ MmioWrite32 (
   If 64-bit MMIO register operations are not supported, then ASSERT().\r
   If Address is not aligned on a 64-bit boundary, then ASSERT().\r
 \r
+  For Td guest TDVMCALL_MMIO is invoked to read MMIO registers.\r
+\r
   @param  Address The MMIO register to read.\r
 \r
   @return The value read.\r
@@ -313,7 +364,13 @@ MmioRead64 (
   Flag = FilterBeforeMmIoRead (FilterWidth64, Address, &Value);\r
   if (Flag) {\r
     MemoryFence ();\r
-    Value = *(volatile UINT64 *)Address;\r
+\r
+    if (IsTdxGuest ()) {\r
+      Value = TdMmioRead64 (Address);\r
+    } else {\r
+      Value = *(volatile UINT64 *)Address;\r
+    }\r
+\r
     MemoryFence ();\r
   }\r
 \r
@@ -332,6 +389,8 @@ MmioRead64 (
   If 64-bit MMIO register operations are not supported, then ASSERT().\r
   If Address is not aligned on a 64-bit boundary, then ASSERT().\r
 \r
+  For Td guest TDVMCALL_MMIO is invoked to write MMIO registers.\r
+\r
   @param  Address The MMIO register to write.\r
   @param  Value   The value to write to the MMIO register.\r
 \r
@@ -350,7 +409,13 @@ MmioWrite64 (
   Flag = FilterBeforeMmIoWrite (FilterWidth64, Address, &Value);\r
   if (Flag) {\r
     MemoryFence ();\r
-    *(volatile UINT64 *)Address = Value;\r
+\r
+    if (IsTdxGuest ()) {\r
+      TdMmioWrite64 (Address, Value);\r
+    } else {\r
+      *(volatile UINT64 *)Address = Value;\r
+    }\r
+\r
     MemoryFence ();\r
   }\r
 \r