]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c
OvmfPkg: add a Name GUID to each Firmware Volume
[mirror_edk2.git] / OvmfPkg / Library / PlatformBootManagerLib / BdsPlatform.c
index 7ef4d3de16295fe466f7f43750fe4cd3f68a8a42..912c5ed1ece40f39f27eec8a796d315e54fda540 100644 (file)
@@ -13,8 +13,8 @@
 **/\r
 \r
 #include "BdsPlatform.h"\r
+#include <Guid/XenInfo.h>\r
 #include <Guid/RootBridgesConnectedEventGroup.h>\r
-#include <Library/QemuBootOrderLib.h>\r
 \r
 \r
 //\r
@@ -185,12 +185,6 @@ PlatformRegisterOptionsAndKeys (
              NULL, (UINT16) BootOption.OptionNumber, 0, &Esc, NULL\r
              );\r
   ASSERT (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED);\r
-  //\r
-  // Register UEFI Shell\r
-  //\r
-  PlatformRegisterFvBootOption (\r
-    PcdGetPtr (PcdShellFile), L"EFI Internal Shell", LOAD_OPTION_ACTIVE\r
-    );\r
 }\r
 \r
 EFI_STATUS\r
@@ -1044,6 +1038,37 @@ PciAcpiInitialization (
   IoOr16 ((PciRead32 (Pmba) & ~BIT0) + 4, BIT0);\r
 }\r
 \r
+/**\r
+  This function detects if OVMF is running on Xen.\r
+\r
+**/\r
+STATIC\r
+BOOLEAN\r
+XenDetected (\r
+  VOID\r
+  )\r
+{\r
+  EFI_HOB_GUID_TYPE         *GuidHob;\r
+  STATIC INTN               FoundHob = -1;\r
+\r
+  if (FoundHob == 0) {\r
+    return FALSE;\r
+  } else if (FoundHob == 1) {\r
+    return TRUE;\r
+  }\r
+\r
+  //\r
+  // See if a XenInfo HOB is available\r
+  //\r
+  GuidHob = GetFirstGuidHob (&gEfiXenInfoGuid);\r
+  if (GuidHob == NULL) {\r
+    FoundHob = 0;\r
+    return FALSE;\r
+  }\r
+\r
+  FoundHob = 1;\r
+  return TRUE;\r
+}\r
 \r
 EFI_STATUS\r
 EFIAPI\r
