Skip to content

Commit

Permalink
OvmfPkg/XenHypercallLib: Enable it in PEIM
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Laszlo Ersek <[email protected]>
Message-Id: <[email protected]>
  • Loading branch information
anthonyper-ctx authored and lersek committed Aug 21, 2019
1 parent 2a4a624 commit 68f4599
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 9 deletions.
12 changes: 12 additions & 0 deletions OvmfPkg/Include/Library/XenHypercallLib.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,18 @@
#ifndef __XEN_HYPERCALL_LIB_H__
#define __XEN_HYPERCALL_LIB_H__

/**
To call when the gEfiXenInfoGuid HOB became available after the library init
function has already been executed.
This allow to make hypercall in the PEIM stage.
**/
RETURN_STATUS
EFIAPI
XenHypercallLibInit (
VOID
);

/**
Check if the Xen Hypercall library is able to make calls to the Xen
hypervisor.
Expand Down
8 changes: 1 addition & 7 deletions OvmfPkg/Library/XenHypercallLib/X86XenHypercall.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,7 @@ XenHypercallLibInit (

GuidHob = GetFirstGuidHob (&gEfiXenInfoGuid);
if (GuidHob == NULL) {
//
// 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() above
// will return FALSE.
//
return RETURN_SUCCESS;
return RETURN_NOT_FOUND;
}
XenInfo = (EFI_XEN_INFO *) GET_GUID_HOB_DATA (GuidHob);
HyperPage = XenInfo->HyperPages;
Expand Down
16 changes: 16 additions & 0 deletions OvmfPkg/Library/XenHypercallLib/XenHypercall.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,22 @@
#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 (
Expand Down
4 changes: 2 additions & 2 deletions OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@
FILE_GUID = B5EE9A32-CA5A-49A8-82E3-ADA4CCB77C7C
MODULE_TYPE = BASE
VERSION_STRING = 1.0
CONSTRUCTOR = XenHypercallLibInit
CONSTRUCTOR = XenHypercallLibConstruct

[Defines.IA32, Defines.X64]
LIBRARY_CLASS = XenHypercallLib|DXE_DRIVER UEFI_DRIVER
LIBRARY_CLASS = XenHypercallLib|PEIM DXE_DRIVER UEFI_DRIVER

[Defines.ARM, Defines.AARCH64]
LIBRARY_CLASS = XenHypercallLib
Expand Down

0 comments on commit 68f4599

Please sign in to comment.