**/\r
\r
#include "BdsPlatform.h"\r
+#include <Guid/XenInfo.h>\r
#include <Guid/RootBridgesConnectedEventGroup.h>\r
-#include <Library/QemuBootOrderLib.h>\r
\r
\r
//\r
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
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
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
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
\r
}\r
\r
-\r
VOID\r
PlatformBdsConnectSequence (\r
VOID\r
//\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
\r
--*/\r
{\r
- EFI_STATUS Status;\r
EFI_BOOT_MODE BootMode;\r
\r
DEBUG ((EFI_D_INFO, "PlatformBootManagerAfterConsole\n"));\r
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
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
//\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
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