| /** @file | |
| Functions to make Xen hypercalls. | |
| Copyright (C) 2014, Citrix Ltd. | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #include <PiDxe.h> | |
| #include <IndustryStandard/Xen/hvm/params.h> | |
| #include <IndustryStandard/Xen/memory.h> | |
| #include <Library/DebugLib.h> | |
| #include <Library/XenHypercallLib.h> | |
| RETURN_STATUS | |
| EFIAPI | |
| XenHypercallLibConstruct ( | |
| VOID | |
| ) | |
| { | |
| XenHypercallLibInit (); | |
| // | |
| // We don't fail library construction, since that has catastrophic | |
| // consequences for client modules (whereas those modules may easily be | |
| // running on a non-Xen platform). Instead, XenHypercallIsAvailable() | |
| // will return FALSE. | |
| // | |
| return RETURN_SUCCESS; | |
| } | |
| UINT64 | |
| EFIAPI | |
| XenHypercallHvmGetParam ( | |
| IN UINT32 Index | |
| ) | |
| { | |
| xen_hvm_param_t Parameter; | |
| INTN Error; | |
| Parameter.domid = DOMID_SELF; | |
| Parameter.index = Index; | |
| Error = XenHypercall2 ( | |
| __HYPERVISOR_hvm_op, | |
| HVMOP_get_param, | |
| (INTN)&Parameter | |
| ); | |
| if (Error != 0) { | |
| DEBUG (( | |
| DEBUG_ERROR, | |
| "XenHypercall: Error %Ld trying to get HVM parameter %d\n", | |
| (INT64)Error, | |
| Index | |
| )); | |
| return 0; | |
| } | |
| return Parameter.value; | |
| } | |
| INTN | |
| EFIAPI | |
| XenHypercallMemoryOp ( | |
| IN UINTN Operation, | |
| IN OUT VOID *Arguments | |
| ) | |
| { | |
| return XenHypercall2 ( | |
| __HYPERVISOR_memory_op, | |
| Operation, | |
| (INTN)Arguments | |
| ); | |
| } | |
| INTN | |
| EFIAPI | |
| XenHypercallEventChannelOp ( | |
| IN INTN Operation, | |
| IN OUT VOID *Arguments | |
| ) | |
| { | |
| return XenHypercall2 ( | |
| __HYPERVISOR_event_channel_op, | |
| Operation, | |
| (INTN)Arguments | |
| ); | |
| } |