\r
The XenStore is ASCII string based, and has a structure and semantics\r
similar to a filesystem. There are files and directories, the directories\r
- able to contain files or other directories. The depth of the hierachy\r
+ able to contain files or other directories. The depth of the hierarchy\r
is only limited by the XenStore's maximum path length.\r
\r
The communication channel between the XenStore service and other\r
This file may be distributed separately from the Linux kernel, or\r
incorporated into other software packages, subject to the following license:\r
\r
- Permission is hereby granted, free of charge, to any person obtaining a copy\r
- of this source file (the "Software"), to deal in the Software without\r
- restriction, including without limitation the rights to use, copy, modify,\r
- merge, publish, distribute, sublicense, and/or sell copies of the Software,\r
- and to permit persons to whom the Software is furnished to do so, subject to\r
- the following conditions:\r
-\r
- The above copyright notice and this permission notice shall be included in\r
- all copies or substantial portions of the Software.\r
-\r
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\r
- IN THE SOFTWARE.\r
+ SPDX-License-Identifier: MIT\r
**/\r
\r
#include "XenStore.h"\r
//\r
\r
typedef struct {\r
- CONST VOID *Data;\r
- UINT32 Len;\r
+ CONST VOID *Data;\r
+ UINT32 Len;\r
} WRITE_REQUEST;\r
\r
/* Register callback to watch subtree (node) in the XenStore. */\r
-#define XENSTORE_WATCH_SIGNATURE SIGNATURE_32 ('X','S','w','a')\r
-struct _XENSTORE_WATCH\r
-{\r
- UINT32 Signature;\r
- LIST_ENTRY Link;\r
+#define XENSTORE_WATCH_SIGNATURE SIGNATURE_32 ('X','S','w','a')\r
+struct _XENSTORE_WATCH {\r
+ UINT32 Signature;\r
+ LIST_ENTRY Link;\r
\r
/* Path being watched. */\r
- CHAR8 *Node;\r
+ CHAR8 *Node;\r
};\r
\r
#define XENSTORE_WATCH_FROM_LINK(l) \\r
CR (l, XENSTORE_WATCH, Link, XENSTORE_WATCH_SIGNATURE)\r
\r
-\r
/**\r
* Structure capturing messages received from the XenStore service.\r
*/\r
-#define XENSTORE_MESSAGE_SIGNATURE SIGNATURE_32 ('X', 'S', 's', 'm')\r
+#define XENSTORE_MESSAGE_SIGNATURE SIGNATURE_32 ('X', 'S', 's', 'm')\r
typedef struct {\r
- UINT32 Signature;\r
- LIST_ENTRY Link;\r
+ UINT32 Signature;\r
+ LIST_ENTRY Link;\r
\r
- struct xsd_sockmsg Header;\r
+ struct xsd_sockmsg Header;\r
\r
union {\r
/* Queued replies. */\r
struct {\r
- CHAR8 *Body;\r
+ CHAR8 *Body;\r
} Reply;\r
\r
/* Queued watch events. */\r
struct {\r
- XENSTORE_WATCH *Handle;\r
- CONST CHAR8 **Vector;\r
- UINT32 VectorSize;\r
+ XENSTORE_WATCH *Handle;\r
+ CONST CHAR8 **Vector;\r
+ UINT32 VectorSize;\r
} Watch;\r
} u;\r
} XENSTORE_MESSAGE;\r
* Pointer to shared memory communication structures allowing us\r
* to communicate with the XenStore service.\r
*/\r
- struct xenstore_domain_interface *XenStore;\r
+ struct xenstore_domain_interface *XenStore;\r
\r
- XENBUS_DEVICE *Dev;\r
+ XENBUS_DEVICE *Dev;\r
\r
/**\r
* A list of replies to our requests.\r
*\r
* /note Only one requesting context can be active at a time.\r
*/\r
- LIST_ENTRY ReplyList;\r
+ LIST_ENTRY ReplyList;\r
\r
/** Lock protecting the reply list. */\r
- EFI_LOCK ReplyLock;\r
+ EFI_LOCK ReplyLock;\r
\r
/**\r
* List of registered watches.\r
*/\r
- LIST_ENTRY RegisteredWatches;\r
+ LIST_ENTRY RegisteredWatches;\r
\r
/** Lock protecting the registered watches list. */\r
- EFI_LOCK RegisteredWatchesLock;\r
+ EFI_LOCK RegisteredWatchesLock;\r
\r
/**\r
* List of pending watch callback events.\r
*/\r
- LIST_ENTRY WatchEvents;\r
+ LIST_ENTRY WatchEvents;\r
\r
- /** Lock protecting the watch calback list. */\r
- EFI_LOCK WatchEventsLock;\r
+ /** Lock protecting the watch callback list. */\r
+ EFI_LOCK WatchEventsLock;\r
\r
/**\r
* The event channel for communicating with the\r
* XenStore service.\r
*/\r
- evtchn_port_t EventChannel;\r
+ evtchn_port_t EventChannel;\r
\r
/** Handle for XenStore events. */\r
- EFI_EVENT EventChannelEvent;\r
+ EFI_EVENT EventChannelEvent;\r
} XENSTORE_PRIVATE;\r
\r
//\r
// Global Data\r
//\r
-static XENSTORE_PRIVATE xs;\r
-\r
+static XENSTORE_PRIVATE xs;\r
\r
//\r
// Private Utility Functions\r
STATIC\r
UINT32\r
ExtractStrings (\r
- IN CONST CHAR8 *Strings,\r
- IN UINTN Len,\r
- OUT CONST CHAR8 **Dst OPTIONAL\r
+ IN CONST CHAR8 *Strings,\r
+ IN UINTN Len,\r
+ OUT CONST CHAR8 **Dst OPTIONAL\r
)\r
{\r
- UINT32 Num = 0;\r
- CONST CHAR8 *Ptr;\r
+ UINT32 Num = 0;\r
+ CONST CHAR8 *Ptr;\r
\r
for (Ptr = Strings; Ptr < Strings + Len; Ptr += AsciiStrSize (Ptr)) {\r
if (Dst != NULL) {\r
*Dst++ = Ptr;\r
}\r
+\r
Num++;\r
}\r
\r
OUT UINT32 *NumPtr\r
)\r
{\r
- CONST CHAR8 **Dst;\r
+ CONST CHAR8 **Dst;\r
\r
- ASSERT(NumPtr != NULL);\r
- ASSERT(Strings != NULL);\r
+ ASSERT (NumPtr != NULL);\r
+ ASSERT (Strings != NULL);\r
\r
/* Protect against unterminated buffers. */\r
if (Len > 0) {\r
\r
/* Transfer to one big alloc for easy freeing by the caller. */\r
Dst = AllocatePool (*NumPtr * sizeof (CHAR8 *) + Len);\r
- CopyMem ((VOID*)&Dst[*NumPtr], Strings, Len);\r
+ CopyMem ((VOID *)&Dst[*NumPtr], Strings, Len);\r
FreePool (Strings);\r
\r
/* Extract pointers to newly allocated array. */\r
- Strings = (CHAR8 *) &Dst[*NumPtr];\r
+ Strings = (CHAR8 *)&Dst[*NumPtr];\r
ExtractStrings (Strings, Len, Dst);\r
\r
return (Dst);\r
STATIC\r
XENSTORE_WATCH *\r
XenStoreFindWatch (\r
- IN CONST CHAR8 *Token\r
+ IN CONST CHAR8 *Token\r
)\r
{\r
- XENSTORE_WATCH *Watch, *WantedWatch;\r
- LIST_ENTRY *Entry;\r
+ XENSTORE_WATCH *Watch, *WantedWatch;\r
+ LIST_ENTRY *Entry;\r
\r
- WantedWatch = (VOID *) AsciiStrHexToUintn (Token);\r
+ WantedWatch = (VOID *)AsciiStrHexToUintn (Token);\r
\r
if (IsListEmpty (&xs.RegisteredWatches)) {\r
return NULL;\r
}\r
+\r
for (Entry = GetFirstNode (&xs.RegisteredWatches);\r
!IsNull (&xs.RegisteredWatches, Entry);\r
- Entry = GetNextNode (&xs.RegisteredWatches, Entry)) {\r
+ Entry = GetNextNode (&xs.RegisteredWatches, Entry))\r
+ {\r
Watch = XENSTORE_WATCH_FROM_LINK (Entry);\r
- if (Watch == WantedWatch)\r
+ if (Watch == WantedWatch) {\r
return Watch;\r
+ }\r
}\r
\r
return NULL;\r
\r
CHAR8 *\r
XenStoreJoin (\r
- IN CONST CHAR8 *DirectoryPath,\r
- IN CONST CHAR8 *Node\r
+ IN CONST CHAR8 *DirectoryPath,\r
+ IN CONST CHAR8 *Node\r
)\r
{\r
- CHAR8 *Buf;\r
+ CHAR8 *Buf;\r
+ UINTN BufSize;\r
\r
/* +1 for '/' and +1 for '\0' */\r
- Buf = AllocateZeroPool (\r
- AsciiStrLen (DirectoryPath) + AsciiStrLen (Node) + 2);\r
- AsciiStrCat (Buf, DirectoryPath);\r
- if (Node[0] != '\0') {\r
- AsciiStrCat (Buf, "/");\r
- AsciiStrCat (Buf, Node);\r
+ BufSize = AsciiStrLen (DirectoryPath) + AsciiStrLen (Node) + 2;\r
+ Buf = AllocatePool (BufSize);\r
+ ASSERT (Buf != NULL);\r
+\r
+ if (Node[0] == '\0') {\r
+ AsciiSPrint (Buf, BufSize, "%a", DirectoryPath);\r
+ } else {\r
+ AsciiSPrint (Buf, BufSize, "%a/%a", DirectoryPath, Node);\r
}\r
\r
return Buf;\r
STATIC\r
BOOLEAN\r
XenStoreCheckIndexes (\r
- XENSTORE_RING_IDX Cons,\r
- XENSTORE_RING_IDX Prod\r
+ XENSTORE_RING_IDX Cons,\r
+ XENSTORE_RING_IDX Prod\r
)\r
{\r
return ((Prod - Cons) <= XENSTORE_RING_SIZE);\r
STATIC\r
VOID *\r
XenStoreGetOutputChunk (\r
- IN XENSTORE_RING_IDX Cons,\r
- IN XENSTORE_RING_IDX Prod,\r
- IN CHAR8 *Buffer,\r
- OUT UINT32 *LenPtr\r
+ IN XENSTORE_RING_IDX Cons,\r
+ IN XENSTORE_RING_IDX Prod,\r
+ IN CHAR8 *Buffer,\r
+ OUT UINT32 *LenPtr\r
)\r
{\r
- UINT32 Len;\r
+ UINT32 Len;\r
+\r
Len = XENSTORE_RING_SIZE - MASK_XENSTORE_IDX (Prod);\r
if ((XENSTORE_RING_SIZE - (Prod - Cons)) < Len) {\r
Len = XENSTORE_RING_SIZE - (Prod - Cons);\r
}\r
+\r
*LenPtr = Len;\r
return (Buffer + MASK_XENSTORE_IDX (Prod));\r
}\r
STATIC\r
CONST VOID *\r
XenStoreGetInputChunk (\r
- IN XENSTORE_RING_IDX Cons,\r
- IN XENSTORE_RING_IDX Prod,\r
- IN CONST CHAR8 *Buffer,\r
- OUT UINT32 *LenPtr\r
+ IN XENSTORE_RING_IDX Cons,\r
+ IN XENSTORE_RING_IDX Prod,\r
+ IN CONST CHAR8 *Buffer,\r
+ OUT UINT32 *LenPtr\r
)\r
{\r
- UINT32 Len;\r
+ UINT32 Len;\r
\r
Len = XENSTORE_RING_SIZE - MASK_XENSTORE_IDX (Cons);\r
if ((Prod - Cons) < Len) {\r
Len = Prod - Cons;\r
}\r
+\r
*LenPtr = Len;\r
return (Buffer + MASK_XENSTORE_IDX (Cons));\r
}\r
STATIC\r
EFI_STATUS\r
XenStoreWaitForEvent (\r
- IN EFI_EVENT Event,\r
- IN UINT64 Timeout\r
+ IN EFI_EVENT Event,\r
+ IN UINT64 Timeout\r
)\r
{\r
- UINTN Index;\r
- EFI_STATUS Status;\r
- EFI_EVENT TimerEvent;\r
- EFI_EVENT WaitList[2];\r
+ UINTN Index;\r
+ EFI_STATUS Status;\r
+ EFI_EVENT TimerEvent;\r
+ EFI_EVENT WaitList[2];\r
\r
gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &TimerEvent);\r
gBS->SetTimer (TimerEvent, TimerRelative, Timeout);\r
\r
WaitList[0] = xs.EventChannelEvent;\r
WaitList[1] = TimerEvent;\r
- Status = gBS->WaitForEvent (2, WaitList, &Index);\r
+ Status = gBS->WaitForEvent (2, WaitList, &Index);\r
ASSERT (Status != EFI_INVALID_PARAMETER);\r
gBS->CloseEvent (TimerEvent);\r
if (Status == EFI_UNSUPPORTED) {\r
return EFI_SUCCESS;\r
}\r
+\r
if (Index == 1) {\r
return EFI_TIMEOUT;\r
} else {\r
STATIC\r
XENSTORE_STATUS\r
XenStoreWriteStore (\r
- IN CONST VOID *DataPtr,\r
- IN UINT32 Len\r
+ IN CONST VOID *DataPtr,\r
+ IN UINT32 Len\r
)\r
{\r
- XENSTORE_RING_IDX Cons, Prod;\r
- CONST CHAR8 *Data = (CONST CHAR8 *)DataPtr;\r
+ XENSTORE_RING_IDX Cons, Prod;\r
+ CONST CHAR8 *Data = (CONST CHAR8 *)DataPtr;\r
\r
while (Len != 0) {\r
- void *Dest;\r
- UINT32 Available;\r
+ void *Dest;\r
+ UINT32 Available;\r
\r
Cons = xs.XenStore->req_cons;\r
Prod = xs.XenStore->req_prod;\r
* Note that the events from both queues are combined, so being woken\r
* does not guarantee that data exist in the read ring.\r
*/\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
- Status = XenStoreWaitForEvent (xs.EventChannelEvent,\r
- EFI_TIMER_PERIOD_SECONDS (1));\r
+ Status = XenStoreWaitForEvent (\r
+ xs.EventChannelEvent,\r
+ EFI_TIMER_PERIOD_SECONDS (1)\r
+ );\r
if (Status == EFI_TIMEOUT) {\r
- DEBUG ((EFI_D_WARN, "XenStore Write, waiting for a ring event.\n"));\r
+ DEBUG ((DEBUG_WARN, "XenStore Write, waiting for a ring event.\n"));\r
}\r
+\r
continue;\r
}\r
\r
\r
CopyMem (Dest, Data, Available);\r
Data += Available;\r
- Len -= Available;\r
+ Len -= Available;\r
\r
/*\r
* The store to the producer index, which indicates\r
STATIC\r
XENSTORE_STATUS\r
XenStoreReadStore (\r
- OUT VOID *DataPtr,\r
- IN UINT32 Len\r
+ OUT VOID *DataPtr,\r
+ IN UINT32 Len\r
)\r
{\r
- XENSTORE_RING_IDX Cons, Prod;\r
- CHAR8 *Data = (CHAR8 *) DataPtr;\r
+ XENSTORE_RING_IDX Cons, Prod;\r
+ CHAR8 *Data = (CHAR8 *)DataPtr;\r
\r
while (Len != 0) {\r
- UINT32 Available;\r
- CONST CHAR8 *Src;\r
+ UINT32 Available;\r
+ CONST CHAR8 *Src;\r
\r
Cons = xs.XenStore->rsp_cons;\r
Prod = xs.XenStore->rsp_prod;\r
* Note that the events from both queues are combined, so being woken\r
* does not guarantee that data exist in the read ring.\r
*/\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
- Status = XenStoreWaitForEvent (xs.EventChannelEvent,\r
- EFI_TIMER_PERIOD_SECONDS (1));\r
+ Status = XenStoreWaitForEvent (\r
+ xs.EventChannelEvent,\r
+ EFI_TIMER_PERIOD_SECONDS (1)\r
+ );\r
if (Status == EFI_TIMEOUT) {\r
- DEBUG ((EFI_D_WARN, "XenStore Read, waiting for a ring event.\n"));\r
+ DEBUG ((DEBUG_WARN, "XenStore Read, waiting for a ring event.\n"));\r
}\r
+\r
continue;\r
}\r
\r
\r
CopyMem (Data, Src, Available);\r
Data += Available;\r
- Len -= Available;\r
+ Len -= Available;\r
\r
/*\r
* Insure that the producer of this ring does not see\r
VOID\r
)\r
{\r
- XENSTORE_MESSAGE *Message;\r
- CHAR8 *Body;\r
- XENSTORE_STATUS Status;\r
+ XENSTORE_MESSAGE *Message;\r
+ CHAR8 *Body;\r
+ XENSTORE_STATUS Status;\r
\r
- Message = AllocateZeroPool (sizeof (XENSTORE_MESSAGE));\r
+ Message = AllocateZeroPool (sizeof (XENSTORE_MESSAGE));\r
Message->Signature = XENSTORE_MESSAGE_SIGNATURE;\r
- Status = XenStoreReadStore (&Message->Header, sizeof (Message->Header));\r
+ Status = XenStoreReadStore (&Message->Header, sizeof (Message->Header));\r
if (Status != XENSTORE_STATUS_SUCCESS) {\r
FreePool (Message);\r
- DEBUG ((EFI_D_ERROR, "XenStore: Error read store (%d)\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "XenStore: Error read store (%d)\n", Status));\r
return Status;\r
}\r
\r
- Body = AllocatePool (Message->Header.len + 1);\r
+ Body = AllocatePool (Message->Header.len + 1);\r
Status = XenStoreReadStore (Body, Message->Header.len);\r
if (Status != XENSTORE_STATUS_SUCCESS) {\r
FreePool (Body);\r
FreePool (Message);\r
- DEBUG ((EFI_D_ERROR, "XenStore: Error read store (%d)\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "XenStore: Error read store (%d)\n", Status));\r
return Status;\r
}\r
+\r
Body[Message->Header.len] = '\0';\r
\r
if (Message->Header.type == XS_WATCH_EVENT) {\r
- Message->u.Watch.Vector = Split(Body, Message->Header.len,\r
- &Message->u.Watch.VectorSize);\r
+ Message->u.Watch.Vector = Split (\r
+ Body,\r
+ Message->Header.len,\r
+ &Message->u.Watch.VectorSize\r
+ );\r
\r
EfiAcquireLock (&xs.RegisteredWatchesLock);\r
Message->u.Watch.Handle =\r
XenStoreFindWatch (Message->u.Watch.Vector[XS_WATCH_TOKEN]);\r
- DEBUG ((EFI_D_INFO, "XenStore: Watch event %a\n",\r
- Message->u.Watch.Vector[XS_WATCH_TOKEN]));\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "XenStore: Watch event %a\n",\r
+ Message->u.Watch.Vector[XS_WATCH_TOKEN]\r
+ ));\r
if (Message->u.Watch.Handle != NULL) {\r
EfiAcquireLock (&xs.WatchEventsLock);\r
InsertHeadList (&xs.WatchEvents, &Message->Link);\r
EfiReleaseLock (&xs.WatchEventsLock);\r
} else {\r
- DEBUG ((EFI_D_WARN, "XenStore: Watch handle %a not found\n",\r
- Message->u.Watch.Vector[XS_WATCH_TOKEN]));\r
- FreePool((VOID*)Message->u.Watch.Vector);\r
- FreePool(Message);\r
+ DEBUG ((\r
+ DEBUG_WARN,\r
+ "XenStore: Watch handle %a not found\n",\r
+ Message->u.Watch.Vector[XS_WATCH_TOKEN]\r
+ ));\r
+ FreePool ((VOID *)Message->u.Watch.Vector);\r
+ FreePool (Message);\r
}\r
+\r
EfiReleaseLock (&xs.RegisteredWatchesLock);\r
} else {\r
Message->u.Reply.Body = Body;\r
\r
**/\r
typedef struct {\r
- XENSTORE_STATUS Status;\r
- CONST CHAR8 *ErrorStr;\r
+ XENSTORE_STATUS Status;\r
+ CONST CHAR8 *ErrorStr;\r
} XenStoreErrors;\r
\r
-static XenStoreErrors gXenStoreErrors[] = {\r
- { XENSTORE_STATUS_EINVAL, "EINVAL" },\r
- { XENSTORE_STATUS_EACCES, "EACCES" },\r
- { XENSTORE_STATUS_EEXIST, "EEXIST" },\r
- { XENSTORE_STATUS_EISDIR, "EISDIR" },\r
- { XENSTORE_STATUS_ENOENT, "ENOENT" },\r
- { XENSTORE_STATUS_ENOMEM, "ENOMEM" },\r
- { XENSTORE_STATUS_ENOSPC, "ENOSPC" },\r
- { XENSTORE_STATUS_EIO, "EIO" },\r
+static XenStoreErrors gXenStoreErrors[] = {\r
+ { XENSTORE_STATUS_EINVAL, "EINVAL" },\r
+ { XENSTORE_STATUS_EACCES, "EACCES" },\r
+ { XENSTORE_STATUS_EEXIST, "EEXIST" },\r
+ { XENSTORE_STATUS_EISDIR, "EISDIR" },\r
+ { XENSTORE_STATUS_ENOENT, "ENOENT" },\r
+ { XENSTORE_STATUS_ENOMEM, "ENOMEM" },\r
+ { XENSTORE_STATUS_ENOSPC, "ENOSPC" },\r
+ { XENSTORE_STATUS_EIO, "EIO" },\r
{ XENSTORE_STATUS_ENOTEMPTY, "ENOTEMPTY" },\r
- { XENSTORE_STATUS_ENOSYS, "ENOSYS" },\r
- { XENSTORE_STATUS_EROFS, "EROFS" },\r
- { XENSTORE_STATUS_EBUSY, "EBUSY" },\r
- { XENSTORE_STATUS_EAGAIN, "EAGAIN" },\r
- { XENSTORE_STATUS_EISCONN, "EISCONN" },\r
- { XENSTORE_STATUS_E2BIG, "E2BIG" }\r
+ { XENSTORE_STATUS_ENOSYS, "ENOSYS" },\r
+ { XENSTORE_STATUS_EROFS, "EROFS" },\r
+ { XENSTORE_STATUS_EBUSY, "EBUSY" },\r
+ { XENSTORE_STATUS_EAGAIN, "EAGAIN" },\r
+ { XENSTORE_STATUS_EISCONN, "EISCONN" },\r
+ { XENSTORE_STATUS_E2BIG, "E2BIG" }\r
};\r
-#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))\r
\r
STATIC\r
XENSTORE_STATUS\r
XenStoreGetError (\r
- CONST CHAR8 *ErrorStr\r
+ CONST CHAR8 *ErrorStr\r
)\r
{\r
- UINT32 Index;\r
+ UINT32 Index;\r
\r
- for (Index = 0; Index < ARRAY_SIZE(gXenStoreErrors); Index++) {\r
+ for (Index = 0; Index < ARRAY_SIZE (gXenStoreErrors); Index++) {\r
if (!AsciiStrCmp (ErrorStr, gXenStoreErrors[Index].ErrorStr)) {\r
return gXenStoreErrors[Index].Status;\r
}\r
}\r
- DEBUG ((EFI_D_WARN, "XenStore gave unknown error %a\n", ErrorStr));\r
+\r
+ DEBUG ((DEBUG_WARN, "XenStore gave unknown error %a\n", ErrorStr));\r
return XENSTORE_STATUS_EINVAL;\r
}\r
\r
STATIC\r
XENSTORE_STATUS\r
XenStoreReadReply (\r
- OUT enum xsd_sockmsg_type *TypePtr,\r
- OUT UINT32 *LenPtr OPTIONAL,\r
- OUT VOID **Result\r
+ OUT enum xsd_sockmsg_type *TypePtr,\r
+ OUT UINT32 *LenPtr OPTIONAL,\r
+ OUT VOID **Result\r
)\r
{\r
- XENSTORE_MESSAGE *Message;\r
- LIST_ENTRY *Entry;\r
- CHAR8 *Body;\r
+ XENSTORE_MESSAGE *Message;\r
+ LIST_ENTRY *Entry;\r
+ CHAR8 *Body;\r
\r
while (IsListEmpty (&xs.ReplyList)) {\r
- XENSTORE_STATUS Status;\r
+ XENSTORE_STATUS Status;\r
Status = XenStoreProcessMessage ();\r
- if (Status != XENSTORE_STATUS_SUCCESS && Status != XENSTORE_STATUS_EAGAIN) {\r
- DEBUG ((EFI_D_ERROR, "XenStore, error while reading the ring (%d).",\r
- Status));\r
+ if ((Status != XENSTORE_STATUS_SUCCESS) && (Status != XENSTORE_STATUS_EAGAIN)) {\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "XenStore, error while reading the ring (%d).",\r
+ Status\r
+ ));\r
return Status;\r
}\r
}\r
+\r
EfiAcquireLock (&xs.ReplyLock);\r
- Entry = GetFirstNode (&xs.ReplyList);\r
+ Entry = GetFirstNode (&xs.ReplyList);\r
Message = XENSTORE_MESSAGE_FROM_LINK (Entry);\r
RemoveEntryList (Entry);\r
EfiReleaseLock (&xs.ReplyLock);\r
if (LenPtr != NULL) {\r
*LenPtr = Message->Header.len;\r
}\r
+\r
Body = Message->u.Reply.Body;\r
\r
FreePool (Message);\r
}\r
\r
/**\r
- Send a message with an optionally muti-part body to the XenStore service.\r
+ Send a message with an optionally multi-part body to the XenStore service.\r
\r
@param Transaction The transaction to use for this request.\r
@param RequestType The type of message to send.\r
STATIC\r
XENSTORE_STATUS\r
XenStoreTalkv (\r
- IN CONST XENSTORE_TRANSACTION *Transaction,\r
- IN enum xsd_sockmsg_type RequestType,\r
- IN CONST WRITE_REQUEST *WriteRequest,\r
- IN UINT32 NumRequests,\r
- OUT UINT32 *LenPtr OPTIONAL,\r
- OUT VOID **ResultPtr OPTIONAL\r
+ IN CONST XENSTORE_TRANSACTION *Transaction,\r
+ IN enum xsd_sockmsg_type RequestType,\r
+ IN CONST WRITE_REQUEST *WriteRequest,\r
+ IN UINT32 NumRequests,\r
+ OUT UINT32 *LenPtr OPTIONAL,\r
+ OUT VOID **ResultPtr OPTIONAL\r
)\r
{\r
- struct xsd_sockmsg Message;\r
- void *Return = NULL;\r
- UINT32 Index;\r
- XENSTORE_STATUS Status;\r
+ struct xsd_sockmsg Message;\r
+ void *Return = NULL;\r
+ UINT32 Index;\r
+ XENSTORE_STATUS Status;\r
\r
if (Transaction == XST_NIL) {\r
Message.tx_id = 0;\r
} else {\r
Message.tx_id = Transaction->Id;\r
}\r
+\r
Message.req_id = 0;\r
- Message.type = RequestType;\r
- Message.len = 0;\r
+ Message.type = RequestType;\r
+ Message.len = 0;\r
for (Index = 0; Index < NumRequests; Index++) {\r
Message.len += WriteRequest[Index].Len;\r
}\r
\r
Status = XenStoreWriteStore (&Message, sizeof (Message));\r
if (Status != XENSTORE_STATUS_SUCCESS) {\r
- DEBUG ((EFI_D_ERROR, "XenStoreTalkv failed %d\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "XenStoreTalkv failed %d\n", Status));\r
goto Error;\r
}\r
\r
for (Index = 0; Index < NumRequests; Index++) {\r
Status = XenStoreWriteStore (WriteRequest[Index].Data, WriteRequest[Index].Len);\r
if (Status != XENSTORE_STATUS_SUCCESS) {\r
- DEBUG ((EFI_D_ERROR, "XenStoreTalkv failed %d\n", Status));\r
+ DEBUG ((DEBUG_ERROR, "XenStoreTalkv failed %d\n", Status));\r
goto Error;\r
}\r
}\r
STATIC\r
XENSTORE_STATUS\r
XenStoreSingle (\r
- IN CONST XENSTORE_TRANSACTION *Transaction,\r
- IN enum xsd_sockmsg_type RequestType,\r
- IN CONST CHAR8 *Body,\r
- OUT UINT32 *LenPtr OPTIONAL,\r
- OUT VOID **Result OPTIONAL\r
+ IN CONST XENSTORE_TRANSACTION *Transaction,\r
+ IN enum xsd_sockmsg_type RequestType,\r
+ IN CONST CHAR8 *Body,\r
+ OUT UINT32 *LenPtr OPTIONAL,\r
+ OUT VOID **Result OPTIONAL\r
)\r
{\r
- WRITE_REQUEST WriteRequest;\r
-\r
- WriteRequest.Data = (VOID *) Body;\r
- WriteRequest.Len = (UINT32)AsciiStrSize (Body);\r
-\r
- return XenStoreTalkv (Transaction, RequestType, &WriteRequest, 1,\r
- LenPtr, Result);\r
+ WRITE_REQUEST WriteRequest;\r
+\r
+ WriteRequest.Data = (VOID *)Body;\r
+ WriteRequest.Len = (UINT32)AsciiStrSize (Body);\r
+\r
+ return XenStoreTalkv (\r
+ Transaction,\r
+ RequestType,\r
+ &WriteRequest,\r
+ 1,\r
+ LenPtr,\r
+ Result\r
+ );\r
}\r
\r
//\r
STATIC\r
XENSTORE_STATUS\r
XenStoreWatch (\r
- CONST CHAR8 *Path,\r
- CONST CHAR8 *Token\r
+ CONST CHAR8 *Path,\r
+ CONST CHAR8 *Token\r
)\r
{\r
- WRITE_REQUEST WriteRequest[2];\r
+ WRITE_REQUEST WriteRequest[2];\r
\r
- WriteRequest[0].Data = (VOID *) Path;\r
- WriteRequest[0].Len = (UINT32)AsciiStrSize (Path);\r
- WriteRequest[1].Data = (VOID *) Token;\r
- WriteRequest[1].Len = (UINT32)AsciiStrSize (Token);\r
+ WriteRequest[0].Data = (VOID *)Path;\r
+ WriteRequest[0].Len = (UINT32)AsciiStrSize (Path);\r
+ WriteRequest[1].Data = (VOID *)Token;\r
+ WriteRequest[1].Len = (UINT32)AsciiStrSize (Token);\r
\r
return XenStoreTalkv (XST_NIL, XS_WATCH, WriteRequest, 2, NULL, NULL);\r
}\r
STATIC\r
XENSTORE_STATUS\r
XenStoreUnwatch (\r
- CONST CHAR8 *Path,\r
- CONST CHAR8 *Token\r
+ CONST CHAR8 *Path,\r
+ CONST CHAR8 *Token\r
)\r
{\r
- WRITE_REQUEST WriteRequest[2];\r
+ WRITE_REQUEST WriteRequest[2];\r
\r
- WriteRequest[0].Data = (VOID *) Path;\r
- WriteRequest[0].Len = (UINT32)AsciiStrSize (Path);\r
- WriteRequest[1].Data = (VOID *) Token;\r
- WriteRequest[1].Len = (UINT32)AsciiStrSize (Token);\r
+ WriteRequest[0].Data = (VOID *)Path;\r
+ WriteRequest[0].Len = (UINT32)AsciiStrSize (Path);\r
+ WriteRequest[1].Data = (VOID *)Token;\r
+ WriteRequest[1].Len = (UINT32)AsciiStrSize (Token);\r
\r
return XenStoreTalkv (XST_NIL, XS_UNWATCH, WriteRequest, 2, NULL, NULL);\r
}\r
STATIC\r
XENSTORE_STATUS\r
XenStoreWaitWatch (\r
- VOID *Token\r
+ VOID *Token\r
)\r
{\r
- XENSTORE_MESSAGE *Message;\r
- LIST_ENTRY *Entry = NULL;\r
- LIST_ENTRY *Last = NULL;\r
- XENSTORE_STATUS Status;\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
+ (Last == GetFirstNode (&xs.WatchEvents)))\r
+ {\r
EfiReleaseLock (&xs.WatchEventsLock);\r
Status = XenStoreProcessMessage ();\r
- if (Status != XENSTORE_STATUS_SUCCESS && Status != XENSTORE_STATUS_EAGAIN) {\r
+ if ((Status != XENSTORE_STATUS_SUCCESS) && (Status != XENSTORE_STATUS_EAGAIN)) {\r
return Status;\r
}\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
+ Entry = GetNextNode (&xs.WatchEvents, Entry))\r
+ {\r
Message = XENSTORE_MESSAGE_FROM_LINK (Entry);\r
if (Message->u.Watch.Handle == Token) {\r
RemoveEntryList (Entry);\r
EfiReleaseLock (&xs.WatchEventsLock);\r
- FreePool((VOID*)Message->u.Watch.Vector);\r
- FreePool(Message);\r
+ FreePool ((VOID *)Message->u.Watch.Vector);\r
+ FreePool (Message);\r
return XENSTORE_STATUS_SUCCESS;\r
}\r
}\r
+\r
Last = GetFirstNode (&xs.WatchEvents);\r
EfiReleaseLock (&xs.WatchEventsLock);\r
}\r
VOID\r
EFIAPI\r
NotifyEventChannelCheckForEvent (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
)\r
{\r
- XENSTORE_PRIVATE *xsp;\r
+ XENSTORE_PRIVATE *xsp;\r
+\r
xsp = (XENSTORE_PRIVATE *)Context;\r
if (TestAndClearBit (xsp->EventChannel, xsp->Dev->SharedInfo->evtchn_pending)) {\r
gBS->SignalEvent (Event);\r
STATIC\r
EFI_STATUS\r
XenStoreInitComms (\r
- XENSTORE_PRIVATE *xsp\r
+ XENSTORE_PRIVATE *xsp\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_EVENT TimerEvent;\r
- struct xenstore_domain_interface *XenStore = xsp->XenStore;\r
+ EFI_STATUS Status;\r
+ EFI_EVENT TimerEvent;\r
+ struct xenstore_domain_interface *XenStore = xsp->XenStore;\r
\r
Status = gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &TimerEvent);\r
- Status = gBS->SetTimer (TimerEvent, TimerRelative,\r
- EFI_TIMER_PERIOD_SECONDS (5));\r
+ Status = gBS->SetTimer (\r
+ TimerEvent,\r
+ TimerRelative,\r
+ EFI_TIMER_PERIOD_SECONDS (5)\r
+ );\r
while (XenStore->rsp_prod != XenStore->rsp_cons) {\r
Status = gBS->CheckEvent (TimerEvent);\r
if (!EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_WARN, "XENSTORE response ring is not quiescent "\r
- "(%08x:%08x): fixing up\n",\r
- XenStore->rsp_cons, XenStore->rsp_prod));\r
+ DEBUG ((\r
+ DEBUG_WARN,\r
+ "XENSTORE response ring is not quiescent "\r
+ "(%08x:%08x): fixing up\n",\r
+ XenStore->rsp_cons,\r
+ XenStore->rsp_prod\r
+ ));\r
XenStore->rsp_cons = XenStore->rsp_prod;\r
}\r
}\r
+\r
gBS->CloseEvent (TimerEvent);\r
\r
- Status = gBS->CreateEvent (EVT_NOTIFY_WAIT, TPL_NOTIFY,\r
- NotifyEventChannelCheckForEvent, xsp,\r
- &xsp->EventChannelEvent);\r
+ Status = gBS->CreateEvent (\r
+ EVT_NOTIFY_WAIT,\r
+ TPL_NOTIFY,\r
+ NotifyEventChannelCheckForEvent,\r
+ xsp,\r
+ &xsp->EventChannelEvent\r
+ );\r
ASSERT_EFI_ERROR (Status);\r
\r
return Status;\r
**/\r
EFI_STATUS\r
XenStoreInit (\r
- XENBUS_DEVICE *Dev\r
+ XENBUS_DEVICE *Dev\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
+\r
/**\r
* The HVM guest pseudo-physical frame number. This is Xen's mapping\r
* of the true machine frame number into our "physical address space".\r
*/\r
- UINTN XenStoreGpfn;\r
+ UINTN XenStoreGpfn;\r
\r
xs.Dev = Dev;\r
\r
xs.EventChannel = (evtchn_port_t)XenHypercallHvmGetParam (HVM_PARAM_STORE_EVTCHN);\r
- XenStoreGpfn = (UINTN)XenHypercallHvmGetParam (HVM_PARAM_STORE_PFN);\r
- xs.XenStore = (VOID *) (XenStoreGpfn << EFI_PAGE_SHIFT);\r
- DEBUG ((EFI_D_INFO, "XenBusInit: XenBus rings @%p, event channel %x\n",\r
- xs.XenStore, xs.EventChannel));\r
+ XenStoreGpfn = (UINTN)XenHypercallHvmGetParam (HVM_PARAM_STORE_PFN);\r
+ xs.XenStore = (VOID *)(XenStoreGpfn << EFI_PAGE_SHIFT);\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "XenBusInit: XenBus rings @%p, event channel %x\n",\r
+ xs.XenStore,\r
+ xs.EventChannel\r
+ ));\r
\r
InitializeListHead (&xs.ReplyList);\r
InitializeListHead (&xs.WatchEvents);\r
\r
/* Initialize the shared memory rings to talk to xenstored */\r
Status = XenStoreInitComms (&xs);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
\r
return Status;\r
}\r
\r
VOID\r
XenStoreDeinit (\r
- IN XENBUS_DEVICE *Dev\r
+ IN XENBUS_DEVICE *Dev\r
)\r
{\r
//\r
// it is stopped.\r
//\r
if (!IsListEmpty (&xs.RegisteredWatches)) {\r
- XENSTORE_WATCH *Watch;\r
- LIST_ENTRY *Entry;\r
- DEBUG ((EFI_D_WARN, "XenStore: RegisteredWatches is not empty, cleaning up..."));\r
+ XENSTORE_WATCH *Watch;\r
+ LIST_ENTRY *Entry;\r
+ DEBUG ((DEBUG_WARN, "XenStore: RegisteredWatches is not empty, cleaning up..."));\r
Entry = GetFirstNode (&xs.RegisteredWatches);\r
while (!IsNull (&xs.RegisteredWatches, Entry)) {\r
Watch = XENSTORE_WATCH_FROM_LINK (Entry);\r
// having cleanup the list RegisteredWatches.\r
//\r
if (!IsListEmpty (&xs.WatchEvents)) {\r
- LIST_ENTRY *Entry;\r
- DEBUG ((EFI_D_WARN, "XenStore: WatchEvents is not empty, cleaning up..."));\r
+ LIST_ENTRY *Entry;\r
+ DEBUG ((DEBUG_WARN, "XenStore: WatchEvents is not empty, cleaning up..."));\r
Entry = GetFirstNode (&xs.WatchEvents);\r
while (!IsNull (&xs.WatchEvents, Entry)) {\r
- XENSTORE_MESSAGE *Message = XENSTORE_MESSAGE_FROM_LINK (Entry);\r
+ XENSTORE_MESSAGE *Message = XENSTORE_MESSAGE_FROM_LINK (Entry);\r
Entry = GetNextNode (&xs.WatchEvents, Entry);\r
RemoveEntryList (&Message->Link);\r
- FreePool ((VOID*)Message->u.Watch.Vector);\r
+ FreePool ((VOID *)Message->u.Watch.Vector);\r
FreePool (Message);\r
}\r
}\r
\r
if (!IsListEmpty (&xs.ReplyList)) {\r
- XENSTORE_MESSAGE *Message;\r
- LIST_ENTRY *Entry;\r
+ XENSTORE_MESSAGE *Message;\r
+ LIST_ENTRY *Entry;\r
Entry = GetFirstNode (&xs.ReplyList);\r
while (!IsNull (&xs.ReplyList, Entry)) {\r
Message = XENSTORE_MESSAGE_FROM_LINK (Entry);\r
- Entry = GetNextNode (&xs.ReplyList, Entry);\r
+ Entry = GetNextNode (&xs.ReplyList, Entry);\r
RemoveEntryList (&Message->Link);\r
FreePool (Message->u.Reply.Body);\r
FreePool (Message);\r
if (xs.XenStore->server_features & XENSTORE_SERVER_FEATURE_RECONNECTION) {\r
xs.XenStore->connection = XENSTORE_RECONNECT;\r
XenEventChannelNotify (xs.Dev, xs.EventChannel);\r
- while (*(volatile UINT32*)&xs.XenStore->connection == XENSTORE_RECONNECT) {\r
+ while (*(volatile UINT32 *)&xs.XenStore->connection == XENSTORE_RECONNECT) {\r
XenStoreWaitForEvent (xs.EventChannelEvent, EFI_TIMER_PERIOD_MILLISECONDS (100));\r
}\r
} else {\r
xs.XenStore->req_cons = xs.XenStore->req_prod = 0;\r
xs.XenStore->rsp_cons = xs.XenStore->rsp_prod = 0;\r
}\r
+\r
xs.XenStore = NULL;\r
}\r
\r
\r
XENSTORE_STATUS\r
XenStoreListDirectory (\r
- IN CONST XENSTORE_TRANSACTION *Transaction,\r
- IN CONST CHAR8 *DirectoryPath,\r
- IN CONST CHAR8 *Node,\r
- OUT UINT32 *DirectoryCountPtr,\r
- OUT CONST CHAR8 ***DirectoryListPtr\r
+ IN CONST XENSTORE_TRANSACTION *Transaction,\r
+ IN CONST CHAR8 *DirectoryPath,\r
+ IN CONST CHAR8 *Node,\r
+ OUT UINT32 *DirectoryCountPtr,\r
+ OUT CONST CHAR8 ***DirectoryListPtr\r
)\r
{\r
- CHAR8 *Path;\r
- CHAR8 *TempStr;\r
- UINT32 Len = 0;\r
- XENSTORE_STATUS Status;\r
-\r
- Path = XenStoreJoin (DirectoryPath, Node);\r
- Status = XenStoreSingle (Transaction, XS_DIRECTORY, Path, &Len,\r
- (VOID **) &TempStr);\r
+ CHAR8 *Path;\r
+ CHAR8 *TempStr;\r
+ UINT32 Len = 0;\r
+ XENSTORE_STATUS Status;\r
+\r
+ Path = XenStoreJoin (DirectoryPath, Node);\r
+ Status = XenStoreSingle (\r
+ Transaction,\r
+ XS_DIRECTORY,\r
+ Path,\r
+ &Len,\r
+ (VOID **)&TempStr\r
+ );\r
FreePool (Path);\r
if (Status != XENSTORE_STATUS_SUCCESS) {\r
return Status;\r
\r
BOOLEAN\r
XenStorePathExists (\r
- IN CONST XENSTORE_TRANSACTION *Transaction,\r
- IN CONST CHAR8 *Directory,\r
- IN CONST CHAR8 *Node\r
+ IN CONST XENSTORE_TRANSACTION *Transaction,\r
+ IN CONST CHAR8 *Directory,\r
+ IN CONST CHAR8 *Node\r
)\r
{\r
- CONST CHAR8 **TempStr;\r
- XENSTORE_STATUS Status;\r
- UINT32 TempNum;\r
-\r
- Status = XenStoreListDirectory (Transaction, Directory, Node,\r
- &TempNum, &TempStr);\r
+ CONST CHAR8 **TempStr;\r
+ XENSTORE_STATUS Status;\r
+ UINT32 TempNum;\r
+\r
+ Status = XenStoreListDirectory (\r
+ Transaction,\r
+ Directory,\r
+ Node,\r
+ &TempNum,\r
+ &TempStr\r
+ );\r
if (Status != XENSTORE_STATUS_SUCCESS) {\r
return FALSE;\r
}\r
- FreePool ((VOID*)TempStr);\r
+\r
+ FreePool ((VOID *)TempStr);\r
return TRUE;\r
}\r
\r
XENSTORE_STATUS\r
XenStoreRead (\r
- IN CONST XENSTORE_TRANSACTION *Transaction,\r
- IN CONST CHAR8 *DirectoryPath,\r
- IN CONST CHAR8 *Node,\r
- OUT UINT32 *LenPtr OPTIONAL,\r
- OUT VOID **Result\r
+ IN CONST XENSTORE_TRANSACTION *Transaction,\r
+ IN CONST CHAR8 *DirectoryPath,\r
+ IN CONST CHAR8 *Node,\r
+ OUT UINT32 *LenPtr OPTIONAL,\r
+ OUT VOID **Result\r
)\r
{\r
- CHAR8 *Path;\r
- VOID *Value;\r
- XENSTORE_STATUS Status;\r
+ CHAR8 *Path;\r
+ VOID *Value;\r
+ XENSTORE_STATUS Status;\r
\r
- Path = XenStoreJoin (DirectoryPath, Node);\r
+ Path = XenStoreJoin (DirectoryPath, Node);\r
Status = XenStoreSingle (Transaction, XS_READ, Path, LenPtr, &Value);\r
FreePool (Path);\r
if (Status != XENSTORE_STATUS_SUCCESS) {\r
\r
XENSTORE_STATUS\r
XenStoreWrite (\r
- IN CONST XENSTORE_TRANSACTION *Transaction,\r
- IN CONST CHAR8 *DirectoryPath,\r
- IN CONST CHAR8 *Node,\r
- IN CONST CHAR8 *Str\r
+ IN CONST XENSTORE_TRANSACTION *Transaction,\r
+ IN CONST CHAR8 *DirectoryPath,\r
+ IN CONST CHAR8 *Node,\r
+ IN CONST CHAR8 *Str\r
)\r
{\r
- CHAR8 *Path;\r
- WRITE_REQUEST WriteRequest[2];\r
- XENSTORE_STATUS Status;\r
+ CHAR8 *Path;\r
+ WRITE_REQUEST WriteRequest[2];\r
+ XENSTORE_STATUS Status;\r
\r
Path = XenStoreJoin (DirectoryPath, Node);\r
\r
- WriteRequest[0].Data = (VOID *) Path;\r
- WriteRequest[0].Len = (UINT32)AsciiStrSize (Path);\r
- WriteRequest[1].Data = (VOID *) Str;\r
- WriteRequest[1].Len = (UINT32)AsciiStrLen (Str);\r
+ WriteRequest[0].Data = (VOID *)Path;\r
+ WriteRequest[0].Len = (UINT32)AsciiStrSize (Path);\r
+ WriteRequest[1].Data = (VOID *)Str;\r
+ WriteRequest[1].Len = (UINT32)AsciiStrLen (Str);\r
\r
Status = XenStoreTalkv (Transaction, XS_WRITE, WriteRequest, 2, NULL, NULL);\r
FreePool (Path);\r
\r
XENSTORE_STATUS\r
XenStoreRemove (\r
- IN CONST XENSTORE_TRANSACTION *Transaction,\r
- IN CONST CHAR8 *DirectoryPath,\r
- IN CONST CHAR8 *Node\r
+ IN CONST XENSTORE_TRANSACTION *Transaction,\r
+ IN CONST CHAR8 *DirectoryPath,\r
+ IN CONST CHAR8 *Node\r
)\r
{\r
- CHAR8 *Path;\r
- XENSTORE_STATUS Status;\r
+ CHAR8 *Path;\r
+ XENSTORE_STATUS Status;\r
\r
- Path = XenStoreJoin (DirectoryPath, Node);\r
+ Path = XenStoreJoin (DirectoryPath, Node);\r
Status = XenStoreSingle (Transaction, XS_RM, Path, NULL, NULL);\r
FreePool (Path);\r
\r
OUT XENSTORE_TRANSACTION *Transaction\r
)\r
{\r
- CHAR8 *IdStr;\r
- XENSTORE_STATUS Status;\r
-\r
- Status = XenStoreSingle (XST_NIL, XS_TRANSACTION_START, "", NULL,\r
- (VOID **) &IdStr);\r
+ CHAR8 *IdStr;\r
+ XENSTORE_STATUS Status;\r
+\r
+ Status = XenStoreSingle (\r
+ XST_NIL,\r
+ XS_TRANSACTION_START,\r
+ "",\r
+ NULL,\r
+ (VOID **)&IdStr\r
+ );\r
if (Status == XENSTORE_STATUS_SUCCESS) {\r
Transaction->Id = (UINT32)AsciiStrDecimalToUintn (IdStr);\r
FreePool (IdStr);\r
\r
XENSTORE_STATUS\r
XenStoreTransactionEnd (\r
- IN CONST XENSTORE_TRANSACTION *Transaction,\r
- IN BOOLEAN Abort\r
+ IN CONST XENSTORE_TRANSACTION *Transaction,\r
+ IN BOOLEAN Abort\r
)\r
{\r
- CHAR8 AbortStr[2];\r
+ CHAR8 AbortStr[2];\r
\r
- if (Abort) {\r
- AsciiStrCpy (AbortStr, "F");\r
- } else {\r
- AsciiStrCpy (AbortStr, "T");\r
- }\r
+ AbortStr[0] = Abort ? 'F' : 'T';\r
+ AbortStr[1] = '\0';\r
\r
return XenStoreSingle (Transaction, XS_TRANSACTION_END, AbortStr, NULL, NULL);\r
}\r
\r
XENSTORE_STATUS\r
+EFIAPI\r
XenStoreVSPrint (\r
- IN CONST XENSTORE_TRANSACTION *Transaction,\r
- IN CONST CHAR8 *DirectoryPath,\r
- IN CONST CHAR8 *Node,\r
- IN CONST CHAR8 *FormatString,\r
- IN VA_LIST Marker\r
+ IN CONST XENSTORE_TRANSACTION *Transaction,\r
+ IN CONST CHAR8 *DirectoryPath,\r
+ IN CONST CHAR8 *Node,\r
+ IN CONST CHAR8 *FormatString,\r
+ IN VA_LIST Marker\r
)\r
{\r
- CHAR8 *Buf;\r
- XENSTORE_STATUS Status;\r
- UINTN BufSize;\r
-\r
- BufSize = SPrintLengthAsciiFormat (FormatString, Marker) + 1;\r
+ CHAR8 *Buf;\r
+ XENSTORE_STATUS Status;\r
+ UINTN BufSize;\r
+ VA_LIST Marker2;\r
+\r
+ VA_COPY (Marker2, Marker);\r
+ BufSize = SPrintLengthAsciiFormat (FormatString, Marker2) + 1;\r
+ VA_END (Marker2);\r
Buf = AllocateZeroPool (BufSize);\r
AsciiVSPrint (Buf, BufSize, FormatString, Marker);\r
Status = XenStoreWrite (Transaction, DirectoryPath, Node, Buf);\r
XENSTORE_STATUS\r
EFIAPI\r
XenStoreSPrint (\r
- IN CONST XENSTORE_TRANSACTION *Transaction,\r
- IN CONST CHAR8 *DirectoryPath,\r
- IN CONST CHAR8 *Node,\r
- IN CONST CHAR8 *FormatString,\r
+ IN CONST 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
+ VA_LIST Marker;\r
+ XENSTORE_STATUS Status;\r
\r
VA_START (Marker, FormatString);\r
Status = XenStoreVSPrint (Transaction, DirectoryPath, Node, FormatString, Marker);\r
)\r
{\r
/* Pointer in ascii is the token. */\r
- CHAR8 Token[sizeof (XENSTORE_WATCH) * 2 + 1];\r
- XENSTORE_STATUS Status;\r
- XENSTORE_WATCH *Watch;\r
+ CHAR8 Token[sizeof (XENSTORE_WATCH) * 2 + 1];\r
+ XENSTORE_STATUS Status;\r
+ XENSTORE_WATCH *Watch;\r
\r
- Watch = AllocateZeroPool (sizeof (XENSTORE_WATCH));\r
+ Watch = AllocateZeroPool (sizeof (XENSTORE_WATCH));\r
Watch->Signature = XENSTORE_WATCH_SIGNATURE;\r
- Watch->Node = XenStoreJoin (DirectoryPath, Node);\r
+ Watch->Node = XenStoreJoin (DirectoryPath, Node);\r
\r
EfiAcquireLock (&xs.RegisteredWatchesLock);\r
InsertTailList (&xs.RegisteredWatches, &Watch->Link);\r
EfiReleaseLock (&xs.RegisteredWatchesLock);\r
\r
- AsciiSPrint (Token, sizeof (Token), "%p", (VOID*) Watch);\r
+ AsciiSPrint (Token, sizeof (Token), "%p", (VOID *)Watch);\r
Status = XenStoreWatch (Watch->Node, Token);\r
\r
/* Ignore errors due to multiple registration. */\r
\r
VOID\r
XenStoreUnregisterWatch (\r
- IN XENSTORE_WATCH *Watch\r
+ IN XENSTORE_WATCH *Watch\r
)\r
{\r
- CHAR8 Token[sizeof (Watch) * 2 + 1];\r
- LIST_ENTRY *Entry;\r
+ CHAR8 Token[sizeof (Watch) * 2 + 1];\r
+ LIST_ENTRY *Entry;\r
\r
ASSERT (Watch->Signature == XENSTORE_WATCH_SIGNATURE);\r
\r
- AsciiSPrint (Token, sizeof (Token), "%p", (VOID *) Watch);\r
+ AsciiSPrint (Token, sizeof (Token), "%p", (VOID *)Watch);\r
if (XenStoreFindWatch (Token) == NULL) {\r
return;\r
}\r
EfiAcquireLock (&xs.WatchEventsLock);\r
Entry = GetFirstNode (&xs.WatchEvents);\r
while (!IsNull (&xs.WatchEvents, Entry)) {\r
- XENSTORE_MESSAGE *Message = XENSTORE_MESSAGE_FROM_LINK (Entry);\r
+ XENSTORE_MESSAGE *Message = XENSTORE_MESSAGE_FROM_LINK (Entry);\r
Entry = GetNextNode (&xs.WatchEvents, Entry);\r
if (Message->u.Watch.Handle == Watch) {\r
RemoveEntryList (&Message->Link);\r
- FreePool ((VOID*)Message->u.Watch.Vector);\r
+ FreePool ((VOID *)Message->u.Watch.Vector);\r
FreePool (Message);\r
}\r
}\r
+\r
EfiReleaseLock (&xs.WatchEventsLock);\r
\r
FreePool (Watch->Node);\r
FreePool (Watch);\r
}\r
\r
-\r
//\r
// XENBUS protocol\r
//\r
XENSTORE_STATUS\r
EFIAPI\r
XenBusWaitForWatch (\r
- IN XENBUS_PROTOCOL *This,\r
- IN VOID *Token\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN VOID *Token\r
)\r
{\r
return XenStoreWaitWatch (Token);\r
XENSTORE_STATUS\r
EFIAPI\r
XenBusXenStoreRead (\r
- IN XENBUS_PROTOCOL *This,\r
- IN CONST XENSTORE_TRANSACTION *Transaction,\r
- IN CONST CHAR8 *Node,\r
- OUT VOID **Value\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN CONST XENSTORE_TRANSACTION *Transaction,\r
+ IN CONST CHAR8 *Node,\r
+ OUT VOID **Value\r
)\r
{\r
return XenStoreRead (Transaction, This->Node, Node, NULL, Value);\r
XENSTORE_STATUS\r
EFIAPI\r
XenBusXenStoreBackendRead (\r
- IN XENBUS_PROTOCOL *This,\r
- IN CONST XENSTORE_TRANSACTION *Transaction,\r
- IN CONST CHAR8 *Node,\r
- OUT VOID **Value\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN CONST XENSTORE_TRANSACTION *Transaction,\r
+ IN CONST CHAR8 *Node,\r
+ OUT VOID **Value\r
)\r
{\r
return XenStoreRead (Transaction, This->Backend, Node, NULL, Value);\r
XENSTORE_STATUS\r
EFIAPI\r
XenBusXenStoreRemove (\r
- IN XENBUS_PROTOCOL *This,\r
- IN CONST XENSTORE_TRANSACTION *Transaction,\r
- IN const char *Node\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN CONST XENSTORE_TRANSACTION *Transaction,\r
+ IN const char *Node\r
)\r
{\r
return XenStoreRemove (Transaction, This->Node, Node);\r
XENSTORE_STATUS\r
EFIAPI\r
XenBusXenStoreTransactionEnd (\r
- IN XENBUS_PROTOCOL *This,\r
- IN CONST XENSTORE_TRANSACTION *Transaction,\r
- IN BOOLEAN Abort\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN CONST XENSTORE_TRANSACTION *Transaction,\r
+ IN BOOLEAN Abort\r
)\r
{\r
return XenStoreTransactionEnd (Transaction, Abort);\r
XENSTORE_STATUS\r
EFIAPI\r
XenBusXenStoreSPrint (\r
- IN XENBUS_PROTOCOL *This,\r
- IN CONST XENSTORE_TRANSACTION *Transaction,\r
- IN CONST CHAR8 *DirectoryPath,\r
- IN CONST CHAR8 *Node,\r
- IN CONST CHAR8 *FormatString,\r
+ IN XENBUS_PROTOCOL *This,\r
+ IN CONST 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
+ VA_LIST Marker;\r
+ XENSTORE_STATUS Status;\r
\r
VA_START (Marker, FormatString);\r
Status = XenStoreVSPrint (Transaction, DirectoryPath, Node, FormatString, Marker);\r
XENSTORE_STATUS\r
EFIAPI\r
XenBusRegisterWatch (\r
- IN XENBUS_PROTOCOL *This,\r
- IN CONST CHAR8 *Node,\r
- OUT VOID **Token\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
+ 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
+ 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
+ return XenStoreRegisterWatch (This->Backend, Node, (XENSTORE_WATCH **)Token);\r
}\r
\r
VOID\r
IN VOID *Token\r
)\r
{\r
- XenStoreUnregisterWatch ((XENSTORE_WATCH *) Token);\r
+ XenStoreUnregisterWatch ((XENSTORE_WATCH *)Token);\r
}\r