The Pedigree Project 0.1
DevFs.h
1/*
2 * Copyright (c) 2008-2014, Pedigree Developers
3 *
4 * Please see the CONTRIB file in the root of the source tree for a full
5 * list of contributors.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#ifndef DEVFS_H
21#define DEVFS_H
22
23#include "pedigree/kernel/Log.h"
24#include "pedigree/kernel/graphics/Graphics.h"
25#include "pedigree/kernel/graphics/GraphicsService.h"
26#include "pedigree/kernel/machine/InputManager.h"
27#include "pedigree/kernel/process/Mutex.h"
28#include "pedigree/kernel/utilities/ExtensibleBitmap.h"
29#include "pedigree/kernel/utilities/Vector.h"
30
31#include "modules/subsys/posix/PsAuxFile.h"
32#include "modules/subsys/posix/VirtualTerminal.h"
33#include "modules/system/vfs/Directory.h"
34#include "modules/system/vfs/File.h"
35#include "modules/system/vfs/Filesystem.h"
36
37class DevFs;
38class DevFsDirectory;
39class Serial;
40
41extern DevFs* g_pDevFs;
42
43class RandomFile : public File {
44 public:
45 RandomFile(String str, size_t inode, Filesystem* pParentFS, File* pParent)
46 : File(str, 0, 0, 0, inode, pParentFS, 0, pParent) {
47 setPermissionsOnly(FILE_UR | FILE_UW | FILE_GR | FILE_GW | FILE_OR | FILE_OW);
48 setUidOnly(0);
49 setGidOnly(0);
50 }
51 ~RandomFile() {}
52
53 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
54 bool bCanBlock = true);
55 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
56 bool bCanBlock = true);
57 bool supports(size_t command) const override;
58 int command(size_t command, void* buffer) override;
59
60 private:
61 virtual bool isBytewise() const {
62 return true;
63 }
64};
65
66class NullFile : public File {
67 public:
68 NullFile(String str, size_t inode, Filesystem* pParentFS, File* pParentNode)
69 : File(str, 0, 0, 0, inode, pParentFS, 0, pParentNode) {
70 setPermissionsOnly(FILE_UR | FILE_UW | FILE_GR | FILE_GW | FILE_OR | FILE_OW);
71 setUidOnly(0);
72 setGidOnly(0);
73 }
74 ~NullFile() {}
75
76 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
77 bool bCanBlock = true);
78 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
79 bool bCanBlock = true);
80
81 private:
82 virtual bool isBytewise() const {
83 return true;
84 }
85};
86
87class ZeroFile : public File {
88 public:
89 ZeroFile(String str, size_t inode, Filesystem* pParentFS, File* pParentNode)
90 : File(str, 0, 0, 0, inode, pParentFS, 0, pParentNode) {
91 setPermissionsOnly(FILE_UR | FILE_UW | FILE_GR | FILE_GW | FILE_OR | FILE_OW);
92 setUidOnly(0);
93 setGidOnly(0);
94 }
95 ~ZeroFile() {}
96
97 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
98 bool bCanBlock = true);
99 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
100 bool bCanBlock = true);
101
102 private:
103 virtual bool isBytewise() const {
104 return true;
105 }
106};
107
108class SerialFile : public File {
109 public:
110 SerialFile(String str, size_t inode, Filesystem* pParentFS, File* pParent, Serial* serial);
111 ~SerialFile() {}
112
113 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
114 bool bCanBlock = true);
115 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
116 bool bCanBlock = true);
117 virtual int select(bool bWriting = false, int timeout = 0);
118
119 private:
120 Serial* m_Serial;
121
122 virtual bool isBytewise() const {
123 return true;
124 }
125};
126
127class PtmxFile : public File {
128 public:
129 PtmxFile(String str, size_t inode, Filesystem* pParentFS, File* pParent,
130 DevFsDirectory* m_pPtsDirectory, uint32_t slavePermissions = 0333,
131 bool callerOwns = false);
132 ~PtmxFile();
133
134 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
135 bool bCanBlock = true);
136 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
137 bool bCanBlock = true);
138
139 // override open() to correctly handle returning a master and creating
140 // the associated slave.
141 virtual File* open();
142 bool isCharacterDevice() const override {
143 return true;
144 }
145 uint64_t deviceNumber() const override {
146 return 0x0502;
147 }
148
149 private:
150 ExtensibleBitmap m_Terminals;
151 DevFsDirectory* m_pPtsDirectory;
152 Mutex m_Lock;
153 Vector<File*> m_Masters;
154 uint32_t m_SlavePermissions;
155 bool m_CallerOwns;
156
157 virtual bool isBytewise() const {
158 return true;
159 }
160};
161
162class RtcFile : public File {
163 public:
164 RtcFile(size_t inode, Filesystem* pParentFS, File* pParentNode)
165 : File(String("rtc"), 0, 0, 0, inode, pParentFS, 0, pParentNode) {
166 setPermissionsOnly(FILE_UR | FILE_UW | FILE_GR | FILE_GW | FILE_OR);
167 setUidOnly(0);
168 setGidOnly(0);
169 }
170 ~RtcFile() {}
171
172 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
173 bool bCanBlock = true);
174 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
175 bool bCanBlock = true);
176
177 virtual bool supports(const size_t command) const;
178 virtual int command(const size_t command, void* buffer);
179
180 private:
181 virtual bool isBytewise() const {
182 return true;
183 }
184};
185
186class FramebufferFile : public File {
187 public:
188 FramebufferFile(String str, size_t inode, Filesystem* pParentFS, File* pParentNode);
190
191 bool initialise();
192
193 virtual uintptr_t readBlock(uint64_t location);
194 virtual physical_uintptr_t getPhysicalPage(size_t offset);
195 bool isDirectPhysicalMapping() const override {
196 return true;
197 }
198 void returnPhysicalPage(size_t offset) override;
199
200 virtual bool supports(const size_t command) const;
201 virtual int command(const size_t command, void* buffer);
202
204
205 private:
207
208 bool m_bTextMode;
209 size_t m_nDepth;
210 uint32_t m_LinuxPalette[256];
211};
212
213class Tty0File : public File {
214 public:
215 Tty0File(String str, size_t inode, Filesystem* pParentFS, File* pParent, DevFs* devfs);
216 ~Tty0File();
217
218 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
219 bool bCanBlock = true);
220 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
221 bool bCanBlock = true);
222
223 // override open() to correctly handle returning a master and creating
224 // the associated slave.
225 virtual File* open();
226
227 private:
228 DevFs* m_pDevFs;
229
230 virtual bool isBytewise() const {
231 return true;
232 }
233};
234
235class MemFile : public File {
236 public:
237 MemFile(String name, size_t inode, Filesystem* pParentFS, File* pParentNode)
238 : File(name, 0, 0, 0, inode, pParentFS, 0, pParentNode) {
239 setPermissionsOnly(FILE_UR | FILE_UW | FILE_GR | FILE_GW | FILE_OR | FILE_OW);
240 setUidOnly(0);
241 setGidOnly(0);
242 }
243 ~MemFile() {}
244
245 virtual physical_uintptr_t getPhysicalPage(size_t offset);
246 bool isDirectPhysicalMapping() const override {
247 return true;
248 }
249 virtual void returnPhysicalPage(size_t offset);
250};
251
254class DevFsDirectory : public Directory {
255 public:
256 DevFsDirectory(String name, Time::Timestamp accessedTime, Time::Timestamp modifiedTime,
257 Time::Timestamp creationTime, uintptr_t inode, class Filesystem* pFs, size_t size,
258 File* pParent)
259 : Directory(name, accessedTime, modifiedTime, creationTime, inode, pFs, size, pParent) {}
260
261 virtual ~DevFsDirectory();
262
263 bool addEntry(String name, File* pFile) {
264 return addDirectoryEntry(name, pFile);
265 }
266};
267
269class DevFs : public Filesystem {
270 public:
271 SyncStatus sync() override {
272 return SyncStatus::Success;
273 }
274
275 DevFs()
276 : m_pRoot(0), m_CttySelector(nullptr), m_Serial(nullptr), m_VtManager(0), m_pPsAuxFile(0) {}
277
278 virtual ~DevFs();
279
280 virtual bool initialise(Disk* pDisk);
281
282 virtual File* getRoot() const {
283 return m_pRoot;
284 }
285 virtual const String& getVolumeLabel() const {
286 static String devfsLabel("dev");
287 return devfsLabel;
288 }
289
290 virtual size_t getNextInode();
291 virtual void revertInode();
292
293 bool isControllingTerminalSelector(const File* file) const {
294 return file && file == m_CttySelector;
295 }
296
297 void handleInput(InputManager::InputNotification& in);
298
299 VirtualTerminalManager& getTerminalManager() {
300 return *m_VtManager;
301 }
302
303 protected:
304 virtual bool createFile(File* parent, const String& filename, uint32_t mask) {
305 return false;
306 }
307 virtual bool createDirectory(File* parent, const String& filename, uint32_t mask) {
308 return false;
309 }
310 virtual bool createSymlink(File* parent, const String& filename, const String& value) {
311 return false;
312 }
313 virtual bool removeNode(File*, const String&, File*) {
314 return false;
315 }
316
317 private:
318 DevFs(const DevFs&);
319 DevFs& operator=(const DevFs&);
320
321 DevFsDirectory* m_pRoot;
322 File* m_CttySelector;
323 SerialFile* m_Serial;
324
325 size_t m_NextInode;
326
327 VirtualTerminalManager* m_VtManager;
328
329 PsAuxFile* m_pPsAuxFile;
330};
331
332#endif
Definition DevFs.h:269
virtual bool createDirectory(File *parent, const String &filename, uint32_t mask)
Definition DevFs.h:307
SyncStatus sync() override
Definition DevFs.h:271
virtual const String & getVolumeLabel() const
Definition DevFs.h:285
virtual bool initialise(Disk *pDisk)
Definition DevFs.cc:814
virtual File * getRoot() const
Definition DevFs.h:282
virtual bool removeNode(File *, const String &, File *)
Definition DevFs.h:313
virtual bool createFile(File *parent, const String &filename, uint32_t mask)
Definition DevFs.h:304
virtual bool createSymlink(File *parent, const String &filename, const String &value)
Definition DevFs.h:310
bool addDirectoryEntry(const String &name, File *pTarget)
Definition Directory.cc:835
Definition Disk.h:35
Definition File.h:75
void setGidOnly(size_t gid)
Definition File.cc:1448
void setPermissionsOnly(uint32_t perms)
Definition File.cc:1440
void setUidOnly(size_t uid)
Definition File.cc:1444
File()
Definition File.cc:165
GraphicsService::GraphicsParameters * m_pGraphicsParameters
Definition DevFs.h:206
void returnPhysicalPage(size_t offset) override
Definition DevFs.cc:500
virtual int command(const size_t command, void *buffer)
Definition DevFs.cc:511
virtual bool supports(const size_t command) const
Definition DevFs.cc:504
virtual physical_uintptr_t getPhysicalPage(size_t offset)
Definition DevFs.cc:491
virtual uintptr_t readBlock(uint64_t location)
Definition DevFs.cc:476
virtual void returnPhysicalPage(size_t offset)
Definition DevFs.cc:797
virtual physical_uintptr_t getPhysicalPage(size_t offset)
Definition DevFs.cc:792
Definition Mutex.h:56
virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition DevFs.cc:247
virtual bool isBytewise() const
Definition DevFs.h:82
virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition DevFs.cc:242
virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition DevFs.cc:270
virtual bool isBytewise() const
Definition DevFs.h:157
virtual File * open()
Definition DevFs.cc:280
virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition DevFs.cc:275
virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition DevFs.cc:173
virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition DevFs.cc:194
bool supports(size_t command) const override
Definition DevFs.cc:201
int command(size_t command, void *buffer) override
Definition DevFs.cc:205
virtual bool isBytewise() const
Definition DevFs.h:61
virtual bool isBytewise() const
Definition DevFs.h:181
virtual int command(const size_t command, void *buffer)
Definition DevFs.cc:422
virtual bool supports(const size_t command) const
Definition DevFs.cc:415
virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition DevFs.cc:410
virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition DevFs.cc:406
virtual int select(bool bWriting=false, int timeout=0)
Definition DevFs.cc:399
virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition DevFs.cc:386
virtual bool isBytewise() const
Definition DevFs.h:122
virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition DevFs.cc:360
virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition DevFs.cc:782
virtual File * open()
Definition DevFs.cc:787
virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition DevFs.cc:777
virtual bool isBytewise() const
Definition DevFs.h:230
A vector / dynamic array.
Definition Vector.h:33
virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition DevFs.cc:341
virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition DevFs.cc:347
virtual bool isBytewise() const
Definition DevFs.h:103