acadia/zion/interrupt/driver_manager.cpp

33 lines
901 B
C++

#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<uint8_t> DriverManager::RegisterListener(
glcr::RefPtr<Port> 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;
}