forked from Bananymous/banan-os
				
			Kernel: Add API for implementing mmappable devices
This commit is contained in:
		
							parent
							
								
									d86ecf4f61
								
							
						
					
					
						commit
						4a87d6052b
					
				|  | @ -1,6 +1,7 @@ | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| #include <kernel/FS/TmpFS/Inode.h> | #include <kernel/FS/TmpFS/Inode.h> | ||||||
|  | #include <kernel/Memory/MemoryRegion.h> | ||||||
| 
 | 
 | ||||||
| namespace Kernel | namespace Kernel | ||||||
| { | { | ||||||
|  | @ -15,6 +16,8 @@ namespace Kernel | ||||||
| 		virtual bool is_partition() const { return false; } | 		virtual bool is_partition() const { return false; } | ||||||
| 		virtual bool is_storage_device() const { return false; } | 		virtual bool is_storage_device() const { return false; } | ||||||
| 
 | 
 | ||||||
|  | 		virtual BAN::ErrorOr<BAN::UniqPtr<MemoryRegion>> mmap_region(PageTable&, off_t offset, size_t len, AddressRange, MemoryRegion::Type, PageTable::flags_t) { return BAN::Error::from_errno(EINVAL); } | ||||||
|  | 
 | ||||||
| 		virtual dev_t rdev() const override = 0; | 		virtual dev_t rdev() const override = 0; | ||||||
| 
 | 
 | ||||||
| 		virtual BAN::StringView name() const = 0; | 		virtual BAN::StringView name() const = 0; | ||||||
|  |  | ||||||
|  | @ -1058,12 +1058,13 @@ namespace Kernel | ||||||
| 			return m_mapped_regions.back()->vaddr(); | 			return m_mapped_regions.back()->vaddr(); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		auto inode = TRY(m_open_file_descriptors.inode_of(args->fildes)); |  | ||||||
| 		if (inode->mode().ifreg()) |  | ||||||
| 		{ |  | ||||||
| 		if (args->addr != nullptr) | 		if (args->addr != nullptr) | ||||||
| 			return BAN::Error::from_errno(ENOTSUP); | 			return BAN::Error::from_errno(ENOTSUP); | ||||||
| 
 | 
 | ||||||
|  | 		LockGuard _(m_lock); | ||||||
|  | 
 | ||||||
|  | 		auto inode = TRY(m_open_file_descriptors.inode_of(args->fildes)); | ||||||
|  | 
 | ||||||
| 		auto inode_flags = TRY(m_open_file_descriptors.flags_of(args->fildes)); | 		auto inode_flags = TRY(m_open_file_descriptors.flags_of(args->fildes)); | ||||||
| 		if (!(inode_flags & O_RDONLY)) | 		if (!(inode_flags & O_RDONLY)) | ||||||
| 			return BAN::Error::from_errno(EACCES); | 			return BAN::Error::from_errno(EACCES); | ||||||
|  | @ -1071,20 +1072,32 @@ namespace Kernel | ||||||
| 			if ((args->prot & PROT_WRITE) && !(inode_flags & O_WRONLY)) | 			if ((args->prot & PROT_WRITE) && !(inode_flags & O_WRONLY)) | ||||||
| 				return BAN::Error::from_errno(EACCES); | 				return BAN::Error::from_errno(EACCES); | ||||||
| 
 | 
 | ||||||
| 			auto region = TRY(FileBackedRegion::create( | 		BAN::UniqPtr<MemoryRegion> memory_region; | ||||||
|  | 		if (inode->mode().ifreg()) | ||||||
|  | 		{			 | ||||||
|  | 			memory_region = TRY(FileBackedRegion::create( | ||||||
| 				inode, | 				inode, | ||||||
| 				page_table(), | 				page_table(), | ||||||
| 				args->off, args->len, | 				args->off, args->len, | ||||||
| 				{ .start = 0x400000, .end = KERNEL_OFFSET }, | 				{ .start = 0x400000, .end = KERNEL_OFFSET }, | ||||||
| 				region_type, page_flags | 				region_type, page_flags | ||||||
| 			)); | 			)); | ||||||
| 
 | 		} | ||||||
| 			LockGuard _(m_lock); | 		else if (inode->is_device()) | ||||||
| 			TRY(m_mapped_regions.push_back(BAN::move(region))); | 		{ | ||||||
| 			return m_mapped_regions.back()->vaddr(); | 			memory_region = TRY(static_cast<Device&>(*inode).mmap_region( | ||||||
|  | 				page_table(), | ||||||
|  | 				args->off, args->len, | ||||||
|  | 				{ .start = 0x400000, .end = KERNEL_OFFSET }, | ||||||
|  | 				region_type, page_flags | ||||||
|  | 			)); | ||||||
| 		} | 		} | ||||||
| 		 | 		 | ||||||
| 		return BAN::Error::from_errno(ENOTSUP); | 		if (!memory_region) | ||||||
|  | 			return BAN::Error::from_errno(ENODEV); | ||||||
|  | 
 | ||||||
|  | 		TRY(m_mapped_regions.push_back(BAN::move(memory_region))); | ||||||
|  | 		return m_mapped_regions.back()->vaddr(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	BAN::ErrorOr<long> Process::sys_munmap(void* addr, size_t len) | 	BAN::ErrorOr<long> Process::sys_munmap(void* addr, size_t len) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue