]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/XenBusDxe/XenHypercall.c
OvmfPkg/XenBusDxe: fix VS2010 build failures
[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
26EFI_STATUS\r
27XenHyperpageInit (\r
28 IN OUT XENBUS_DEVICE *Dev\r
29 )\r
30{\r
31 EFI_HOB_GUID_TYPE *GuidHob;\r
32 EFI_XEN_INFO *XenInfo;\r
33\r
34 GuidHob = GetFirstGuidHob (&gEfiXenInfoGuid);\r
35 if (GuidHob == NULL) {\r
36 return EFI_NOT_FOUND;\r
37 }\r
38 XenInfo = (EFI_XEN_INFO *) GET_GUID_HOB_DATA (GuidHob);\r
39 Dev->Hyperpage = XenInfo->HyperPages;\r
40 return EFI_SUCCESS;\r
41}\r
42\r
43UINT64\r
44XenHypercallHvmGetParam (\r
45 IN XENBUS_DEVICE *Dev,\r
cec6ad0a 46 IN UINT32 Index\r
abcbbb14
AP
47 )\r
48{\r
49 xen_hvm_param_t Parameter;\r
50 INTN Error;\r
51\r
52 ASSERT (Dev->Hyperpage != NULL);\r
53\r
54 Parameter.domid = DOMID_SELF;\r
55 Parameter.index = Index;\r
017a4866 56 Error = XenHypercall2 ((UINT8*)Dev->Hyperpage + __HYPERVISOR_hvm_op * 32,\r
abcbbb14
AP
57 HVMOP_get_param, (INTN) &Parameter);\r
58 if (Error != 0) {\r
59 DEBUG ((EFI_D_ERROR,\r
60 "XenHypercall: Error %d trying to get HVM parameter %d\n",\r
61 Error, Index));\r
62 return 0;\r
63 }\r
64 return Parameter.value;\r
65}\r
66\r
67INTN\r
68XenHypercallMemoryOp (\r
69 IN XENBUS_DEVICE *Dev,\r
70 IN UINTN Operation,\r
71 IN OUT VOID *Arguments\r
72 )\r
73{\r
74 ASSERT (Dev->Hyperpage != NULL);\r
017a4866 75 return XenHypercall2 ((UINT8*)Dev->Hyperpage + __HYPERVISOR_memory_op * 32,\r
abcbbb14
AP
76 Operation, (INTN) Arguments);\r
77}\r
78\r
79INTN\r
80XenHypercallEventChannelOp (\r
81 IN XENBUS_DEVICE *Dev,\r
82 IN INTN Operation,\r
83 IN OUT VOID *Arguments\r
84 )\r
85{\r
86 ASSERT (Dev->Hyperpage != NULL);\r
017a4866 87 return XenHypercall2 ((UINT8*)Dev->Hyperpage + __HYPERVISOR_event_channel_op * 32,\r
abcbbb14
AP
88 Operation, (INTN) Arguments);\r
89}\r
90\r
91EFI_STATUS\r
92XenGetSharedInfoPage (\r
93 IN OUT XENBUS_DEVICE *Dev\r
94 )\r
95{\r
96 xen_add_to_physmap_t Parameter;\r
97\r
98 ASSERT (Dev->SharedInfo == NULL);\r
99\r
100 Parameter.domid = DOMID_SELF;\r
101 Parameter.space = XENMAPSPACE_shared_info;\r
102 Parameter.idx = 0;\r
103\r
104 //\r
105 // using reserved page because the page is not released when Linux is\r
106 // starting because of the add_to_physmap. QEMU might try to access the\r
107 // page, and fail because it have no right to do so (segv).\r
108 //\r
109 Dev->SharedInfo = AllocateReservedPages (1);\r
110 Parameter.gpfn = (UINTN) Dev->SharedInfo >> EFI_PAGE_SHIFT;\r
111 if (XenHypercallMemoryOp (Dev, XENMEM_add_to_physmap, &Parameter) != 0) {\r
112 FreePages (Dev->SharedInfo, 1);\r
113 Dev->SharedInfo = NULL;\r
114 return EFI_LOAD_ERROR;\r
115 }\r
116\r
117 return EFI_SUCCESS;\r
118}\r