similarity index 82%
rename from OvmfPkg/XenBusDxe/XenHypercall.h
rename to OvmfPkg/Include/Library/XenHypercallLib.h
@@ -13,8 +13,8 @@
**/
-#ifndef __XENBUS_DXE_HYPERCALL_H__
-#define __XENBUS_DXE_HYPERCALL_H__
+#ifndef __XEN_HYPERCALL_LIB_H_
+#define __XEN_HYPERCALL_LIB_H_
/**
This function will put the two arguments in the right place (registers) and
@@ -35,18 +35,6 @@ XenHypercall2 (
);
/**
- Get the page where all hypercall are from the XenInfo hob.
-
- @param Dev A XENBUS_DEVICE instance.
-
- @retval EFI_NOT_FOUND hyperpage could not be found.
- @retval EFI_SUCCESS Successfully retrieve the hyperpage pointer.
-**/
-EFI_STATUS
-XenHyperpageInit (
- );
-
-/**
Return the value of the HVM parameter Index.
@param Index The parameter to get, e.g. HVM_PARAM_STORE_EVTCHN.
similarity index 100%
rename from OvmfPkg/XenBusDxe/Ia32/hypercall.nasm
rename to OvmfPkg/Library/XenHypercallLib/Ia32/hypercall.nasm
similarity index 100%
rename from OvmfPkg/XenBusDxe/X64/hypercall.nasm
rename to OvmfPkg/Library/XenHypercallLib/X64/hypercall.nasm
similarity index 66%
rename from OvmfPkg/XenBusDxe/XenHypercall.c
rename to OvmfPkg/Library/XenHypercallLib/XenHypercall.c
@@ -14,32 +14,12 @@
**/
#include <PiDxe.h>
-#include <Library/HobLib.h>
-#include <Guid/XenInfo.h>
-
-#include "XenBusDxe.h"
-#include "XenHypercall.h"
#include <IndustryStandard/Xen/hvm/params.h>
#include <IndustryStandard/Xen/memory.h>
-STATIC VOID *Hyperpage;
-
-EFI_STATUS
-XenHyperpageInit (
- )
-{
- EFI_HOB_GUID_TYPE *GuidHob;
- EFI_XEN_INFO *XenInfo;
-
- GuidHob = GetFirstGuidHob (&gEfiXenInfoGuid);
- if (GuidHob == NULL) {
- return EFI_NOT_FOUND;
- }
- XenInfo = (EFI_XEN_INFO *) GET_GUID_HOB_DATA (GuidHob);
- Hyperpage = XenInfo->HyperPages;
- return EFI_SUCCESS;
-}
+#include <Library/DebugLib.h>
+#include <Library/XenHypercallLib.h>
UINT64
XenHypercallHvmGetParam (
@@ -81,16 +61,3 @@ XenHypercallEventChannelOp (
return XenHypercall2 (__HYPERVISOR_event_channel_op,
Operation, (INTN) Arguments);
}
-
-INTN
-EFIAPI
-XenHypercall2 (
- IN INTN HypercallID,
- IN OUT INTN Arg1,
- IN OUT INTN Arg2
- )
-{
- ASSERT (HyperPage != NULL);
-
- return __XenHypercall2 ((UINT8*)HyperPage + HypercallID * 32, Arg1, Arg2);
-}
new file mode 100644
@@ -0,0 +1,77 @@
+/** @file
+ Xen Hypercall Library implementation for Intel architecture
+
+Copyright (c) 2014, Linaro Ltd. All rights reserved.<BR>
+This program and the accompanying materials are licensed and made available under
+the terms and conditions of the BSD License that accompanies this distribution.
+The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php.
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <PiDxe.h>
+#include <Library/HobLib.h>
+#include <Library/DebugLib.h>
+#include <Guid/XenInfo.h>
+
+STATIC VOID *HyperPage;
+
+//
+// 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
+XenHypercallLibIntelInit (
+ 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 INTN HypercallID,
+ IN OUT INTN Arg1,
+ IN OUT INTN Arg2
+ )
+{
+ ASSERT (HyperPage != NULL);
+
+ return __XenHypercall2 ((UINT8*)HyperPage + HypercallID * 32, Arg1, Arg2);
+}
new file mode 100644
@@ -0,0 +1,52 @@
+## @file
+# Xen Hypercall abstraction lib for Intel architecture
+#
+# Copyright (c) 2014, Linaro Ltd. All rights reserved.<BR>
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = XenHypercallLibIntel
+ FILE_GUID = B5EE9A32-CA5A-49A8-82E3-ADA4CCB77C7C
+ MODULE_TYPE = BASE
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = XenHypercallLib|DXE_DRIVER UEFI_DRIVER
+ CONSTRUCTOR = XenHypercallLibIntelInit
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64
+#
+
+[Sources]
+ XenHypercallIntel.c
+
+[Sources.IA32]
+ Ia32/hypercall.nasm
+
+[Sources.X64]
+ X64/hypercall.nasm
+
+[Sources]
+ XenHypercall.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ OvmfPkg/OvmfPkg.dec
+
+[LibraryClasses]
+ BaseLib
+ HobLib
+ DebugLib
+
+[Guids]
+ gEfiXenInfoGuid
@@ -44,6 +44,10 @@
#
SerializeVariablesLib|Include/Library/SerializeVariablesLib.h
+ ## @libraryclass Invoke Xen hypercalls
+ #
+ XenHypercallLib|Include/Library/XenHypercallLib.h
+
[Guids]
gUefiOvmfPkgTokenSpaceGuid = {0x93bb96af, 0xb9f2, 0x4eb8, {0x94, 0x62, 0xe0, 0xba, 0x74, 0x56, 0x42, 0x36}}
gEfiXenInfoGuid = {0xd3b46f3b, 0xd441, 0x1244, {0x9a, 0x12, 0x0, 0x12, 0x27, 0x3f, 0xc1, 0x4d}}
@@ -128,6 +128,7 @@
S3BootScriptLib|MdeModulePkg/Library/PiDxeS3BootScriptLib/DxeS3BootScriptLib.inf
SmbusLib|MdePkg/Library/BaseSmbusLibNull/BaseSmbusLibNull.inf
OrderedCollectionLib|MdePkg/Library/BaseOrderedCollectionRedBlackTreeLib/BaseOrderedCollectionRedBlackTreeLib.inf
+ XenHypercallLib|OvmfPkg/Library/XenHypercallLib/XenHypercallLibIntel.inf
[LibraryClasses.common]
!if $(SECURE_BOOT_ENABLE) == TRUE
@@ -133,6 +133,7 @@
S3BootScriptLib|MdeModulePkg/Library/PiDxeS3BootScriptLib/DxeS3BootScriptLib.inf
SmbusLib|MdePkg/Library/BaseSmbusLibNull/BaseSmbusLibNull.inf
OrderedCollectionLib|MdePkg/Library/BaseOrderedCollectionRedBlackTreeLib/BaseOrderedCollectionRedBlackTreeLib.inf
+ XenHypercallLib|OvmfPkg/Library/XenHypercallLib/XenHypercallLibIntel.inf
[LibraryClasses.common]
!if $(SECURE_BOOT_ENABLE) == TRUE
@@ -133,6 +133,7 @@
S3BootScriptLib|MdeModulePkg/Library/PiDxeS3BootScriptLib/DxeS3BootScriptLib.inf
SmbusLib|MdePkg/Library/BaseSmbusLibNull/BaseSmbusLibNull.inf
OrderedCollectionLib|MdePkg/Library/BaseOrderedCollectionRedBlackTreeLib/BaseOrderedCollectionRedBlackTreeLib.inf
+ XenHypercallLib|OvmfPkg/Library/XenHypercallLib/XenHypercallLibIntel.inf
[LibraryClasses.common]
!if $(SECURE_BOOT_ENABLE) == TRUE
@@ -16,7 +16,8 @@
**/
#include "EventChannel.h"
-#include "XenHypercall.h"
+
+#include <Library/XenHypercallLib.h>
UINT32
XenEventChannelNotify (
@@ -34,7 +34,7 @@
#include <IndustryStandard/Xen/memory.h>
-#include "XenHypercall.h"
+#include <Library/XenHypercallLib.h>
#include "GrantTable.h"
#include "InterlockedCompareExchange16.h"
@@ -26,10 +26,10 @@
#include <IndustryStandard/Pci.h>
#include <IndustryStandard/Acpi.h>
#include <Library/DebugLib.h>
+#include <Library/XenHypercallLib.h>
#include "XenBusDxe.h"
-#include "XenHypercall.h"
#include "GrantTable.h"
#include "XenStore.h"
#include "XenBus.h"
@@ -390,13 +390,6 @@ XenBusDxeDriverBindingStart (
MmioAddr = BarDesc->AddrRangeMin;
FreePool (BarDesc);
- Status = XenHyperpageInit ();
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "XenBus: Unable to retrieve the hyperpage.\n"));
- Status = EFI_UNSUPPORTED;
- goto ErrorAllocated;
- }
-
Status = XenGetSharedInfoPage (Dev);
if (EFI_ERROR (Status)) {
DEBUG ((EFI_D_ERROR, "XenBus: Unable to get the shared info page.\n"));
@@ -34,8 +34,6 @@
DriverBinding.h
ComponentName.c
ComponentName.h
- XenHypercall.c
- XenHypercall.h
InterlockedCompareExchange16.c
InterlockedCompareExchange16.h
GrantTable.c
@@ -49,12 +47,10 @@
Helpers.c
[Sources.IA32]
- Ia32/hypercall.nasm
Ia32/InterlockedCompareExchange16.nasm
Ia32/TestAndClearBit.nasm
[Sources.X64]
- X64/hypercall.nasm
X64/InterlockedCompareExchange16.nasm
X64/TestAndClearBit.nasm
@@ -67,8 +63,7 @@
UefiLib
DevicePathLib
DebugLib
- HobLib
-
+ XenHypercallLib
[Protocols]
gEfiDriverBindingProtocolGuid
@@ -77,7 +72,3 @@
gEfiComponentNameProtocolGuid
gXenBusProtocolGuid
-
-[Guids]
- gEfiXenInfoGuid
-
@@ -60,8 +60,8 @@
#include <IndustryStandard/Xen/hvm/params.h>
-#include "XenHypercall.h"
#include "EventChannel.h"
+#include <Library/XenHypercallLib.h>
//
// Private Data Structures
This moves all of the Xen hypercall code that was private to XenBusDxe to a new library class XenHypercallLib. This will allow us to reimplement it for ARM, and to export the Xen hypercall functionality to other parts of the code, such as a Xen console SerialPortLib driver. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> --- OvmfPkg/{XenBusDxe/XenHypercall.h => Include/Library/XenHypercallLib.h} | 16 ++------------- OvmfPkg/{XenBusDxe => Library/XenHypercallLib}/Ia32/hypercall.nasm | 0 OvmfPkg/{XenBusDxe => Library/XenHypercallLib}/X64/hypercall.nasm | 0 OvmfPkg/{XenBusDxe => Library/XenHypercallLib}/XenHypercall.c | 37 ++-------------------------------- OvmfPkg/Library/XenHypercallLib/XenHypercallIntel.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ OvmfPkg/Library/XenHypercallLib/XenHypercallLibIntel.inf | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ OvmfPkg/OvmfPkg.dec | 4 ++++ OvmfPkg/OvmfPkgIa32.dsc | 1 + OvmfPkg/OvmfPkgIa32X64.dsc | 1 + OvmfPkg/OvmfPkgX64.dsc | 1 + OvmfPkg/XenBusDxe/EventChannel.c | 3 ++- OvmfPkg/XenBusDxe/GrantTable.c | 2 +- OvmfPkg/XenBusDxe/XenBusDxe.c | 9 +-------- OvmfPkg/XenBusDxe/XenBusDxe.inf | 11 +---------- OvmfPkg/XenBusDxe/XenStore.c | 2 +- 15 files changed, 146 insertions(+), 70 deletions(-)