]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Include/IndustryStandard/VirtioFs.h
OvmfPkg: CloudHv: Retrieve RSDP address from PVH
[mirror_edk2.git] / OvmfPkg / Include / IndustryStandard / VirtioFs.h
index ea7d80d15d0b2bd8368c84255c9dc845665ac421..dbcb62f6caf27b945eb3b0d6286f1e1485927e01 100644 (file)
 //\r
 // Lowest numbered queue for sending normal priority requests.\r
 //\r
-#define VIRTIO_FS_REQUEST_QUEUE 1\r
+#define VIRTIO_FS_REQUEST_QUEUE  1\r
 \r
 //\r
 // Number of bytes in the "VIRTIO_FS_CONFIG.Tag" field.\r
 //\r
-#define VIRTIO_FS_TAG_BYTES 36\r
+#define VIRTIO_FS_TAG_BYTES  36\r
 \r
 //\r
 // Device configuration layout.\r
@@ -40,13 +40,415 @@ typedef struct {
   // encoded bytes take up the entire Tag field, then there is no NUL\r
   // terminator.\r
   //\r
-  UINT8 Tag[VIRTIO_FS_TAG_BYTES];\r
+  UINT8     Tag[VIRTIO_FS_TAG_BYTES];\r
   //\r
   // The total number of request virtqueues exposed by the device (i.e.,\r
   // excluding the "hiprio" queue).\r
   //\r
-  UINT32 NumReqQueues;\r
+  UINT32    NumReqQueues;\r
 } VIRTIO_FS_CONFIG;\r
 #pragma pack ()\r
 \r
