We are going to replace XenDetected() implementation in PlatformBootManagerLib by the one in XenPlatformLib. PlatformBootManagerLib's implementation does cache the result of GetFirstGuidHob(), so we do something similar in XenPlatformLib. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=1689 Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com> Message-Id: <20190813113119.14804-27-anthony.perard@citrix.com>
		
			
				
	
	
		
			82 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Get information about Xen
 | 
						|
 | 
						|
  This library simply allow to find out if OVMF is running under Xen and
 | 
						|
  allow to get more information when it is the case.
 | 
						|
 | 
						|
  Copyright (c) 2019, Citrix Systems, Inc.
 | 
						|
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include <PiDxe.h>
 | 
						|
#include <Library/HobLib.h>
 | 
						|
#include <Library/XenPlatformLib.h>
 | 
						|
 | 
						|
/**
 | 
						|
  This function return a pointer to the XenInfo HOB.
 | 
						|
 | 
						|
  @return  XenInfo pointer or NULL if not available
 | 
						|
**/
 | 
						|
EFI_XEN_INFO *
 | 
						|
EFIAPI
 | 
						|
XenGetInfoHOB (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_HOB_GUID_TYPE   *GuidHob;
 | 
						|
  STATIC BOOLEAN      Cached = FALSE;
 | 
						|
  STATIC EFI_XEN_INFO *XenInfo;
 | 
						|
 | 
						|
  //
 | 
						|
  // Return the cached result for the benefit of XenDetected that can be
 | 
						|
  // called many times.
 | 
						|
  //
 | 
						|
  if (Cached) {
 | 
						|
    return XenInfo;
 | 
						|
  }
 | 
						|
 | 
						|
  GuidHob = GetFirstGuidHob (&gEfiXenInfoGuid);
 | 
						|
  if (GuidHob == NULL) {
 | 
						|
    XenInfo = NULL;
 | 
						|
  } else {
 | 
						|
    XenInfo = (EFI_XEN_INFO *) GET_GUID_HOB_DATA (GuidHob);
 | 
						|
  }
 | 
						|
  Cached = TRUE;
 | 
						|
  return XenInfo;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function detects if OVMF is running on Xen.
 | 
						|
 | 
						|
  @retval TRUE    OVMF is running on Xen
 | 
						|
  @retval FALSE   Xen has not been detected
 | 
						|
**/
 | 
						|
BOOLEAN
 | 
						|
EFIAPI
 | 
						|
XenDetected (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  return (XenGetInfoHOB () != NULL);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function detect if OVMF have started via the PVH entry point.
 | 
						|
 | 
						|
  @retval TRUE  PVH entry point as been used
 | 
						|
  @retval FALSE OVMF have started via the HVM route
 | 
						|
**/
 | 
						|
BOOLEAN
 | 
						|
EFIAPI
 | 
						|
XenPvhDetected (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_XEN_INFO        *XenInfo;
 | 
						|
 | 
						|
  XenInfo = XenGetInfoHOB ();
 | 
						|
  return (XenInfo != NULL && XenInfo->RsdpPvh != NULL);
 | 
						|
}
 |