OvmfPkg: replace strict XenHypercallLib construction with explicit query

XenHypercallLib has two clients at the moment: XenBusDxe and
XenConsoleSerialPortLib. Currently, when XenBusDxe starts on a non-Xen X86
platform (ie. as part of OVMF not running on Xen), the X86XenHypercallLib
instance built into it fails to initialize, which triggers an ASSERT() in
auto-generated code.

Instead, let's call XenHypercallIsAvailable() in the driver's entry point,
and exit cleanly when the driver is started on a non-Xen platform.

Modify the constructor of XenConsoleSerialPortLib similarly; we shouldn't
proceed if Xen is not available. In practice this check should never fail,
because XenConsoleSerialPortLib is only used on ARM, and
ArmXenHypercallLib is always available; but nonetheless we should be
pedantic.

Reported-by: Gabriel L. Somlo <gsomlo@gmail.com>
Suggested-by: Jordan Justen <jordan.l.justen@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Tested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17001 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Laszlo Ersek 2015-03-03 08:13:40 +00:00 committed by lersek
parent 02f69a25f0
commit 48b3ff0479
3 changed files with 16 additions and 1 deletions

View File

@ -40,6 +40,10 @@ SerialPortInitialize (
VOID VOID
) )
{ {
if (! XenHypercallIsAvailable ()) {
return RETURN_NOT_FOUND;
}
if (!mXenConsoleInterface) { if (!mXenConsoleInterface) {
mXenConsoleEventChain.port = (UINT32)XenHypercallHvmGetParam (HVM_PARAM_CONSOLE_EVTCHN); mXenConsoleEventChain.port = (UINT32)XenHypercallHvmGetParam (HVM_PARAM_CONSOLE_EVTCHN);
mXenConsoleInterface = (struct xencons_interface *)(UINTN) mXenConsoleInterface = (struct xencons_interface *)(UINTN)

View File

@ -65,7 +65,13 @@ XenHypercallLibInit (
GuidHob = GetFirstGuidHob (&gEfiXenInfoGuid); GuidHob = GetFirstGuidHob (&gEfiXenInfoGuid);
if (GuidHob == NULL) { if (GuidHob == NULL) {
return RETURN_NOT_FOUND; //
// 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;
} }
XenInfo = (EFI_XEN_INFO *) GET_GUID_HOB_DATA (GuidHob); XenInfo = (EFI_XEN_INFO *) GET_GUID_HOB_DATA (GuidHob);
HyperPage = XenInfo->HyperPages; HyperPage = XenInfo->HyperPages;

View File

@ -165,6 +165,7 @@ XenBusDxeUnload (
@param SystemTable A pointer to the EFI System Table. @param SystemTable A pointer to the EFI System Table.
@retval EFI_SUCCESS The operation completed successfully. @retval EFI_SUCCESS The operation completed successfully.
@retval EFI_ABORTED Xen hypercalls are not available.
@retval Others An unexpected error occurred. @retval Others An unexpected error occurred.
**/ **/
EFI_STATUS EFI_STATUS
@ -176,6 +177,10 @@ XenBusDxeDriverEntryPoint (
{ {
EFI_STATUS Status; EFI_STATUS Status;
if (! XenHypercallIsAvailable ()) {
return EFI_ABORTED;
}
// //
// Install UEFI Driver Model protocol(s). // Install UEFI Driver Model protocol(s).
// //