+//\r
+// FUSE-related definitions follow.\r
+//\r
+// From virtio-v1.1-cs01-87fa6b5d8155, 5.11 File System Device: "[...] The\r
+// driver acts as the FUSE client mounting the file system. The virtio file\r
+// system device provides the mechanism for transporting FUSE requests [...]"\r
+//\r
+// Unfortunately, the documentation of the FUSE wire protocol is lacking. The\r
+// Virtio spec (as of this writing) simply defers to\r
+// "include/uapi/linux/fuse.h" in the Linux kernel source -- see the reference\r
+// in virtio spec file "introduction.tex", at commit 87fa6b5d8155.\r
+//\r
+// Of course, "include/uapi/linux/fuse.h" is a moving target (the virtio spec\r
+// does not specify a particular FUSE interface version). The OvmfPkg code\r
+// targets version 7.31, because that's the lowest version that the QEMU\r
+// virtio-fs daemon supports at this time -- see QEMU commit 72c42e2d6551\r
+// ("virtiofsd: Trim out compatibility code", 2020-01-23).\r
+//\r
+// Correspondingly, Linux's "include/uapi/linux/fuse.h" is consulted as checked\r
+// out at commit (c6ff213fe5b8^) = d78092e4937d ("fuse: fix page dereference\r
+// after free", 2020-09-18); that is, right before commit c6ff213fe5b8 ("fuse:\r
+// add submount support to <uapi/linux/fuse.h>", 2020-09-18) introduces FUSE\r
+// interface version 7.32.\r
+//\r
+#define VIRTIO_FS_FUSE_MAJOR  7\r
+#define VIRTIO_FS_FUSE_MINOR  31\r
+\r
+//\r
+// The inode number of the root directory.\r
+//\r
+#define VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID  1\r
+\r
+//\r
+// Distinguished errno values.\r
+//\r
+#define VIRTIO_FS_FUSE_ERRNO_ENOENT  (-2)\r
+\r
+//\r
+// File mode bitmasks.\r
+//\r
+#define VIRTIO_FS_FUSE_MODE_TYPE_MASK  0170000u\r
+#define VIRTIO_FS_FUSE_MODE_TYPE_REG   0100000u\r
+#define VIRTIO_FS_FUSE_MODE_TYPE_DIR   0040000u\r
+#define VIRTIO_FS_FUSE_MODE_PERM_RWXU  0000700u\r
+#define VIRTIO_FS_FUSE_MODE_PERM_RUSR  0000400u\r
+#define VIRTIO_FS_FUSE_MODE_PERM_WUSR  0000200u\r
+#define VIRTIO_FS_FUSE_MODE_PERM_XUSR  0000100u\r
+#define VIRTIO_FS_FUSE_MODE_PERM_RWXG  0000070u\r
+#define VIRTIO_FS_FUSE_MODE_PERM_RGRP  0000040u\r
+#define VIRTIO_FS_FUSE_MODE_PERM_WGRP  0000020u\r
+#define VIRTIO_FS_FUSE_MODE_PERM_XGRP  0000010u\r
+#define VIRTIO_FS_FUSE_MODE_PERM_RWXO  0000007u\r
+#define VIRTIO_FS_FUSE_MODE_PERM_ROTH  0000004u\r
+#define VIRTIO_FS_FUSE_MODE_PERM_WOTH  0000002u\r
+#define VIRTIO_FS_FUSE_MODE_PERM_XOTH  0000001u\r
+\r
+//\r
+// Flags for VirtioFsFuseOpSetAttr, in the VIRTIO_FS_FUSE_SETATTR_REQUEST.Valid\r
+// field.\r
+//\r
+#define VIRTIO_FS_FUSE_SETATTR_REQ_F_MODE   BIT0\r
+#define VIRTIO_FS_FUSE_SETATTR_REQ_F_SIZE   BIT3\r
+#define VIRTIO_FS_FUSE_SETATTR_REQ_F_ATIME  BIT4\r
+#define VIRTIO_FS_FUSE_SETATTR_REQ_F_MTIME  BIT5\r
+\r
+//\r
+// Flags for VirtioFsFuseOpOpen.\r
+//\r
+#define VIRTIO_FS_FUSE_OPEN_REQ_F_RDONLY  0\r
+#define VIRTIO_FS_FUSE_OPEN_REQ_F_RDWR    2\r
+\r
+//\r
+// Flags for VirtioFsFuseOpInit.\r
+//\r
+#define VIRTIO_FS_FUSE_INIT_REQ_F_DO_READDIRPLUS  BIT13\r
+\r
+/**\r
+  Macro for calculating the size of a directory stream entry.\r
+\r
+  The macro may evaluate Namelen multiple times.\r
+\r
+  The macro evaluates to a UINTN value that is safe to cast to UINT32.\r
+\r
+  @param[in] Namelen  The size of the filename byte array that follows\r
+                      VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE in the directory\r
+                      stream, as reported by\r
+                      VIRTIO_FS_FUSE_STATFS_RESPONSE.Namelen or\r
+                      VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE.Namelen. The filename\r
+                      byte array is not NUL-terminated.\r
+\r
+  @retval 0  Namelen was zero or greater than SIZE_4KB.\r
+\r
+  @return    The number of bytes in the directory entry, including the\r
+             VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE header.\r
+**/\r
+#define VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE_SIZE(Namelen)             \\r
+  ((Namelen) == 0 || (Namelen) > SIZE_4KB ?                          \\r
+   (UINTN)0 :                                                        \\r
+   ALIGN_VALUE (                                                     \\r
+     sizeof (VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE) + (UINTN)(Namelen), \\r
+     sizeof (UINT64)                                                 \\r
+     )                                                               \\r
+   )\r
+\r
+//\r
+// Flags for VirtioFsFuseOpRename2.\r
+//\r
+#define VIRTIO_FS_FUSE_RENAME2_REQ_F_NOREPLACE  BIT0\r
+\r
+//\r
+// FUSE operation codes.\r
+//\r
+typedef enum {\r
+  VirtioFsFuseOpLookup      =  1,\r
+  VirtioFsFuseOpForget      =  2,\r
+  VirtioFsFuseOpGetAttr     =  3,\r
+  VirtioFsFuseOpSetAttr     =  4,\r
+  VirtioFsFuseOpMkDir       =  9,\r
+  VirtioFsFuseOpUnlink      = 10,\r
+  VirtioFsFuseOpRmDir       = 11,\r
+  VirtioFsFuseOpOpen        = 14,\r
+  VirtioFsFuseOpRead        = 15,\r
+  VirtioFsFuseOpWrite       = 16,\r
+  VirtioFsFuseOpStatFs      = 17,\r
+  VirtioFsFuseOpRelease     = 18,\r
+  VirtioFsFuseOpFsync       = 20,\r
+  VirtioFsFuseOpFlush       = 25,\r
+  VirtioFsFuseOpInit        = 26,\r
+  VirtioFsFuseOpOpenDir     = 27,\r
+  VirtioFsFuseOpReleaseDir  = 29,\r
+  VirtioFsFuseOpFsyncDir    = 30,\r
+  VirtioFsFuseOpCreate      = 35,\r
+  VirtioFsFuseOpReadDirPlus = 44,\r
+  VirtioFsFuseOpRename2     = 45,\r
+} VIRTIO_FS_FUSE_OPCODE;\r
+\r
+#pragma pack (1)\r
+//\r
+// Request-response headers common to all request types.\r
+//\r
+typedef struct {\r
+  UINT32    Len;\r
+  UINT32    Opcode;\r
+  UINT64    Unique;\r
+  UINT64    NodeId;\r
+  UINT32    Uid;\r
+  UINT32    Gid;\r
+  UINT32    Pid;\r
+  UINT32    Padding;\r
+} VIRTIO_FS_FUSE_REQUEST;\r
+\r
+typedef struct {\r
+  UINT32    Len;\r
+  INT32     Error;\r
+  UINT64    Unique;\r
+} VIRTIO_FS_FUSE_RESPONSE;\r
+\r
+//\r
+// Structure with which the Virtio Filesystem device reports a NodeId to the\r
+// FUSE client (i.e., to the Virtio Filesystem driver). This structure is a\r
+// part of the response headers for operations that inform the FUSE client of\r
+// an inode.\r
+//\r
+typedef struct {\r
+  UINT64    NodeId;\r
+  UINT64    Generation;\r
+  UINT64    EntryValid;\r
+  UINT64    AttrValid;\r
+  UINT32    EntryValidNsec;\r
+  UINT32    AttrValidNsec;\r
+} VIRTIO_FS_FUSE_NODE_RESPONSE;\r
+\r
+//\r
+// Structure describing the host-side attributes of an inode. This structure is\r
+// a part of the response headers for operations that inform the FUSE client of\r
+// an inode.\r
+//\r
+typedef struct {\r
+  UINT64    Ino;\r
+  UINT64    Size;\r
+  UINT64    Blocks;\r
+  UINT64    Atime;\r
+  UINT64    Mtime;\r
+  UINT64    Ctime;\r
+  UINT32    AtimeNsec;\r
+  UINT32    MtimeNsec;\r
+  UINT32    CtimeNsec;\r
+  UINT32    Mode;\r
+  UINT32    Nlink;\r
+  UINT32    Uid;\r
+  UINT32    Gid;\r
+  UINT32    Rdev;\r
+  UINT32    Blksize;\r
+  UINT32    Padding;\r
+} VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE;\r
+\r
+//\r
+// Header for VirtioFsFuseOpForget.\r
+//\r
+typedef struct {\r
+  UINT64    NumberOfLookups;\r
+} VIRTIO_FS_FUSE_FORGET_REQUEST;\r
+\r
+//\r
+// Headers for VirtioFsFuseOpGetAttr (VIRTIO_FS_FUSE_GETATTR_RESPONSE is also\r
+// for VirtioFsFuseOpSetAttr).\r
+//\r
+typedef struct {\r
+  UINT32    GetAttrFlags;\r
+  UINT32    Dummy;\r
+  UINT64    FileHandle;\r
+} VIRTIO_FS_FUSE_GETATTR_REQUEST;\r
+\r
+typedef struct {\r
+  UINT64    AttrValid;\r
+  UINT32    AttrValidNsec;\r
+  UINT32    Dummy;\r
+} VIRTIO_FS_FUSE_GETATTR_RESPONSE;\r
+\r
+//\r
+// Header for VirtioFsFuseOpSetAttr.\r
+//\r
+typedef struct {\r
+  UINT32    Valid;\r
+  UINT32    Padding;\r
+  UINT64    FileHandle;\r
+  UINT64    Size;\r
+  UINT64    LockOwner;\r
+  UINT64    Atime;\r
+  UINT64    Mtime;\r
+  UINT64    Ctime;\r
+  UINT32    AtimeNsec;\r
+  UINT32    MtimeNsec;\r
+  UINT32    CtimeNsec;\r
+  UINT32    Mode;\r
+  UINT32    Unused4;\r
+  UINT32    Uid;\r
+  UINT32    Gid;\r
+  UINT32    Unused5;\r
+} VIRTIO_FS_FUSE_SETATTR_REQUEST;\r
+\r
+//\r
+// Header for VirtioFsFuseOpMkDir.\r
+//\r
+typedef struct {\r
+  UINT32    Mode;\r
+  UINT32    Umask;\r
+} VIRTIO_FS_FUSE_MKDIR_REQUEST;\r
+\r
+//\r
+// Headers for VirtioFsFuseOpOpen and VirtioFsFuseOpOpenDir.\r
+//\r
+typedef struct {\r
+  UINT32    Flags;\r
+  UINT32    Unused;\r
+} VIRTIO_FS_FUSE_OPEN_REQUEST;\r
+\r
+typedef struct {\r
+  UINT64    FileHandle;\r
+  UINT32    OpenFlags;\r
+  UINT32    Padding;\r
+} VIRTIO_FS_FUSE_OPEN_RESPONSE;\r
+\r
+//\r
+// Header for VirtioFsFuseOpRead and VirtioFsFuseOpReadDirPlus.\r
+//\r
+typedef struct {\r
+  UINT64    FileHandle;\r
+  UINT64    Offset;\r
+  UINT32    Size;\r
+  UINT32    ReadFlags;\r
+  UINT64    LockOwner;\r
+  UINT32    Flags;\r
+  UINT32    Padding;\r
+} VIRTIO_FS_FUSE_READ_REQUEST;\r
+\r
+//\r
+// Headers for VirtioFsFuseOpWrite.\r
+//\r
+typedef struct {\r
+  UINT64    FileHandle;\r
+  UINT64    Offset;\r
+  UINT32    Size;\r
+  UINT32    WriteFlags;\r
+  UINT64    LockOwner;\r
+  UINT32    Flags;\r
+  UINT32    Padding;\r
+} VIRTIO_FS_FUSE_WRITE_REQUEST;\r
+\r
+typedef struct {\r
+  UINT32    Size;\r
+  UINT32    Padding;\r
+} VIRTIO_FS_FUSE_WRITE_RESPONSE;\r
+\r
+//\r
+// Header for VirtioFsFuseOpStatFs.\r
+//\r
+typedef struct {\r
+  UINT64    Blocks;\r
+  UINT64    Bfree;\r
+  UINT64    Bavail;\r
+  UINT64    Files;\r
+  UINT64    Ffree;\r
+  UINT32    Bsize;\r
+  UINT32    Namelen;\r
+  UINT32    Frsize;\r
+  UINT32    Padding;\r
+  UINT32    Spare[6];\r
+} VIRTIO_FS_FUSE_STATFS_RESPONSE;\r
+\r
+//\r
+// Header for VirtioFsFuseOpRelease and VirtioFsFuseOpReleaseDir.\r
+//\r
+typedef struct {\r
+  UINT64    FileHandle;\r
+  UINT32    Flags;\r
+  UINT32    ReleaseFlags;\r
+  UINT64    LockOwner;\r
+} VIRTIO_FS_FUSE_RELEASE_REQUEST;\r
+\r
+//\r
+// Header for VirtioFsFuseOpFsync and VirtioFsFuseOpFsyncDir.\r
+//\r
+typedef struct {\r
+  UINT64    FileHandle;\r
+  UINT32    FsyncFlags;\r
+  UINT32    Padding;\r
+} VIRTIO_FS_FUSE_FSYNC_REQUEST;\r
+\r
+//\r
+// Header for VirtioFsFuseOpFlush.\r
+//\r
+typedef struct {\r
+  UINT64    FileHandle;\r
+  UINT32    Unused;\r
+  UINT32    Padding;\r
+  UINT64    LockOwner;\r
+} VIRTIO_FS_FUSE_FLUSH_REQUEST;\r
+\r
+//\r
+// Headers for VirtioFsFuseOpInit.\r
+//\r
+typedef struct {\r
+  UINT32    Major;\r
+  UINT32    Minor;\r
+  UINT32    MaxReadahead;\r
+  UINT32    Flags;\r
+} VIRTIO_FS_FUSE_INIT_REQUEST;\r
+\r
+typedef struct {\r
+  UINT32    Major;\r
+  UINT32    Minor;\r
+  UINT32    MaxReadahead;\r
+  UINT32    Flags;\r
+  UINT16    MaxBackground;\r
+  UINT16    CongestionThreshold;\r
+  UINT32    MaxWrite;\r
+  UINT32    TimeGran;\r
+  UINT16    MaxPages;\r
+  UINT16    MapAlignment;\r
+  UINT32    Unused[8];\r
+} VIRTIO_FS_FUSE_INIT_RESPONSE;\r
+\r
+//\r
+// Header for VirtioFsFuseOpCreate.\r
+//\r
+typedef struct {\r
+  UINT32    Flags;\r
+  UINT32    Mode;\r
+  UINT32    Umask;\r
+  UINT32    Padding;\r
+} VIRTIO_FS_FUSE_CREATE_REQUEST;\r
+\r
+//\r
+// Header for VirtioFsFuseOpReadDirPlus.\r
+//\r
+// Diverging from the rest of the headers, this structure embeds other\r
+// structures. The reason is that a scatter list cannot be used to receive\r
+// NodeResp and AttrResp separately; the record below is followed by a variable\r
+// size filename byte array, and then such pairs are repeated a number of\r
+// times. Thus, later header start offsets depend on earlier filename array\r
+// sizes.\r
+//\r
+typedef struct {\r
+  VIRTIO_FS_FUSE_NODE_RESPONSE          NodeResp;\r
+  VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE    AttrResp;\r
+  UINT64                                NodeId;\r
+  UINT64                                CookieForNextEntry;\r
+  UINT32                                Namelen;\r
+  UINT32                                Type;\r
+} VIRTIO_FS_FUSE_DIRENTPLUS_RESPONSE;\r
+\r
+//\r
+// Header for VirtioFsFuseOpRename2.\r
+//\r
+typedef struct {\r
+  UINT64    NewDir;\r
+  UINT32    Flags;\r
+  UINT32    Padding;\r
+} VIRTIO_FS_FUSE_RENAME2_REQUEST;\r
+#pragma pack ()\r
+\r
 #endif // VIRTIO_FS_H_\r