[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[win-pv-devel] [PATCH 4/6] Define new IOCTLs for user-mode clients



IOCTL input is defined as XENIFACE_*_IN structs.
IOCTL output is defined as XENIFACE_*_OUT structs.

Signed-off-by: Rafal Wojdyla <omeg@xxxxxxxxxxxxxxxxxxxxxx>
---
 include/xeniface_ioctls.h | 279 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 278 insertions(+), 1 deletion(-)

diff --git a/include/xeniface_ioctls.h b/include/xeniface_ioctls.h
index 1367f67..6ad98d6 100644
--- a/include/xeniface_ioctls.h
+++ b/include/xeniface_ioctls.h
@@ -29,20 +29,297 @@
  * SUCH DAMAGE.
  */
 
+/*! \file xeniface_ioctls.h
+    \brief User-mode IOCTL interfaces to the XENIFACE driver
+*/
+
 #ifndef _XENIFACE_IOCTLS_H_
 #define _XENIFACE_IOCTLS_H_
 
+/*! \brief XENIFACE device GUID */
 DEFINE_GUID(GUID_INTERFACE_XENIFACE, \
     0xb2cfb085, 0xaa5e, 0x47e1, 0x8b, 0xf7, 0x97, 0x93, 0xf3, 0x15, 0x45, 
0x65);
 
+/*! \brief Bitmask of XenStore key permissions */
+typedef enum _XENIFACE_STORE_PERMISSION_MASK {
+    XENIFACE_STORE_PERM_NONE  = 0, /*!< No access */
+    XENIFACE_STORE_PERM_READ  = 1, /*!< Read access */
+    XENIFACE_STORE_PERM_WRITE = 2, /*!< Write access */
+} XENIFACE_STORE_PERMISSION_MASK;
+
+/*! \brief XenStore key permissions entry for a single domain */
+typedef struct _XENIFACE_STORE_PERMISSION {
+    USHORT                         Domain; /*!< Target domain */
+    XENIFACE_STORE_PERMISSION_MASK Mask;   /*!< Permissions for the domain */
+} XENIFACE_STORE_PERMISSION, *PXENIFACE_STORE_PERMISSION;
+
+/*! \brief Bitmask of all available XenStore permission values */
+#define XENIFACE_STORE_ALLOWED_PERMISSIONS \
+    (XENIFACE_STORE_PERM_NONE | XENIFACE_STORE_PERM_READ | 
XENIFACE_STORE_PERM_WRITE)
+
+/*! \brief Read a value from XenStore
+
+    Input: NUL-terminated CHAR array containing the requested key's path
+
+    Output: NUL-terminated CHAR array containing the requested key's value
+*/
 #define IOCTL_XENIFACE_STORE_READ \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Write a value to XenStore
+
+    Input: NUL-terminated CHAR array containing the requested key's path,
+           NUL-terminated CHAR array containing the key's value,
+           final NUL terminator
+
+    Output: None
+*/
 #define IOCTL_XENIFACE_STORE_WRITE \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Enumerate all immediate child keys of a XenStore key
+
+    Input: NUL-terminated CHAR array containing the requested key's path
+
+    Output: List of NUL-terminated CHAR arrays containing the child key names,
+            followed by a NUL CHAR
+*/
 #define IOCTL_XENIFACE_STORE_DIRECTORY \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Remove a key from XenStore
+
+    Input: NUL-terminated CHAR array containing the requested key's path
+
+    Output: None
+*/
 #define IOCTL_XENIFACE_STORE_REMOVE \
     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS)
 
