summaryrefslogtreecommitdiffstats
path: root/OvmfPkg/XenBusDxe/XenStore.c
diff options
context:
space:
mode:
authorAnthony PERARD <anthony.perard@citrix.com>2014-10-29 06:51:04 +0000
committerjljusten <jljusten@Edk2>2014-10-29 06:51:04 +0000
commitc23c037fb3b47574950a19d4753fbeccff5e3d42 (patch)
treef87ec4718056441c4be3d29c3f189803ec0f9bc6 /OvmfPkg/XenBusDxe/XenStore.c
parent02a6bcff71e2f11be851b3bd62518a62e58e71f5 (diff)
downloadedk2-c23c037fb3b47574950a19d4753fbeccff5e3d42.tar.gz
edk2-c23c037fb3b47574950a19d4753fbeccff5e3d42.tar.bz2
edk2-c23c037fb3b47574950a19d4753fbeccff5e3d42.zip
OvmfPkg/XenBusDxe: Add XenStore function into the XenBus protocol
Change in V3: - Have XenStoreWaitWatch/XenBusWaitForWatch return a XENSTORE_STATUS instead of VOID. - Add description of the introducted member of the protocol. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Acked-by: Jordan Justen <jordan.l.justen@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16269 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'OvmfPkg/XenBusDxe/XenStore.c')
-rw-r--r--OvmfPkg/XenBusDxe/XenStore.c164
1 files changed, 164 insertions, 0 deletions
diff --git a/OvmfPkg/XenBusDxe/XenStore.c b/OvmfPkg/XenBusDxe/XenStore.c
index 4b99c9ca1f..aed6b141bd 100644
--- a/OvmfPkg/XenBusDxe/XenStore.c
+++ b/OvmfPkg/XenBusDxe/XenStore.c
@@ -941,6 +941,46 @@ XenStoreUnwatch (
return XenStoreTalkv (XST_NIL, XS_UNWATCH, WriteRequest, 2, NULL, NULL);
}
+STATIC
+XENSTORE_STATUS
+XenStoreWaitWatch (
+ VOID *Token
+ )
+{
+ XENSTORE_MESSAGE *Message;
+ LIST_ENTRY *Entry = NULL;
+ LIST_ENTRY *Last = NULL;
+ XENSTORE_STATUS Status;
+
+ while (TRUE) {
+ EfiAcquireLock (&xs.WatchEventsLock);
+ if (IsListEmpty (&xs.WatchEvents) ||
+ Last == GetFirstNode (&xs.WatchEvents)) {
+ EfiReleaseLock (&xs.WatchEventsLock);
+ Status = XenStoreProcessMessage ();
+ if (Status != XENSTORE_STATUS_SUCCESS && Status != XENSTORE_STATUS_EAGAIN) {
+ return Status;
+ }
+ 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 XENSTORE_STATUS_SUCCESS;
+ }
+ }
+ Last = GetFirstNode (&xs.WatchEvents);
+ EfiReleaseLock (&xs.WatchEventsLock);
+ }
+}
+
VOID
EFIAPI
NotifyEventChannelCheckForEvent (
@@ -1384,3 +1424,127 @@ XenStoreUnregisterWatch (
FreePool (Watch->Node);
FreePool (Watch);
}
+
+
+//
+// XENBUS protocol
+//
+
+XENSTORE_STATUS
+EFIAPI
+XenBusWaitForWatch (
+ IN XENBUS_PROTOCOL *This,
+ IN VOID *Token
+ )
+{
+ return 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);
+}