[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 13/18] OvmfPkg/XenBusDxe: Add XenStore function into the XenBus protocol
On Thu, Sep 04, 2014 at 05:51:08PM +0100, Anthony PERARD wrote: > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx> Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> > --- > OvmfPkg/Include/Protocol/XenBus.h | 103 ++++++++++++++++++++++++ > OvmfPkg/XenBusDxe/XenStore.c | 160 > ++++++++++++++++++++++++++++++++++++++ > OvmfPkg/XenBusDxe/XenStore.h | 87 +++++++++++++++++++++ > 3 files changed, 350 insertions(+) > > diff --git a/OvmfPkg/Include/Protocol/XenBus.h > b/OvmfPkg/Include/Protocol/XenBus.h > index b10c143..99e174b 100644 > --- a/OvmfPkg/Include/Protocol/XenBus.h > +++ b/OvmfPkg/Include/Protocol/XenBus.h > @@ -81,6 +81,62 @@ typedef enum { > /// Function prototypes > /// > > +/* > + * Return error from xs_read > + * Return value of the node ${This->Node}/${node} > + */ > +typedef > +XENSTORE_STATUS > +(EFIAPI *XENBUS_XS_READ)( > + IN XENBUS_PROTOCOL *This, > + IN XENSTORE_TRANSACTION Transaction, > + IN CONST CHAR8 *Node, > + OUT VOID **Result > + ); > + > +typedef > +XENSTORE_STATUS > +(EFIAPI *XENBUS_XS_BACKEND_READ)( > + IN XENBUS_PROTOCOL *This, > + IN XENSTORE_TRANSACTION Transaction, > + IN CONST CHAR8 *Node, > + OUT VOID **Result > + ); > + > +typedef > +XENSTORE_STATUS > +(EFIAPI *XENBUS_XS_PRINTF) ( > + IN XENBUS_PROTOCOL *This, > + IN XENSTORE_TRANSACTION Transaction, > + IN CONST CHAR8 *Directory, > + IN CONST CHAR8 *Node, > + IN CONST CHAR8 *Format, > + ... > + ); > + > +typedef > +XENSTORE_STATUS > +(EFIAPI *XENBUS_XS_REMOVE) ( > + IN XENBUS_PROTOCOL *This, > + IN XENSTORE_TRANSACTION Transaction, > + IN CONST CHAR8 *Node > + ); > + > +typedef > +XENSTORE_STATUS > +(EFIAPI *XENBUS_XS_TRANSACTION_START)( > + IN XENBUS_PROTOCOL *This, > + OUT XENSTORE_TRANSACTION *Transaction > + ); > + > +typedef > +XENSTORE_STATUS > +(EFIAPI *XENBUS_XS_TRANSACTION_END) ( > + IN XENBUS_PROTOCOL *This, > + IN XENSTORE_TRANSACTION Transaction, > + IN BOOLEAN Abort > + ); > + > typedef > EFI_STATUS > (EFIAPI *XENBUS_GRANT_ACCESS)( > @@ -98,16 +154,63 @@ EFI_STATUS > IN grant_ref_t Ref > ); > > +typedef > +XENSTORE_STATUS > +(EFIAPI *XENBUS_REGISTER_WATCH) ( > + IN XENBUS_PROTOCOL *This, > + IN CONST CHAR8 *Node, > + // XENSTORE_WATCH ? > + OUT VOID **Token > + ); > + > +typedef > +XENSTORE_STATUS > +(EFIAPI *XENBUS_REGISTER_WATCH_BACKEND) ( > + IN XENBUS_PROTOCOL *This, > + IN CONST CHAR8 *Node, > + OUT VOID **Token > + ); > + > +typedef > +VOID > +(EFIAPI *XENBUS_UNREGISTER_WATCH) ( > + IN XENBUS_PROTOCOL *This, > + IN VOID *Token > + ); > + > +typedef > +VOID > +(EFIAPI *XENBUS_WAIT_FOR_WATCH) ( > + IN XENBUS_PROTOCOL *This, > + IN VOID *Token > + ); > + > > /// > /// Protocol structure > /// > struct _XENBUS_PROTOCOL { > + XENBUS_XS_READ XsRead; > + XENBUS_XS_BACKEND_READ XsBackendRead; > + XENBUS_XS_PRINTF XsPrintf; > + XENBUS_XS_REMOVE XsRemove; > + XENBUS_XS_TRANSACTION_START XsTransactionStart; > + XENBUS_XS_TRANSACTION_END XsTransactionEnd; > + > XENBUS_GRANT_ACCESS GrantAccess; > XENBUS_GRANT_END_ACCESS GrantEndAccess; > + > + XENBUS_REGISTER_WATCH RegisterWatch; > + XENBUS_REGISTER_WATCH_BACKEND RegisterWatchBackend; > + XENBUS_UNREGISTER_WATCH UnregisterWatch; > + XENBUS_WAIT_FOR_WATCH WaitForWatch; > // > // Protocol data fields > // > + CONST CHAR8 *Type; > + UINT16 DeviceId; > + CONST CHAR8 *Node; > + CONST CHAR8 *Backend; > }; > > extern EFI_GUID gXenBusProtocolGuid; > diff --git a/OvmfPkg/XenBusDxe/XenStore.c b/OvmfPkg/XenBusDxe/XenStore.c > index bcf6e1c..d828c06 100644 > --- a/OvmfPkg/XenBusDxe/XenStore.c > +++ b/OvmfPkg/XenBusDxe/XenStore.c > @@ -892,6 +892,42 @@ XenStoreUnwatch ( > return XenStoreTalkv (XST_NIL, XS_UNWATCH, WriteRequest, 2, NULL, NULL); > } > > +STATIC > +VOID > +XenStoreWaitWatch ( > + VOID *Token > + ) > +{ > + XENSTORE_MESSAGE *Message; > + LIST_ENTRY *Entry = NULL; > + LIST_ENTRY *Last = NULL; > + > + while (TRUE) { > + EfiAcquireLock (&xs.WatchEventsLock); > + if (IsListEmpty (&xs.WatchEvents) || > + Last == GetFirstNode (&xs.WatchEvents)) { > + EfiReleaseLock (&xs.WatchEventsLock); > + XenStoreProcessMessage (); > + continue; > + } > + > + for (Entry = GetFirstNode (&xs.WatchEvents); > + Entry != Last && !IsNull (&xs.WatchEvents, Entry); > + Entry = GetNextNode (&xs.WatchEvents, Entry)) { > + Message = XENSTORE_MESSAGE_FROM_LINK (Entry); > + if (Message->u.Watch.Handle == Token) { > + RemoveEntryList (Entry); > + EfiReleaseLock (&xs.WatchEventsLock); > + FreePool(Message->u.Watch.Vector); > + FreePool(Message); > + return; > + } > + } > + Last = GetFirstNode (&xs.WatchEvents); > + EfiReleaseLock (&xs.WatchEventsLock); > + } > +} > + > VOID > EFIAPI > NotifyEventChannelCheckForEvent ( > @@ -1318,3 +1354,127 @@ XenStoreUnregisterWatch ( > FreePool (Watch->Node); > FreePool (Watch); > } > + > + > +// > +// XENBUS protocol > +// > + > +VOID > +EFIAPI > +XenBusWaitForWatch ( > + IN XENBUS_PROTOCOL *This, > + IN VOID *Token > + ) > +{ > + XenStoreWaitWatch (Token); > +} > + > +XENSTORE_STATUS > +EFIAPI > +XenBusXenStoreRead ( > + IN XENBUS_PROTOCOL *This, > + IN XENSTORE_TRANSACTION Transaction, > + IN CONST CHAR8 *Node, > + OUT VOID **Value > + ) > +{ > + return XenStoreRead (Transaction, This->Node, Node, NULL, Value); > +} > + > +XENSTORE_STATUS > +EFIAPI > +XenBusXenStoreBackendRead ( > + IN XENBUS_PROTOCOL *This, > + IN XENSTORE_TRANSACTION Transaction, > + IN CONST CHAR8 *Node, > + OUT VOID **Value > + ) > +{ > + return XenStoreRead (Transaction, This->Backend, Node, NULL, Value); > +} > + > +XENSTORE_STATUS > +EFIAPI > +XenBusXenStoreRemove ( > + IN XENBUS_PROTOCOL *This, > + IN XENSTORE_TRANSACTION Transaction, > + IN const char *Node > + ) > +{ > + return XenStoreRemove (Transaction, This->Node, Node); > +} > + > +XENSTORE_STATUS > +EFIAPI > +XenBusXenStoreTransactionStart ( > + IN XENBUS_PROTOCOL *This, > + OUT XENSTORE_TRANSACTION *Transaction > + ) > +{ > + return XenStoreTransactionStart (Transaction); > +} > + > +XENSTORE_STATUS > +EFIAPI > +XenBusXenStoreTransactionEnd ( > + IN XENBUS_PROTOCOL *This, > + IN XENSTORE_TRANSACTION Transaction, > + IN BOOLEAN Abort > + ) > +{ > + return XenStoreTransactionEnd (Transaction, Abort); > +} > + > +XENSTORE_STATUS > +EFIAPI > +XenBusXenStoreSPrint ( > + IN XENBUS_PROTOCOL *This, > + IN XENSTORE_TRANSACTION Transaction, > + IN CONST CHAR8 *DirectoryPath, > + IN CONST CHAR8 *Node, > + IN CONST CHAR8 *FormatString, > + ... > + ) > +{ > + VA_LIST Marker; > + XENSTORE_STATUS Status; > + > + VA_START (Marker, FormatString); > + Status = XenStoreVSPrint (Transaction, DirectoryPath, Node, FormatString, > Marker); > + VA_END (Marker); > + > + return Status; > +} > + > +XENSTORE_STATUS > +EFIAPI > +XenBusRegisterWatch ( > + IN XENBUS_PROTOCOL *This, > + IN CONST CHAR8 *Node, > + OUT VOID **Token > + ) > +{ > + return XenStoreRegisterWatch (This->Node, Node, (XENSTORE_WATCH **) Token); > +} > + > +XENSTORE_STATUS > +EFIAPI > +XenBusRegisterWatchBackend ( > + IN XENBUS_PROTOCOL *This, > + IN CONST CHAR8 *Node, > + OUT VOID **Token > + ) > +{ > + return XenStoreRegisterWatch (This->Backend, Node, (XENSTORE_WATCH **) > Token); > +} > + > +VOID > +EFIAPI > +XenBusUnregisterWatch ( > + IN XENBUS_PROTOCOL *This, > + IN VOID *Token > + ) > +{ > + XenStoreUnregisterWatch ((XENSTORE_WATCH *) Token); > +} > diff --git a/OvmfPkg/XenBusDxe/XenStore.h b/OvmfPkg/XenBusDxe/XenStore.h > index 2902e3f..5d1a6b3 100644 > --- a/OvmfPkg/XenBusDxe/XenStore.h > +++ b/OvmfPkg/XenBusDxe/XenStore.h > @@ -289,4 +289,91 @@ XenStoreDeinit ( > IN XENBUS_DEVICE *Dev > ); > > + > +// > +// XENBUS protocol > +// > + > +VOID > +EFIAPI > +XenBusWaitForWatch ( > + IN XENBUS_PROTOCOL *This, > + IN VOID *Token > + ); > + > +XENSTORE_STATUS > +EFIAPI > +XenBusXenStoreRead ( > + IN XENBUS_PROTOCOL *This, > + IN XENSTORE_TRANSACTION Transaction, > + IN CONST CHAR8 *Node, > + OUT VOID **Value > + ); > + > +XENSTORE_STATUS > +EFIAPI > +XenBusXenStoreBackendRead ( > + IN XENBUS_PROTOCOL *This, > + IN XENSTORE_TRANSACTION Transaction, > + IN CONST CHAR8 *Node, > + OUT VOID **Value > + ); > + > +XENSTORE_STATUS > +EFIAPI > +XenBusXenStoreRemove ( > + IN XENBUS_PROTOCOL *This, > + IN XENSTORE_TRANSACTION Transaction, > + IN CONST CHAR8 *Node > + ); > + > +XENSTORE_STATUS > +EFIAPI > +XenBusXenStoreTransactionStart ( > + IN XENBUS_PROTOCOL *This, > + OUT XENSTORE_TRANSACTION *Transaction > + ); > + > +XENSTORE_STATUS > +EFIAPI > +XenBusXenStoreTransactionEnd ( > + IN XENBUS_PROTOCOL *This, > + IN XENSTORE_TRANSACTION Transaction, > + IN BOOLEAN Abort > + ); > + > +XENSTORE_STATUS > +EFIAPI > +XenBusXenStoreSPrint ( > + IN XENBUS_PROTOCOL *This, > + IN XENSTORE_TRANSACTION Transaction, > + IN CONST CHAR8 *DirectoryPath, > + IN CONST CHAR8 *Node, > + IN CONST CHAR8 *FormatString, > + ... > + ); > + > +XENSTORE_STATUS > +EFIAPI > +XenBusRegisterWatch ( > + IN XENBUS_PROTOCOL *This, > + IN CONST CHAR8 *Node, > + OUT VOID **Token > + ); > + > +XENSTORE_STATUS > +EFIAPI > +XenBusRegisterWatchBackend ( > + IN XENBUS_PROTOCOL *This, > + IN CONST CHAR8 *Node, > + OUT VOID **Token > + ); > + > +VOID > +EFIAPI > +XenBusUnregisterWatch ( > + IN XENBUS_PROTOCOL *This, > + IN VOID *Token > + ); > + > #endif /* _XEN_XENSTORE_XENSTOREVAR_H */ > -- > Anthony PERARD > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |