[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 13/18] OvmfPkg/XenBusDxe: Add XenStore function into the XenBus protocol
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Anthony PERARD <anthony.perard@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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |