mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 09:58:11 +00:00
Kernel: Memory-mapped files now have the absolute path as their name.
It's generated when the mapping is first created, so it won't update if the file moves. Maybe that's something we should support, too.
This commit is contained in:
parent
4320c5fd58
commit
5e1c7cb32c
9 changed files with 10 additions and 17 deletions
|
@ -84,7 +84,7 @@ dword BXVGADevice::find_framebuffer_address()
|
|||
return framebuffer_address;
|
||||
}
|
||||
|
||||
KResultOr<Region*> BXVGADevice::mmap(Process& process, LinearAddress preferred_laddr, size_t offset, size_t size, int prot)
|
||||
KResultOr<Region*> BXVGADevice::mmap(Process& process, FileDescriptor&, LinearAddress preferred_laddr, size_t offset, size_t size, int prot)
|
||||
{
|
||||
ASSERT(offset == 0);
|
||||
ASSERT(size == framebuffer_size_in_bytes());
|
||||
|
|
|
@ -18,7 +18,7 @@ public:
|
|||
void set_y_offset(int);
|
||||
|
||||
virtual int ioctl(FileDescriptor&, unsigned request, unsigned arg) override;
|
||||
virtual KResultOr<Region*> mmap(Process&, LinearAddress preferred_laddr, size_t offset, size_t, int prot) override;
|
||||
virtual KResultOr<Region*> mmap(Process&, FileDescriptor&, LinearAddress preferred_laddr, size_t offset, size_t, int prot) override;
|
||||
|
||||
size_t framebuffer_size_in_bytes() const { return m_framebuffer_size.area() * sizeof(dword) * 2; }
|
||||
Size framebuffer_size() const { return m_framebuffer_size; }
|
||||
|
|
|
@ -24,7 +24,7 @@ int File::ioctl(FileDescriptor&, unsigned, unsigned)
|
|||
return -ENOTTY;
|
||||
}
|
||||
|
||||
KResultOr<Region*> File::mmap(Process&, LinearAddress, size_t, size_t, int)
|
||||
KResultOr<Region*> File::mmap(Process&, FileDescriptor&, LinearAddress, size_t, size_t, int)
|
||||
{
|
||||
return KResult(-ENODEV);
|
||||
}
|
||||
|
|
|
@ -52,7 +52,7 @@ public:
|
|||
virtual ssize_t read(FileDescriptor&, byte*, ssize_t) = 0;
|
||||
virtual ssize_t write(FileDescriptor&, const byte*, ssize_t) = 0;
|
||||
virtual int ioctl(FileDescriptor&, unsigned request, unsigned arg);
|
||||
virtual KResultOr<Region*> mmap(Process&, LinearAddress preferred_laddr, size_t offset, size_t size, int prot);
|
||||
virtual KResultOr<Region*> mmap(Process&, FileDescriptor&, LinearAddress preferred_laddr, size_t offset, size_t size, int prot);
|
||||
|
||||
virtual String absolute_path(const FileDescriptor&) const = 0;
|
||||
|
||||
|
|
|
@ -260,7 +260,7 @@ InodeMetadata FileDescriptor::metadata() const
|
|||
|
||||
KResultOr<Region*> FileDescriptor::mmap(Process& process, LinearAddress laddr, size_t offset, size_t size, int prot)
|
||||
{
|
||||
return m_file->mmap(process, laddr, offset, size, prot);
|
||||
return m_file->mmap(process, *this, laddr, offset, size, prot);
|
||||
}
|
||||
|
||||
KResult FileDescriptor::truncate(off_t length)
|
||||
|
|
|
@ -23,19 +23,12 @@ ssize_t InodeFile::write(FileDescriptor& descriptor, const byte* data, ssize_t c
|
|||
return m_inode->write_bytes(descriptor.offset(), count, data, &descriptor);
|
||||
}
|
||||
|
||||
KResultOr<Region*> InodeFile::mmap(Process& process, LinearAddress preferred_laddr, size_t offset, size_t size, int prot)
|
||||
KResultOr<Region*> InodeFile::mmap(Process& process, FileDescriptor& descriptor, LinearAddress preferred_laddr, size_t offset, size_t size, int prot)
|
||||
{
|
||||
ASSERT(offset == 0);
|
||||
// FIXME: If PROT_EXEC, check that the underlying file system isn't mounted noexec.
|
||||
String region_name;
|
||||
#if 0
|
||||
// FIXME: I would like to do this, but it would instantiate all the damn inodes.
|
||||
region_name = absolute_path();
|
||||
#else
|
||||
region_name = "Memory-mapped file";
|
||||
#endif
|
||||
InterruptDisabler disabler;
|
||||
auto* region = process.allocate_file_backed_region(preferred_laddr, size, inode(), move(region_name), prot);
|
||||
auto* region = process.allocate_file_backed_region(preferred_laddr, size, inode(), descriptor.absolute_path(), prot);
|
||||
if (!region)
|
||||
return KResult(-ENOMEM);
|
||||
return region;
|
||||
|
|
|
@ -21,7 +21,7 @@ public:
|
|||
|
||||
virtual ssize_t read(FileDescriptor&, byte*, ssize_t) override;
|
||||
virtual ssize_t write(FileDescriptor&, const byte*, ssize_t) override;
|
||||
virtual KResultOr<Region*> mmap(Process&, LinearAddress preferred_laddr, size_t offset, size_t size, int prot) override;
|
||||
virtual KResultOr<Region*> mmap(Process&, FileDescriptor&, LinearAddress preferred_laddr, size_t offset, size_t size, int prot) override;
|
||||
|
||||
virtual String absolute_path(const FileDescriptor&) const override;
|
||||
|
||||
|
|
|
@ -89,7 +89,7 @@ int SharedMemory::write(FileDescriptor&, const byte* data, int data_size)
|
|||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
KResultOr<Region*> SharedMemory::mmap(Process& process, LinearAddress laddr, size_t offset, size_t size, int prot)
|
||||
KResultOr<Region*> SharedMemory::mmap(Process& process, FileDescriptor&, LinearAddress laddr, size_t offset, size_t size, int prot)
|
||||
{
|
||||
if (!vmo())
|
||||
return KResult(-ENODEV);
|
||||
|
|
|
@ -31,7 +31,7 @@ private:
|
|||
virtual String absolute_path(const FileDescriptor&) const override;
|
||||
virtual const char* class_name() const override { return "SharedMemory"; }
|
||||
virtual bool is_shared_memory() const override { return true; }
|
||||
virtual KResultOr<Region*> mmap(Process&, LinearAddress, size_t offset, size_t size, int prot) override;
|
||||
virtual KResultOr<Region*> mmap(Process&, FileDescriptor&, LinearAddress, size_t offset, size_t size, int prot) override;
|
||||
|
||||
SharedMemory(const String& name, uid_t, gid_t, mode_t);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue