Kernel: Start preparing for recursive paging

This commit is contained in:
apio 2022-11-08 17:12:59 +01:00
parent 2230ebd969
commit 6f72f92493
2 changed files with 25 additions and 8 deletions

View File

@ -38,6 +38,7 @@ namespace VMM
void propagate_user(PageTable* root, uint64_t vaddr);
void flush_tlb(uint64_t addr);
void flush_tlb_full();
void decompose_vaddr(uint64_t vaddr, uint64_t& page_index, uint64_t& pt_index, uint64_t& pd_index,
uint64_t& pdp_index);

View File

@ -61,6 +61,16 @@ void VMM::init()
{
kernel_pml4 = (PageTable*)read_cr3();
current_pml4 = kernel_pml4;
// Set up recursive paging
PageDirectoryEntry& recursive_pde = kernel_pml4->entries[510];
memset(&recursive_pde, 0, sizeof(PageDirectoryEntry));
recursive_pde.present = true;
recursive_pde.read_write = true;
recursive_pde.larger_pages = false;
recursive_pde.no_execute = true;
recursive_pde.set_address((uint64_t)kernel_pml4);
flush_tlb_full();
}
void VMM::unmap(uint64_t vaddr)
@ -131,6 +141,7 @@ void VMM::map(uint64_t vaddr, uint64_t paddr, int flags)
{
unmap(vaddr);
pde = create_pde_if_not_exists(current_pml4, vaddr);
will_flush_tlb = false; // unmap() already flushes the TLB for us
}
pde->set_address(round_down_to_nearest_page(paddr));
@ -295,6 +306,11 @@ void VMM::flush_tlb(uint64_t addr)
asm volatile("invlpg (%0)" : : "r"(addr) : "memory");
}
void VMM::flush_tlb_full()
{
write_cr3(current_pml4);
}
void VMM::decompose_vaddr(uint64_t vaddr, uint64_t& page_index, uint64_t& pt_index, uint64_t& pd_index,
uint64_t& pdp_index)
{