diff options
author | Timon Kruiper <timonkruiper@gmail.com> | 2023-04-01 02:53:20 +0200 |
---|---|---|
committer | Idan Horowitz <idan.horowitz@gmail.com> | 2023-04-06 21:19:58 +0300 |
commit | 7440112cd9b680111176582bc8b05db2b3ce4c45 (patch) | |
tree | 169620b20dea1f826fdd8f4848958d8d73f0f917 /Kernel/Memory | |
parent | 6a8581855d4e32ba0da328cd89642d0154484b96 (diff) | |
download | serenity-7440112cd9b680111176582bc8b05db2b3ce4c45.zip |
Kernel: Implement ScopedAddressSpaceSwitcher using PageDirectory
This makes the code architecture independent, and thus makes it work for
aarch64.
Diffstat (limited to 'Kernel/Memory')
-rw-r--r-- | Kernel/Memory/ScopedAddressSpaceSwitcher.cpp | 14 | ||||
-rw-r--r-- | Kernel/Memory/ScopedAddressSpaceSwitcher.h | 4 |
2 files changed, 6 insertions, 12 deletions
diff --git a/Kernel/Memory/ScopedAddressSpaceSwitcher.cpp b/Kernel/Memory/ScopedAddressSpaceSwitcher.cpp index 0bbf51601d..5abd6b04b5 100644 --- a/Kernel/Memory/ScopedAddressSpaceSwitcher.cpp +++ b/Kernel/Memory/ScopedAddressSpaceSwitcher.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> + * Copyright (c) 2023, Timon Kruiper <timonkruiper@gmail.com> * * SPDX-License-Identifier: BSD-2-Clause */ @@ -13,23 +14,14 @@ namespace Kernel { ScopedAddressSpaceSwitcher::ScopedAddressSpaceSwitcher(Process& process) { VERIFY(Thread::current() != nullptr); -#if ARCH(X86_64) - m_previous_cr3 = read_cr3(); -#elif ARCH(AARCH64) - TODO_AARCH64(); -#endif + m_previous_page_directory = Memory::PageDirectory::find_current(); Memory::MemoryManager::enter_process_address_space(process); } ScopedAddressSpaceSwitcher::~ScopedAddressSpaceSwitcher() { InterruptDisabler disabler; -#if ARCH(X86_64) - Thread::current()->regs().cr3 = m_previous_cr3; - write_cr3(m_previous_cr3); -#elif ARCH(AARCH64) - TODO_AARCH64(); -#endif + Memory::activate_page_directory(*m_previous_page_directory, Thread::current()); } } diff --git a/Kernel/Memory/ScopedAddressSpaceSwitcher.h b/Kernel/Memory/ScopedAddressSpaceSwitcher.h index d547072931..a0c7ceb363 100644 --- a/Kernel/Memory/ScopedAddressSpaceSwitcher.h +++ b/Kernel/Memory/ScopedAddressSpaceSwitcher.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org> + * Copyright (c) 2023, Timon Kruiper <timonkruiper@gmail.com> * * SPDX-License-Identifier: BSD-2-Clause */ @@ -7,6 +8,7 @@ #pragma once #include <AK/Types.h> +#include <Kernel/Arch/PageDirectory.h> #include <Kernel/Forward.h> namespace Kernel { @@ -17,7 +19,7 @@ public: ~ScopedAddressSpaceSwitcher(); private: - u32 m_previous_cr3 { 0 }; + LockRefPtr<Memory::PageDirectory> m_previous_page_directory; }; } |