From f0105cb7fb783d5c925006e401fd8e279f43583b Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 6 Mar 2024 00:46:20 +0200 Subject: [PATCH] Kernel: Move Interruptable from InterruptController.h to its own file --- kernel/CMakeLists.txt | 1 + kernel/include/kernel/IDT.h | 3 +- kernel/include/kernel/Input/PS2/Device.h | 2 +- kernel/include/kernel/InterruptController.h | 17 ----------- kernel/include/kernel/Interruptable.h | 23 +++++++++++++++ .../include/kernel/Networking/E1000/E1000.h | 2 +- .../kernel/Storage/ATA/AHCI/Controller.h | 2 +- kernel/include/kernel/Storage/ATA/ATABus.h | 2 +- kernel/include/kernel/Storage/NVMe/Queue.h | 2 +- kernel/include/kernel/Terminal/Serial.h | 2 +- kernel/include/kernel/Timer/HPET.h | 2 +- kernel/include/kernel/Timer/PIT.h | 2 +- kernel/kernel/InterruptController.cpp | 21 -------------- kernel/kernel/Interruptable.cpp | 29 +++++++++++++++++++ kernel/kernel/Storage/ATA/ATAController.cpp | 1 + 15 files changed, 63 insertions(+), 48 deletions(-) create mode 100644 kernel/include/kernel/Interruptable.h create mode 100644 kernel/kernel/Interruptable.cpp diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index b11db885..441505f5 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -40,6 +40,7 @@ set(KERNEL_SOURCES kernel/Input/PS2/Keyboard.cpp kernel/Input/PS2/Keymap.cpp kernel/Input/PS2/Mouse.cpp + kernel/Interruptable.cpp kernel/InterruptController.cpp kernel/kernel.cpp kernel/Memory/DMARegion.cpp diff --git a/kernel/include/kernel/IDT.h b/kernel/include/kernel/IDT.h index 5db76b85..2857efd8 100644 --- a/kernel/include/kernel/IDT.h +++ b/kernel/include/kernel/IDT.h @@ -2,6 +2,7 @@ #include #include +#include #include @@ -10,8 +11,6 @@ constexpr uint8_t IRQ_VECTOR_BASE = 0x20; namespace Kernel { - class Interruptable; - struct GateDescriptor { uint16_t offset1; diff --git a/kernel/include/kernel/Input/PS2/Device.h b/kernel/include/kernel/Input/PS2/Device.h index 2ec4cbfa..ba399b91 100644 --- a/kernel/include/kernel/Input/PS2/Device.h +++ b/kernel/include/kernel/Input/PS2/Device.h @@ -1,7 +1,7 @@ #pragma once #include -#include +#include namespace Kernel::Input { diff --git a/kernel/include/kernel/InterruptController.h b/kernel/include/kernel/InterruptController.h index 63e6bd75..82b286e9 100644 --- a/kernel/include/kernel/InterruptController.h +++ b/kernel/include/kernel/InterruptController.h @@ -8,23 +8,6 @@ namespace Kernel { - class Interruptable - { - public: - void set_irq(int irq); - void enable_interrupt(); - void disable_interrupt(); - - virtual void handle_irq() = 0; - - protected: - Interruptable() = default; - ~Interruptable() {} - - private: - int m_irq { -1 }; - }; - class InterruptController { public: diff --git a/kernel/include/kernel/Interruptable.h b/kernel/include/kernel/Interruptable.h new file mode 100644 index 00000000..8a15665e --- /dev/null +++ b/kernel/include/kernel/Interruptable.h @@ -0,0 +1,23 @@ +#pragma once + +namespace Kernel +{ + + class Interruptable + { + public: + void set_irq(int irq); + void enable_interrupt(); + void disable_interrupt(); + + virtual void handle_irq() = 0; + + protected: + Interruptable() = default; + ~Interruptable() {} + + private: + int m_irq { -1 }; + }; + +} diff --git a/kernel/include/kernel/Networking/E1000/E1000.h b/kernel/include/kernel/Networking/E1000/E1000.h index 9a32f635..7aa12f53 100644 --- a/kernel/include/kernel/Networking/E1000/E1000.h +++ b/kernel/include/kernel/Networking/E1000/E1000.h @@ -1,7 +1,7 @@ #pragma once #include -#include +#include #include #include #include diff --git a/kernel/include/kernel/Storage/ATA/AHCI/Controller.h b/kernel/include/kernel/Storage/ATA/AHCI/Controller.h index 7a697bc6..dae314e7 100644 --- a/kernel/include/kernel/Storage/ATA/AHCI/Controller.h +++ b/kernel/include/kernel/Storage/ATA/AHCI/Controller.h @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include #include diff --git a/kernel/include/kernel/Storage/ATA/ATABus.h b/kernel/include/kernel/Storage/ATA/ATABus.h index 16991266..f8abf509 100644 --- a/kernel/include/kernel/Storage/ATA/ATABus.h +++ b/kernel/include/kernel/Storage/ATA/ATABus.h @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include namespace Kernel diff --git a/kernel/include/kernel/Storage/NVMe/Queue.h b/kernel/include/kernel/Storage/NVMe/Queue.h index 964cf616..1992d80f 100644 --- a/kernel/include/kernel/Storage/NVMe/Queue.h +++ b/kernel/include/kernel/Storage/NVMe/Queue.h @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include #include diff --git a/kernel/include/kernel/Terminal/Serial.h b/kernel/include/kernel/Terminal/Serial.h index 3df9250b..69bc1c42 100644 --- a/kernel/include/kernel/Terminal/Serial.h +++ b/kernel/include/kernel/Terminal/Serial.h @@ -2,7 +2,7 @@ #include #include -#include +#include #include namespace Kernel diff --git a/kernel/include/kernel/Timer/HPET.h b/kernel/include/kernel/Timer/HPET.h index bd4cdbf5..4b35b024 100644 --- a/kernel/include/kernel/Timer/HPET.h +++ b/kernel/include/kernel/Timer/HPET.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include diff --git a/kernel/include/kernel/Timer/PIT.h b/kernel/include/kernel/Timer/PIT.h index 4f023f6d..b8a57b51 100644 --- a/kernel/include/kernel/Timer/PIT.h +++ b/kernel/include/kernel/Timer/PIT.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include namespace Kernel diff --git a/kernel/kernel/InterruptController.cpp b/kernel/kernel/InterruptController.cpp index c8e1f312..7989e4c1 100644 --- a/kernel/kernel/InterruptController.cpp +++ b/kernel/kernel/InterruptController.cpp @@ -8,29 +8,8 @@ namespace Kernel { - namespace IDT { void register_irq_handler(uint8_t irq, Interruptable*); } - static InterruptController* s_instance = nullptr; - void Interruptable::set_irq(int irq) - { - if (m_irq != -1) - IDT::register_irq_handler(m_irq, nullptr); - m_irq = irq; - IDT::register_irq_handler(irq, this); - } - - void Interruptable::enable_interrupt() - { - ASSERT(m_irq != -1); - InterruptController::get().enable_irq(m_irq); - } - - void Interruptable::disable_interrupt() - { - ASSERT_NOT_REACHED(); - } - InterruptController& InterruptController::get() { ASSERT(s_instance); diff --git a/kernel/kernel/Interruptable.cpp b/kernel/kernel/Interruptable.cpp new file mode 100644 index 00000000..450ac8b5 --- /dev/null +++ b/kernel/kernel/Interruptable.cpp @@ -0,0 +1,29 @@ +#include +#include +#include +#include + +namespace Kernel +{ + + void Interruptable::set_irq(int irq) + { + auto& processor = Processor::current(); + if (m_irq != -1) + processor.idt().register_irq_handler(m_irq, nullptr); + m_irq = irq; + processor.idt().register_irq_handler(irq, this); + } + + void Interruptable::enable_interrupt() + { + ASSERT(m_irq != -1); + InterruptController::get().enable_irq(m_irq); + } + + void Interruptable::disable_interrupt() + { + ASSERT_NOT_REACHED(); + } + +} diff --git a/kernel/kernel/Storage/ATA/ATAController.cpp b/kernel/kernel/Storage/ATA/ATAController.cpp index c755c9f1..86de85c8 100644 --- a/kernel/kernel/Storage/ATA/ATAController.cpp +++ b/kernel/kernel/Storage/ATA/ATAController.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include