From d0d2d4381c70ff1d12165d4dd33221932eed1f58 Mon Sep 17 00:00:00 2001 From: apio Date: Tue, 20 Sep 2022 17:16:07 +0200 Subject: [PATCH] Add a is_in_handler function to validate being in an interrupt handler --- kernel/include/interrupts/Interrupts.h | 4 ++++ kernel/src/interrupts/InterruptEntry.asm | 12 ++++++++++++ kernel/src/interrupts/Interrupts.cpp | 14 ++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/kernel/include/interrupts/Interrupts.h b/kernel/include/interrupts/Interrupts.h index 5365e370..d70ce395 100644 --- a/kernel/include/interrupts/Interrupts.h +++ b/kernel/include/interrupts/Interrupts.h @@ -1,7 +1,11 @@ #pragma once +#include "interrupts/SavedContext.h" namespace Interrupts { void enable(); void disable(); + + bool is_in_handler(); + void return_from_handler(SavedContext* context); } \ No newline at end of file diff --git a/kernel/src/interrupts/InterruptEntry.asm b/kernel/src/interrupts/InterruptEntry.asm index 04183b1c..ce9e3250 100644 --- a/kernel/src/interrupts/InterruptEntry.asm +++ b/kernel/src/interrupts/InterruptEntry.asm @@ -37,6 +37,12 @@ unused: extern common_handler +section .bss +global __is_in_interrupt_handler +__is_in_interrupt_handler: + resb 1 + +section .text global asm_common asm_common: cld @@ -66,12 +72,18 @@ asm_common: mov r8, cr2 push r8 + mov BYTE [__is_in_interrupt_handler], 1 + mov rdi, rsp call common_handler +global _asm_interrupt_exit +_asm_interrupt_exit: add rsp, 8 + mov BYTE [__is_in_interrupt_handler], 0 + pop r8 mov ds, r8 mov es, r8 diff --git a/kernel/src/interrupts/Interrupts.cpp b/kernel/src/interrupts/Interrupts.cpp index e295bc43..4a4dfa98 100644 --- a/kernel/src/interrupts/Interrupts.cpp +++ b/kernel/src/interrupts/Interrupts.cpp @@ -8,4 +8,18 @@ void Interrupts::disable() void Interrupts::enable() { asm volatile("sti"); +} + +extern char __is_in_interrupt_handler; +bool Interrupts::is_in_handler() +{ + return __is_in_interrupt_handler; +} + +void Interrupts::return_from_handler(SavedContext* context) +{ + asm volatile("mov %0, %%rsp\n" + "jmp _asm_interrupt_exit" + : + : "r"(context)); } \ No newline at end of file