Support multiple registered interrupt handlers

This commit is contained in:
Alex 2023-03-02 02:32:31 +02:00
parent 2bdfe0bedc
commit 784d7726df
Signed by untrusted user who does not match committer: enderice2
GPG Key ID: EACC3AD603BAB4DD

View File

@ -131,19 +131,17 @@ namespace Interrupts
if (unlikely(Frame->InterruptNumber == CPU::x86::IRQ29)) if (unlikely(Frame->InterruptNumber == CPU::x86::IRQ29))
CPU::Stop(); CPU::Stop();
Handler *handler = nullptr; bool InterruptHandled = false;
foreach (auto var in RegisteredEvents) foreach (auto ev in RegisteredEvents)
{ {
if (var.ID == static_cast<int>(Frame->InterruptNumber)) if (ev.ID == static_cast<int>(Frame->InterruptNumber))
{ {
handler = (Handler *)var.Data; ((Handler *)ev.Data)->OnInterruptReceived(Frame);
break; InterruptHandled = true;
} }
} }
if (handler != nullptr) if (!InterruptHandled)
handler->OnInterruptReceived(Frame);
else
{ {
error("IRQ%ld is unhandled on CPU %d.", Frame->InterruptNumber - 32, Core); error("IRQ%ld is unhandled on CPU %d.", Frame->InterruptNumber - 32, Core);
if (Frame->InterruptNumber == CPU::x86::IRQ1) if (Frame->InterruptNumber == CPU::x86::IRQ1)
@ -172,9 +170,9 @@ namespace Interrupts
Handler::Handler(int InterruptNumber) Handler::Handler(int InterruptNumber)
{ {
foreach (auto var in RegisteredEvents) foreach (auto ev in RegisteredEvents)
{ {
if (var.ID == InterruptNumber) if (ev.ID == InterruptNumber)
{ {
warn("IRQ%d is already registered.", InterruptNumber - 32); warn("IRQ%d is already registered.", InterruptNumber - 32);
} }