diff options
Diffstat (limited to 'arch/x86_64/src/kapi/memory.cpp')
| -rw-r--r-- | arch/x86_64/src/kapi/memory.cpp | 36 |
1 files changed, 15 insertions, 21 deletions
diff --git a/arch/x86_64/src/kapi/memory.cpp b/arch/x86_64/src/kapi/memory.cpp index abc0526..ae0401e 100644 --- a/arch/x86_64/src/kapi/memory.cpp +++ b/arch/x86_64/src/kapi/memory.cpp @@ -67,25 +67,25 @@ namespace teachos::memory } //! Inject, or graft, a faux recursive PML4 into the active page mapping structure. - auto inject_faux_pml4(frame_allocator & allocator) + auto inject_faux_pml4(frame_allocator & allocator, page_mapper & mapper) { using namespace x86_64; using entry_flags = page_table::entry::flags; auto page = page::containing(unused_page_address); - auto temporary_mapper = scoped_mapping{page}; + auto temporary_mapper = scoped_mapping{page, mapper}; auto new_pml4_frame = allocator.allocate(); auto pml4 = std::construct_at(temporary_mapper.map_as<page_table>(*new_pml4_frame, entry_flags::writable)); (*pml4)[recursive_page_map_index].frame(new_pml4_frame.value(), entry_flags::present | entry_flags::writable); auto pml4_index = pml_index<4>(page); - auto & old_pml4 = paging_root::get(); - auto pml4_entry = old_pml4[pml4_index]; + auto old_pml4 = paging_root::get(); + auto pml4_entry = (*old_pml4)[pml4_index]; auto pml3_index = pml_index<3>(page); - auto old_pml3 = old_pml4.next(pml4_index); + auto old_pml3 = old_pml4->next(pml4_index); auto pml3_entry = (**old_pml3)[pml3_index]; auto pml2_index = pml_index<2>(page); @@ -96,15 +96,15 @@ namespace teachos::memory auto old_pml1 = (**old_pml2).next(pml2_index); auto pml1_entry = (**old_pml1)[pml1_index]; - paging_root::get()[recursive_page_map_index].frame(new_pml4_frame.value(), - entry_flags::present | entry_flags::writable); + (*paging_root::get())[recursive_page_map_index].frame(new_pml4_frame.value(), + entry_flags::present | entry_flags::writable); tlb_flush_all(); - auto & new_pml4 = paging_root::get(); - new_pml4[pml4_index] = pml4_entry; + auto new_pml4 = paging_root::get(); + (*new_pml4)[pml4_index] = pml4_entry; - auto new_pml3 = new_pml4.next(pml4_index); + auto new_pml3 = new_pml4->next(pml4_index); (**new_pml3)[pml3_index] = pml3_entry; auto new_pml2 = (**new_pml3).next(pml3_index); @@ -116,10 +116,10 @@ namespace teachos::memory return *new_pml4_frame; } - auto remap_kernel() -> void + auto remap_kernel(page_mapper & mapper) -> void { auto kernel_mapper = x86_64::kernel_mapper{boot::bootstrap_information.mbi}; - kernel_mapper.remap_kernel(); + kernel_mapper.remap_kernel(mapper); } auto remap_vga_text_mode_buffer(page_mapper & mapper) -> void @@ -188,16 +188,13 @@ namespace teachos::memory auto early_allocator = create_early_frame_allocator(); auto allocation_buffer = x86_64::buffered_allocator<4>{&early_allocator}; - allocator = &allocation_buffer; - auto recursive_mapper = x86_64::recursive_page_mapper{allocation_buffer}; - mapper = &recursive_mapper; - - auto new_pml4_frame = inject_faux_pml4(allocation_buffer); cio::println("[x86_64:MEM] Preparing new paging hierarchy."); - remap_kernel(); + auto new_pml4_frame = inject_faux_pml4(allocation_buffer, recursive_mapper); + + remap_kernel(recursive_mapper); remap_vga_text_mode_buffer(recursive_mapper); remap_multiboot_information(recursive_mapper); @@ -206,9 +203,6 @@ namespace teachos::memory auto cr3 = cpu::x86_64::cr3::read(); cr3.address(new_pml4_frame.start_address()); cpu::x86_64::cr3::write(cr3); - - mapper = nullptr; - allocator = nullptr; } } // namespace teachos::memory |
