]> git.proxmox.com Git - mirror_edk2.git/blame - StdLibPrivateInternalFiles/Include/kfile.h
OvmfPkg/Include/Guid: Add XenInfo GUID
[mirror_edk2.git] / StdLibPrivateInternalFiles / Include / kfile.h
CommitLineData
b00771f5 1/** @file\r
2 The EFI kernel's interpretation of a "file".\r
3\r
4 Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
5 This program and the accompanying materials are licensed and made available\r
6 under the terms and conditions of the BSD License which accompanies this\r
7 distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php.\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13 * Copyright (c) 1982, 1986, 1989, 1993\r
14 * The Regents of the University of California. All rights reserved.\r
15 *\r
16 * Redistribution and use in source and binary forms, with or without\r
17 * modification, are permitted provided that the following conditions\r
18 * are met:\r
19 * 1. Redistributions of source code must retain the above copyright\r
20 * notice, this list of conditions and the following disclaimer.\r
21 * 2. Redistributions in binary form must reproduce the above copyright\r
22 * notice, this list of conditions and the following disclaimer in the\r
23 * documentation and/or other materials provided with the distribution.\r
24 * 3. Neither the name of the University nor the names of its contributors\r
25 * may be used to endorse or promote products derived from this software\r
26 * without specific prior written permission.\r
27 *\r
28 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND\r
29 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
30 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
31 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE\r
32 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
36 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
37 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
38 * SUCH DAMAGE.\r
39 *\r
40 * file.h 8.3 (Berkeley) 1/9/95\r
41 NetBSD: file.h,v 1.56 2006/05/14 21:38:18 elad Exp\r
42**/\r
43#ifndef _PIF_KFILE_H_\r
44#define _PIF_KFILE_H_\r
45\r
46#include <Uefi.h>\r
47#include <Protocol/SimpleTextOut.h>\r
48#include <Protocol/SimpleFileSystem.h>\r
49\r
50#include <wchar.h>\r
51#include <sys/fcntl.h>\r
52#include <sys/unistd.h>\r
53\r
54struct stat;\r
55struct fileops;\r
56struct _Device_Node;\r
57\r
58/* The number of "special" character stream devices.\r
59 These include:\r
60 stdin, stdout, stderr\r
61*/\r
62#define NUM_SPECIAL 3\r
63\r
64/* Organization of the f_iflags member of the __filedes structure. */\r
65#define DTYPE_MASK 0x00000007 ///< Device Type\r
66#define DTYPE_VNODE 1 /* file */\r
67#define DTYPE_SOCKET 2 /* communications endpoint */\r
68#define DTYPE_PIPE 3 /* pipe */\r
69#define DTYPE_KQUEUE 4 /* event queue */\r
70#define DTYPE_MISC 5 /* misc file descriptor type */\r
71#define DTYPE_CRYPTO 6 /* crypto */\r
72#define DTYPE_NAMES "0", "file", "socket", "pipe", "kqueue", "misc", "crypto"\r
73\r
74#define FIF_WANTCLOSE 0x10000000 /* a close is waiting for usecount */\r
75#define FIF_DELCLOSE 0x20000000 /* Delete on close. */\r
76#define FIF_LARVAL 0x80000000 /* not fully constructed; don't use */\r
77\r
78/*\r
79 This structure must be a multiple of 8 bytes in length.\r
80*/\r
81struct __filedes {\r
82 const struct fileops *f_ops;\r
83 void *devdata; /* Device-specific data */\r
84 off_t f_offset; /* current position in file */\r
85 UINT32 f_flag; /* see fcntl.h */\r
86 UINT32 f_iflags; // In use if non-zero\r
87 int Oflags; // From the open call\r
88 int Omode; // From the open call\r
89 int RefCount; // Reference count of opens\r
90 UINT16 MyFD; // Which FD this is.\r
91 UINT16 Reserved_1; // Force this structure to be a multiple of 8-bytes in length\r
92};\r
93\r
94struct fileops {\r
95 /* These functions must always be implemented. */\r
96 int (EFIAPI *fo_close) (struct __filedes *filp);\r
97 ssize_t (EFIAPI *fo_read) (struct __filedes *filp, off_t *Offset, size_t Len, void *Buf);\r
98 ssize_t (EFIAPI *fo_write) (struct __filedes *filp, off_t *Offset, size_t Len, const void *Buf);\r
99\r
100 /* Call the fnullop_* version of these functions if not implemented by the device. */\r
101 int (EFIAPI *fo_fcntl) (struct __filedes *filp, UINT32 Cmd, void *p3, void *p4);\r
102 short (EFIAPI *fo_poll) (struct __filedes *filp, short Events);\r
103 int (EFIAPI *fo_flush) (struct __filedes *filp);\r
104\r
105 /* Call the fbadop_* version of these functions if not implemented by the device. */\r
106 int (EFIAPI *fo_stat) (struct __filedes *filp, struct stat *StatBuf, void *Buf);\r
107 int (EFIAPI *fo_ioctl) (struct __filedes *filp, ULONGN Cmd, void *argp);\r
108 int (EFIAPI *fo_delete) (struct __filedes *filp);\r
109 int (EFIAPI *fo_rmdir) (struct __filedes *filp);\r
110 int (EFIAPI *fo_mkdir) (const char *path, __mode_t perms);\r
111 int (EFIAPI *fo_rename) (const char *from, const char *to);\r
112\r
113 /* Use a NULL if this function has not been implemented by the device. */\r
114 off_t (EFIAPI *fo_lseek) (struct __filedes *filp, off_t, int);\r
115};\r
116\r
117/* A generic instance structure which is valid for\r
118 for all device instance structures.\r
119\r
120 All device instance structures MUST be a multiple of 8-bytes in length.\r
121*/\r
122typedef struct {\r
123 UINT32 Cookie; ///< Special value identifying this as a valid Instance\r
124 UINT32 InstanceNum; ///< Which instance is this? Zero-based.\r
125 EFI_HANDLE Dev; ///< Pointer to either Input or Output Protocol.\r
126 struct _Device_Node *Parent; ///< Points to the parent Device Node.\r
127 struct fileops Abstraction; ///< Pointers to functions implementing this device's abstraction.\r
128 UINTN Reserved_1; // Force this to always be a multiple of 8-bytes in length\r
129} GenericInstance;\r
130\r
131/* Type of all Device-specific handler's open routines. */\r
132typedef\r
133 int (EFIAPI *FO_OPEN) (struct __filedes *FD, void *IP, wchar_t *Path, wchar_t *Flags);\r
134\r
135#define FILE_IS_USABLE(fp) (((fp)->f_iflags & \\r
136 (FIF_WANTCLOSE|FIF_LARVAL)) == 0)\r
137\r
138#define FILE_SET_MATURE(fp) \\r
139do { \\r
140 (fp)->f_iflags &= ~FIF_LARVAL; \\r
141} while (/*CONSTCOND*/0)\r
142\r
143/*\r
144 * Flags for fo_read and fo_write.\r
145 */\r
146#define FOF_UPDATE_OFFSET 0x01 /* update the file offset */\r
147\r
148__BEGIN_DECLS\r
149\r
150int fdcreate (CHAR16 *, UINT32, UINT32, BOOLEAN, VOID *, const struct fileops *);\r
151\r
152/* Commonly used fileops\r
153 fnullop_* Does nothing and returns success.\r
154 fbadop_* Does nothing and returns EPERM\r
155*/\r
156int fnullop_fcntl (struct __filedes *filp, UINT32 Cmd, void *p3, void *p4);\r
157short fnullop_poll (struct __filedes *filp, short Events);\r
158int fnullop_flush (struct __filedes *filp);\r
159\r
160int fbadop_stat (struct __filedes *filp, struct stat *StatBuf, void *Buf);\r
161int fbadop_ioctl (struct __filedes *filp, ULONGN Cmd, void *argp);\r
162int fbadop_delete (struct __filedes *filp);\r
163int fbadop_rmdir (struct __filedes *filp);\r
164int fbadop_mkdir (const char *path, __mode_t perms);\r
165int fbadop_rename (const char *from, const char *to);\r
166\r
167__END_DECLS\r
168\r
169/* From the original file... */\r
170#if 0\r
171\r
172//struct proc;\r
173//struct lwp;\r
174//struct uio;\r
175//struct iovec;\r
176//struct knote;\r
177\r
178//LIST_HEAD(filelist, file);\r
179//extern struct filelist filehead; /* head of list of open files */\r
180//extern int maxfiles; /* kernel limit on # of open files */\r
181//extern int nfiles; /* actual number of open files */\r
182\r
183//extern const struct fileops vnops; /* vnode operations for files */\r
184\r
185struct fileops {\r
186 int (*fo_read) (struct file *, off_t *, struct uio *, kauth_cred_t, int);\r
187 int (*fo_write) (struct file *, off_t *, struct uio *, kauth_cred_t, int);\r
188 int (*fo_ioctl) (struct file *, u_long, void *, struct lwp *);\r
189 int (*fo_fcntl) (struct file *, u_int, void *, struct lwp *);\r
190 int (*fo_poll) (struct file *, int, struct lwp *);\r
191 int (*fo_stat) (struct file *, struct stat *, struct lwp *);\r
192 int (*fo_close) (struct file *, struct lwp *);\r
193};\r
194\r
195/*\r
196 * Kernel descriptor table.\r
197 * One entry for each open kernel vnode and socket.\r
198 */\r
199struct file {\r
200 LIST_ENTRY(file) f_list; /* list of active files */\r
201 void *f_data; /* descriptor data, e.g. vnode/socket */\r
202 const struct fileops *f_ops;\r
203 void *f_DevDesc; /* Device Descriptor pointer */\r
204 EFI_FILE_HANDLE FileHandle;\r
205 EFI_HANDLE Handle;\r
206 off_t f_offset; /* current position in file */\r
207 int f_flag; /* see fcntl.h */\r
208 UINT32 f_iflags; /* internal flags; FIF_* */\r
209 int f_advice; /* access pattern hint; UVM_ADV_* */\r
210 int f_type; /* descriptor type */\r
211 int f_usecount; /* number active users */\r
212 u_int f_count; /* reference count */\r
213 u_int f_msgcount; /* references from message queue */\r
214// kauth_cred_t f_cred; /* creds associated with descriptor */\r
215 struct simplelock f_slock;\r
216 UINT16 MyFD; /* Which FD this is. */\r
217};\r
218\r
219#ifdef DIAGNOSTIC\r
220#define FILE_USE_CHECK(fp, str) \\r
221 do { \\r
222 if ((fp)->f_usecount < 0) \\r
223 panic(str); \\r
224} while (/* CONSTCOND */ 0)\r
225#else\r
226#define FILE_USE_CHECK(fp, str) /* nothing */\r
227#endif\r
228\r
229 /*\r
230 * FILE_USE() must be called with the file lock held.\r
231 * (Typical usage is: `fp = fd_getfile(..); FILE_USE(fp);'\r
232 * and fd_getfile() returns the file locked)\r
233 *\r
234 * fp is a pointer to a __filedes structure.\r
235 */\r
236#define FILE_USE(fp) \\r
237 do { \\r
238 (fp)->f_usecount++; \\r
239 FILE_USE_CHECK((fp), "f_usecount overflow"); \\r
240 simple_unlock(&(fp)->f_slock); \\r
241 } while (/* CONSTCOND */ 0)\r
242\r
243#define FILE_UNUSE_WLOCK(fp, l, havelock) \\r
244 do { \\r
245 if (!(havelock)) \\r
246 simple_lock(&(fp)->f_slock); \\r
247 if ((fp)->f_iflags & FIF_WANTCLOSE) { \\r
248 simple_unlock(&(fp)->f_slock); \\r
249 /* Will drop usecount */ \\r
250 (void) closef((fp), (l)); \\r
251 break; \\r
252 } else { \\r
253 (fp)->f_usecount--; \\r
254 FILE_USE_CHECK((fp), "f_usecount underflow"); \\r
255 } \\r
256 simple_unlock(&(fp)->f_slock); \\r
257 } while (/* CONSTCOND */ 0)\r
258\r
259#define FILE_UNUSE(fp, l) FILE_UNUSE_WLOCK(fp, l, 0)\r
260#define FILE_UNUSE_HAVELOCK(fp, l) FILE_UNUSE_WLOCK(fp, l, 1)\r
261\r
262__BEGIN_DECLS\r
263//int dofileread (struct lwp *, int, struct file *, void *, size_t, off_t *, int, register_t *);\r
264//int dofilewrite (struct lwp *, int, struct file *, const void *, size_t, off_t *, int, register_t *);\r
265\r
266//int dofilereadv (struct lwp *, int, struct file *, const struct iovec *, int, off_t *, int, register_t *);\r
267//int dofilewritev(struct lwp *, int, struct file *, const struct iovec *, int, off_t *, int, register_t *);\r
268\r
269//int fsetown (struct proc *, pid_t *, int, const void *);\r
270//int fgetown (struct proc *, pid_t, int, void *);\r
271//void fownsignal (pid_t, int, int, int, void *);\r
272\r
273//int fdclone (struct lwp *, struct file *, int, int, const struct fileops *, void *);\r
274\r
275/* Commonly used fileops\r
276 fnullop_* Does nothing and returns success.\r
277 fbadop_* Does nothing and returns EPERM\r
278*/\r
279//int fnullop_fcntl (struct file *, u_int, void *, struct lwp *);\r
280//int fnullop_poll (struct file *, int, struct lwp *);\r
281//int fnullop_kqfilter(struct file *, struct knote *);\r
282//int fbadop_stat (struct file *, struct stat *, struct lwp *);\r
283//int fbadop_ioctl (struct file *, u_long, void *, struct lwp *);\r
284__END_DECLS\r
285\r
286#endif\r
287\r
288#endif /* _PIF_KFILE_H_ */\r