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
|
#pragma once
|
||||||
|
|
||||||
#include <BAN/LinkedList.h>
|
#include <BAN/LinkedList.h>
|
||||||
|
#include <BAN/Optional.h>
|
||||||
#include <BAN/UniqPtr.h>
|
#include <BAN/UniqPtr.h>
|
||||||
#include <kernel/Memory/Heap.h>
|
#include <kernel/Memory/Heap.h>
|
||||||
#include <kernel/Memory/PageTable.h>
|
#include <kernel/Memory/PageTable.h>
|
||||||
|
@ -19,6 +20,8 @@ namespace Kernel
|
||||||
|
|
||||||
BAN::ErrorOr<BAN::UniqPtr<GeneralAllocator>> clone(PageTable&);
|
BAN::ErrorOr<BAN::UniqPtr<GeneralAllocator>> clone(PageTable&);
|
||||||
|
|
||||||
|
BAN::Optional<paddr_t> paddr_of(vaddr_t);
|
||||||
|
|
||||||
vaddr_t allocate(size_t);
|
vaddr_t allocate(size_t);
|
||||||
bool deallocate(vaddr_t);
|
bool deallocate(vaddr_t);
|
||||||
|
|
||||||
|
@ -30,12 +33,14 @@ namespace Kernel
|
||||||
{
|
{
|
||||||
vaddr_t address { 0 };
|
vaddr_t address { 0 };
|
||||||
BAN::Vector<paddr_t> pages;
|
BAN::Vector<paddr_t> pages;
|
||||||
|
|
||||||
|
bool contains(vaddr_t);
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const vaddr_t m_first_vaddr;
|
|
||||||
PageTable& m_page_table;
|
PageTable& m_page_table;
|
||||||
BAN::LinkedList<Allocation> m_allocations;
|
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;
|
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.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();
|
m_page_table.unlock();
|
||||||
|
|
||||||
MUST(m_allocations.push_back(BAN::move(allocation)));
|
MUST(m_allocations.push_back(BAN::move(allocation)));
|
||||||
|
@ -121,4 +123,25 @@ namespace Kernel
|
||||||
return allocator;
|
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