]> git.proxmox.com Git - mirror_edk2.git/blob - OvmfPkg/Library/XenHypercallLib/XenHypercall.c
d4fa802743de22eaae13ccd8f086c82105f602d1
[mirror_edk2.git] / OvmfPkg / Library / XenHypercallLib / XenHypercall.c
1 /** @file
2 Functions to make Xen hypercalls.
3
4 Copyright (C) 2014, Citrix Ltd.
5
6 SPDX-License-Identifier: BSD-2-Clause-Patent
7
8 **/
9
10 #include <PiDxe.h>
11
12 #include <IndustryStandard/Xen/hvm/params.h>
13 #include <IndustryStandard/Xen/memory.h>
14
15 #include <Library/DebugLib.h>
16 #include <Library/XenHypercallLib.h>
17
18 RETURN_STATUS
19 EFIAPI
20 XenHypercallLibConstruct (
21 VOID
22 )
23 {
24 XenHypercallLibInit ();
25 //
26 // We don't fail library construction, since that has catastrophic
27 // consequences for client modules (whereas those modules may easily be
28 // running on a non-Xen platform). Instead, XenHypercallIsAvailable()
29 // will return FALSE.
30 //
31 return RETURN_SUCCESS;
32 }
33
34 UINT64
35 EFIAPI
36 XenHypercallHvmGetParam (
37 IN UINT32 Index
38 )
39 {
40 xen_hvm_param_t Parameter;
41 INTN Error;
42
43 Parameter.domid = DOMID_SELF;
44 Parameter.index = Index;
45 Error = XenHypercall2 (__HYPERVISOR_hvm_op,
46 HVMOP_get_param, (INTN) &Parameter);
47 if (Error != 0) {
48 DEBUG ((EFI_D_ERROR,
49 "XenHypercall: Error %Ld trying to get HVM parameter %d\n",
50 (INT64)Error, Index));
51 return 0;
52 }
53 return Parameter.value;
54 }
55
56 INTN
57 EFIAPI
58 XenHypercallMemoryOp (
59 IN UINTN Operation,
60 IN OUT VOID *Arguments
61 )
62 {
63 return XenHypercall2 (__HYPERVISOR_memory_op,
64 Operation, (INTN) Arguments);
65 }
66
67 INTN
68 EFIAPI
69 XenHypercallEventChannelOp (
70 IN INTN Operation,
71 IN OUT VOID *Arguments
72 )
73 {
74 return XenHypercall2 (__HYPERVISOR_event_channel_op,
75 Operation, (INTN) Arguments);
76 }