From b3e16068eff4cf3fd18b8c0fc0dfe3801a483515 Mon Sep 17 00:00:00 2001 From: apio Date: Wed, 12 Oct 2022 12:56:55 +0200 Subject: [PATCH] Kernel: Add Utilities::get_rflags(), and thus Interrupts::are_enabled() --- kernel/include/interrupts/Interrupts.h | 2 ++ kernel/include/misc/utils.h | 2 ++ kernel/src/interrupts/Interrupts.cpp | 6 ++++++ kernel/src/main.asm | 6 ++++++ kernel/src/misc/utils.cpp | 6 ++++++ 5 files changed, 22 insertions(+) diff --git a/kernel/include/interrupts/Interrupts.h b/kernel/include/interrupts/Interrupts.h index c87edbf0..507fa590 100644 --- a/kernel/include/interrupts/Interrupts.h +++ b/kernel/include/interrupts/Interrupts.h @@ -8,4 +8,6 @@ namespace Interrupts bool is_in_handler(); void return_from_handler(Context* context); + + bool are_enabled(); } \ No newline at end of file diff --git a/kernel/include/misc/utils.h b/kernel/include/misc/utils.h index a2ecab57..2d009e19 100644 --- a/kernel/include/misc/utils.h +++ b/kernel/include/misc/utils.h @@ -5,4 +5,6 @@ namespace Utilities { uint64_t get_blocks_from_size(uint64_t blocksize, uint64_t size); // Returns how many blocks of size blocksize does size occupy. + + uint64_t get_rflags(); } \ No newline at end of file diff --git a/kernel/src/interrupts/Interrupts.cpp b/kernel/src/interrupts/Interrupts.cpp index d7d6b779..96dd830f 100644 --- a/kernel/src/interrupts/Interrupts.cpp +++ b/kernel/src/interrupts/Interrupts.cpp @@ -1,4 +1,5 @@ #include "interrupts/Interrupts.h" +#include "misc/utils.h" #include "trace/StackTracer.h" void Interrupts::disable() @@ -24,4 +25,9 @@ void Interrupts::return_from_handler(Context* context) "jmp _asm_interrupt_exit" : : "r"(context)); +} + +bool Interrupts::are_enabled() +{ + return (Utilities::get_rflags() & 0x200) > 0; } \ No newline at end of file diff --git a/kernel/src/main.asm b/kernel/src/main.asm index 04e8bf2d..070821d7 100644 --- a/kernel/src/main.asm +++ b/kernel/src/main.asm @@ -25,4 +25,10 @@ asm_enable_sse: mov rax, cr4 or ax, 3 << 9 mov cr4, rax + ret + +global asm_get_rflags +asm_get_rflags: + pushfq + pop rax ret \ No newline at end of file diff --git a/kernel/src/misc/utils.cpp b/kernel/src/misc/utils.cpp index 528d5e38..26e58673 100644 --- a/kernel/src/misc/utils.cpp +++ b/kernel/src/misc/utils.cpp @@ -3,4 +3,10 @@ uint64_t Utilities::get_blocks_from_size(uint64_t blocksize, uint64_t size) { return (size + (blocksize - 1)) / blocksize; +} + +extern "C" uint64_t asm_get_rflags(); +uint64_t Utilities::get_rflags() +{ + return asm_get_rflags(); } \ No newline at end of file