]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/XenBusDxe/XenHypercall.c
Ovmf/Xen: refactor XenBusDxe hypercall implementation
[mirror_edk2.git] / OvmfPkg / XenBusDxe / XenHypercall.c
CommitLineData
abcbbb14
AP
1/** @file\r
2 Functions to make Xen hypercalls.\r
3\r
4 Copyright (C) 2014, Citrix Ltd.\r
5\r
6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include <PiDxe.h>\r
17#include <Library/HobLib.h>\r
18#include <Guid/XenInfo.h>\r
19\r
20#include "XenBusDxe.h"\r
21#include "XenHypercall.h"\r
22\r
23#include <IndustryStandard/Xen/hvm/params.h>\r
24#include <IndustryStandard/Xen/memory.h>\r
25\r
bbc3758a
AB
26STATIC VOID *HyperPage;\r
27\r
28//\r
29// Interface exposed by the ASM implementation of the core hypercall\r
30//\r
31INTN\r
32EFIAPI\r
33__XenHypercall2 (\r
34 IN VOID *HypercallAddr,\r
35 IN OUT INTN Arg1,\r
36 IN OUT INTN Arg2\r
37 );\r
38\r
abcbbb14
AP
39EFI_STATUS\r
40XenHyperpageInit (\r
abcbbb14
AP
41 )\r
42{\r
43 EFI_HOB_GUID_TYPE *GuidHob;\r
44 EFI_XEN_INFO *XenInfo;\r
45\r
46 GuidHob = GetFirstGuidHob (&gEfiXenInfoGuid);\r
47 if (GuidHob == NULL) {\r
48 return EFI_NOT_FOUND;\r
49 }\r
50 XenInfo = (EFI_XEN_INFO *) GET_GUID_HOB_DATA (GuidHob);\r
bbc3758a 51 HyperPage = XenInfo->HyperPages;\r
abcbbb14
AP
52 return EFI_SUCCESS;\r
53}\r
54\r
55UINT64\r
56XenHypercallHvmGetParam (\r
cec6ad0a 57 IN UINT32 Index\r
abcbbb14
AP
58 )\r
59{\r
60 xen_hvm_param_t Parameter;\r
61 INTN Error;\r
62\r
abcbbb14
AP
63 Parameter.domid = DOMID_SELF;\r
64 Parameter.index = Index;\r
bbc3758a 65 Error = XenHypercall2 (__HYPERVISOR_hvm_op,\r
abcbbb14
AP
66 HVMOP_get_param, (INTN) &Parameter);\r
67 if (Error != 0) {\r
68 DEBUG ((EFI_D_ERROR,\r
69 "XenHypercall: Error %d trying to get HVM parameter %d\n",\r
70 Error, Index));\r
71 return 0;\r
72 }\r
73 return Parameter.value;\r
74}\r
75\r
76INTN\r
77XenHypercallMemoryOp (\r
abcbbb14
AP
78 IN UINTN Operation,\r
79 IN OUT VOID *Arguments\r
80 )\r
81{\r
bbc3758a 82 return XenHypercall2 (__HYPERVISOR_memory_op,\r
abcbbb14
AP
83 Operation, (INTN) Arguments);\r
84}\r
85\r
86INTN\r
87XenHypercallEventChannelOp (\r
abcbbb14
AP
88 IN INTN Operation,\r
89 IN OUT VOID *Arguments\r
90 )\r
91{\r
bbc3758a 92 return XenHypercall2 (__HYPERVISOR_event_channel_op,\r
abcbbb14
AP
93 Operation, (INTN) Arguments);\r
94}\r
95\r
bbc3758a
AB
96INTN\r
97EFIAPI\r
98XenHypercall2 (\r
99 IN UINTN HypercallID,\r
100 IN OUT INTN Arg1,\r
101 IN OUT INTN Arg2\r
abcbbb14
AP
102 )\r
103{\r
bbc3758a 104 ASSERT (HyperPage != NULL);\r
abcbbb14 105\r
bbc3758a 106 return __XenHypercall2 ((UINT8*)HyperPage + HypercallID * 32, Arg1, Arg2);\r
abcbbb14 107}\r