+/*! \brief Set permissions for a XenStore key
+
+    Input: XENIFACE_STORE_SET_PERMISSIONS_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_STORE_SET_PERMISSIONS \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_STORE_SET_PERMISSIONS */
+typedef struct _XENIFACE_STORE_SET_PERMISSIONS_IN {
+    PCHAR                     Path;                       /*!< NUL-terminated 
path to a XenStore key */
+    ULONG                     PathLength;                 /*!< Size of Path in 
bytes, including the NUL terminator */
+    ULONG                     NumberPermissions;          /*!< Number of 
permission entries */
+    XENIFACE_STORE_PERMISSION Permissions[ANYSIZE_ARRAY]; /*!< Permission 
entries */
+} XENIFACE_STORE_SET_PERMISSIONS_IN, *PXENIFACE_STORE_SET_PERMISSIONS_IN;
+
+/*! \brief Add a XenStore watch
+
+    Input: XENIFACE_STORE_ADD_WATCH_IN
+
+    Output: XENIFACE_STORE_ADD_WATCH_OUT
+*/
+#define IOCTL_XENIFACE_STORE_ADD_WATCH \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_STORE_ADD_WATCH */
+typedef struct _XENIFACE_STORE_ADD_WATCH_IN {
+    PCHAR  Path;       /*!< NUL-terminated path to a XenStore key */
+    ULONG  PathLength; /*!< Size of Path in bytes, including the NUL 
terminator */
+    HANDLE Event;      /*!< Handle to an event object that will be signaled 
when the watch fires */
+} XENIFACE_STORE_ADD_WATCH_IN, *PXENIFACE_STORE_ADD_WATCH_IN;
+
+/*! \brief Output for IOCTL_XENIFACE_STORE_ADD_WATCH */
+typedef struct _XENIFACE_STORE_ADD_WATCH_OUT {
+    PVOID Context; /*!< Handle to the watch */
+} XENIFACE_STORE_ADD_WATCH_OUT, *PXENIFACE_STORE_ADD_WATCH_OUT;
+
+/*! \brief Remove a XenStore watch
+
+    Input: XENIFACE_STORE_REMOVE_WATCH_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_STORE_REMOVE_WATCH \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x806, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_STORE_REMOVE_WATCH */
+typedef struct _XENIFACE_STORE_REMOVE_WATCH_IN {
+    PVOID Context; /*!< Handle to the watch */
+} XENIFACE_STORE_REMOVE_WATCH_IN, *PXENIFACE_STORE_REMOVE_WATCH_IN;
+
+/*! \brief Open an event channel that was already bound by a remote domain
+
+    Input: XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN
+
+    Output: XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT
+*/
+#define IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN */
+typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN {
+    USHORT  RemoteDomain; /*!< Remote domain that has already bound the 
channel */
+    ULONG   RemotePort;   /*!< Port number that is assigned to the event 
channel in the RemoteDomain */
+    BOOLEAN Mask;         /*!< Set to TRUE if the event channel should be 
initially masked */
+    HANDLE  Event;        /*!< Handle to an event object that will receive 
event channel notifications */
+} XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN, *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_IN;
+
+/*! \brief Output for IOCTL_XENIFACE_EVTCHN_BIND_INTERDOMAIN */
+typedef struct _XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT {
+    ULONG LocalPort; /*!< Local port number that is assigned to the event 
channel */
+} XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT, *PXENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT;
+
+/*! \brief Open an unbound event channel
+
+    Input: XENIFACE_EVTCHN_BIND_UNBOUND_IN
+
+    Output: XENIFACE_EVTCHN_BIND_UNBOUND_OUT
+*/
+#define IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND */
+typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_IN {
+    USHORT  RemoteDomain; /*!< Remote domain that will bind the channel */
+    BOOLEAN Mask;         /*!< Set to TRUE if the event channel should be 
initially masked */
+    HANDLE  Event;        /*!< Handle to an event object that will receive 
event channel notifications */
+} XENIFACE_EVTCHN_BIND_UNBOUND_IN, *PXENIFACE_EVTCHN_BIND_UNBOUND_IN;
+
+/*! \brief Output for IOCTL_XENIFACE_EVTCHN_BIND_UNBOUND */
+typedef struct _XENIFACE_EVTCHN_BIND_UNBOUND_OUT {
+    ULONG LocalPort; /*!< Local port number that is assigned to the event 
channel */
+} XENIFACE_EVTCHN_BIND_UNBOUND_OUT, *PXENIFACE_EVTCHN_BIND_UNBOUND_OUT;
+
+/*! \brief Close an event channel
+
+    Input: XENIFACE_EVTCHN_CLOSE_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_EVTCHN_CLOSE \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x812, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_EVTCHN_CLOSE */
+typedef struct _XENIFACE_EVTCHN_CLOSE_IN {
+    ULONG LocalPort; /*!< Local port number that is assigned to the event 
channel */
+} XENIFACE_EVTCHN_CLOSE_IN, *PXENIFACE_EVTCHN_CLOSE_IN;
+
+/*! \brief Notify the remote end of an event channel
+
+    Input: XENIFACE_EVTCHN_CLOSE_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_EVTCHN_NOTIFY \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x813, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_EVTCHN_NOTIFY */
+typedef struct _XENIFACE_EVTCHN_NOTIFY_IN {
+    ULONG LocalPort; /*!< Local port number that is assigned to the event 
channel */
+} XENIFACE_EVTCHN_NOTIFY_IN, *PXENIFACE_EVTCHN_NOTIFY_IN;
+
+/*! \brief Unmask an event channel
+
+    Input: XENIFACE_EVTCHN_CLOSE_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_EVTCHN_UNMASK \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x814, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_EVTCHN_UNMASK */
+typedef struct _XENIFACE_EVTCHN_UNMASK_IN {
+    ULONG LocalPort; /*!< Local port number that is assigned to the event 
channel */
+} XENIFACE_EVTCHN_UNMASK_IN, *PXENIFACE_EVTCHN_UNMASK_IN;
+
+/*! \brief Bitmask of XenStore key permissions */
+typedef enum _XENIFACE_GNTTAB_PAGE_FLAGS {
+    XENIFACE_GNTTAB_READONLY          = 1 << 0, /*!< If set, the 
granted/mapped pages are read-only */
+    XENIFACE_GNTTAB_USE_NOTIFY_OFFSET = 1 << 1, /*!< If set, the NotifyOffset 
member of the grant/map IOCTL input is used */
+    XENIFACE_GNTTAB_USE_NOTIFY_PORT   = 1 << 2, /*!< If set, the NotifyPort 
member of the grant/map IOCTL input is used */
+} XENIFACE_GNTTAB_PAGE_FLAGS;
+
+/*! \brief Grant permission to access local memory pages to a foreign domain
+    \note This IOCTL must be asynchronous. The driver doesn't complete the 
request
+          until the grant is explicitly revoked or the calling thread 
terminates.
+
+    Input: XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN
+
+    Output: XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT
+*/
+#define IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x820, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS */
+typedef struct _XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN {
+    ULONG                      RequestId;    /*!< A unique (for the calling 
process) number identifying the request */
+    USHORT                     RemoteDomain; /*!< Remote domain that is being 
granted access */
+    ULONG                      NumberPages;  /*!< Number of 4k pages to grant 
access to */
+    XENIFACE_GNTTAB_PAGE_FLAGS Flags;        /*!< Additional flags */
+    ULONG                      NotifyOffset; /*!< Offset of a byte in the 
granted region that will be set to 0 when the grant is revoked */
+    ULONG                      NotifyPort;   /*!< Local port number of an open 
event channel that will be notified when the grant is revoked */
+} XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN, 
*PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_IN;
+
+/*! \brief Output for IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS */
+typedef struct _XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT {
+    PVOID Address;                   /*!< User-mode address of the granted 
memory region */
+    ULONG References[ANYSIZE_ARRAY]; /*!< An array of Xen-assigned references 
for each granted page */
+} XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT, 
*PXENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT;
+
+/*! \brief Revoke a foreign domain access to previously granted memory region
+
+    Input: XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x821, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS */
+typedef struct _XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN {
+    ULONG RequestId; /*! Request ID used in the corresponding 
IOCTL_XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS call */
+} XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN, 
*PXENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN;
+
+/*! \brief Map a foreign memory region into the current address space
+    \note This IOCTL must be asynchronous. The driver doesn't complete the 
request
+          until the memory is explicitly unmapped or the calling thread 
terminates.
+
+    Input: XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN
+
+    Output: XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT
+*/
+#define IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x822, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES */
+typedef struct _XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN {
+    ULONG                      RequestId;                 /*!< A unique (for 
the calling process) number identifying the request */
+    USHORT                     RemoteDomain;              /*!< Remote domain 
that has granted access to the pages */
+    ULONG                      NumberPages;               /*!< Number of 4k 
pages to map */
+    XENIFACE_GNTTAB_PAGE_FLAGS Flags;                     /*!< Additional 
flags */
+    ULONG                      NotifyOffset;              /*!< Offset of a 
byte in the mapped region that will be set to 0 when the region is unmapped */
+    ULONG                      NotifyPort;                /*!< Local port 
number of an open event channel that will be notified when the region is 
unmapped */
+    ULONG                      References[ANYSIZE_ARRAY]; /*!< An array of 
Xen-assigned references for each granted page */
+} XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN, *PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN;
+
+/*! \brief Output for IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES */
+typedef struct _XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT {
+    PVOID Address; /*!< User-mode address of the mapped memory region */
+} XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT, 
*PXENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT;
+
+/*! \brief Unmap a foreign memory region from the current address space
+
+    Input: XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN
+
+    Output: None
+*/
+#define IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES \
+    CTL_CODE(FILE_DEVICE_UNKNOWN, 0x823, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/*! \brief Input for IOCTL_XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES */
+typedef struct _XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN {
+    ULONG RequestId; /*! Request ID used in the corresponding 
IOCTL_XENIFACE_GNTTAB_MAP_FOREIGN_PAGES call */
+} XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN, 
*PXENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN;
+
 #endif // _XENIFACE_IOCTLS_H_
-
-- 
1.8.1.msysgit.1

_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.