diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-09-29 10:41:36 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-09-29 10:41:36 +0200 |
| commit | e9b880648c18d3680ae10cc5660f0dbe981af5d8 (patch) | |
| tree | a24e81e48920853ba191e8e7c6c3cfcd22194fba | |
| parent | 5bad38935238da045d9fd467eae9dfd958deea34 (diff) | |
| download | kernel-e9b880648c18d3680ae10cc5660f0dbe981af5d8.tar.xz kernel-e9b880648c18d3680ae10cc5660f0dbe981af5d8.zip | |
kapi/interrupt: rework enablement API
| -rw-r--r-- | arch/x86_64/kapi/interrupts.cpp | 23 | ||||
| -rw-r--r-- | kapi/kapi/interrupts.hpp | 19 | ||||
| -rw-r--r-- | kapi/kapi/interrupts/state.hpp | 26 | ||||
| -rw-r--r-- | kernel/kernel/main.cpp | 2 | ||||
| -rw-r--r-- | kernel/kernel/test_support/kapi/interrupts.cpp | 16 |
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 |
