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

Reply via email to