[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |