From c86b42b88659c50b6def9b5b52b4605b2a0e5d13 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Fri, 24 Jul 2026 12:36:04 +0200 Subject: kapi/interrupts: add ISR context --- arch/x86_64/arch/devices/legacy_pit.cpp | 15 +++++++++------ arch/x86_64/arch/devices/legacy_pit.hpp | 3 ++- 2 files changed, 11 insertions(+), 7 deletions(-) (limited to 'arch/x86_64') diff --git a/arch/x86_64/arch/devices/legacy_pit.cpp b/arch/x86_64/arch/devices/legacy_pit.cpp index b2a30ef9..b24f87ea 100644 --- a/arch/x86_64/arch/devices/legacy_pit.cpp +++ b/arch/x86_64/arch/devices/legacy_pit.cpp @@ -63,7 +63,7 @@ namespace arch::devices auto divisor = static_cast(base_frequency / data->frequency_in_hz); - kapi::interrupts::register_handler(data->irq_number, *this); + kapi::interrupts::register_handler(data->irq_number, *this, data); command_port::write(square_wave_mode); io::wait(); @@ -89,17 +89,20 @@ namespace arch::devices return pit_names; } - auto pit_driver::handle_interrupt(std::uint32_t irq_number) -> kapi::interrupts::status + auto pit_driver::handle_interrupt(std::uint32_t irq_number, kstd::weak_ptr context) -> kapi::interrupts::status { - // auto data = static_pointer_cast(device.driver_data()); + auto data = static_pointer_cast(context.lock()); + if (!data) + { + return kapi::interrupts::status::unhandled; + } - if (irq_number != 0) + if (irq_number != data->irq_number) { return kapi::interrupts::status::unhandled; } - // TODO: upgrade kapi interrupts to gain access to the device. - // ++m_ticks; + ++data->ticks; return kapi::interrupts::status::handled; } diff --git a/arch/x86_64/arch/devices/legacy_pit.hpp b/arch/x86_64/arch/devices/legacy_pit.hpp index f0a18ecb..31c02207 100644 --- a/arch/x86_64/arch/devices/legacy_pit.hpp +++ b/arch/x86_64/arch/devices/legacy_pit.hpp @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -42,7 +43,7 @@ namespace arch::devices [[nodiscard]] auto supported_names() const -> std::span override; - auto handle_interrupt(std::uint32_t irq_number) -> kapi::interrupts::status override; + auto handle_interrupt(std::uint32_t irq_number, kstd::weak_ptr context) -> kapi::interrupts::status override; protected: auto query_interface(kapi::devices::interface interface) -> void * override; -- cgit v1.2.3