summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGary Lin <glin@suse.com>2016-06-01 18:26:20 +0800
committerJordan Justen <jordan.l.justen@intel.com>2016-06-02 13:34:28 -0700
commitda2369d21d2e57a0de8fa7ae954812122c87326e (patch)
tree1044125e6dbdbdd0ef79f131907956fa438491cf
parent05bf4747dd8e412d10fccbe35346aa2597b4167b (diff)
downloadedk2-platforms-da2369d21d2e57a0de8fa7ae954812122c87326e.tar.xz
OvmfPkg/PlatformBootManagerLib: Connect the Xen drivers before loading NvVars
When OVMF tried to load the file-based NvVars, it checked all the PCI instances and connected the drivers to the mass storage device. However, Xen registered its PCI device with a special class id (0xFF80), so ConnectRecursivelyIfPciMassStorage() couldn't recognize it and skipped the driver connecting for Xen PCI devices. In the end, the Xen block device wasn't initialized until EfiBootManagerConnectAll() was called, and it's already too late to load NvVars. This commit connects the Xen drivers in ConnectRecursivelyIfPciMassStorage() so that Xen can use the file-based NvVars. v3: * Introduce XenDetected() to cache the result of Xen detection instead of relying on PcdPciDisableBusEnumeration. v2: * Cosmetic changes Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Gary Lin <glin@suse.com> Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
-rw-r--r--OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c41
-rw-r--r--OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf1
2 files changed, 40 insertions, 2 deletions
diff --git a/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c b/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c
index befcc5707a..912c5ed1ec 100644
--- a/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c
+++ b/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c
@@ -13,6 +13,7 @@
**/
#include "BdsPlatform.h"
+#include <Guid/XenInfo.h>
#include <Guid/RootBridgesConnectedEventGroup.h>
@@ -1037,6 +1038,37 @@ PciAcpiInitialization (
IoOr16 ((PciRead32 (Pmba) & ~BIT0) + 4, BIT0);
}
+/**
+ This function detects if OVMF is running on Xen.
+
+**/
+STATIC
+BOOLEAN
+XenDetected (
+ VOID
+ )
+{
+ EFI_HOB_GUID_TYPE *GuidHob;
+ STATIC INTN FoundHob = -1;
+
+ if (FoundHob == 0) {
+ return FALSE;
+ } else if (FoundHob == 1) {
+ return TRUE;
+ }
+
+ //
+ // See if a XenInfo HOB is available
+ //
+ GuidHob = GetFirstGuidHob (&gEfiXenInfoGuid);
+ if (GuidHob == NULL) {
+ FoundHob = 0;
+ return FALSE;
+ }
+
+ FoundHob = 1;
+ return TRUE;
+}
EFI_STATUS
EFIAPI
@@ -1050,7 +1082,11 @@ ConnectRecursivelyIfPciMassStorage (
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
CHAR16 *DevPathStr;
- if (IS_CLASS1 (PciHeader, PCI_CLASS_MASS_STORAGE)) {
+ //
+ // Recognize PCI Mass Storage, and Xen PCI devices
+ //
+ if (IS_CLASS1 (PciHeader, PCI_CLASS_MASS_STORAGE) ||
+ (XenDetected() && IS_CLASS2 (PciHeader, 0xFF, 0x80))) {
DevicePath = NULL;
Status = gBS->HandleProtocol (
Handle,
@@ -1068,7 +1104,8 @@ ConnectRecursivelyIfPciMassStorage (
if (DevPathStr != NULL) {
DEBUG((
EFI_D_INFO,
- "Found Mass Storage device: %s\n",
+ "Found %s device: %s\n",
+ IS_CLASS1 (PciHeader, PCI_CLASS_MASS_STORAGE) ? L"Mass Storage" : L"Xen",
DevPathStr
));
FreePool(DevPathStr);
diff --git a/OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf b/OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
index 5fcee3c55c..ffa1288e4d 100644
--- a/OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
+++ b/OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
@@ -74,5 +74,6 @@
gEfiLoadedImageProtocolGuid # PROTOCOL SOMETIMES_PRODUCED
[Guids]
+ gEfiXenInfoGuid
gEfiEndOfDxeEventGroupGuid
gRootBridgesConnectedEventGroupGuid