33 lines
901 B
C++
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;
|
|
}
|