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.cpp79
1 files changed, 12 insertions, 67 deletions
diff --git a/arch/x86_64/src/kapi/memory.cpp b/arch/x86_64/src/kapi/memory.cpp
index 920c82b..36b1706 100644
--- a/arch/x86_64/src/kapi/memory.cpp
+++ b/arch/x86_64/src/kapi/memory.cpp
@@ -1,6 +1,5 @@
#include "kapi/memory.hpp"
-#include "kapi/cio.hpp"
#include "kapi/system.hpp"
#include "x86_64/boot/boot.hpp"
@@ -28,7 +27,8 @@ namespace teachos::memory
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
auto constinit allocator = static_cast<frame_allocator *>(nullptr);
- constexpr auto static unused_page_address = 0x0000'7fff'cafe'faceuz;
+ constexpr auto static unused_page_address = linear_address{0x0000'7fff'cafe'faceuz};
+ constexpr auto static recursive_page_map_index = 510;
auto create_memory_information() -> x86_64::region_allocator::memory_information
{
@@ -61,62 +61,18 @@ namespace teachos::memory
auto inject_faux_pml4(frame_allocator & allocator) -> void
{
- using entry_flags = x86_64::page_table::entry::flags;
- using page_table = x86_64::page_table;
-
- auto temporary_page = page::containing(linear_address{unused_page_address});
- auto temporary_page_address = temporary_page.start_address();
-
- auto & pml4 = x86_64::paging_root::get();
-
- // NOLINTBEGIN(cppcoreguidelines-avoid-magic-numbers)
- auto faux_pml4_frame =
- allocator.allocate()
- .and_then([&](auto frame) -> auto {
- auto index = temporary_page_address >> 39 & 0x1ffu;
- pml4[index].frame(frame, entry_flags::present | entry_flags::writable);
- return pml4.next(index);
- })
- .and_then([&](auto pml) -> auto {
- std::construct_at(pml);
- auto index = temporary_page_address >> 30 & 0x1ffu;
- (*pml)[index].frame(*allocator.allocate(), entry_flags::present | entry_flags::writable);
- return pml->next(index);
- })
- .and_then([&](auto pml) -> auto {
- std::construct_at(pml);
- auto index = temporary_page_address >> 21 & 0x1ffu;
- (*pml)[index].frame(*allocator.allocate(), entry_flags::present | entry_flags::writable);
- return pml->next(index);
- })
- .transform([&](auto pml) -> auto {
- std::construct_at(pml);
- auto index = temporary_page_address >> 12 & 0x1ffu;
- (*pml)[index].frame(*allocator.allocate(), entry_flags::present | entry_flags::writable);
- return pml;
- })
- .and_then([&](auto pml) -> auto {
- auto faux_pml4_pointer = std::bit_cast<page_table *>(temporary_page_address.raw());
- auto faux_pml4 = std::construct_at<page_table>(faux_pml4_pointer);
-
- auto index = temporary_page_address >> 12 & 0x1ffu;
- auto frame = (*pml)[index].frame();
-
- (*faux_pml4)[510].frame(*frame, entry_flags::present | entry_flags::writable);
- return frame;
- });
- // NOLINTEND(cppcoreguidelines-avoid-magic-numbers)
-
- if (!faux_pml4_frame)
- {
- system::panic("[MEM] Failed to map and construct faux PML4");
- }
+ using namespace x86_64;
+ using entry_flags = page_table::entry::flags;
+
+ auto temporary_mapper = scoped_mapping{page::containing(unused_page_address), allocator};
+ auto new_pml4_frame = allocator.allocate();
- // NOLINTNEXTLINE(cppcoreguidelines-avoid-magic-numbers)
- pml4[510].frame(*faux_pml4_frame, entry_flags::present | entry_flags::writable);
- x86_64::tlb_flush_all();
+ 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);
+ paging_root::get()[recursive_page_map_index].frame(new_pml4_frame.value(),
+ entry_flags::present | entry_flags::writable);
- cio::println("[MEM] Injected faux PML4 as recursive map.");
+ tlb_flush_all();
}
} // namespace
@@ -141,19 +97,8 @@ namespace teachos::memory
auto allocator = create_early_frame_allocator();
enable_cpu_protections();
-
- // TODO: remove
inject_faux_pml4(allocator);
- // TODO: implement
- auto temporary_mapper = x86_64::scoped_mapping{linear_address{unused_page_address}, allocator};
- auto new_pml4_frame = allocator.allocate();
-
- auto new_plm4 = temporary_mapper.map_as<x86_64::page_table>(
- *new_pml4_frame, x86_64::page_table::entry::flags::present | x86_64::page_table::entry::flags::writable);
- (*new_plm4)[510].frame(new_pml4_frame.value(),
- x86_64::page_table::entry::flags::present | x86_64::page_table::entry::flags::writable);
-
// paging::kernel_mapper kernel(allocator, memory_information);
// kernel.remap_kernel();
// video::vga::text::write("Kernel remapping successful", video::vga::text::common_attributes::green_on_black);