2 Type and macro definitions specific to the Virtio Filesystem device.
4 At the time of this writing, the latest released Virtio specification (v1.1)
5 does not include the virtio-fs device. The development version of the
6 specification defines it however; see the latest version at
7 <https://github.com/oasis-tcs/virtio-spec/blob/87fa6b5d8155/virtio-fs.tex>.
9 This header file is minimal, and only defines the types and macros that are
10 necessary for the OvmfPkg implementation.
12 Copyright (C) 2020, Red Hat, Inc.
14 SPDX-License-Identifier: BSD-2-Clause-Patent
20 #include <IndustryStandard/Virtio.h>
23 // Lowest numbered queue for sending normal priority requests.
25 #define VIRTIO_FS_REQUEST_QUEUE 1
28 // Number of bytes in the "VIRTIO_FS_CONFIG.Tag" field.
30 #define VIRTIO_FS_TAG_BYTES 36
33 // Device configuration layout.
38 // The Tag field can be considered the filesystem label, or a mount point
39 // hint. It is UTF-8 encoded, and padded to full size with NUL bytes. If the
40 // encoded bytes take up the entire Tag field, then there is no NUL
43 UINT8 Tag
[VIRTIO_FS_TAG_BYTES
];
45 // The total number of request virtqueues exposed by the device (i.e.,
46 // excluding the "hiprio" queue).
53 // FUSE-related definitions follow.
55 // From virtio-v1.1-cs01-87fa6b5d8155, 5.11 File System Device: "[...] The
56 // driver acts as the FUSE client mounting the file system. The virtio file
57 // system device provides the mechanism for transporting FUSE requests [...]"
59 // Unfortunately, the documentation of the FUSE wire protocol is lacking. The
60 // Virtio spec (as of this writing) simply defers to
61 // "include/uapi/linux/fuse.h" in the Linux kernel source -- see the reference
62 // in virtio spec file "introduction.tex", at commit 87fa6b5d8155.
64 // Of course, "include/uapi/linux/fuse.h" is a moving target (the virtio spec
65 // does not specify a particular FUSE interface version). The OvmfPkg code
66 // targets version 7.31, because that's the lowest version that the QEMU
67 // virtio-fs daemon supports at this time -- see QEMU commit 72c42e2d6551
68 // ("virtiofsd: Trim out compatibility code", 2020-01-23).
70 // Correspondingly, Linux's "include/uapi/linux/fuse.h" is consulted as checked
71 // out at commit (c6ff213fe5b8^) = d78092e4937d ("fuse: fix page dereference
72 // after free", 2020-09-18); that is, right before commit c6ff213fe5b8 ("fuse:
73 // add submount support to <uapi/linux/fuse.h>", 2020-09-18) introduces FUSE
74 // interface version 7.32.
76 #define VIRTIO_FS_FUSE_MAJOR 7
77 #define VIRTIO_FS_FUSE_MINOR 31
80 // The inode number of the root directory.
82 #define VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID 1
85 // FUSE operation codes.
88 VirtioFsFuseOpRelease
= 18,
89 VirtioFsFuseOpInit
= 26,
90 VirtioFsFuseOpOpenDir
= 27,
91 VirtioFsFuseOpReleaseDir
= 29,
92 } VIRTIO_FS_FUSE_OPCODE
;
96 // Request-response headers common to all request types.
107 } VIRTIO_FS_FUSE_REQUEST
;
113 } VIRTIO_FS_FUSE_RESPONSE
;
116 // Header for VirtioFsFuseOpRelease and VirtioFsFuseOpReleaseDir.
123 } VIRTIO_FS_FUSE_RELEASE_REQUEST
;
126 // Headers for VirtioFsFuseOpInit.
133 } VIRTIO_FS_FUSE_INIT_REQUEST
;
140 UINT16 MaxBackground
;
141 UINT16 CongestionThreshold
;
147 } VIRTIO_FS_FUSE_INIT_RESPONSE
;
150 // Headers for VirtioFsFuseOpOpenDir.
155 } VIRTIO_FS_FUSE_OPEN_REQUEST
;
161 } VIRTIO_FS_FUSE_OPEN_RESPONSE
;
164 #endif // VIRTIO_FS_H_