ScopedAddressSpaceSwitcher.cpp 669 B

123456789101112131415161718192021222324252627
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/Arch/InterruptDisabler.h>
  7. #include <Kernel/Memory/MemoryManager.h>
  8. #include <Kernel/Memory/ScopedAddressSpaceSwitcher.h>
  9. namespace Kernel {
  10. ScopedAddressSpaceSwitcher::ScopedAddressSpaceSwitcher(Process& process)
  11. {
  12. VERIFY(Thread::current() != nullptr);
  13. m_previous_cr3 = read_cr3();
  14. Memory::MemoryManager::enter_process_address_space(process);
  15. }
  16. ScopedAddressSpaceSwitcher::~ScopedAddressSpaceSwitcher()
  17. {
  18. InterruptDisabler disabler;
  19. Thread::current()->regs().cr3 = m_previous_cr3;
  20. write_cr3(m_previous_cr3);
  21. }
  22. }