diff --git a/Kernel/Arch/aarch64/PageDirectory.cpp b/Kernel/Arch/aarch64/PageDirectory.cpp index 6f74c82474..1067061282 100644 --- a/Kernel/Arch/aarch64/PageDirectory.cpp +++ b/Kernel/Arch/aarch64/PageDirectory.cpp @@ -19,30 +19,42 @@ namespace Kernel::Memory { -void PageDirectory::register_page_directory(PageDirectory*) +struct TTBR0Map { + SpinlockProtected, LockRank::None> map {}; +}; + +static Singleton s_ttbr0_map; + +void PageDirectory::register_page_directory(PageDirectory* directory) { - dbgln("FIXME: PageDirectory: Actually implement registering a page directory!"); + s_ttbr0_map->map.with([&](auto& map) { + map.insert(directory->ttbr0(), *directory); + }); } -void PageDirectory::deregister_page_directory(PageDirectory*) +void PageDirectory::deregister_page_directory(PageDirectory* directory) { - TODO_AARCH64(); + s_ttbr0_map->map.with([&](auto& map) { + map.remove(directory->ttbr0()); + }); } LockRefPtr PageDirectory::find_current() { - TODO_AARCH64(); - return nullptr; + return s_ttbr0_map->map.with([&](auto& map) { + return map.find(Aarch64::Asm::get_ttbr0_el1()); + }); } -void activate_kernel_page_directory(PageDirectory const&) +void activate_kernel_page_directory(PageDirectory const& page_directory) { - dbgln("FIXME: PageDirectory: Actually implement activating a kernel page directory!"); + Aarch64::Asm::set_ttbr0_el1(page_directory.ttbr0()); } -void activate_page_directory(PageDirectory const&, Thread*) +void activate_page_directory(PageDirectory const& page_directory, Thread* current_thread) { - TODO_AARCH64(); + current_thread->regs().ttbr0_el1 = page_directory.ttbr0(); + Aarch64::Asm::set_ttbr0_el1(page_directory.ttbr0()); } UNMAP_AFTER_INIT NonnullLockRefPtr PageDirectory::must_create_kernel_page_directory() diff --git a/Kernel/Arch/aarch64/Processor.cpp b/Kernel/Arch/aarch64/Processor.cpp index cfd0b9aacd..3d56148805 100644 --- a/Kernel/Arch/aarch64/Processor.cpp +++ b/Kernel/Arch/aarch64/Processor.cpp @@ -409,6 +409,11 @@ extern "C" void enter_thread_context(Thread* from_thread, Thread* to_thread) Processor::set_current_thread(*to_thread); + auto& from_regs = from_thread->regs(); + auto& to_regs = to_thread->regs(); + if (from_regs.ttbr0_el1 != to_regs.ttbr0_el1) + Aarch64::Asm::set_ttbr0_el1(to_regs.ttbr0_el1); + to_thread->set_cpu(Processor::current().id()); auto in_critical = to_thread->saved_critical();