]> git.proxmox.com Git - mirror_edk2.git/blob - OvmfPkg/Include/IndustryStandard/VirtioFs.h
OvmfPkg/VirtioFsDxe: implement the wrapper function for FUSE_OPENDIR
[mirror_edk2.git] / OvmfPkg / Include / IndustryStandard / VirtioFs.h
1 /** @file
2 Type and macro definitions specific to the Virtio Filesystem device.
3
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>.
8
9 This header file is minimal, and only defines the types and macros that are
10 necessary for the OvmfPkg implementation.
11
12 Copyright (C) 2020, Red Hat, Inc.
13
14 SPDX-License-Identifier: BSD-2-Clause-Patent
15 **/
16
17 #ifndef VIRTIO_FS_H_
18 #define VIRTIO_FS_H_
19
20 #include <IndustryStandard/Virtio.h>
21
22 //
23 // Lowest numbered queue for sending normal priority requests.
24 //
25 #define VIRTIO_FS_REQUEST_QUEUE 1
26
27 //
28 // Number of bytes in the "VIRTIO_FS_CONFIG.Tag" field.
29 //
30 #define VIRTIO_FS_TAG_BYTES 36
31
32 //
33 // Device configuration layout.
34 //
35 #pragma pack (1)
36 typedef struct {
37 //
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
41 // terminator.
42 //
43 UINT8 Tag[VIRTIO_FS_TAG_BYTES];
44 //
45 // The total number of request virtqueues exposed by the device (i.e.,
46 // excluding the "hiprio" queue).
47 //
48 UINT32 NumReqQueues;
49 } VIRTIO_FS_CONFIG;
50 #pragma pack ()
51
52 //
53 // FUSE-related definitions follow.
54 //
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 [...]"
58 //
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.
63 //
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).
69 //
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.
75 //
76 #define VIRTIO_FS_FUSE_MAJOR 7
77 #define VIRTIO_FS_FUSE_MINOR 31
78
79 //
80 // FUSE operation codes.
81 //
82 typedef enum {
83 VirtioFsFuseOpInit = 26,
84 VirtioFsFuseOpOpenDir = 27,
85 } VIRTIO_FS_FUSE_OPCODE;
86
87 #pragma pack (1)
88 //
89 // Request-response headers common to all request types.
90 //
91 typedef struct {
92 UINT32 Len;
93 UINT32 Opcode;
94 UINT64 Unique;
95 UINT64 NodeId;
96 UINT32 Uid;
97 UINT32 Gid;
98 UINT32 Pid;
99 UINT32 Padding;
100 } VIRTIO_FS_FUSE_REQUEST;
101
102 typedef struct {
103 UINT32 Len;
104 INT32 Error;
105 UINT64 Unique;
106 } VIRTIO_FS_FUSE_RESPONSE;
107
108 //
109 // Headers for VirtioFsFuseOpInit.
110 //
111 typedef struct {
112 UINT32 Major;
113 UINT32 Minor;
114 UINT32 MaxReadahead;
115 UINT32 Flags;
116 } VIRTIO_FS_FUSE_INIT_REQUEST;
117
118 typedef struct {
119 UINT32 Major;
120 UINT32 Minor;
121 UINT32 MaxReadahead;
122 UINT32 Flags;
123 UINT16 MaxBackground;
124 UINT16 CongestionThreshold;
125 UINT32 MaxWrite;
126 UINT32 TimeGran;
127 UINT16 MaxPages;
128 UINT16 MapAlignment;
129 UINT32 Unused[8];
130 } VIRTIO_FS_FUSE_INIT_RESPONSE;
131
132 //
133 // Headers for VirtioFsFuseOpOpenDir.
134 //
135 typedef struct {
136 UINT32 Flags;
137 UINT32 Unused;
138 } VIRTIO_FS_FUSE_OPEN_REQUEST;
139
140 typedef struct {
141 UINT64 FileHandle;
142 UINT32 OpenFlags;
143 UINT32 Padding;
144 } VIRTIO_FS_FUSE_OPEN_RESPONSE;
145 #pragma pack ()
146
147 #endif // VIRTIO_FS_H_