blob: f6b3e5ca7001af9ec99f5cea099491051378b1f7 [file] [log] [blame]
/** @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);
}