[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] Update EVTCHN, GNTTAB and STORE interface headers
Updates revision to 09000004 Fixes Evtchn Unmask calls Updates xenbus interface headers to latest versions This will resolve an issue where, under certain timing conditions, xenvbd will request a second reboot before functioning correctly. Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- include/evtchn_interface.h | 128 +++++++++++++++++++++++++++++++++------------ include/gnttab_interface.h | 92 +++++++++++++++++++++++++++++++- include/store_interface.h | 68 ++++++++++++++++++++++-- src/xenvbd.inf | 6 +-- src/xenvbd/ring.c | 6 ++- 5 files changed, 257 insertions(+), 43 deletions(-) diff --git a/include/evtchn_interface.h b/include/evtchn_interface.h index 6f8fe42..068a697 100644 --- a/include/evtchn_interface.h +++ b/include/evtchn_interface.h @@ -112,13 +112,6 @@ typedef PXENBUS_EVTCHN_CHANNEL ... ); -typedef NTSTATUS -(*XENBUS_EVTCHN_BIND_V2)( - IN PINTERFACE Interface, - IN PXENBUS_EVTCHN_CHANNEL Channel, - IN ULONG Cpu - ); - /*! \typedef XENBUS_EVTCHN_BIND \brief Bind an event channel to a specific CPU @@ -135,8 +128,8 @@ typedef NTSTATUS IN UCHAR Number ); -typedef BOOLEAN -(*XENBUS_EVTCHN_UNMASK_V1)( +typedef VOID +(*XENBUS_EVTCHN_UNMASK_V4)( IN PINTERFACE Interface, IN PXENBUS_EVTCHN_CHANNEL Channel, IN BOOLEAN InCallback @@ -148,17 +141,28 @@ typedef BOOLEAN \param Interface The interface header \param Channel The channel handle \param InCallback Set to TRUE if this method is invoked in context of the channel callback + \param Force Set to TRUE if the unmask must succeed, otherwise set to FALSE and the function will return FALSE if the unmask did not complete. */ -typedef VOID +typedef BOOLEAN (*XENBUS_EVTCHN_UNMASK)( IN PINTERFACE Interface, IN PXENBUS_EVTCHN_CHANNEL Channel, - IN BOOLEAN InCallback + IN BOOLEAN InCallback, + IN BOOLEAN Force + ); + +typedef VOID +(*XENBUS_EVTCHN_SEND_V1)( + IN PINTERFACE Interface, + IN PXENBUS_EVTCHN_CHANNEL Channel ); /*! \typedef XENBUS_EVTCHN_SEND \brief Send an event to the remote end of the channel + It is assumed that the domain cannot suspend during this call so + IRQL must be >= DISPATCH_LEVEL. + \param Interface The interface header \param Channel The channel handle */ @@ -180,6 +184,42 @@ typedef VOID IN PXENBUS_EVTCHN_CHANNEL Channel ); +/*! \typedef XENBUS_EVTCHN_GET_COUNT + \brief Get the number of events received by the channel since it was opened + + \param Interface The interface header + \param Channel The channel handle + \return The number of events +*/ +typedef ULONG +(*XENBUS_EVTCHN_GET_COUNT)( + IN PINTERFACE Interface, + IN PXENBUS_EVTCHN_CHANNEL Channel + ); + +typedef NTSTATUS +(*XENBUS_EVTCHN_WAIT_V5)( + IN PINTERFACE Interface, + IN PXENBUS_EVTCHN_CHANNEL Channel, + IN PLARGE_INTEGER Timeout OPTIONAL + ); + +/*! \typedef XENBUS_EVTCHN_WAIT + \brief Wait for events to the local end of the channel + + \param Interface The interface header + \param Channel The channel handle + \param Count The event count to wait for + \param Timeout An optional timeout value (similar to KeWaitForSingleObject(), but non-zero values are allowed at DISPATCH_LEVEL). +*/ +typedef NTSTATUS +(*XENBUS_EVTCHN_WAIT)( + IN PINTERFACE Interface, + IN PXENBUS_EVTCHN_CHANNEL Channel, + IN ULONG Count, + IN PLARGE_INTEGER Timeout OPTIONAL + ); + /*! \typedef XENBUS_EVTCHN_GET_PORT \brief Get the local port number bound to the channel @@ -209,61 +249,83 @@ typedef VOID DEFINE_GUID(GUID_XENBUS_EVTCHN_INTERFACE, 0xbe2440ac, 0x1098, 0x4150, 0xaf, 0x4d, 0x45, 0x2f, 0xad, 0xce, 0xf9, 0x23); -/*! \struct _XENBUS_EVTCHN_INTERFACE_V1 - \brief EVTCHN interface version 1 +/*! \struct _XENBUS_EVTCHN_INTERFACE_V4 + \brief EVTCHN interface version 4 \ingroup interfaces */ -struct _XENBUS_EVTCHN_INTERFACE_V1 { +struct _XENBUS_EVTCHN_INTERFACE_V4 { INTERFACE Interface; XENBUS_EVTCHN_ACQUIRE EvtchnAcquire; XENBUS_EVTCHN_RELEASE EvtchnRelease; XENBUS_EVTCHN_OPEN EvtchnOpen; - XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1; - XENBUS_EVTCHN_SEND EvtchnSend; + XENBUS_EVTCHN_BIND EvtchnBind; + XENBUS_EVTCHN_UNMASK_V4 EvtchnUnmaskVersion4; + XENBUS_EVTCHN_SEND_V1 EvtchnSendVersion1; XENBUS_EVTCHN_TRIGGER EvtchnTrigger; XENBUS_EVTCHN_GET_PORT EvtchnGetPort; XENBUS_EVTCHN_CLOSE EvtchnClose; }; -/*! \struct _XENBUS_EVTCHN_INTERFACE_V2 - \brief EVTCHN interface version 2 +/*! \struct _XENBUS_EVTCHN_INTERFACE_V5 + \brief EVTCHN interface version 5 \ingroup interfaces */ -struct _XENBUS_EVTCHN_INTERFACE_V2 { +struct _XENBUS_EVTCHN_INTERFACE_V5 { INTERFACE Interface; XENBUS_EVTCHN_ACQUIRE EvtchnAcquire; XENBUS_EVTCHN_RELEASE EvtchnRelease; XENBUS_EVTCHN_OPEN EvtchnOpen; - XENBUS_EVTCHN_BIND_V2 EvtchnBindVersion2; - XENBUS_EVTCHN_UNMASK_V1 EvtchnUnmaskVersion1; + XENBUS_EVTCHN_BIND EvtchnBind; + XENBUS_EVTCHN_UNMASK_V4 EvtchnUnmaskVersion4; + XENBUS_EVTCHN_SEND_V1 EvtchnSendVersion1; + XENBUS_EVTCHN_TRIGGER EvtchnTrigger; + XENBUS_EVTCHN_WAIT_V5 EvtchnWaitVersion5; + XENBUS_EVTCHN_GET_PORT EvtchnGetPort; + XENBUS_EVTCHN_CLOSE EvtchnClose; +}; + +/*! \struct _XENBUS_EVTCHN_INTERFACE_V6 + \brief EVTCHN interface version 6 + \ingroup interfaces +*/ +struct _XENBUS_EVTCHN_INTERFACE_V6 { + INTERFACE Interface; + XENBUS_EVTCHN_ACQUIRE EvtchnAcquire; + XENBUS_EVTCHN_RELEASE EvtchnRelease; + XENBUS_EVTCHN_OPEN EvtchnOpen; + XENBUS_EVTCHN_BIND EvtchnBind; + XENBUS_EVTCHN_UNMASK_V4 EvtchnUnmaskVersion4; XENBUS_EVTCHN_SEND EvtchnSend; XENBUS_EVTCHN_TRIGGER EvtchnTrigger; + XENBUS_EVTCHN_WAIT_V5 EvtchnWaitVersion5; XENBUS_EVTCHN_GET_PORT EvtchnGetPort; XENBUS_EVTCHN_CLOSE EvtchnClose; }; -/*! \struct _XENBUS_EVTCHN_INTERFACE_V3 - \brief EVTCHN interface version 3 +/*! \struct _XENBUS_EVTCHN_INTERFACE_V7 + \brief EVTCHN interface version 7 \ingroup interfaces */ -struct _XENBUS_EVTCHN_INTERFACE_V3 { +struct _XENBUS_EVTCHN_INTERFACE_V7 { INTERFACE Interface; XENBUS_EVTCHN_ACQUIRE EvtchnAcquire; XENBUS_EVTCHN_RELEASE EvtchnRelease; XENBUS_EVTCHN_OPEN EvtchnOpen; - XENBUS_EVTCHN_BIND_V2 EvtchnBindVersion2; - XENBUS_EVTCHN_UNMASK EvtchnUnmask; + XENBUS_EVTCHN_BIND EvtchnBind; + XENBUS_EVTCHN_UNMASK_V4 EvtchnUnmaskVersion4; XENBUS_EVTCHN_SEND EvtchnSend; XENBUS_EVTCHN_TRIGGER EvtchnTrigger; + XENBUS_EVTCHN_GET_COUNT EvtchnGetCount; + XENBUS_EVTCHN_WAIT EvtchnWait; XENBUS_EVTCHN_GET_PORT EvtchnGetPort; XENBUS_EVTCHN_CLOSE EvtchnClose; }; -/*! \struct _XENBUS_EVTCHN_INTERFACE_V4 - \brief EVTCHN interface version 4 +/*! \struct _XENBUS_EVTCHN_INTERFACE_V8 + \brief EVTCHN interface version 8 \ingroup interfaces */ -struct _XENBUS_EVTCHN_INTERFACE_V4 { +struct _XENBUS_EVTCHN_INTERFACE_V8 { INTERFACE Interface; XENBUS_EVTCHN_ACQUIRE EvtchnAcquire; XENBUS_EVTCHN_RELEASE EvtchnRelease; @@ -272,11 +334,13 @@ struct _XENBUS_EVTCHN_INTERFACE_V4 { XENBUS_EVTCHN_UNMASK EvtchnUnmask; XENBUS_EVTCHN_SEND EvtchnSend; XENBUS_EVTCHN_TRIGGER EvtchnTrigger; + XENBUS_EVTCHN_GET_COUNT EvtchnGetCount; + XENBUS_EVTCHN_WAIT EvtchnWait; XENBUS_EVTCHN_GET_PORT EvtchnGetPort; XENBUS_EVTCHN_CLOSE EvtchnClose; }; -typedef struct _XENBUS_EVTCHN_INTERFACE_V4 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE; +typedef struct _XENBUS_EVTCHN_INTERFACE_V8 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVTCHN_INTERFACE; /*! \def XENBUS_EVTCHN \brief Macro at assist in method invocation @@ -286,8 +350,8 @@ typedef struct _XENBUS_EVTCHN_INTERFACE_V4 XENBUS_EVTCHN_INTERFACE, *PXENBUS_EVT #endif // _WINDLL -#define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 1 -#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 4 +#define XENBUS_EVTCHN_INTERFACE_VERSION_MIN 4 +#define XENBUS_EVTCHN_INTERFACE_VERSION_MAX 8 #endif // _XENBUS_EVTCHN_INTERFACE_H diff --git a/include/gnttab_interface.h b/include/gnttab_interface.h index d29440a..61272ab 100644 --- a/include/gnttab_interface.h +++ b/include/gnttab_interface.h @@ -148,6 +148,26 @@ typedef ULONG IN PXENBUS_GNTTAB_ENTRY Entry ); +/*! \typedef XENBUS_GNTTAB_QUERY_REFERENCE + \brief Get the reference number of the entry + + \param Interface The interface header + \param Reference The reference number + \param Pfn An optional pointer to receive the value of the reference frame number + \param ReadOnly An optional pointer to receive the boolean value of the read-only flag +*/ +typedef NTSTATUS +(*XENBUS_GNTTAB_QUERY_REFERENCE)( + IN PINTERFACE Interface, + IN ULONG Reference, + OUT PPFN_NUMBER Pfn OPTIONAL, + OUT PBOOLEAN ReadOnly OPTIONAL + ); + +#define XENBUS_GNTTAB_CONSOLE_REFERENCE 0 +#define XENBUS_GNTTAB_STORE_REFERENCE 1 + + /*! \typedef XENBUS_GNTTAB_DESTROY_CACHE \brief Destroy a cache of grant table entries @@ -163,6 +183,39 @@ typedef VOID IN PXENBUS_GNTTAB_CACHE Cache ); +/*! \typedef XENBUS_GNTTAB_MAP_FOREIGN_PAGES + \brief Map foreign memory pages into the system address space + + \param Interface The interface header + \param Domain The domid of the foreign domain that granted the pages + \param NumberPages Number of pages to map + \param References Array of grant reference numbers shared by the foreign domain + \param ReadOnly If TRUE, pages are mapped with read-only access + \param Address The physical address that the foreign pages are mapped under +*/ + +typedef NTSTATUS +(*XENBUS_GNTTAB_MAP_FOREIGN_PAGES)( + IN PINTERFACE Interface, + IN USHORT Domain, + IN ULONG NumberPages, + IN PULONG References, + IN BOOLEAN ReadOnly, + OUT PHYSICAL_ADDRESS *Address + ); + +/*! \typedef XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES + \brief Unmap foreign memory pages from the system address space + + \param Interface The interface header + \param Address The physical address that the foreign pages are mapped under +*/ +typedef NTSTATUS +(*XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES)( + IN PINTERFACE Interface, + IN PHYSICAL_ADDRESS Address + ); + // {763679C5-E5C2-4A6D-8B88-6BB02EC42D8E} DEFINE_GUID(GUID_XENBUS_GNTTAB_INTERFACE, 0x763679c5, 0xe5c2, 0x4a6d, 0x8b, 0x88, 0x6b, 0xb0, 0x2e, 0xc4, 0x2d, 0x8e); @@ -182,7 +235,42 @@ struct _XENBUS_GNTTAB_INTERFACE_V1 { XENBUS_GNTTAB_DESTROY_CACHE GnttabDestroyCache; }; -typedef struct _XENBUS_GNTTAB_INTERFACE_V1 XENBUS_GNTTAB_INTERFACE, *PXENBUS_GNTTAB_INTERFACE; +/*! \struct _XENBUS_GNTTAB_INTERFACE_V2 + \brief GNTTAB interface version 2 + \ingroup interfaces +*/ +struct _XENBUS_GNTTAB_INTERFACE_V2 { + INTERFACE Interface; + XENBUS_GNTTAB_ACQUIRE GnttabAcquire; + XENBUS_GNTTAB_RELEASE GnttabRelease; + XENBUS_GNTTAB_CREATE_CACHE GnttabCreateCache; + XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess; + XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS GnttabRevokeForeignAccess; + XENBUS_GNTTAB_GET_REFERENCE GnttabGetReference; + XENBUS_GNTTAB_DESTROY_CACHE GnttabDestroyCache; + XENBUS_GNTTAB_MAP_FOREIGN_PAGES GnttabMapForeignPages; + XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES GnttabUnmapForeignPages; +}; + +/*! \struct _XENBUS_GNTTAB_INTERFACE_V3 + \brief GNTTAB interface version 3 + \ingroup interfaces +*/ +struct _XENBUS_GNTTAB_INTERFACE_V3 { + INTERFACE Interface; + XENBUS_GNTTAB_ACQUIRE GnttabAcquire; + XENBUS_GNTTAB_RELEASE GnttabRelease; + XENBUS_GNTTAB_CREATE_CACHE GnttabCreateCache; + XENBUS_GNTTAB_PERMIT_FOREIGN_ACCESS GnttabPermitForeignAccess; + XENBUS_GNTTAB_REVOKE_FOREIGN_ACCESS GnttabRevokeForeignAccess; + XENBUS_GNTTAB_GET_REFERENCE GnttabGetReference; + XENBUS_GNTTAB_QUERY_REFERENCE GnttabQueryReference; + XENBUS_GNTTAB_DESTROY_CACHE GnttabDestroyCache; + XENBUS_GNTTAB_MAP_FOREIGN_PAGES GnttabMapForeignPages; + XENBUS_GNTTAB_UNMAP_FOREIGN_PAGES GnttabUnmapForeignPages; +}; + +typedef struct _XENBUS_GNTTAB_INTERFACE_V3 XENBUS_GNTTAB_INTERFACE, *PXENBUS_GNTTAB_INTERFACE; /*! \def XENBUS_GNTTAB \brief Macro at assist in method invocation @@ -193,7 +281,7 @@ typedef struct _XENBUS_GNTTAB_INTERFACE_V1 XENBUS_GNTTAB_INTERFACE, *PXENBUS_GNT #endif // _WINDLL #define XENBUS_GNTTAB_INTERFACE_VERSION_MIN 1 -#define XENBUS_GNTTAB_INTERFACE_VERSION_MAX 1 +#define XENBUS_GNTTAB_INTERFACE_VERSION_MAX 3 #endif // _XENBUS_GNTTAB_INTERFACE_H diff --git a/include/store_interface.h b/include/store_interface.h index 5bcbba3..52f1a1d 100644 --- a/include/store_interface.h +++ b/include/store_interface.h @@ -50,6 +50,23 @@ typedef struct _XENBUS_STORE_TRANSACTION XENBUS_STORE_TRANSACTION, *PXENBUS_S */ typedef struct _XENBUS_STORE_WATCH XENBUS_STORE_WATCH, *PXENBUS_STORE_WATCH; +/*! \typedef XENBUS_STORE_PERMISSION_MASK + \brief Bitmask of XenStore key permissions +*/ +typedef enum _XENBUS_STORE_PERMISSION_MASK { + XENBUS_STORE_PERM_NONE = 0, + XENBUS_STORE_PERM_READ = 1, + XENBUS_STORE_PERM_WRITE = 2, +} XENBUS_STORE_PERMISSION_MASK; + +/*! \typedef XENBUS_STORE_PERMISSION + \brief XenStore key permissions entry for a single domain +*/ +typedef struct _XENBUS_STORE_PERMISSION { + USHORT Domain; + XENBUS_STORE_PERMISSION_MASK Mask; +} XENBUS_STORE_PERMISSION, *PXENBUS_STORE_PERMISSION; + /*! \typedef XENBUS_STORE_ACQUIRE \brief Acquire a reference to the STORE interface @@ -247,10 +264,36 @@ typedef VOID IN PINTERFACE Interface ); +/*! \typedef XENBUS_STORE_PERMISSIONS_SET + \brief Set permissions for a XenStore key + + \param Interface The interface header + \param Transaction The transaction handle (NULL if this is not + part of a transaction) + \param Prefix An optional prefix for the \a Node + \param Node The concatenation of the \a Prefix and this value specifies + the XenStore key to set permissions of + \param Permissions An array of permissions to set + \param NumberPermissions Number of elements in the \a Permissions array +*/ +typedef NTSTATUS +(*XENBUS_STORE_PERMISSIONS_SET)( + IN PINTERFACE Interface, + IN PXENBUS_STORE_TRANSACTION Transaction OPTIONAL, + IN PCHAR Prefix OPTIONAL, + IN PCHAR Node, + IN PXENBUS_STORE_PERMISSION Permissions, + IN ULONG NumberPermissions + ); + // {86824C3B-D34E-4753-B281-2F1E3AD214D7} DEFINE_GUID(GUID_XENBUS_STORE_INTERFACE, 0x86824c3b, 0xd34e, 0x4753, 0xb2, 0x81, 0x2f, 0x1e, 0x3a, 0xd2, 0x14, 0xd7); +/*! \struct _XENBUS_STORE_INTERFACE_V1 + \brief STORE interface version 1 + \ingroup interfaces +*/ struct _XENBUS_STORE_INTERFACE_V1 { INTERFACE Interface; XENBUS_STORE_ACQUIRE StoreAcquire; @@ -267,11 +310,28 @@ struct _XENBUS_STORE_INTERFACE_V1 { XENBUS_STORE_POLL StorePoll; }; -/*! \struct _XENBUS_STORE_INTERFACE_V1 - \brief STORE interface version 1 +/*! \struct _XENBUS_STORE_INTERFACE_V2 + \brief STORE interface version 2 \ingroup interfaces */ -typedef struct _XENBUS_STORE_INTERFACE_V1 XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE; +struct _XENBUS_STORE_INTERFACE_V2 { + INTERFACE Interface; + XENBUS_STORE_ACQUIRE StoreAcquire; + XENBUS_STORE_RELEASE StoreRelease; + XENBUS_STORE_FREE StoreFree; + XENBUS_STORE_READ StoreRead; + XENBUS_STORE_PRINTF StorePrintf; + XENBUS_STORE_PERMISSIONS_SET StorePermissionsSet; + XENBUS_STORE_REMOVE StoreRemove; + XENBUS_STORE_DIRECTORY StoreDirectory; + XENBUS_STORE_TRANSACTION_START StoreTransactionStart; + XENBUS_STORE_TRANSACTION_END StoreTransactionEnd; + XENBUS_STORE_WATCH_ADD StoreWatchAdd; + XENBUS_STORE_WATCH_REMOVE StoreWatchRemove; + XENBUS_STORE_POLL StorePoll; +}; + +typedef struct _XENBUS_STORE_INTERFACE_V2 XENBUS_STORE_INTERFACE, *PXENBUS_STORE_INTERFACE; /*! \def XENBUS_STORE \brief Macro at assist in method invocation @@ -282,7 +342,7 @@ typedef struct _XENBUS_STORE_INTERFACE_V1 XENBUS_STORE_INTERFACE, *PXENBUS_STORE #endif // _WINDLL #define XENBUS_STORE_INTERFACE_VERSION_MIN 1 -#define XENBUS_STORE_INTERFACE_VERSION_MAX 1 +#define XENBUS_STORE_INTERFACE_VERSION_MAX 2 #endif // _XENBUS_STORE_INTERFACE_H diff --git a/src/xenvbd.inf b/src/xenvbd.inf index bb5ada2..5220add 100644 --- a/src/xenvbd.inf +++ b/src/xenvbd.inf @@ -54,9 +54,9 @@ xenvbd_coinst.dll=0,, %Vendor%=Inst,NT$ARCH$ [Inst.NT$ARCH$] -%XenVbdName%=XenVbd_Inst,XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_VBD&REV_09000000 -%XenVbdName%=XenVbd_Inst,XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_VBD&REV_09000000 -%XenVbdName%=XenVbd_Inst,XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_VBD&REV_09000000 +%XenVbdName%=XenVbd_Inst,XENBUS\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_VBD&REV_09000004 +%XenVbdName%=XenVbd_Inst,XENBUS\VEN_@VENDOR_PREFIX@0001&DEV_VBD&REV_09000004 +%XenVbdName%=XenVbd_Inst,XENBUS\VEN_@VENDOR_PREFIX@0002&DEV_VBD&REV_09000004 [XenVbd_Inst] CopyFiles=XenVbd_Copyfiles diff --git a/src/xenvbd/ring.c b/src/xenvbd/ring.c index a7b636d..2f5c876 100644 --- a/src/xenvbd/ring.c +++ b/src/xenvbd/ring.c @@ -1649,7 +1649,8 @@ BlkifRingDpc( XENBUS_EVTCHN(Unmask, &Ring->EvtchnInterface, BlkifRing->Channel, - FALSE); + FALSE, + TRUE); } static NTSTATUS @@ -1923,7 +1924,8 @@ BlkifRingConnect( XENBUS_EVTCHN(Unmask, &Ring->EvtchnInterface, BlkifRing->Channel, - FALSE); + FALSE, + TRUE); status = RtlStringCchPrintfA(Name, MAX_NAME_LEN, -- 2.16.2.windows.1 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |