OvmfPkg/XenBusDxe: Add Event Channel into XenBus protocol.

This patch adds three event channel related functions:
- EventChannelAllocate: Allocate an event channel port that can be bind
  from a specified domain.
- EventChannelNotify: Send an event to the remote end of a channel.
- EventChannelClose: Close a local event channel port.

Change in V3:
- eventchannel, update protocol to return error code.
- expand patch description
- Add comments in the XenBus Protocol header.

Change in V2:
- coding style
- adding comment to functions
- Rename Xenbus to XenBus.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16271 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Anthony PERARD
2014-10-29 06:51:26 +00:00
committed by jljusten
parent 86d968e05e
commit e86895d9e4
4 changed files with 163 additions and 0 deletions

View File

@@ -31,3 +31,58 @@ XenEventChannelNotify (
ReturnCode = XenHypercallEventChannelOp (Dev, EVTCHNOP_send, &Send);
return ReturnCode;
}
UINT32
EFIAPI
XenBusEventChannelAllocate (
IN XENBUS_PROTOCOL *This,
IN domid_t DomainId,
OUT evtchn_port_t *Port
)
{
XENBUS_PRIVATE_DATA *Private;
evtchn_alloc_unbound_t Parameter;
UINT32 ReturnCode;
Private = XENBUS_PRIVATE_DATA_FROM_THIS (This);
Parameter.dom = DOMID_SELF;
Parameter.remote_dom = DomainId;
ReturnCode = XenHypercallEventChannelOp (Private->Dev,
EVTCHNOP_alloc_unbound,
&Parameter);
if (ReturnCode != 0) {
DEBUG ((EFI_D_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
)
{
XENBUS_PRIVATE_DATA *Private;
evtchn_close_t Close;
Private = XENBUS_PRIVATE_DATA_FROM_THIS (This);
Close.port = Port;
return XenHypercallEventChannelOp (Private->Dev, EVTCHNOP_close, &Close);
}