]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/Include/IndustryStandard/VirtioFs.h
OvmfPkg/VirtioFsDxe: implement EFI_FILE_PROTOCOL.GetPosition, .SetPosition
[mirror_edk2.git] / OvmfPkg / Include / IndustryStandard / VirtioFs.h
CommitLineData
eaa7115d
LE
1/** @file\r
2 Type and macro definitions specific to the Virtio Filesystem device.\r
3\r
4 At the time of this writing, the latest released Virtio specification (v1.1)\r
5 does not include the virtio-fs device. The development version of the\r
6 specification defines it however; see the latest version at\r
7 <https://github.com/oasis-tcs/virtio-spec/blob/87fa6b5d8155/virtio-fs.tex>.\r
8\r
9 This header file is minimal, and only defines the types and macros that are\r
10 necessary for the OvmfPkg implementation.\r
11\r
12 Copyright (C) 2020, Red Hat, Inc.\r
13\r
14 SPDX-License-Identifier: BSD-2-Clause-Patent\r
15**/\r
16\r
17#ifndef VIRTIO_FS_H_\r
18#define VIRTIO_FS_H_\r
19\r
20#include <IndustryStandard/Virtio.h>\r
21\r
22//\r
23// Lowest numbered queue for sending normal priority requests.\r
24//\r
25#define VIRTIO_FS_REQUEST_QUEUE 1\r
26\r
27//\r
28// Number of bytes in the "VIRTIO_FS_CONFIG.Tag" field.\r
29//\r
30#define VIRTIO_FS_TAG_BYTES 36\r
31\r
32//\r
33// Device configuration layout.\r
34//\r
35#pragma pack (1)\r
36typedef struct {\r
37 //\r
38 // The Tag field can be considered the filesystem label, or a mount point\r
39 // hint. It is UTF-8 encoded, and padded to full size with NUL bytes. If the\r
40 // encoded bytes take up the entire Tag field, then there is no NUL\r
41 // terminator.\r
42 //\r
43 UINT8 Tag[VIRTIO_FS_TAG_BYTES];\r
44 //\r
45 // The total number of request virtqueues exposed by the device (i.e.,\r
46 // excluding the "hiprio" queue).\r
47 //\r
48 UINT32 NumReqQueues;\r
49} VIRTIO_FS_CONFIG;\r
50#pragma pack ()\r
51\r
6a2dc768
LE
52//\r
53// FUSE-related definitions follow.\r
54//\r
55// From virtio-v1.1-cs01-87fa6b5d8155, 5.11 File System Device: "[...] The\r
56// driver acts as the FUSE client mounting the file system. The virtio file\r
57// system device provides the mechanism for transporting FUSE requests [...]"\r
58//\r
59// Unfortunately, the documentation of the FUSE wire protocol is lacking. The\r
60// Virtio spec (as of this writing) simply defers to\r
61// "include/uapi/linux/fuse.h" in the Linux kernel source -- see the reference\r
62// in virtio spec file "introduction.tex", at commit 87fa6b5d8155.\r
63//\r
64// Of course, "include/uapi/linux/fuse.h" is a moving target (the virtio spec\r
65// does not specify a particular FUSE interface version). The OvmfPkg code\r
66// targets version 7.31, because that's the lowest version that the QEMU\r
67// virtio-fs daemon supports at this time -- see QEMU commit 72c42e2d6551\r
68// ("virtiofsd: Trim out compatibility code", 2020-01-23).\r
69//\r
70// Correspondingly, Linux's "include/uapi/linux/fuse.h" is consulted as checked\r
71// out at commit (c6ff213fe5b8^) = d78092e4937d ("fuse: fix page dereference\r
72// after free", 2020-09-18); that is, right before commit c6ff213fe5b8 ("fuse:\r
73// add submount support to <uapi/linux/fuse.h>", 2020-09-18) introduces FUSE\r
74// interface version 7.32.\r
75//\r
76#define VIRTIO_FS_FUSE_MAJOR 7\r
77#define VIRTIO_FS_FUSE_MINOR 31\r
78\r
334c13e1
LE
79//\r
80// The inode number of the root directory.\r
81//\r
82#define VIRTIO_FS_FUSE_ROOT_DIR_NODE_ID 1\r
83\r
b6ce961a
LE
84//\r
85// Distinguished errno values.\r
86//\r
87#define VIRTIO_FS_FUSE_ERRNO_ENOENT (-2)\r
88\r
f058cb69
LE
89//\r
90// File mode bitmasks.\r
91//\r
cd473d41
LE
92#define VIRTIO_FS_FUSE_MODE_TYPE_MASK 0170000u\r
93#define VIRTIO_FS_FUSE_MODE_TYPE_REG 0100000u\r
94#define VIRTIO_FS_FUSE_MODE_TYPE_DIR 0040000u\r
f058cb69 95#define VIRTIO_FS_FUSE_MODE_PERM_RWXU 0000700u\r
a70860f4
LE
96#define VIRTIO_FS_FUSE_MODE_PERM_RUSR 0000400u\r
97#define VIRTIO_FS_FUSE_MODE_PERM_WUSR 0000200u\r
f058cb69 98#define VIRTIO_FS_FUSE_MODE_PERM_RWXG 0000070u\r
a70860f4
LE
99#define VIRTIO_FS_FUSE_MODE_PERM_RGRP 0000040u\r
100#define VIRTIO_FS_FUSE_MODE_PERM_WGRP 0000020u\r
f058cb69 101#define VIRTIO_FS_FUSE_MODE_PERM_RWXO 0000007u\r
a70860f4
LE
102#define VIRTIO_FS_FUSE_MODE_PERM_ROTH 0000004u\r
103#define VIRTIO_FS_FUSE_MODE_PERM_WOTH 0000002u\r
f058cb69 104\r
da82d2e3
LE
105//\r
106// Flags for VirtioFsFuseOpOpen.\r
107//\r
108#define VIRTIO_FS_FUSE_OPEN_REQ_F_RDONLY 0\r
109#define VIRTIO_FS_FUSE_OPEN_REQ_F_RDWR 2\r
110\r
fa97e372
LE
111//\r
112// FUSE operation codes.\r
113//\r
114typedef enum {\r
b6ce961a 115 VirtioFsFuseOpLookup = 1,\r
92a4d30e 116 VirtioFsFuseOpForget = 2,\r
e3bc9577 117 VirtioFsFuseOpGetAttr = 3,\r
f058cb69 118 VirtioFsFuseOpMkDir = 9,\r
0771671c
LE
119 VirtioFsFuseOpUnlink = 10,\r
120 VirtioFsFuseOpRmDir = 11,\r
da82d2e3 121 VirtioFsFuseOpOpen = 14,\r
ba118463 122 VirtioFsFuseOpStatFs = 17,\r
72d4f133 123 VirtioFsFuseOpRelease = 18,\r
2e151d26 124 VirtioFsFuseOpFsync = 20,\r
d0474399 125 VirtioFsFuseOpFlush = 25,\r
fa97e372 126 VirtioFsFuseOpInit = 26,\r
b62a0c56 127 VirtioFsFuseOpOpenDir = 27,\r
72d4f133 128 VirtioFsFuseOpReleaseDir = 29,\r
2e151d26 129 VirtioFsFuseOpFsyncDir = 30,\r
a70860f4 130 VirtioFsFuseOpCreate = 35,\r
fa97e372
LE
131} VIRTIO_FS_FUSE_OPCODE;\r
132\r
6a2dc768
LE
133#pragma pack (1)\r
134//\r
135// Request-response headers common to all request types.\r
136//\r
137typedef struct {\r
138 UINT32 Len;\r
139 UINT32 Opcode;\r
140 UINT64 Unique;\r
141 UINT64 NodeId;\r
142 UINT32 Uid;\r
143 UINT32 Gid;\r
144 UINT32 Pid;\r
145 UINT32 Padding;\r
146} VIRTIO_FS_FUSE_REQUEST;\r
147\r
148typedef struct {\r
149 UINT32 Len;\r
150 INT32 Error;\r
151 UINT64 Unique;\r
152} VIRTIO_FS_FUSE_RESPONSE;\r
fa97e372 153\r
f058cb69
LE
154//\r
155// Structure with which the Virtio Filesystem device reports a NodeId to the\r
156// FUSE client (i.e., to the Virtio Filesystem driver). This structure is a\r
157// part of the response headers for operations that inform the FUSE client of\r
158// an inode.\r
159//\r
160typedef struct {\r
161 UINT64 NodeId;\r
162 UINT64 Generation;\r
163 UINT64 EntryValid;\r
164 UINT64 AttrValid;\r
165 UINT32 EntryValidNsec;\r
166 UINT32 AttrValidNsec;\r
167} VIRTIO_FS_FUSE_NODE_RESPONSE;\r
168\r
169//\r
170// Structure describing the host-side attributes of an inode. This structure is\r
171// a part of the response headers for operations that inform the FUSE client of\r
172// an inode.\r
173//\r
174typedef struct {\r
175 UINT64 Ino;\r
176 UINT64 Size;\r
177 UINT64 Blocks;\r
178 UINT64 Atime;\r
179 UINT64 Mtime;\r
180 UINT64 Ctime;\r
181 UINT32 AtimeNsec;\r
182 UINT32 MtimeNsec;\r
183 UINT32 CtimeNsec;\r
184 UINT32 Mode;\r
185 UINT32 Nlink;\r
186 UINT32 Uid;\r
187 UINT32 Gid;\r
188 UINT32 Rdev;\r
189 UINT32 Blksize;\r
190 UINT32 Padding;\r
191} VIRTIO_FS_FUSE_ATTRIBUTES_RESPONSE;\r
192\r
92a4d30e
LE
193//\r
194// Header for VirtioFsFuseOpForget.\r
195//\r
196typedef struct {\r
197 UINT64 NumberOfLookups;\r
198} VIRTIO_FS_FUSE_FORGET_REQUEST;\r
199\r
e3bc9577
LE
200//\r
201// Headers for VirtioFsFuseOpGetAttr.\r
202//\r
203typedef struct {\r
204 UINT32 GetAttrFlags;\r
205 UINT32 Dummy;\r
206 UINT64 FileHandle;\r
207} VIRTIO_FS_FUSE_GETATTR_REQUEST;\r
208\r
209typedef struct {\r
210 UINT64 AttrValid;\r
211 UINT32 AttrValidNsec;\r
212 UINT32 Dummy;\r
213} VIRTIO_FS_FUSE_GETATTR_RESPONSE;\r
214\r
f058cb69
LE
215//\r
216// Header for VirtioFsFuseOpMkDir.\r
217//\r
218typedef struct {\r
219 UINT32 Mode;\r
220 UINT32 Umask;\r
221} VIRTIO_FS_FUSE_MKDIR_REQUEST;\r
222\r
da82d2e3
LE
223//\r
224// Headers for VirtioFsFuseOpOpen and VirtioFsFuseOpOpenDir.\r
225//\r
226typedef struct {\r
227 UINT32 Flags;\r
228 UINT32 Unused;\r
229} VIRTIO_FS_FUSE_OPEN_REQUEST;\r
230\r
231typedef struct {\r
232 UINT64 FileHandle;\r
233 UINT32 OpenFlags;\r
234 UINT32 Padding;\r
235} VIRTIO_FS_FUSE_OPEN_RESPONSE;\r
236\r
ba118463
LE
237//\r
238// Header for VirtioFsFuseOpStatFs.\r
239//\r
240typedef struct {\r
241 UINT64 Blocks;\r
242 UINT64 Bfree;\r
243 UINT64 Bavail;\r
244 UINT64 Files;\r
245 UINT64 Ffree;\r
246 UINT32 Bsize;\r
247 UINT32 Namelen;\r
248 UINT32 Frsize;\r
249 UINT32 Padding;\r
250 UINT32 Spare[6];\r
251} VIRTIO_FS_FUSE_STATFS_RESPONSE;\r
252\r
72d4f133
LE
253//\r
254// Header for VirtioFsFuseOpRelease and VirtioFsFuseOpReleaseDir.\r
255//\r
256typedef struct {\r
257 UINT64 FileHandle;\r
258 UINT32 Flags;\r
259 UINT32 ReleaseFlags;\r
260 UINT64 LockOwner;\r
261} VIRTIO_FS_FUSE_RELEASE_REQUEST;\r
262\r
2e151d26
LE
263//\r
264// Header for VirtioFsFuseOpFsync and VirtioFsFuseOpFsyncDir.\r
265//\r
266typedef struct {\r
267 UINT64 FileHandle;\r
268 UINT32 FsyncFlags;\r
269 UINT32 Padding;\r
270} VIRTIO_FS_FUSE_FSYNC_REQUEST;\r
271\r
d0474399
LE
272//\r
273// Header for VirtioFsFuseOpFlush.\r
274//\r
275typedef struct {\r
276 UINT64 FileHandle;\r
277 UINT32 Unused;\r
278 UINT32 Padding;\r
279 UINT64 LockOwner;\r
280} VIRTIO_FS_FUSE_FLUSH_REQUEST;\r
281\r
fa97e372
LE
282//\r
283// Headers for VirtioFsFuseOpInit.\r
284//\r
285typedef struct {\r
286 UINT32 Major;\r
287 UINT32 Minor;\r
288 UINT32 MaxReadahead;\r
289 UINT32 Flags;\r
290} VIRTIO_FS_FUSE_INIT_REQUEST;\r
291\r
292typedef struct {\r
293 UINT32 Major;\r
294 UINT32 Minor;\r
295 UINT32 MaxReadahead;\r
296 UINT32 Flags;\r
297 UINT16 MaxBackground;\r
298 UINT16 CongestionThreshold;\r
299 UINT32 MaxWrite;\r
300 UINT32 TimeGran;\r
301 UINT16 MaxPages;\r
302 UINT16 MapAlignment;\r
303 UINT32 Unused[8];\r
304} VIRTIO_FS_FUSE_INIT_RESPONSE;\r
a70860f4
LE
305\r
306//\r
307// Header for VirtioFsFuseOpCreate.\r
308//\r
309typedef struct {\r
310 UINT32 Flags;\r
311 UINT32 Mode;\r
312 UINT32 Umask;\r
313 UINT32 Padding;\r
314} VIRTIO_FS_FUSE_CREATE_REQUEST;\r
6a2dc768
LE
315#pragma pack ()\r
316\r
eaa7115d 317#endif // VIRTIO_FS_H_\r