aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/kapi/memory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/src/kapi/memory.cpp')
-rw-r--r--arch/x86_64/src/kapi/memory.cpp36
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