Files
system76-edk2/OvmfPkg/Library/XenHypercallLib/XenHypercall.c
Anthony PERARD 68f4599dfc OvmfPkg/XenHypercallLib: Enable it in PEIM
Allow to use Xen hypercalls earlier, during the PEIM stage, but
XenHypercallLibInit() must be called once the XenInfo HOB is created
with the HyperPage setup.

Change the return value of XenHypercallLibInit so failure can be
detected when the call shouldn't fail, but still have the constructor
always succeed.

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-17-anthony.perard@citrix.com>
2019-08-21 18:03:49 +02:00

77 lines
1.6 KiB
C

/** @file
Functions to make Xen hypercalls.
Copyright (C) 2014, Citrix Ltd.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <PiDxe.h>
#include <IndustryStandard/Xen/hvm/params.h>
#include <IndustryStandard/Xen/memory.h>
#include <Library/DebugLib.h>
#include <Library/XenHypercallLib.h>
RETURN_STATUS
EFIAPI
XenHypercallLibConstruct (
VOID
)
{
XenHypercallLibInit ();
//
// We don't fail library construction, since that has catastrophic
// consequences for client modules (whereas those modules may easily be
// running on a non-Xen platform). Instead, XenHypercallIsAvailable()
// will return FALSE.
//
return RETURN_SUCCESS;
}
UINT64
EFIAPI
XenHypercallHvmGetParam (
IN UINT32 Index
)
{
xen_hvm_param_t Parameter;
INTN Error;
Parameter.domid = DOMID_SELF;
Parameter.index = Index;
Error = XenHypercall2 (__HYPERVISOR_hvm_op,
HVMOP_get_param, (INTN) &Parameter);
if (Error != 0) {
DEBUG ((EFI_D_ERROR,
"XenHypercall: Error %Ld trying to get HVM parameter %d\n",
(INT64)Error, Index));
return 0;
}
return Parameter.value;
}
INTN
EFIAPI
XenHypercallMemoryOp (
IN UINTN Operation,
IN OUT VOID *Arguments
)
{
return XenHypercall2 (__HYPERVISOR_memory_op,
Operation, (INTN) Arguments);
}
INTN
EFIAPI
XenHypercallEventChannelOp (
IN INTN Operation,
IN OUT VOID *Arguments
)
{
return XenHypercall2 (__HYPERVISOR_event_channel_op,
Operation, (INTN) Arguments);
}