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, 22 insertions, 14 deletions
diff --git a/arch/x86_64/src/kapi/memory.cpp b/arch/x86_64/src/kapi/memory.cpp index abfb32e..8c53c4c 100644 --- a/arch/x86_64/src/kapi/memory.cpp +++ b/arch/x86_64/src/kapi/memory.cpp @@ -24,6 +24,7 @@ #include <cstddef> #include <cstdint> #include <memory> +#include <optional> #include <span> #include <utility> @@ -36,7 +37,7 @@ namespace teachos::memory constexpr auto static recursive_page_map_index = x86_64::page_table::entry_count - 2; //! Instantiate a basic, memory region based, early frame allocator for remapping. - auto create_early_frame_allocator() + auto collect_memory_information() { auto memory_map = boot::bootstrap_information.mbi->maybe_memory_map(); if (!memory_map) @@ -48,12 +49,10 @@ namespace teachos::memory auto mbi_span = std::span{std::bit_cast<std::byte *>(mbi), mbi->size_bytes()}; auto image_span = std::span{&boot::x86_64::_start_physical, &boot::x86_64::_end_physical}; - return x86_64::region_allocator{ - { - .image_range = std::make_pair(physical_address{&image_span.front()}, physical_address{&image_span.back()}), - .mbi_range = std::make_pair(physical_address{&mbi_span.front()}, physical_address{&mbi_span.back()}), - .memory_map = *memory_map, - } + return x86_64::region_allocator::memory_information{ + .image_range = std::make_pair(physical_address{&image_span.front()}, physical_address{&image_span.back()}), + .mbi_range = std::make_pair(physical_address{&mbi_span.front()}, physical_address{&mbi_span.back()}), + .memory_map = *memory_map, }; } @@ -150,6 +149,12 @@ namespace teachos::memory } // namespace + // NOLINTBEGIN(cppcoreguidelines-avoid-non-const-global-variables) + auto constinit region_based_allocator = std::optional<x86_64::region_allocator>{}; + auto constinit buffered_allocator = std::optional<x86_64::buffered_allocator<4>>{}; + auto constinit recursive_page_mapper = std::optional<x86_64::recursive_page_mapper>{}; + // NOLINTEND(cppcoreguidelines-avoid-non-const-global-variables) + auto init() -> void { auto static constinit is_initialized = std::atomic_flag{}; @@ -163,23 +168,26 @@ namespace teachos::memory enable_cpu_protections(); - auto early_allocator = create_early_frame_allocator(); - auto allocation_buffer = x86_64::buffered_allocator<4>{&early_allocator}; - auto recursive_mapper = x86_64::recursive_page_mapper{allocation_buffer}; + region_based_allocator.emplace(collect_memory_information()); + buffered_allocator.emplace(&*region_based_allocator); + recursive_page_mapper.emplace(*buffered_allocator); cio::println("[x86_64:MEM] Preparing new paging hierarchy."); - auto new_pml4_frame = inject_faux_pml4(allocation_buffer, recursive_mapper); + auto new_pml4_frame = inject_faux_pml4(*buffered_allocator, *recursive_page_mapper); - remap_kernel(recursive_mapper); - remap_vga_text_mode_buffer(recursive_mapper); - remap_multiboot_information(recursive_mapper); + remap_kernel(*recursive_page_mapper); + remap_vga_text_mode_buffer(*recursive_page_mapper); + remap_multiboot_information(*recursive_page_mapper); cio::println("[x86_64:MEM] Switching to new paging hierarchy."); auto cr3 = cpu::x86_64::cr3::read(); cr3.address(new_pml4_frame.start_address()); cpu::x86_64::cr3::write(cr3); + + set_frame_allocator(*buffered_allocator); + set_page_mapper(*recursive_page_mapper); } } // namespace teachos::memory |
