The Pedigree Project 0.1
ProcFs.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 PROCFS_H
21#define PROCFS_H
22
23#include "pedigree/kernel/Atomic.h"
24#include "pedigree/kernel/Log.h"
25#include "pedigree/kernel/machine/Machine.h"
26#include "pedigree/kernel/machine/Timer.h"
27#include "pedigree/kernel/process/Process.h"
28#include "pedigree/kernel/process/Semaphore.h"
29#include "pedigree/kernel/utilities/ExtensibleBitmap.h"
30
31#include "modules/system/vfs/Directory.h"
32#include "modules/system/vfs/File.h"
33#include "modules/system/vfs/Filesystem.h"
34
35class ProcFs;
36class ProcFsDirectory;
37class Thread;
38class PosixProcess;
40
41class MeminfoFile : public File {
42 public:
43 MeminfoFile(size_t inode, Filesystem* pParentFS, File* pParent);
45
46 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
47 bool bCanBlock = true);
48 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
49 bool bCanBlock = true);
50
51 virtual size_t getSize();
52
53 private:
54 void updateContents();
55
56 String m_Contents;
57 Mutex m_Lock;
58
59 virtual bool isBytewise() const {
60 return true;
61 }
62};
63
64class PciDevicesFile : public File {
65 public:
66 PciDevicesFile(size_t inode, Filesystem* pParentFS, File* pParent);
68
69 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
70 bool bCanBlock = true);
71 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
72 bool bCanBlock = true);
73
74 virtual size_t getSize();
75
76 private:
77 void resync();
78
79 String m_Contents;
80
81 virtual bool isBytewise() const {
82 return true;
83 }
84};
85
86class MountFile : public File {
87 public:
88 MountFile(size_t inode, Filesystem* pParentFS, File* pParent);
89 ~MountFile();
90
91 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
92 bool bCanBlock = true);
93 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
94 bool bCanBlock = true);
95
96 virtual size_t getSize();
97
98 private:
99 virtual bool isBytewise() const {
100 return true;
101 }
102};
103
104class UptimeFile : public File {
105 public:
106 UptimeFile(size_t inode, Filesystem* pParentFS, File* pParent);
107 ~UptimeFile();
108
109 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
110 bool bCanBlock = true);
111 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
112 bool bCanBlock = true);
113
114 virtual size_t getSize();
115
116 private:
117 String generateString();
118
119 virtual bool isBytewise() const {
120 return true;
121 }
122};
123
124class ConstantFile : public File {
125 public:
126 ConstantFile(String name, const char* value, size_t size, size_t inode, Filesystem* pParentFS,
127 File* pParent);
129
130 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
131 bool bCanBlock = true);
132 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
133 bool bCanBlock = true);
134
135 virtual size_t getSize();
136
137 private:
138 char* m_Contents;
139 size_t m_Size;
140
141 virtual bool isBytewise() const {
142 return true;
143 }
144};
145
149 public:
150 using Directory::markDetached;
151
152 ProcFsDirectory(String name, Time::Timestamp accessedTime, Time::Timestamp modifiedTime,
153 Time::Timestamp creationTime, uintptr_t inode, class Filesystem* pFs, size_t size,
154 File* pParent)
155 : Directory(name, accessedTime, modifiedTime, creationTime, inode, pFs, size, pParent) {}
156
157 virtual ~ProcFsDirectory();
158
159 void addEntry(String name, File* pFile) {
160 addDirectoryEntry(name, pFile);
161 }
162};
163
165class ProcFs : public Filesystem {
166 public:
167 SyncStatus sync() override {
168 return SyncStatus::Success;
169 }
170
171 explicit ProcFs(const SharedPointer<UserspacePidNamespace>& space = Process::rootPidNamespace())
172 : m_PidNamespace(space), m_pRoot(0), m_NextInode(0) {}
173 const SharedPointer<UserspacePidNamespace>& pidNamespace() const {
174 return m_PidNamespace;
175 }
176 static void publishProcess(PosixProcess* process);
177 static void unpublishProcess(PosixProcess* process);
178
179 virtual ~ProcFs();
180
181 virtual bool initialise(Disk* pDisk);
182
183 virtual File* getRoot() const {
184 return m_pRoot;
185 }
186 virtual const String& getVolumeLabel() const {
187 static String volumeLabel("proc");
188 return volumeLabel;
189 }
190
191 virtual size_t getNextInode();
192 virtual void revertInode();
193
194 void addProcess(PosixProcess* proc);
195 void removeProcess(PosixProcess* proc);
196 void invalidateNamespaceTask(const SharedPointer<PosixNamespaceContext>& context, size_t pid,
197 size_t taskId);
198
199 protected:
200 virtual bool createFile(File* parent, const String& filename, uint32_t mask) {
201 return false;
202 }
203 virtual bool createDirectory(File* parent, const String& filename, uint32_t mask) {
204 return false;
205 }
206 virtual bool createSymlink(File* parent, const String& filename, const String& value) {
207 return false;
208 }
209 virtual bool removeNode(File*, const String&, File*) {
210 return false;
211 }
212
213 private:
214 ProcFs(const ProcFs&);
215 ProcFs& operator=(const ProcFs&);
216
217 bool initialiseNamespaceLinks();
218 void initialiseResolverFile();
219 void initialiseNetworkFile();
220 ProcFsDirectory* createProcessDirectory(PosixProcess* process);
221
223 ProcFs* m_RegistryNext = nullptr;
224 bool m_Registered = false;
225 ProcFsDirectory* m_pRoot;
226
227 Atomic<size_t> m_NextInode;
228
229 String m_PciDevices;
230};
231
232void procfsInvalidateNamespaceTask(const SharedPointer<PosixNamespaceContext>& context, size_t pid,
233 size_t taskId);
234
235bool procfsAddUserMaps(ProcFs&, ProcFsDirectory&, Process&);
236
237bool procfsAddSystemStatusFiles(ProcFs& filesystem, ProcFsDirectory& root);
238bool procfsAddProcessStatusFiles(ProcFs& filesystem, ProcFsDirectory& directory, size_t pid);
239
240#endif // PROCFS_H
virtual bool isBytewise() const
Definition ProcFs.h:141
virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition ProcFs.cc:316
virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition ProcFs.cc:300
bool addDirectoryEntry(const String &name, File *pTarget)
Definition Directory.cc:835
Definition Disk.h:35
Definition File.h:75
virtual bool isBytewise() const
Definition ProcFs.h:59
virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition ProcFs.cc:82
virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition ProcFs.cc:101
virtual bool isBytewise() const
Definition ProcFs.h:99
virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition ProcFs.cc:222
virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition ProcFs.cc:202
Definition Mutex.h:56
virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition ProcFs.cc:121
virtual bool isBytewise() const
Definition ProcFs.h:81
virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition ProcFs.cc:139
void resync()
Definition ProcFs.cc:144
SyncStatus sync() override
Definition ProcFs.h:167
virtual bool removeNode(File *, const String &, File *)
Definition ProcFs.h:209
virtual File * getRoot() const
Definition ProcFs.h:183
virtual bool createDirectory(File *parent, const String &filename, uint32_t mask)
Definition ProcFs.h:203
virtual bool createFile(File *parent, const String &filename, uint32_t mask)
Definition ProcFs.h:200
virtual bool createSymlink(File *parent, const String &filename, const String &value)
Definition ProcFs.h:206
virtual const String & getVolumeLabel() const
Definition ProcFs.h:186
void addProcess(PosixProcess *proc)
Definition ProcFs.cc:533
virtual bool initialise(Disk *pDisk)
Definition ProcFs.cc:341
virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition ProcFs.cc:261
virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
Definition ProcFs.cc:242
virtual bool isBytewise() const
Definition ProcFs.h:119