]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BaseIoLibIntrinsic/IoLibGcc.c
MdePkg: Support IoRead/IoWrite for Tdx guest in BaseIoLibIntrinsic
[mirror_edk2.git] / MdePkg / Library / BaseIoLibIntrinsic / IoLibGcc.c
index 5c791289c469111c767318c0bfde0dc96be4e44a..05a739085967c1390ea5ebb5f42ba5cac31acd06 100644 (file)
@@ -16,6 +16,7 @@
 **/\r
 \r
 #include "BaseIoLibIntrinsicInternal.h"\r
+#include "IoLibTdx.h"\r
 \r
 /**\r
   Reads an 8-bit I/O port.\r
@@ -24,7 +25,9 @@
   This function must guarantee that all I/O read and write operations are\r
   serialized.\r
 \r
-  If 8-bit I/O port operations are not supported, then ASSERT().\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
@@ -42,7 +45,11 @@ IoRead8 (
 \r
   Flag = FilterBeforeIoRead (FilterWidth8, Port, &Data);\r
   if (Flag) {\r
-    __asm__ __volatile__ ("inb %w1,%b0" : "=a" (Data) : "d" ((UINT16)Port));\r
+    if (IsTdxGuest ()) {\r
+      Data = TdIoRead8 (Port);\r
+    } else {\r
+      __asm__ __volatile__ ("inb %w1,%b0" : "=a" (Data) : "d" ((UINT16)Port));\r
+    }\r
   }\r
 \r
   FilterAfterIoRead (FilterWidth8, Port, &Data);\r
@@ -59,6 +66,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
@@ -76,7 +85,11 @@ IoWrite8 (
 \r
   Flag = FilterBeforeIoWrite (FilterWidth8, Port, &Value);\r
   if (Flag) {\r
-    __asm__ __volatile__ ("outb %b0,%w1" : : "a" (Value), "d" ((UINT16)Port));\r
+    if (IsTdxGuest ()) {\r
+      TdIoWrite8 (Port, Value);\r
+    } else {\r
+      __asm__ __volatile__ ("outb %b0,%w1" : : "a" (Value), "d" ((UINT16)Port));\r
+    }\r
   }\r
 \r
   FilterAfterIoWrite (FilterWidth8, Port, &Value);\r
@@ -94,6 +107,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
@@ -112,7 +127,11 @@ IoRead16 (
 \r
   Flag = FilterBeforeIoRead (FilterWidth16, Port, &Data);\r
   if (Flag) {\r
-    __asm__ __volatile__ ("inw %w1,%w0" : "=a" (Data) : "d" ((UINT16)Port));\r
+    if (IsTdxGuest ()) {\r
+      Data = TdIoRead16 (Port);\r
+    } else {\r
+      __asm__ __volatile__ ("inw %w1,%w0" : "=a" (Data) : "d" ((UINT16)Port));\r
+    }\r
   }\r
 \r
   FilterAfterIoRead (FilterWidth16, Port, &Data);\r
@@ -130,6 +149,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
@@ -149,7 +170,11 @@ IoWrite16 (
 \r
   Flag = FilterBeforeIoWrite (FilterWidth16, Port, &Value);\r
   if (Flag) {\r
-    __asm__ __volatile__ ("outw %w0,%w1" : : "a" (Value), "d" ((UINT16)Port));\r
+    if (IsTdxGuest ()) {\r
+      TdIoWrite16 (Port, Value);\r
+    } else {\r
+      __asm__ __volatile__ ("outw %w0,%w1" : : "a" (Value), "d" ((UINT16)Port));\r
+    }\r
   }\r
 \r
   FilterAfterIoWrite (FilterWidth16, Port, &Value);\r
@@ -167,6 +192,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
@@ -185,7 +212,11 @@ IoRead32 (
 \r
   Flag = FilterBeforeIoRead (FilterWidth32, Port, &Data);\r
   if (Flag) {\r
-    __asm__ __volatile__ ("inl %w1,%0" : "=a" (Data) : "d" ((UINT16)Port));\r
+    if (IsTdxGuest ()) {\r
+      Data = TdIoRead32 (Port);\r
+    } else {\r
+      __asm__ __volatile__ ("inl %w1,%0" : "=a" (Data) : "d" ((UINT16)Port));\r
+    }\r
   }\r
 \r
   FilterAfterIoRead (FilterWidth32, Port, &Data);\r
@@ -203,6 +234,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
@@ -222,7 +255,11 @@ IoWrite32 (
 \r
   Flag = FilterBeforeIoWrite (FilterWidth32, Port, &Value);\r
   if (Flag) {\r
-    __asm__ __volatile__ ("outl %0,%w1" : : "a" (Value), "d" ((UINT16)Port));\r
+    if (IsTdxGuest ()) {\r
+      TdIoWrite32 (Port, Value);\r
+    } else {\r
+      __asm__ __volatile__ ("outl %0,%w1" : : "a" (Value), "d" ((UINT16)Port));\r
+    }\r
   }\r
 \r
   FilterAfterIoWrite (FilterWidth32, Port, &Value);\r