aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/x86_64/kapi/interrupts.cpp23
-rw-r--r--kapi/kapi/interrupts.hpp19
-rw-r--r--kapi/kapi/interrupts/state.hpp26
-rw-r--r--kernel/kernel/main.cpp2
-rw-r--r--kernel/kernel/test_support/kapi/interrupts.cpp16
5 files changed, 61 insertions, 25 deletions
diff --git a/arch/x86_64/kapi/interrupts.cpp b/arch/x86_64/kapi/interrupts.cpp
index 85acc0fa..8d863bad 100644
--- a/arch/x86_64/kapi/interrupts.cpp
+++ b/arch/x86_64/kapi/interrupts.cpp
@@ -3,14 +3,27 @@
namespace kapi::interrupts
{
- auto enable() -> void
+ auto enabled() -> bool
{
- asm volatile("sti");
+ auto value = false;
+ asm volatile("pushfq\n"
+ "pop %0\n"
+ "and $0x200, %0"
+ : "=r"(value));
+ return value;
}
- auto disable() -> void
+ auto enabled(bool value) -> void
{
- asm volatile("cli");
+ // NOLINTNEXTLINE(bugprone-branch-clone)
+ if (value)
+ {
+ asm volatile("sti");
+ }
+ else
+ {
+ asm volatile("cli");
+ }
}
-} // namespace kapi::interrupts \ No newline at end of file
+} // namespace kapi::interrupts
diff --git a/kapi/kapi/interrupts.hpp b/kapi/kapi/interrupts.hpp
index 9e41b727..f9ff22f9 100644
--- a/kapi/kapi/interrupts.hpp
+++ b/kapi/kapi/interrupts.hpp
@@ -1,5 +1,6 @@
#ifndef TEACHOS_KAPI_INTERRUPTS_HPP
#define TEACHOS_KAPI_INTERRUPTS_HPP
+#include <kapi/interrupts/state.hpp>
#include <kstd/memory.hpp>
@@ -8,9 +9,6 @@
namespace kapi::interrupts
{
- //! @addtogroup kapi-interrupts
- //! @{
-
//! A status that indicates whether an interrupt was handled by a handler.
enum struct status : bool
{
@@ -36,9 +34,7 @@ namespace kapi::interrupts
virtual auto handle_interrupt(std::uint32_t irq_number, kstd::weak_ptr<void> context) -> status = 0;
};
- //! @}
-
- //! @addtogroup kapi-interrupts-kernel-defined
+ //! @name Kernel-defined API
//! @{
//! Register an interrupt handler for the given IRQ number.
@@ -62,17 +58,6 @@ namespace kapi::interrupts
//! @}
- //! @addtogroup kapi-interrupts-platform-defined
- //! @{
-
- //! Enable external interrupts.
- auto enable() -> void;
-
- //! Disable external interrupts.
- auto disable() -> void;
-
- //! @}
-
} // namespace kapi::interrupts
#endif \ No newline at end of file
diff --git a/kapi/kapi/interrupts/state.hpp b/kapi/kapi/interrupts/state.hpp
new file mode 100644
index 00000000..a33a871b
--- /dev/null
+++ b/kapi/kapi/interrupts/state.hpp
@@ -0,0 +1,26 @@
+#ifndef TEACHOS_KAPI_INTERRUPTS_STATE_HPP
+#define TEACHOS_KAPI_INTERRUPTS_STATE_HPP
+
+// IWYU pragma: private, include <kapi/interrupts.hpp>
+
+namespace kapi::interrupts
+{
+
+ //! @name Platform-defined API
+ //! @{
+
+ //! Check if interrupts are currently enabled or not.
+ //!
+ //! @return @p true iff. interrupts are currently enabled, @p false otherwise.
+ auto enabled() -> bool;
+
+ //! Enable or disable interrupts.
+ //!
+ //! @param value @p true if interrupts shall be enabled, @p false otherwise.
+ auto enabled(bool value) -> void;
+
+ //! @}
+
+} // namespace kapi::interrupts
+
+#endif \ No newline at end of file
diff --git a/kernel/kernel/main.cpp b/kernel/kernel/main.cpp
index bc192950..bbbd46c0 100644
--- a/kernel/kernel/main.cpp
+++ b/kernel/kernel/main.cpp
@@ -293,7 +293,7 @@ auto main() -> int
kapi::devices::init_platform_devices();
kstd::println("[OS] Platform devices initialized.");
- kapi::interrupts::enable();
+ kapi::interrupts::enabled(true);
kstd::println("[OS] Interrupts enabled.");
auto modules_bus = kernel::devices::storage::init();
diff --git a/kernel/kernel/test_support/kapi/interrupts.cpp b/kernel/kernel/test_support/kapi/interrupts.cpp
index 00772669..79b03729 100644
--- a/kernel/kernel/test_support/kapi/interrupts.cpp
+++ b/kernel/kernel/test_support/kapi/interrupts.cpp
@@ -1,11 +1,23 @@
#include <kapi/interrupts.hpp>
+#include <atomic>
+
namespace kapi::interrupts
{
- auto enable() -> void
+ namespace
+ {
+ std::atomic_bool interrupt_state = false;
+ }
+
+ auto enabled() -> bool
+ {
+ return interrupt_state.load(std::memory_order::relaxed);
+ }
+
+ auto enabled(bool value) -> void
{
- // TODO: enable simulated interrupts.
+ interrupt_state.store(value, std::memory_order::relaxed);
}
} // namespace kapi::interrupts \ No newline at end of file