/** @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); | |
} |