diff options
Diffstat (limited to 'roms/edk2/OvmfPkg/XenBusDxe/EventChannel.c')
-rw-r--r-- | roms/edk2/OvmfPkg/XenBusDxe/EventChannel.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/roms/edk2/OvmfPkg/XenBusDxe/EventChannel.c b/roms/edk2/OvmfPkg/XenBusDxe/EventChannel.c new file mode 100644 index 000000000..6c905b511 --- /dev/null +++ b/roms/edk2/OvmfPkg/XenBusDxe/EventChannel.c @@ -0,0 +1,78 @@ +/** @file
+ Event Channel function implementation.
+
+ Event channel are use to notify of an event that happened in a shared
+ structure for example.
+
+ Copyright (C) 2014, Citrix Ltd.
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+#include "EventChannel.h"
+
+#include <Library/XenHypercallLib.h>
+
+UINT32
+XenEventChannelNotify (
+ IN XENBUS_DEVICE *Dev,
+ IN evtchn_port_t Port
+ )
+{
+ INTN ReturnCode;
+ evtchn_send_t Send;
+
+ Send.port = Port;
+ ReturnCode = XenHypercallEventChannelOp (EVTCHNOP_send, &Send);
+ return (UINT32)ReturnCode;
+}
+
+UINT32
+EFIAPI
+XenBusEventChannelAllocate (
+ IN XENBUS_PROTOCOL *This,
+ IN domid_t DomainId,
+ OUT evtchn_port_t *Port
+ )
+{
+ evtchn_alloc_unbound_t Parameter;
+ UINT32 ReturnCode;
+
+ Parameter.dom = DOMID_SELF;
+ Parameter.remote_dom = DomainId;
+ ReturnCode = (UINT32)XenHypercallEventChannelOp (
+ EVTCHNOP_alloc_unbound,
+ &Parameter);
+ if (ReturnCode != 0) {
+ DEBUG ((DEBUG_ERROR, "ERROR: alloc_unbound failed with rc=%d", ReturnCode));
+ return ReturnCode;
+ }
+ *Port = Parameter.port;
+ return ReturnCode;
+}
+
+UINT32
+EFIAPI
+XenBusEventChannelNotify (
+ IN XENBUS_PROTOCOL *This,
+ IN evtchn_port_t Port
+ )
+{
+ XENBUS_PRIVATE_DATA *Private;
+
+ Private = XENBUS_PRIVATE_DATA_FROM_THIS(This);
+ return XenEventChannelNotify (Private->Dev, Port);
+}
+
+UINT32
+EFIAPI
+XenBusEventChannelClose (
+ IN XENBUS_PROTOCOL *This,
+ IN evtchn_port_t Port
+ )
+{
+ evtchn_close_t Close;
+
+ Close.port = Port;
+ return (UINT32)XenHypercallEventChannelOp (EVTCHNOP_close, &Close);
+}
|