Reviewed-by: Jordan Justen <[email protected]> Pushed as da2369d21d2e57a0de8fa7ae954812122c87326e
On 2016-06-01 03:26:20, Gary Lin wrote: > 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 <[email protected]> > Cc: Laszlo Ersek <[email protected]> > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Gary Lin <[email protected]> > --- > .../Library/PlatformBootManagerLib/BdsPlatform.c | 41 > ++++++++++++++++++++-- > .../PlatformBootManagerLib.inf | 1 + > 2 files changed, 40 insertions(+), 2 deletions(-) > > diff --git a/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c > b/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c > index befcc57..912c5ed 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 5fcee3c..ffa1288 100644 > --- a/OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf > +++ b/OvmfPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf > @@ -74,5 +74,6 @@ [Protocols] > gEfiLoadedImageProtocolGuid # PROTOCOL SOMETIMES_PRODUCED > > [Guids] > + gEfiXenInfoGuid > gEfiEndOfDxeEventGroupGuid > gRootBridgesConnectedEventGroupGuid > -- > 2.8.3 > > _______________________________________________ > edk2-devel mailing list > [email protected] > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

