/* * Copyright (c) 2018-2021, Andreas Kling * Copyright (c) 2018-2022, James Mintram * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include namespace Kernel::Memory { static Singleton> s_cr3_map; static IntrusiveRedBlackTree<&PageDirectory::m_tree_node>& cr3_map() { VERIFY_INTERRUPTS_DISABLED(); return *s_cr3_map; } void PageDirectory::register_page_directory(PageDirectory* directory) { cr3_map().insert(directory->cr3(), *directory); } void PageDirectory::deregister_page_directory(PageDirectory* directory) { cr3_map().remove(directory->cr3()); } RefPtr PageDirectory::find_current() { SpinlockLocker lock(s_mm_lock); return cr3_map().find(read_cr3()); } void activate_kernel_page_directory(PageDirectory const& pgd) { write_cr3(pgd.cr3()); } void activate_page_directory(PageDirectory const& pgd, Thread* current_thread) { current_thread->regs().cr3 = pgd.cr3(); write_cr3(pgd.cr3()); } }