summaryrefslogtreecommitdiff
path: root/Kernel/Memory
diff options
context:
space:
mode:
authorTimon Kruiper <timonkruiper@gmail.com>2023-04-01 02:53:20 +0200
committerIdan Horowitz <idan.horowitz@gmail.com>2023-04-06 21:19:58 +0300
commit7440112cd9b680111176582bc8b05db2b3ce4c45 (patch)
tree169620b20dea1f826fdd8f4848958d8d73f0f917 /Kernel/Memory
parent6a8581855d4e32ba0da328cd89642d0154484b96 (diff)
downloadserenity-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.cpp14
-rw-r--r--Kernel/Memory/ScopedAddressSpaceSwitcher.h4
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;
};
}