diff options
Diffstat (limited to 'arch/x86_64')
| -rw-r--r-- | arch/x86_64/arch/devices/legacy_pit.cpp | 15 | ||||
| -rw-r--r-- | arch/x86_64/arch/devices/legacy_pit.hpp | 3 |
2 files changed, 11 insertions, 7 deletions
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<std::uint16_t>(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<std::uint8_t>(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<void> context) -> kapi::interrupts::status { - // auto data = static_pointer_cast<driver_data>(device.driver_data()); + auto data = static_pointer_cast<driver_data>(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 <kapi/devices.hpp> #include <kapi/interrupts.hpp> +#include <kstd/memory.hpp> #include <kstd/result.hpp> #include <cstdint> @@ -42,7 +43,7 @@ namespace arch::devices [[nodiscard]] auto supported_names() const -> std::span<std::string_view const> override; - auto handle_interrupt(std::uint32_t irq_number) -> kapi::interrupts::status override; + auto handle_interrupt(std::uint32_t irq_number, kstd::weak_ptr<void> context) -> kapi::interrupts::status override; protected: auto query_interface(kapi::devices::interface interface) -> void * override; |
