#include "interrupt/driver_manager.h" #include "debug/debug.h" DriverManager* gDriverManager = nullptr; DriverManager& DriverManager::Get() { return *gDriverManager; } DriverManager::DriverManager() { gDriverManager = this; } void DriverManager::WriteMessage(uint64_t irq_num, IpcMessage&& message) { if (irq_num < IRQ_OFFSET) { dbgln("WARN IRQ {x} below min offset {x}", irq_num, IRQ_OFFSET); } uint64_t offset = irq_num - IRQ_OFFSET; if (offset >= driver_list_.size()) { dbgln("WARN IRQ for {x} with no registered driver", irq_num); return; } driver_list_[offset]->Send(glcr::Move(message)); } glcr::ErrorOr DriverManager::RegisterListener( glcr::RefPtr port) { if (driver_list_.size() + IRQ_OFFSET >= 0xFF) { return glcr::EXHAUSTED; } uint8_t offset = (driver_list_.size() + IRQ_OFFSET); driver_list_.PushBack(port); return offset; }