[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v4 16/19] 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.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>

---
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.
---
 OvmfPkg/Include/Protocol/XenBus.h | 53 +++++++++++++++++++++++++++++++++++++
 OvmfPkg/XenBusDxe/EventChannel.c  | 55 +++++++++++++++++++++++++++++++++++++++
 OvmfPkg/XenBusDxe/EventChannel.h  | 52 ++++++++++++++++++++++++++++++++++++
 OvmfPkg/XenBusDxe/XenBus.c        |  3 +++
 4 files changed, 163 insertions(+)

diff --git a/OvmfPkg/Include/Protocol/XenBus.h 
b/OvmfPkg/Include/Protocol/XenBus.h
index e54077d..c85c928 100644
--- a/OvmfPkg/Include/Protocol/XenBus.h
+++ b/OvmfPkg/Include/Protocol/XenBus.h
@@ -79,6 +79,7 @@ typedef enum {
 
 
 #include <IndustryStandard/Xen/grant_table.h>
+#include <IndustryStandard/Xen/event_channel.h>
 
 ///
 /// Function prototypes
@@ -266,6 +267,54 @@ EFI_STATUS
   );
 
 /**
+  Allocate a port that can be bind from domain DomainId.
+
+  @param This       A pointer to the XENBUS_PROTOCOL.
+  @param DomainId   The domain ID that can bind the newly allocated port.
+  @param Port       A pointer to a evtchn_port_t that will contain the newly
+                    allocated port.
+
+  @retval UINT32    The return value from the hypercall, 0 if success.
+**/
+typedef
+UINT32
+(EFIAPI *XENBUS_EVENT_CHANNEL_ALLOCATE) (
+  IN  XENBUS_PROTOCOL *This,
+  IN  domid_t         DomainId,
+  OUT evtchn_port_t   *Port
+  );
+
+/**
+  Send an event to the remote end of the channel whose local endpoint is Port.
+
+  @param This       A pointer to the XENBUS_PROTOCOL.
+  @param Port       Local port to the the event from.
+
+  @retval UINT32    The return value from the hypercall, 0 if success.
+**/
+typedef
+UINT32
+(EFIAPI *XENBUS_EVENT_CHANNEL_NOTIFY) (
+  IN XENBUS_PROTOCOL  *This,
+  IN evtchn_port_t    Port
+  );
+
+/**
+  Close a local event channel Port.
+
+  @param This       A pointer to the XENBUS_PROTOCOL.
+  @param Port       The event channel to close.
+
+  @retval UINT32    The return value from the hypercall, 0 if success.
+**/
+typedef
+UINT32
+(EFIAPI *XENBUS_EVENT_CHANNEL_CLOSE) (
+  IN XENBUS_PROTOCOL  *This,
+  IN evtchn_port_t    Port
+  );
+
+/**
   Register a XenStore watch.
 
   XenStore watches allow a client to wait for changes to an object in the
@@ -361,6 +410,10 @@ struct _XENBUS_PROTOCOL {
   XENBUS_GRANT_ACCESS           GrantAccess;
   XENBUS_GRANT_END_ACCESS       GrantEndAccess;
 
+  XENBUS_EVENT_CHANNEL_ALLOCATE EventChannelAllocate;
+  XENBUS_EVENT_CHANNEL_NOTIFY   EventChannelNotify;
+  XENBUS_EVENT_CHANNEL_CLOSE    EventChannelClose;
+
   XENBUS_REGISTER_WATCH         RegisterWatch;
   XENBUS_REGISTER_WATCH_BACKEND RegisterWatchBackend;
   XENBUS_UNREGISTER_WATCH       UnregisterWatch;
diff --git a/OvmfPkg/XenBusDxe/EventChannel.c b/OvmfPkg/XenBusDxe/EventChannel.c
index 5d57f69..48f66fa 100644
--- a/OvmfPkg/XenBusDxe/EventChannel.c
+++ b/OvmfPkg/XenBusDxe/EventChannel.c
@@ -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);
+}
diff --git a/OvmfPkg/XenBusDxe/EventChannel.h b/OvmfPkg/XenBusDxe/EventChannel.h
index da17346..9891951 100644
--- a/OvmfPkg/XenBusDxe/EventChannel.h
+++ b/OvmfPkg/XenBusDxe/EventChannel.h
@@ -33,4 +33,56 @@ XenEventChannelNotify (
   IN evtchn_port_t Port
   );
 
+/*
+ * XenBus protocol
+ */
+
+/**
+  Allocate a port that can be bind from domain DomainId.
+
+  @param This       A pointer to the XENBUS_PROTOCOL.
+  @param DomainId   The domain ID that can bind the newly allocated port.
+  @param Port       A pointer to a evtchn_port_t that will contain the newly
+                    allocated port.
+
+  @retval UINT32    The return value from the hypercall, 0 if success.
+**/
+UINT32
+EFIAPI
+XenBusEventChannelAllocate (
+  IN  XENBUS_PROTOCOL *This,
+  IN  domid_t         DomainId,
+  OUT evtchn_port_t   *Port
+  );
+
+/**
+  Send an event to the remote end of the channel whose local endpoint is Port.
+
+  @param This       A pointer to the XENBUS_PROTOCOL.
+  @param Port       Local port to the the event from.
+
+  @retval UINT32    The return value from the hypercall, 0 if success.
+**/
+UINT32
+EFIAPI
+XenBusEventChannelNotify (
+  IN XENBUS_PROTOCOL *This,
+  IN evtchn_port_t   Port
+  );
+
+/**
+  Close a local event channel Port.
+
+  @param This       A pointer to the XENBUS_PROTOCOL.
+  @param Port       The event channel to close.
+
+  @retval UINT32    The return value from the hypercall, 0 if success.
+**/
+UINT32
+EFIAPI
+XenBusEventChannelClose (
+  IN XENBUS_PROTOCOL *This,
+  IN evtchn_port_t   Port
+  );
+
 #endif
diff --git a/OvmfPkg/XenBusDxe/XenBus.c b/OvmfPkg/XenBusDxe/XenBus.c
index e595767..9ac654d 100644
--- a/OvmfPkg/XenBusDxe/XenBus.c
+++ b/OvmfPkg/XenBusDxe/XenBus.c
@@ -359,6 +359,9 @@ STATIC XENBUS_PRIVATE_DATA gXenBusPrivateData = {
   .XenBusIo.SetState = XenBusSetState,
   .XenBusIo.GrantAccess = XenBusGrantAccess,
   .XenBusIo.GrantEndAccess = XenBusGrantEndAccess,
+  .XenBusIo.EventChannelAllocate = XenBusEventChannelAllocate,
+  .XenBusIo.EventChannelNotify = XenBusEventChannelNotify,
+  .XenBusIo.EventChannelClose = XenBusEventChannelClose,
   .XenBusIo.RegisterWatch = XenBusRegisterWatch,
   .XenBusIo.RegisterWatchBackend = XenBusRegisterWatchBackend,
   .XenBusIo.UnregisterWatch = XenBusUnregisterWatch,
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.