]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/XenBusDxe/XenHypercall.c
Ovmf/Xen: refactor XenBusDxe hypercall implementation
[mirror_edk2.git] / OvmfPkg / XenBusDxe / XenHypercall.c
index 34d92e76b7e38d24d670be41d3da12e963cbeda7..e7134fcf74cea4fcf751b5f6300baaa1bad11e93 100644 (file)
 #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
@@ -36,24 +48,21 @@ XenHyperpageInit (
     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
@@ -66,53 +75,33 @@ XenHypercallHvmGetParam (
 \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