From 21faaf6ea1ea0041d81c830581d1e43294a4d9d8 Mon Sep 17 00:00:00 2001 From: EnderIce2 Date: Mon, 18 Nov 2024 03:38:24 +0200 Subject: [PATCH] interrupts: Switch page table in MainInterruptHandler() --- core/interrupts_manager.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/core/interrupts_manager.cpp b/core/interrupts_manager.cpp index cd24689..a37163d 100644 --- a/core/interrupts_manager.cpp +++ b/core/interrupts_manager.cpp @@ -325,6 +325,34 @@ namespace Interrupts extern "C" nsa void MainInterruptHandler(void *Data) { + class AutoSwitchPageTable + { + private: + void *Original; + + public: + AutoSwitchPageTable() + { +#if defined(a86) + asmv("mov %%cr3, %0" : "=r"(Original)); +#endif + if (likely(Original == KernelPageTable)) + return; +#if defined(a86) + asmv("mov %0, %%cr3" : : "r"(KernelPageTable)); +#endif + } + + ~AutoSwitchPageTable() + { + if (likely(Original == KernelPageTable)) + return; +#if defined(a86) + asmv("mov %0, %%cr3" : : "r"(Original)); +#endif + } + } SwitchPageTable; + CPU::TrapFrame *Frame = (CPU::TrapFrame *)Data; // debug("IRQ%ld", Frame->InterruptNumber - 32);