summaryrefslogtreecommitdiff
path: root/Kernel/Interrupts/IRQController.h
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/IRQController.h
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/IRQController.h')
-rw-r--r--Kernel/Interrupts/IRQController.h10
1 files changed, 6 insertions, 4 deletions
diff --git a/Kernel/Interrupts/IRQController.h b/Kernel/Interrupts/IRQController.h
index f27c5bd0f9..2a99df4ab4 100644
--- a/Kernel/Interrupts/IRQController.h
+++ b/Kernel/Interrupts/IRQController.h
@@ -41,14 +41,16 @@ class IRQController : public RefCounted<IRQController> {
public:
virtual ~IRQController() {}
- virtual void enable(u8 number) = 0;
- virtual void disable(u8 number) = 0;
+ virtual void enable(const GenericInterruptHandler&) = 0;
+ virtual void disable(const GenericInterruptHandler&) = 0;
virtual void hard_disable() { m_hard_disabled = true; }
virtual bool is_vector_enabled(u8 number) const = 0;
bool is_enabled() const { return m_enabled && !m_hard_disabled; }
bool is_hard_disabled() const { return m_hard_disabled; }
- virtual void eoi(u8 number) const = 0;
- virtual u32 get_gsi_base() const = 0;
+ virtual void eoi(const GenericInterruptHandler&) const = 0;
+ virtual void spurious_eoi(const GenericInterruptHandler&) const = 0;
+ virtual size_t interrupt_vectors_count() const = 0;
+ virtual u32 gsi_base() const = 0;
virtual u16 get_isr() const = 0;
virtual u16 get_irr() const = 0;
virtual const char* model() const = 0;