mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 00:47:45 +00:00
Kernel/aarch64: Keep track of root page table and kernel directory table
This commit is contained in:
parent
697c5ca5e5
commit
d9946c8e89
1 changed files with 17 additions and 0 deletions
|
@ -239,6 +239,17 @@ static u64* get_page_directory(u64* root_table, VirtualAddress virtual_addr)
|
||||||
return descriptor_to_pointer(level2_table[level1_idx]);
|
return descriptor_to_pointer(level2_table[level1_idx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u64* get_page_directory_table(u64* root_table, VirtualAddress virtual_addr)
|
||||||
|
{
|
||||||
|
u64 level0_idx = (virtual_addr.get() >> 39) & 0x1FF;
|
||||||
|
u64* level1_table = root_table;
|
||||||
|
|
||||||
|
if (level1_table[level0_idx] == 0)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
return descriptor_to_pointer(level1_table[level0_idx]);
|
||||||
|
}
|
||||||
|
|
||||||
static void setup_kernel_page_directory(u64* root_table)
|
static void setup_kernel_page_directory(u64* root_table)
|
||||||
{
|
{
|
||||||
auto kernel_page_directory = (PhysicalPtr)get_page_directory(root_table, VirtualAddress { *adjust_by_mapping_base(&kernel_mapping_base) });
|
auto kernel_page_directory = (PhysicalPtr)get_page_directory(root_table, VirtualAddress { *adjust_by_mapping_base(&kernel_mapping_base) });
|
||||||
|
@ -246,6 +257,12 @@ static void setup_kernel_page_directory(u64* root_table)
|
||||||
panic_without_mmu("Could not find kernel page directory!"sv);
|
panic_without_mmu("Could not find kernel page directory!"sv);
|
||||||
|
|
||||||
*adjust_by_mapping_base(&boot_pd_kernel) = PhysicalAddress(kernel_page_directory);
|
*adjust_by_mapping_base(&boot_pd_kernel) = PhysicalAddress(kernel_page_directory);
|
||||||
|
|
||||||
|
// FIXME: Rename boot_pml4t to something architecture agnostic.
|
||||||
|
*adjust_by_mapping_base(&boot_pml4t) = PhysicalAddress((PhysicalPtr)root_table);
|
||||||
|
|
||||||
|
// FIXME: Rename to directory_table or similar
|
||||||
|
*adjust_by_mapping_base(&boot_pdpt) = PhysicalAddress((PhysicalPtr)get_page_directory_table(root_table, VirtualAddress { *adjust_by_mapping_base(&kernel_mapping_base) }));
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_page_tables()
|
void init_page_tables()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue