]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BaseIoLibIntrinsic/IoLibMsc.c
MdePkg: Support IoRead/IoWrite for Tdx guest in BaseIoLibIntrinsic
[mirror_edk2.git] / MdePkg / Library / BaseIoLibIntrinsic / IoLibMsc.c
index 9f225a6b5d391a5581baee104bde6b846b61a313..f1b7d51a7245db7f087210853cb6e7f4923315a1 100644 (file)
@@ -14,6 +14,7 @@
 **/\r
 \r
 #include "BaseIoLibIntrinsicInternal.h"\r
+#include "IoLibTdx.h"\r
 \r
 //\r
 // Microsoft Visual Studio 7.1 Function Prototypes for I/O Intrinsics.\r
@@ -82,6 +83,8 @@ _ReadWriteBarrier (
 \r
   If 8-bit I/O port operations are not supported, then ASSERT().\r
 \r
+  For Td guest TDVMCALL_IO is invoked to read I/O port.\r
+\r
   @param  Port  The I/O port to read.\r
 \r
   @return The value read.\r
@@ -98,9 +101,13 @@ IoRead8 (
 \r
   Flag = FilterBeforeIoRead (FilterWidth8, Port, &Value);\r
   if (Flag) {\r
-    _ReadWriteBarrier ();\r
-    Value = (UINT8)_inp ((UINT16)Port);\r
-    _ReadWriteBarrier ();\r
+    if (IsTdxGuest ()) {\r
+      Value = TdIoRead8 (Port);\r
+    } else {\r
+      _ReadWriteBarrier ();\r
+      Value = (UINT8)_inp ((UINT16)Port);\r
+      _ReadWriteBarrier ();\r
+    }\r
   }\r
 \r
   FilterAfterIoRead (FilterWidth8, Port, &Value);\r
@@ -117,6 +124,8 @@ IoRead8 (
 \r
   If 8-bit I/O port operations are not supported, then ASSERT().\r
 \r
+  For Td guest TDVMCALL_IO is invoked to write I/O port.\r
+\r
   @param  Port  The I/O port to write.\r
   @param  Value The value to write to the I/O port.\r
 \r
@@ -134,9 +143,13 @@ IoWrite8 (
 \r
   Flag = FilterBeforeIoWrite (FilterWidth8, Port, &Value);\r
   if (Flag) {\r
-    _ReadWriteBarrier ();\r
-    (UINT8)_outp ((UINT16)Port, Value);\r
-    _ReadWriteBarrier ();\r
+    if (IsTdxGuest ()) {\r
+      TdIoWrite8 (Port, Value);\r
+    } else {\r
+      _ReadWriteBarrier ();\r
+      (UINT8)_outp ((UINT16)Port, Value);\r
+      _ReadWriteBarrier ();\r
+    }\r
   }\r
 \r
   FilterAfterIoWrite (FilterWidth8, Port, &Value);\r
@@ -154,6 +167,8 @@ IoWrite8 (
   If 16-bit I/O port operations are not supported, then ASSERT().\r
   If Port is not aligned on a 16-bit boundary, then ASSERT().\r
 \r
+  For Td guest TDVMCALL_IO is invoked to read I/O port.\r
+\r
   @param  Port  The I/O port to read.\r
 \r
   @return The value read.\r
@@ -172,9 +187,13 @@ IoRead16 (
 \r
   Flag = FilterBeforeIoRead (FilterWidth16, Port, &Value);\r
   if (Flag) {\r
-    _ReadWriteBarrier ();\r
-    Value = _inpw ((UINT16)Port);\r
-    _ReadWriteBarrier ();\r
+    if (IsTdxGuest ()) {\r
+      Value = TdIoRead16 (Port);\r
+    } else {\r
+      _ReadWriteBarrier ();\r
+      Value = _inpw ((UINT16)Port);\r
+      _ReadWriteBarrier ();\r
+    }\r
   }\r
 \r
   FilterBeforeIoRead (FilterWidth16, Port, &Value);\r
@@ -192,6 +211,8 @@ IoRead16 (
   If 16-bit I/O port operations are not supported, then ASSERT().\r
   If Port is not aligned on a 16-bit boundary, then ASSERT().\r
 \r
+  For Td guest TDVMCALL_IO is invoked to write I/O port.\r
+\r
   @param  Port  The I/O port to write.\r
   @param  Value The value to write to the I/O port.\r
 \r
@@ -211,9 +232,13 @@ IoWrite16 (
 \r
   Flag = FilterBeforeIoWrite (FilterWidth16, Port, &Value);\r
   if (Flag) {\r
-    _ReadWriteBarrier ();\r
-    _outpw ((UINT16)Port, Value);\r
-    _ReadWriteBarrier ();\r
+    if (IsTdxGuest ()) {\r
+      TdIoWrite16 (Port, Value);\r
+    } else {\r
+      _ReadWriteBarrier ();\r
+      _outpw ((UINT16)Port, Value);\r
+      _ReadWriteBarrier ();\r
+    }\r
   }\r
 \r
   FilterAfterIoWrite (FilterWidth16, Port, &Value);\r
@@ -231,6 +256,8 @@ IoWrite16 (
   If 32-bit I/O port operations are not supported, then ASSERT().\r
   If Port is not aligned on a 32-bit boundary, then ASSERT().\r
 \r
+  For Td guest TDVMCALL_IO is invoked to read I/O port.\r
+\r
   @param  Port  The I/O port to read.\r
 \r
   @return The value read.\r
@@ -249,9 +276,13 @@ IoRead32 (
 \r
   Flag = FilterBeforeIoRead (FilterWidth32, Port, &Value);\r
   if (Flag) {\r
-    _ReadWriteBarrier ();\r
-    Value = _inpd ((UINT16)Port);\r
-    _ReadWriteBarrier ();\r
+    if (IsTdxGuest ()) {\r
+      Value = TdIoRead32 (Port);\r
+    } else {\r
+      _ReadWriteBarrier ();\r
+      Value = _inpd ((UINT16)Port);\r
+      _ReadWriteBarrier ();\r
+    }\r
   }\r
 \r
   FilterAfterIoRead (FilterWidth32, Port, &Value);\r
@@ -269,6 +300,8 @@ IoRead32 (
   If 32-bit I/O port operations are not supported, then ASSERT().\r
   If Port is not aligned on a 32-bit boundary, then ASSERT().\r
 \r
+  For Td guest TDVMCALL_IO is invoked to write I/O port.\r
+\r
   @param  Port  The I/O port to write.\r
   @param  Value The value to write to the I/O port.\r
 \r
@@ -288,9 +321,13 @@ IoWrite32 (
 \r
   Flag = FilterBeforeIoWrite (FilterWidth32, Port, &Value);\r
   if (Flag) {\r
-    _ReadWriteBarrier ();\r
-    _outpd ((UINT16)Port, Value);\r
-    _ReadWriteBarrier ();\r
+    if (IsTdxGuest ()) {\r
+      TdIoWrite32 (Port, Value);\r
+    } else {\r
+      _ReadWriteBarrier ();\r
+      _outpd ((UINT16)Port, Value);\r
+      _ReadWriteBarrier ();\r
+    }\r
   }\r
 \r
   FilterAfterIoWrite (FilterWidth32, Port, &Value);\r