#pragma once #include #define DISABLE_INTERRUPTS() asm volatile("cli") #define ENABLE_INTERRUPTS() asm volatile("sti") namespace Kernel { class Interruptable { public: void set_irq(int irq); void enable_interrupt(); void disable_interrupt(); virtual void handle_irq() = 0; protected: Interruptable() = default; ~Interruptable() {} private: int m_irq { -1 }; }; class InterruptController { public: virtual ~InterruptController() {} virtual void eoi(uint8_t) = 0; virtual void enable_irq(uint8_t) = 0; virtual bool is_in_service(uint8_t) = 0; static void initialize(bool force_pic); static InterruptController& get(); bool is_using_apic() const { return m_using_apic; } void enter_acpi_mode(); private: bool m_using_apic { false }; }; bool interrupts_enabled(); }