]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/XenBusDxe/XenStore.c
OvmfPkg/XenBusDxe: Add XenStore function into the XenBus protocol
[mirror_edk2.git] / OvmfPkg / XenBusDxe / XenStore.c
index 4b99c9ca1fd8b772a2aa6d5b2303e1b902d64b84..aed6b141bdcd88c5ab1389d5b684f9a0031e7761 100644 (file)
@@ -941,6 +941,46 @@ XenStoreUnwatch (
   return XenStoreTalkv (XST_NIL, XS_UNWATCH, WriteRequest, 2, NULL, NULL);\r
 }\r
 \r
+STATIC\r
+XENSTORE_STATUS\r
+XenStoreWaitWatch (\r
+  VOID *Token\r
+  )\r
+{\r
+  XENSTORE_MESSAGE *Message;\r
+  LIST_ENTRY *Entry = NULL;\r
+  LIST_ENTRY *Last = NULL;\r
+  XENSTORE_STATUS Status;\r
+\r
+  while (TRUE) {\r
+    EfiAcquireLock (&xs.WatchEventsLock);\r
+    if (IsListEmpty (&xs.WatchEvents) ||\r
+        Last == GetFirstNode (&xs.WatchEvents)) {\r
+      EfiReleaseLock (&xs.WatchEventsLock);\r
+      Status = XenStoreProcessMessage ();\r
+      if (Status != XENSTORE_STATUS_SUCCESS && Status != XENSTORE_STATUS_EAGAIN) {\r
+        return Status;\r
+      }\r
+      continue;\r
+    }\r
+\r
+    for (Entry = GetFirstNode (&xs.WatchEvents);\r
+         Entry != Last && !IsNull (&xs.WatchEvents, Entry);\r
+         Entry = GetNextNode (&xs.WatchEvents, Entry)) {\r
+      Message = XENSTORE_MESSAGE_FROM_LINK (Entry);\r
+      if (Message->u.Watch.Handle == Token) {\r
+        RemoveEntryList (Entry);\r
+        EfiReleaseLock (&xs.WatchEventsLock);\r
+        FreePool(Message->u.Watch.Vector);\r
+        FreePool(Message);\r
+        return XENSTORE_STATUS_SUCCESS;\r
+      }\r
+    }\r
+    Last = GetFirstNode (&xs.WatchEvents);\r
+    EfiReleaseLock (&xs.WatchEventsLock);\r
+  }\r
+}\r
+\r
 VOID\r
 EFIAPI\r
 NotifyEventChannelCheckForEvent (\r
@@ -1384,3 +1424,127 @@ XenStoreUnregisterWatch (
   FreePool (Watch->Node);\r
   FreePool (Watch);\r
 }\r
+\r
+\r
+//\r
+// XENBUS protocol\r
+//\r
+\r
+XENSTORE_STATUS\r
+EFIAPI\r
+XenBusWaitForWatch (\r
+  IN XENBUS_PROTOCOL *This,\r
+  IN VOID *Token\r
+  )\r
+{\r
+  return XenStoreWaitWatch (Token);\r
+}\r
+\r
+XENSTORE_STATUS\r
+EFIAPI\r
+XenBusXenStoreRead (\r
+  IN  XENBUS_PROTOCOL       *This,\r
+  IN  XENSTORE_TRANSACTION  Transaction,\r
+  IN  CONST CHAR8           *Node,\r
+  OUT VOID                  **Value\r
+  )\r
+{\r
+  return XenStoreRead (Transaction, This->Node, Node, NULL, Value);\r
+}\r
+\r
+XENSTORE_STATUS\r
+EFIAPI\r
+XenBusXenStoreBackendRead (\r
+  IN  XENBUS_PROTOCOL       *This,\r
+  IN  XENSTORE_TRANSACTION  Transaction,\r
+  IN  CONST CHAR8           *Node,\r
+  OUT VOID                  **Value\r
+  )\r
+{\r
+  return XenStoreRead (Transaction, This->Backend, Node, NULL, Value);\r
+}\r
+\r
+XENSTORE_STATUS\r
+EFIAPI\r
+XenBusXenStoreRemove (\r
+  IN XENBUS_PROTOCOL        *This,\r
+  IN XENSTORE_TRANSACTION   Transaction,\r
+  IN const char             *Node\r
+  )\r
+{\r
+  return XenStoreRemove (Transaction, This->Node, Node);\r
+}\r
+\r
+XENSTORE_STATUS\r
+EFIAPI\r
+XenBusXenStoreTransactionStart (\r
+  IN  XENBUS_PROTOCOL       *This,\r
+  OUT XENSTORE_TRANSACTION  *Transaction\r
+  )\r
+{\r
+  return XenStoreTransactionStart (Transaction);\r
+}\r
+\r
+XENSTORE_STATUS\r
+EFIAPI\r
+XenBusXenStoreTransactionEnd (\r
+  IN XENBUS_PROTOCOL        *This,\r
+  IN XENSTORE_TRANSACTION   Transaction,\r
+  IN BOOLEAN                Abort\r
+  )\r
+{\r
+  return XenStoreTransactionEnd (Transaction, Abort);\r
+}\r
+\r
+XENSTORE_STATUS\r
+EFIAPI\r
+XenBusXenStoreSPrint (\r
+  IN XENBUS_PROTOCOL        *This,\r
+  IN XENSTORE_TRANSACTION   Transaction,\r
+  IN CONST CHAR8            *DirectoryPath,\r
+  IN CONST CHAR8            *Node,\r
+  IN CONST CHAR8            *FormatString,\r
+  ...\r
+  )\r
+{\r
+  VA_LIST Marker;\r
+  XENSTORE_STATUS Status;\r
+\r
+  VA_START (Marker, FormatString);\r
+  Status = XenStoreVSPrint (Transaction, DirectoryPath, Node, FormatString, Marker);\r
+  VA_END (Marker);\r
+\r
+  return Status;\r
+}\r
+\r
+XENSTORE_STATUS\r
+EFIAPI\r
+XenBusRegisterWatch (\r
+  IN  XENBUS_PROTOCOL *This,\r
+  IN  CONST CHAR8     *Node,\r
+  OUT VOID            **Token\r
+  )\r
+{\r
+  return XenStoreRegisterWatch (This->Node, Node, (XENSTORE_WATCH **) Token);\r
+}\r
+\r
+XENSTORE_STATUS\r
+EFIAPI\r
+XenBusRegisterWatchBackend (\r
+  IN  XENBUS_PROTOCOL *This,\r
+  IN  CONST CHAR8     *Node,\r
+  OUT VOID            **Token\r
+  )\r
+{\r
+  return XenStoreRegisterWatch (This->Backend, Node, (XENSTORE_WATCH **) Token);\r
+}\r
+\r
+VOID\r
+EFIAPI\r
+XenBusUnregisterWatch (\r
+  IN XENBUS_PROTOCOL  *This,\r
+  IN VOID             *Token\r
+  )\r
+{\r
+  XenStoreUnregisterWatch ((XENSTORE_WATCH *) Token);\r
+}\r