2 Functions to make Xen hypercalls.
4 Copyright (C) 2014, Citrix Ltd.
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 #include <Library/HobLib.h>
18 #include <Guid/XenInfo.h>
20 #include "XenBusDxe.h"
21 #include "XenHypercall.h"
23 #include <IndustryStandard/Xen/hvm/params.h>
24 #include <IndustryStandard/Xen/memory.h>
28 IN OUT XENBUS_DEVICE
*Dev
31 EFI_HOB_GUID_TYPE
*GuidHob
;
32 EFI_XEN_INFO
*XenInfo
;
34 GuidHob
= GetFirstGuidHob (&gEfiXenInfoGuid
);
35 if (GuidHob
== NULL
) {
38 XenInfo
= (EFI_XEN_INFO
*) GET_GUID_HOB_DATA (GuidHob
);
39 Dev
->Hyperpage
= XenInfo
->HyperPages
;
44 XenHypercallHvmGetParam (
45 IN XENBUS_DEVICE
*Dev
,
49 xen_hvm_param_t Parameter
;
52 ASSERT (Dev
->Hyperpage
!= NULL
);
54 Parameter
.domid
= DOMID_SELF
;
55 Parameter
.index
= Index
;
56 Error
= XenHypercall2 (Dev
->Hyperpage
+ __HYPERVISOR_hvm_op
* 32,
57 HVMOP_get_param
, (INTN
) &Parameter
);
60 "XenHypercall: Error %d trying to get HVM parameter %d\n",
64 return Parameter
.value
;
68 XenHypercallMemoryOp (
69 IN XENBUS_DEVICE
*Dev
,
71 IN OUT VOID
*Arguments
74 ASSERT (Dev
->Hyperpage
!= NULL
);
75 return XenHypercall2 (Dev
->Hyperpage
+ __HYPERVISOR_memory_op
* 32,
76 Operation
, (INTN
) Arguments
);
80 XenHypercallEventChannelOp (
81 IN XENBUS_DEVICE
*Dev
,
83 IN OUT VOID
*Arguments
86 ASSERT (Dev
->Hyperpage
!= NULL
);
87 return XenHypercall2 (Dev
->Hyperpage
+ __HYPERVISOR_event_channel_op
* 32,
88 Operation
, (INTN
) Arguments
);
92 XenGetSharedInfoPage (
93 IN OUT XENBUS_DEVICE
*Dev
96 xen_add_to_physmap_t Parameter
;
98 ASSERT (Dev
->SharedInfo
== NULL
);
100 Parameter
.domid
= DOMID_SELF
;
101 Parameter
.space
= XENMAPSPACE_shared_info
;
105 // using reserved page because the page is not released when Linux is
106 // starting because of the add_to_physmap. QEMU might try to access the
107 // page, and fail because it have no right to do so (segv).
109 Dev
->SharedInfo
= AllocateReservedPages (1);
110 Parameter
.gpfn
= (UINTN
) Dev
->SharedInfo
>> EFI_PAGE_SHIFT
;
111 if (XenHypercallMemoryOp (Dev
, XENMEM_add_to_physmap
, &Parameter
) != 0) {
112 FreePages (Dev
->SharedInfo
, 1);
113 Dev
->SharedInfo
= NULL
;
114 return EFI_LOAD_ERROR
;