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
\r
\r
#include <IndustryStandard/Xen/grant_table.h>\r
+#include <IndustryStandard/Xen/event_channel.h>\r
\r
///\r
/// Function prototypes\r
IN grant_ref_t Ref\r
);\r
\r
+/**\r
+ Allocate a port that can be bind from domain DomainId.\r
+\r
+ @param This A pointer to the XENBUS_PROTOCOL.\r
+ @param DomainId The domain ID that can bind the newly allocated port.\r
+ @param Port A pointer to a evtchn_port_t that will contain the newly\r
+ allocated port.\r
+\r
+ @retval UINT32 The return value from the hypercall, 0 if success.\r
+**/\r
+typedef\r
+UINT32\r
+(EFIAPI *XENBUS_EVENT_CHANNEL_ALLOCATE) (\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN domid_t DomainId,\r
+ OUT evtchn_port_t *Port\r
+ );\r
+\r
+/**\r
+ Send an event to the remote end of the channel whose local endpoint is Port.\r
+\r
+ @param This A pointer to the XENBUS_PROTOCOL.\r
+ @param Port Local port to the the event from.\r
+\r
+ @retval UINT32 The return value from the hypercall, 0 if success.\r
+**/\r
+typedef\r
+UINT32\r
+(EFIAPI *XENBUS_EVENT_CHANNEL_NOTIFY) (\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN evtchn_port_t Port\r
+ );\r
+\r
+/**\r
+ Close a local event channel Port.\r
+\r
+ @param This A pointer to the XENBUS_PROTOCOL.\r
+ @param Port The event channel to close.\r
+\r
+ @retval UINT32 The return value from the hypercall, 0 if success.\r
+**/\r
+typedef\r
+UINT32\r
+(EFIAPI *XENBUS_EVENT_CHANNEL_CLOSE) (\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN evtchn_port_t Port\r
+ );\r
+\r
/**\r
Register a XenStore watch.\r
\r
XENBUS_GRANT_ACCESS GrantAccess;\r
XENBUS_GRANT_END_ACCESS GrantEndAccess;\r
\r
+ XENBUS_EVENT_CHANNEL_ALLOCATE EventChannelAllocate;\r
+ XENBUS_EVENT_CHANNEL_NOTIFY EventChannelNotify;\r
+ XENBUS_EVENT_CHANNEL_CLOSE EventChannelClose;\r
+\r
XENBUS_REGISTER_WATCH RegisterWatch;\r
XENBUS_REGISTER_WATCH_BACKEND RegisterWatchBackend;\r
XENBUS_UNREGISTER_WATCH UnregisterWatch;\r
ReturnCode = XenHypercallEventChannelOp (Dev, EVTCHNOP_send, &Send);\r
return ReturnCode;\r
}\r
+\r
+UINT32\r
+EFIAPI\r
+XenBusEventChannelAllocate (\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN domid_t DomainId,\r
+ OUT evtchn_port_t *Port\r
+ )\r
+{\r
+ XENBUS_PRIVATE_DATA *Private;\r
+ evtchn_alloc_unbound_t Parameter;\r
+ UINT32 ReturnCode;\r
+\r
+ Private = XENBUS_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ Parameter.dom = DOMID_SELF;\r
+ Parameter.remote_dom = DomainId;\r
+ ReturnCode = XenHypercallEventChannelOp (Private->Dev,\r
+ EVTCHNOP_alloc_unbound,\r
+ &Parameter);\r
+ if (ReturnCode != 0) {\r
+ DEBUG ((EFI_D_ERROR, "ERROR: alloc_unbound failed with rc=%d", ReturnCode));\r
+ return ReturnCode;\r
+ }\r
+ *Port = Parameter.port;\r
+ return ReturnCode;\r
+}\r
+\r
+UINT32\r
+EFIAPI\r
+XenBusEventChannelNotify (\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN evtchn_port_t Port\r
+ )\r
+{\r
+ XENBUS_PRIVATE_DATA *Private;\r
+\r
+ Private = XENBUS_PRIVATE_DATA_FROM_THIS(This);\r
+ return XenEventChannelNotify (Private->Dev, Port);\r
+}\r
+\r
+UINT32\r
+EFIAPI\r
+XenBusEventChannelClose (\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN evtchn_port_t Port\r
+ )\r
+{\r
+ XENBUS_PRIVATE_DATA *Private;\r
+ evtchn_close_t Close;\r
+\r
+ Private = XENBUS_PRIVATE_DATA_FROM_THIS (This);\r
+ Close.port = Port;\r
+ return XenHypercallEventChannelOp (Private->Dev, EVTCHNOP_close, &Close);\r
+}\r
IN evtchn_port_t Port\r
);\r
\r
+/*\r
+ * XenBus protocol\r
+ */\r
+\r
+/**\r
+ Allocate a port that can be bind from domain DomainId.\r
+\r
+ @param This A pointer to the XENBUS_PROTOCOL.\r
+ @param DomainId The domain ID that can bind the newly allocated port.\r
+ @param Port A pointer to a evtchn_port_t that will contain the newly\r
+ allocated port.\r
+\r
+ @retval UINT32 The return value from the hypercall, 0 if success.\r
+**/\r
+UINT32\r
+EFIAPI\r
+XenBusEventChannelAllocate (\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN domid_t DomainId,\r
+ OUT evtchn_port_t *Port\r
+ );\r
+\r
+/**\r
+ Send an event to the remote end of the channel whose local endpoint is Port.\r
+\r
+ @param This A pointer to the XENBUS_PROTOCOL.\r
+ @param Port Local port to the the event from.\r
+\r
+ @retval UINT32 The return value from the hypercall, 0 if success.\r
+**/\r
+UINT32\r
+EFIAPI\r
+XenBusEventChannelNotify (\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN evtchn_port_t Port\r
+ );\r
+\r
+/**\r
+ Close a local event channel Port.\r
+\r
+ @param This A pointer to the XENBUS_PROTOCOL.\r
+ @param Port The event channel to close.\r
+\r
+ @retval UINT32 The return value from the hypercall, 0 if success.\r
+**/\r
+UINT32\r
+EFIAPI\r
+XenBusEventChannelClose (\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN evtchn_port_t Port\r
+ );\r
+\r
#endif\r
.XenBusIo.SetState = XenBusSetState,\r
.XenBusIo.GrantAccess = XenBusGrantAccess,\r
.XenBusIo.GrantEndAccess = XenBusGrantEndAccess,\r
+ .XenBusIo.EventChannelAllocate = XenBusEventChannelAllocate,\r
+ .XenBusIo.EventChannelNotify = XenBusEventChannelNotify,\r
+ .XenBusIo.EventChannelClose = XenBusEventChannelClose,\r
.XenBusIo.RegisterWatch = XenBusRegisterWatch,\r
.XenBusIo.RegisterWatchBackend = XenBusRegisterWatchBackend,\r
.XenBusIo.UnregisterWatch = XenBusUnregisterWatch,\r