Kernel: Add GeneralAllocator::paddr_of
Yoy can now query physical address of a virtual address for general allocator allocation
This commit is contained in:
		
							parent
							
								
									d354cccd37
								
							
						
					
					
						commit
						388f530edd
					
				|  | @ -1,6 +1,7 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include <BAN/LinkedList.h> | ||||
| #include <BAN/Optional.h> | ||||
| #include <BAN/UniqPtr.h> | ||||
| #include <kernel/Memory/Heap.h> | ||||
| #include <kernel/Memory/PageTable.h> | ||||
|  | @ -19,6 +20,8 @@ namespace Kernel | |||
| 
 | ||||
| 		BAN::ErrorOr<BAN::UniqPtr<GeneralAllocator>> clone(PageTable&); | ||||
| 
 | ||||
| 		BAN::Optional<paddr_t> paddr_of(vaddr_t); | ||||
| 
 | ||||
| 		vaddr_t allocate(size_t); | ||||
| 		bool deallocate(vaddr_t); | ||||
| 
 | ||||
|  | @ -30,12 +33,14 @@ namespace Kernel | |||
| 		{ | ||||
| 			vaddr_t address { 0 }; | ||||
| 			BAN::Vector<paddr_t> pages; | ||||
| 
 | ||||
| 			bool contains(vaddr_t); | ||||
| 		}; | ||||
| 
 | ||||
| 	private: | ||||
| 		const vaddr_t m_first_vaddr; | ||||
| 		PageTable& m_page_table; | ||||
| 		BAN::LinkedList<Allocation> m_allocations; | ||||
| 		const vaddr_t m_first_vaddr; | ||||
| 	}; | ||||
| 
 | ||||
| } | ||||
|  | @ -51,9 +51,11 @@ namespace Kernel | |||
| 		{ | ||||
| 			vaddr_t vaddr = allocation.address + i * PAGE_SIZE; | ||||
| 			m_page_table.map_page_at(allocation.pages[i], vaddr, PageTable::Flags::UserSupervisor | PageTable::Flags::ReadWrite | PageTable::Flags::Present); | ||||
| 			m_page_table.invalidate(vaddr); | ||||
| 		} | ||||
| 
 | ||||
| 		if (&m_page_table == &PageTable::current()) | ||||
| 			m_page_table.load(); | ||||
| 
 | ||||
| 		m_page_table.unlock(); | ||||
| 
 | ||||
| 		MUST(m_allocations.push_back(BAN::move(allocation))); | ||||
|  | @ -121,4 +123,25 @@ namespace Kernel | |||
| 		return allocator; | ||||
| 	} | ||||
| 
 | ||||
| 	BAN::Optional<paddr_t> GeneralAllocator::paddr_of(vaddr_t vaddr) | ||||
| 	{ | ||||
| 		for (auto& allocation : m_allocations) | ||||
| 		{ | ||||
| 			if (!allocation.contains(vaddr)) | ||||
| 				continue; | ||||
| 			 | ||||
| 			size_t offset = vaddr - allocation.address; | ||||
| 			size_t page_index = offset / PAGE_SIZE; | ||||
| 			size_t page_offset = offset % PAGE_SIZE; | ||||
| 			return allocation.pages[page_index] + page_offset; | ||||
| 		} | ||||
| 
 | ||||
| 		return {}; | ||||
| 	} | ||||
| 
 | ||||
| 	bool GeneralAllocator::Allocation::contains(vaddr_t vaddr) | ||||
| 	{ | ||||
| 		return this->address <= vaddr && vaddr < this->address + this->pages.size() * PAGE_SIZE; | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
		Loading…
	
		Reference in New Issue