| /** @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); | |
| } |