@@ -1057,7 +1082,11 @@ ConnectRecursivelyIfPciMassStorage (
   EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
   CHAR16                    *DevPathStr;\r
 \r
-  if (IS_CLASS1 (PciHeader, PCI_CLASS_MASS_STORAGE)) {\r
+  //\r
+  // Recognize PCI Mass Storage, and Xen PCI devices\r
+  //\r
+  if (IS_CLASS1 (PciHeader, PCI_CLASS_MASS_STORAGE) ||\r
+      (XenDetected() && IS_CLASS2 (PciHeader, 0xFF, 0x80))) {\r
     DevicePath = NULL;\r
     Status = gBS->HandleProtocol (\r
                     Handle,\r
@@ -1075,7 +1104,8 @@ ConnectRecursivelyIfPciMassStorage (
     if (DevPathStr != NULL) {\r
       DEBUG((\r
         EFI_D_INFO,\r
-        "Found Mass Storage device: %s\n",\r
+        "Found %s device: %s\n",\r
+        IS_CLASS1 (PciHeader, PCI_CLASS_MASS_STORAGE) ? L"Mass Storage" : L"Xen",\r
         DevPathStr\r
         ));\r
       FreePool(DevPathStr);\r
@@ -1160,7 +1190,6 @@ PlatformBdsRestoreNvVarsFromHardDisk (
 \r
 }\r
 \r
-\r
 VOID\r
 PlatformBdsConnectSequence (\r
   VOID\r
@@ -1197,104 +1226,19 @@ Returns:
     //\r
     // Build the platform boot option\r
     //\r
-    BdsLibConnectDevicePath (gPlatformConnectSequence[Index]);\r
+    EfiBootManagerConnectDevicePath (gPlatformConnectSequence[Index], NULL);\r
     Index++;\r
   }\r
 \r
   //\r
   // Just use the simple policy to connect all devices\r
   //\r
-  BdsLibConnectAll ();\r
+  DEBUG ((EFI_D_INFO, "EfiBootManagerConnectAll\n"));\r
+  EfiBootManagerConnectAll ();\r
 \r
   PciAcpiInitialization ();\r
-\r
-  //\r
-  // Clear the logo after all devices are connected.\r
-  //\r
-  gST->ConOut->ClearScreen (gST->ConOut);\r
 }\r
 \r
-VOID\r
-PlatformBdsGetDriverOption (\r
-  IN OUT LIST_ENTRY              *BdsDriverLists\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Load the predefined driver option, OEM/IBV can customize this\r
-  to load their own drivers\r
-\r
-Arguments:\r
-\r
-  BdsDriverLists  - The header of the driver option link list.\r
-\r
-Returns:\r
-\r
-  None.\r
-\r
---*/\r
-{\r
-  DEBUG ((EFI_D_INFO, "PlatformBdsGetDriverOption\n"));\r
-  return;\r
-}\r
-\r
-VOID\r
-PlatformBdsDiagnostics (\r
-  IN EXTENDMEM_COVERAGE_LEVEL    MemoryTestLevel,\r
-  IN BOOLEAN                     QuietBoot,\r
-  IN BASEM_MEMORY_TEST           BaseMemoryTest\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Perform the platform diagnostic, such like test memory. OEM/IBV also\r
-  can customize this fuction to support specific platform diagnostic.\r
-\r
-Arguments:\r
-\r
-  MemoryTestLevel  - The memory test intensive level\r
-\r
-  QuietBoot        - Indicate if need to enable the quiet boot\r
-\r
-  BaseMemoryTest   - A pointer to BaseMemoryTest()\r
-\r
-Returns:\r
-\r
-  None.\r
-\r
---*/\r
-{\r
-  EFI_STATUS  Status;\r
-\r
-  DEBUG ((EFI_D_INFO, "PlatformBdsDiagnostics\n"));\r
-\r
-  //\r
-  // Here we can decide if we need to show\r
-  // the diagnostics screen\r
-  // Notes: this quiet boot code should be remove\r
-  // from the graphic lib\r
-  //\r
-  if (QuietBoot) {\r
-    EnableQuietBoot (PcdGetPtr(PcdLogoFile));\r
-    //\r
-    // Perform system diagnostic\r
-    //\r
-    Status = BaseMemoryTest (MemoryTestLevel);\r
-    if (EFI_ERROR (Status)) {\r
-      DisableQuietBoot ();\r
-    }\r
-\r
-    return ;\r
-  }\r
-  //\r
-  // Perform system diagnostic\r
-  //\r
-  Status = BaseMemoryTest (MemoryTestLevel);\r
-}\r
-\r
-\r
 /**\r
   Save the S3 boot script.\r
 \r
@@ -1342,7 +1286,6 @@ Routine Description:
 \r
 --*/\r
 {\r
-  EFI_STATUS                         Status;\r
   EFI_BOOT_MODE                      BootMode;\r
 \r
   DEBUG ((EFI_D_INFO, "PlatformBootManagerAfterConsole\n"));\r
@@ -1358,15 +1301,10 @@ Routine Description:
     PlatformBdsRestoreNvVarsFromHardDisk ();\r
   }\r
 \r
-  //\r
-  // Load the driver option as the driver option list\r
-  //\r
-  PlatformBdsGetDriverOption (DriverOptionList);\r
-\r
   //\r
   // Get current Boot Mode\r
   //\r
-  Status = BdsLibGetBootMode (&BootMode);\r
+  BootMode = GetBootModeHob ();\r
   DEBUG ((EFI_D_ERROR, "Boot Mode:%x\n", BootMode));\r
 \r
   //\r
@@ -1376,9 +1314,15 @@ Routine Description:
   ASSERT (BootMode == BOOT_WITH_FULL_CONFIGURATION);\r
 \r
   //\r
-  // Memory test and Logo show\r
+  // Logo show\r
   //\r
-  PlatformBdsDiagnostics (IGNORE, TRUE, BaseMemoryTest);\r
+  BootLogoEnableLogo (\r
+    ImageFormatBmp,                          // ImageFormat\r
+    PcdGetPtr (PcdLogoFile),                 // Logo\r
+    EdkiiPlatformLogoDisplayAttributeCenter, // Attribute\r
+    0,                                       // OffsetX\r
+    0                                        // OffsetY\r
+    );\r
 \r
   //\r
   // Perform some platform specific connect sequence\r
@@ -1390,16 +1334,16 @@ Routine Description:
   //\r
   TryRunningQemuKernel ();\r
 \r
-  DEBUG ((EFI_D_INFO, "BdsLibConnectAll\n"));\r
-  BdsLibConnectAll ();\r
-  BdsLibEnumerateAllBootOption (BootOptionList);\r
+  EfiBootManagerRefreshAllBootOption ();\r
 \r
-  SetBootOrderFromQemu (BootOptionList);\r
   //\r
-  // The BootOrder variable may have changed, reload the in-memory list with\r
-  // it.\r
+  // Register UEFI Shell\r
   //\r
-  BdsLibBuildOptionFromVar (BootOptionList, L"BootOrder");\r
+  PlatformRegisterFvBootOption (\r
+    PcdGetPtr (PcdShellFile), L"EFI Internal Shell", LOAD_OPTION_ACTIVE\r
+    );\r
+\r
+  SetBootOrderFromQemu ();\r
 }\r
 \r
 /**\r
@@ -1513,5 +1457,22 @@ PlatformBootManagerWaitCallback (
   UINT16          TimeoutRemain\r
   )\r
 {\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Black;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION White;\r
+  UINT16                              Timeout;\r
+\r
+  Timeout = PcdGet16 (PcdPlatformBootTimeOut);\r
+\r
+  Black.Raw = 0x00000000;\r
+  White.Raw = 0x00FFFFFF;\r
+\r
+  BootLogoUpdateProgress (\r
+    White.Pixel,\r
+    Black.Pixel,\r
+    L"Start boot option",\r
+    White.Pixel,\r
+    (Timeout - TimeoutRemain) * 100 / Timeout,\r
+    0\r
+    );\r
 }\r
 \r