/** @file | |
Xen Hypercall Library implementation for Intel architecture | |
Copyright (c) 2014, Linaro Ltd. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#include <PiDxe.h> | |
#include <Library/HobLib.h> | |
#include <Library/DebugLib.h> | |
#include <Guid/XenInfo.h> | |
STATIC VOID *HyperPage; | |
/** | |
Check if the Xen Hypercall library is able to make calls to the Xen | |
hypervisor. | |
Client code should call further functions in this library only if, and after, | |
this function returns TRUE. | |
@retval TRUE Hypercalls are available. | |
@retval FALSE Hypercalls are not available. | |
**/ | |
BOOLEAN | |
EFIAPI | |
XenHypercallIsAvailable ( | |
VOID | |
) | |
{ | |
return HyperPage != NULL; | |
} | |
// | |
// Interface exposed by the ASM implementation of the core hypercall | |
// | |
INTN | |
EFIAPI | |
__XenHypercall2 ( | |
IN VOID *HypercallAddr, | |
IN OUT INTN Arg1, | |
IN OUT INTN Arg2 | |
); | |
/** | |
Library constructor: retrieves the Hyperpage address | |
from the gEfiXenInfoGuid HOB | |
**/ | |
RETURN_STATUS | |
EFIAPI | |
XenHypercallLibInit ( | |
VOID | |
) | |
{ | |
EFI_HOB_GUID_TYPE *GuidHob; | |
EFI_XEN_INFO *XenInfo; | |
GuidHob = GetFirstGuidHob (&gEfiXenInfoGuid); | |
if (GuidHob == NULL) { | |
return RETURN_NOT_FOUND; | |
} | |
XenInfo = (EFI_XEN_INFO *)GET_GUID_HOB_DATA (GuidHob); | |
HyperPage = XenInfo->HyperPages; | |
return RETURN_SUCCESS; | |
} | |
/** | |
This function will put the two arguments in the right place (registers) and | |
invoke the hypercall identified by HypercallID. | |
@param HypercallID The symbolic ID of the hypercall to be invoked | |
@param Arg1 First argument. | |
@param Arg2 Second argument. | |
@return Return 0 if success otherwise it return an errno. | |
**/ | |
INTN | |
EFIAPI | |
XenHypercall2 ( | |
IN UINTN HypercallID, | |
IN OUT INTN Arg1, | |
IN OUT INTN Arg2 | |
) | |
{ | |
ASSERT (HyperPage != NULL); | |
return __XenHypercall2 ((UINT8 *)HyperPage + HypercallID * 32, Arg1, Arg2); | |
} |