diff options
author | Liav A <liavalb@gmail.com> | 2020-03-08 12:47:33 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-03-24 16:15:33 +0100 |
commit | f86be46c989499562b0b9ab9cd194e16dbc5bb36 (patch) | |
tree | a96a8328a29fa3e10e068b73d91176706fcaafee /Kernel/Interrupts/IRQHandler.cpp | |
parent | 666990fbcb5fe3611577e23fd181e1e9b9e1219c (diff) | |
download | serenity-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.cpp | 6 |
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; } |