#include <IndustryStandard/Xen/hvm/params.h>\r
#include <IndustryStandard/Xen/memory.h>\r
\r
+STATIC VOID *HyperPage;\r
+\r
+//\r
+// Interface exposed by the ASM implementation of the core hypercall\r
+//\r
+INTN\r
+EFIAPI\r
+__XenHypercall2 (\r
+ IN VOID *HypercallAddr,\r
+ IN OUT INTN Arg1,\r
+ IN OUT INTN Arg2\r
+ );\r
+\r
EFI_STATUS\r
XenHyperpageInit (\r
- IN OUT XENBUS_DEVICE *Dev\r
)\r
{\r
EFI_HOB_GUID_TYPE *GuidHob;\r
return EFI_NOT_FOUND;\r
}\r
XenInfo = (EFI_XEN_INFO *) GET_GUID_HOB_DATA (GuidHob);\r
- Dev->Hyperpage = XenInfo->HyperPages;\r
+ HyperPage = XenInfo->HyperPages;\r
return EFI_SUCCESS;\r
}\r
\r
UINT64\r
XenHypercallHvmGetParam (\r
- IN XENBUS_DEVICE *Dev,\r
IN UINT32 Index\r
)\r
{\r
xen_hvm_param_t Parameter;\r
INTN Error;\r
\r
- ASSERT (Dev->Hyperpage != NULL);\r
-\r
Parameter.domid = DOMID_SELF;\r
Parameter.index = Index;\r
- Error = XenHypercall2 ((UINT8*)Dev->Hyperpage + __HYPERVISOR_hvm_op * 32,\r
+ Error = XenHypercall2 (__HYPERVISOR_hvm_op,\r
HVMOP_get_param, (INTN) &Parameter);\r
if (Error != 0) {\r
DEBUG ((EFI_D_ERROR,\r
\r
INTN\r
XenHypercallMemoryOp (\r
- IN XENBUS_DEVICE *Dev,\r
IN UINTN Operation,\r
IN OUT VOID *Arguments\r
)\r
{\r
- ASSERT (Dev->Hyperpage != NULL);\r
- return XenHypercall2 ((UINT8*)Dev->Hyperpage + __HYPERVISOR_memory_op * 32,\r
+ return XenHypercall2 (__HYPERVISOR_memory_op,\r
Operation, (INTN) Arguments);\r
}\r
\r
INTN\r
XenHypercallEventChannelOp (\r
- IN XENBUS_DEVICE *Dev,\r
IN INTN Operation,\r
IN OUT VOID *Arguments\r
)\r
{\r
- ASSERT (Dev->Hyperpage != NULL);\r
- return XenHypercall2 ((UINT8*)Dev->Hyperpage + __HYPERVISOR_event_channel_op * 32,\r
+ return XenHypercall2 (__HYPERVISOR_event_channel_op,\r
Operation, (INTN) Arguments);\r
}\r
\r
-EFI_STATUS\r
-XenGetSharedInfoPage (\r
- IN OUT XENBUS_DEVICE *Dev\r
+INTN\r
+EFIAPI\r
+XenHypercall2 (\r
+ IN UINTN HypercallID,\r
+ IN OUT INTN Arg1,\r
+ IN OUT INTN Arg2\r
)\r
{\r
- xen_add_to_physmap_t Parameter;\r
+ ASSERT (HyperPage != NULL);\r
\r
- ASSERT (Dev->SharedInfo == NULL);\r
-\r
- Parameter.domid = DOMID_SELF;\r
- Parameter.space = XENMAPSPACE_shared_info;\r
- Parameter.idx = 0;\r
-\r
- //\r
- // using reserved page because the page is not released when Linux is\r
- // starting because of the add_to_physmap. QEMU might try to access the\r
- // page, and fail because it have no right to do so (segv).\r
- //\r
- Dev->SharedInfo = AllocateReservedPages (1);\r
- Parameter.gpfn = (UINTN) Dev->SharedInfo >> EFI_PAGE_SHIFT;\r
- if (XenHypercallMemoryOp (Dev, XENMEM_add_to_physmap, &Parameter) != 0) {\r
- FreePages (Dev->SharedInfo, 1);\r
- Dev->SharedInfo = NULL;\r
- return EFI_LOAD_ERROR;\r
- }\r
-\r
- return EFI_SUCCESS;\r
+ return __XenHypercall2 ((UINT8*)HyperPage + HypercallID * 32, Arg1, Arg2);\r
}\r