summaryrefslogtreecommitdiff
path: root/Kernel/Interrupts/IRQHandler.cpp
diff options
context:
space:
mode:
authorLiav A <liavalb@gmail.com>2020-03-08 12:47:33 +0200
committerAndreas Kling <kling@serenityos.org>2020-03-24 16:15:33 +0100
commitf86be46c989499562b0b9ab9cd194e16dbc5bb36 (patch)
treea96a8328a29fa3e10e068b73d91176706fcaafee /Kernel/Interrupts/IRQHandler.cpp
parent666990fbcb5fe3611577e23fd181e1e9b9e1219c (diff)
downloadserenity-f86be46c989499562b0b9ab9cd194e16dbc5bb36.zip
Kernel: Abstract IRQ controller handling from Interrupt handlers
Now we don't send raw numbers, but we let the IRQController object to figure out the correct IRQ number. This helps in a situation when we have 2 or more IOAPICs, so if IOAPIC 1 is assigned for IRQs 0-23 and IOAPIC 2 is assigned for IRQs 24-47, if an IRQHandler of IRQ 25 invokes disable() for example, it will call his responsible IRQController (IOAPIC 2), and the IRQController will subtract the IRQ number with his assigned offset, and the result is that the second redirection entry in IOAPIC 2 will be masked.
Diffstat (limited to 'Kernel/Interrupts/IRQHandler.cpp')
-rw-r--r--Kernel/Interrupts/IRQHandler.cpp6
1 files changed, 3 insertions, 3 deletions
diff --git a/Kernel/Interrupts/IRQHandler.cpp b/Kernel/Interrupts/IRQHandler.cpp
index 05439b1ff5..4201f65340 100644
--- a/Kernel/Interrupts/IRQHandler.cpp
+++ b/Kernel/Interrupts/IRQHandler.cpp
@@ -49,7 +49,7 @@ bool IRQHandler::eoi()
#endif
if (!m_shared_with_others) {
ASSERT(!m_responsible_irq_controller.is_null());
- m_responsible_irq_controller->eoi(interrupt_number());
+ m_responsible_irq_controller->eoi(*this);
return true;
}
return false;
@@ -61,7 +61,7 @@ void IRQHandler::enable_irq()
dbg() << "Enable IRQ " << interrupt_number();
#endif
if (!m_shared_with_others)
- m_responsible_irq_controller->enable(interrupt_number());
+ m_responsible_irq_controller->enable(*this);
else
m_enabled = true;
}
@@ -72,7 +72,7 @@ void IRQHandler::disable_irq()
dbg() << "Disable IRQ " << interrupt_number();
#endif
if (!m_shared_with_others)
- m_responsible_irq_controller->disable(interrupt_number());
+ m_responsible_irq_controller->disable(*this);
else
m_enabled = false;
}