fix(kernel): 🐛 interrupt handler was broken for PCI

This commit is contained in:
EnderIce2 2025-05-28 00:43:21 +00:00
parent 814175ddaf
commit 13ce994edf
Signed by: enderice2
GPG Key ID: FEB6B8A8507BA62E

View File

@ -302,7 +302,7 @@ namespace Interrupts
} }
else else
fixme("APIC not found for core %d", Core); fixme("APIC not found for core %d", Core);
// TODO: Handle PIC too // TODO: Handle PIC too
#endif #endif
assert(!"EOI not handled."); assert(!"EOI not handled.");
@ -423,11 +423,10 @@ namespace Interrupts
{ {
for (auto ev : RegisteredEvents) for (auto ev : RegisteredEvents)
{ {
if (ev.IRQ == InterruptNumber) if (ev.IRQ != InterruptNumber)
{ continue;
warn("IRQ%d is already registered.",
InterruptNumber); warn("IRQ%d is already registered.", InterruptNumber);
}
} }
this->InterruptNumber = InterruptNumber; this->InterruptNumber = InterruptNumber;
@ -441,15 +440,12 @@ namespace Interrupts
0, /* Priority */ 0, /* Priority */
Critical}; /* Critical */ Critical}; /* Critical */
RegisteredEvents.push_back(newEvent); RegisteredEvents.push_back(newEvent);
debug("Registered interrupt handler for IRQ%d.", debug("Registered interrupt handler for IRQ%d.", InterruptNumber);
InterruptNumber);
} }
Handler::Handler(PCI::PCIDevice Device, bool Critical) Handler::Handler(PCI::PCIDevice Device, bool Critical)
: Handler(((PCI::PCIHeader0 *)Device.Header)->InterruptLine, Critical)
{ {
PCI::PCIHeader0 *hdr0 =
(PCI::PCIHeader0 *)Device.Header;
Handler(hdr0->InterruptLine, Critical);
} }
Handler::Handler() Handler::Handler()
@ -459,16 +455,14 @@ namespace Interrupts
Handler::~Handler() Handler::~Handler()
{ {
debug("Unregistering interrupt handler for IRQ%d.", debug("Unregistering interrupt handler for IRQ%d.", this->InterruptNumber);
this->InterruptNumber);
forItr(itr, RegisteredEvents) forItr(itr, RegisteredEvents)
{ {
if (itr->IRQ == this->InterruptNumber) if (itr->IRQ != this->InterruptNumber)
{ continue;
RegisteredEvents.erase(itr);
return; RegisteredEvents.erase(itr);
} return;
} }
warn("Event %d not found.", this->InterruptNumber); warn("Event %d not found.", this->InterruptNumber);
} }