]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/PlatformBootManagerLib: Use a Xen console for ConOut/ConIn
authorAnthony PERARD <anthony.perard@citrix.com>
Tue, 13 Aug 2019 11:31:15 +0000 (12:31 +0100)
committerLaszlo Ersek <lersek@redhat.com>
Wed, 21 Aug 2019 16:03:49 +0000 (18:03 +0200)
On a Xen PVH guest, none of the existing serial or console interface
works, so we add a new one, based on XenConsoleSerialPortLib, and
implemented via SerialDxe.

That is a simple console implementation that can work on both PVH
guest and HVM guests, even if it is rarely going to be used on HVM.

Have PlatformBootManagerLib look for the new console, when running as a
Xen guest.

Since we use VENDOR_UART_DEVICE_PATH, fix its description and coding
style.

Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=1689
Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20190813113119.14804-32-anthony.perard@citrix.com>

OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c
OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.h
OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
OvmfPkg/Library/PlatformBootManagerLib/PlatformData.c
OvmfPkg/OvmfXen.dsc
OvmfPkg/OvmfXen.fdf

index 1eba304f09d4edc435ea2e6577c23574cf1a3b8b..70df6b841accb8177d8d772250c982be799c50e7 100644 (file)
@@ -398,7 +398,8 @@ PlatformBootManagerBeforeConsole (
   //\r
   EfiBootManagerDispatchDeferredImages ();\r
 \r
-  PlatformInitializeConsole (gPlatformConsole);\r
+  PlatformInitializeConsole (\r
+    XenDetected() ? gXenPlatformConsole : gPlatformConsole);\r
   PcdStatus = PcdSet16S (PcdPlatformBootTimeOut,\r
                 GetFrontPageTimeoutFromQemu ());\r
   ASSERT_RETURN_ERROR (PcdStatus);\r
index 49a072b4009361d871d33010688844117d74cf7e..153e21510156a95284cf2aa7b40c7da1b7fba00f 100644 (file)
@@ -165,6 +165,7 @@ typedef struct {
 #define CONSOLE_IN  BIT1\r
 #define STD_ERROR   BIT2\r
 extern PLATFORM_CONSOLE_CONNECT_ENTRY  gPlatformConsole[];\r
+extern PLATFORM_CONSOLE_CONNECT_ENTRY  gXenPlatformConsole[];\r
 \r
 //\r
 // Platform BDS Functions\r
index 04d614cd493870a57764ef6e2d8505143101b081..f89cce187942b07c9c7cec8ee4ce36f1993c9724 100644 (file)
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashVariablesEnable\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId\r
   gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut\r
+  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate         ## CONSUMES\r
+  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultDataBits         ## CONSUMES\r
+  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity           ## CONSUMES\r
+  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultStopBits         ## CONSUMES\r
 \r
 [Pcd.IA32, Pcd.X64]\r
   gEfiMdePkgTokenSpaceGuid.PcdFSBClock\r
index 36aab784d79b989fd9288fba6ddbdbe7ac40568e..2858c3dfd5cad0c4ba5e6bf867b143aca1081ff6 100644 (file)
@@ -9,18 +9,19 @@
 \r
 #include "BdsPlatform.h"\r
 #include <Guid/QemuRamfb.h>\r
+#include <Guid/SerialPortLibVendor.h>\r
 \r
 //\r
-// Debug Agent UART Device Path structure\r
+// Vendor UART Device Path structure\r
 //\r
-#pragma pack(1)\r
+#pragma pack (1)\r
 typedef struct {\r
   VENDOR_DEVICE_PATH        VendorHardware;\r
   UART_DEVICE_PATH          Uart;\r
   VENDOR_DEVICE_PATH        TerminalType;\r
   EFI_DEVICE_PATH_PROTOCOL  End;\r
 } VENDOR_UART_DEVICE_PATH;\r
-#pragma pack()\r
+#pragma pack ()\r
 \r
 //\r
 // USB Keyboard Device Path structure\r
@@ -141,6 +142,37 @@ STATIC VENDOR_RAMFB_DEVICE_PATH gQemuRamfbDevicePath = {
   gEndEntire\r
 };\r
 \r
+STATIC VENDOR_UART_DEVICE_PATH gXenConsoleDevicePath = {\r
+  {\r
+    {\r
+      HARDWARE_DEVICE_PATH,\r
+      HW_VENDOR_DP,\r
+      {\r
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
+      }\r
+    },\r
+    EDKII_SERIAL_PORT_LIB_VENDOR_GUID\r
+  },\r
+  {\r
+    {\r
+      MESSAGING_DEVICE_PATH,\r
+      MSG_UART_DP,\r
+      {\r
+        (UINT8) (sizeof (UART_DEVICE_PATH)),\r
+        (UINT8) ((sizeof (UART_DEVICE_PATH)) >> 8)\r
+      }\r
+    },\r
+    0,\r
+    FixedPcdGet64 (PcdUartDefaultBaudRate),\r
+    FixedPcdGet8 (PcdUartDefaultDataBits),\r
+    FixedPcdGet8 (PcdUartDefaultParity),\r
+    FixedPcdGet8 (PcdUartDefaultStopBits),\r
+  },\r
+  gPcAnsiTerminal,\r
+  gEndEntire\r
+};\r
+\r
 //\r
 // Predefined platform default console device path\r
 //\r
@@ -163,6 +195,17 @@ PLATFORM_CONSOLE_CONNECT_ENTRY   gPlatformConsole[] = {
   }\r
 };\r
 \r
+PLATFORM_CONSOLE_CONNECT_ENTRY   gXenPlatformConsole[] = {\r
+  {\r
+    (EFI_DEVICE_PATH_PROTOCOL *)&gXenConsoleDevicePath,\r
+    (CONSOLE_OUT | CONSOLE_IN | STD_ERROR)\r
+  },\r
+  {\r
+    NULL,\r
+    0\r
+  }\r
+};\r
+\r
 //\r
 // Predefined platform connect sequence\r
 //\r
index 54ac910d8eede5968d44d0e95dcae55cb0f61d10..e719a168f81e180bc127783c159e4cd7589d15a2 100644 (file)
   OvmfPkg/XenIoPciDxe/XenIoPciDxe.inf\r
   OvmfPkg/XenBusDxe/XenBusDxe.inf\r
   OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf\r
+  MdeModulePkg/Universal/SerialDxe/SerialDxe.inf {\r
+    <LibraryClasses>\r
+      SerialPortLib|OvmfPkg/Library/XenConsoleSerialPortLib/XenConsoleSerialPortLib.inf\r
+  }\r
   MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf\r
   MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf\r
   MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf\r
index fa0830a3241cfdac08f59a9205054311f8e7e5e3..5c1a925d6a88231ceef18ec5d3d0be0f2153d85a 100644 (file)
@@ -312,6 +312,7 @@ INF  PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf
 INF  OvmfPkg/XenIoPciDxe/XenIoPciDxe.inf\r
 INF  OvmfPkg/XenBusDxe/XenBusDxe.inf\r
 INF  OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.inf\r
+INF  MdeModulePkg/Universal/SerialDxe/SerialDxe.inf\r
 \r
 INF  MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf\r
 INF  MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf\r