Browse Source

Kernel: Move IRQController and InterruptManagement to Arch directory

These 2 classes currently contain much code that is x86(_64) specific.
Move them to the architecture specific directory. This also allows for a
simpler implementation for aarch64.
Timon Kruiper 3 years ago
parent
commit
f085903f62

+ 17 - 0
Kernel/Arch/IRQController.h

@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2022, Timon Kruiper <timonkruiper@gmail.com>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/Platform.h>
+
+#if ARCH(X86_64) || ARCH(I386)
+#    include <Kernel/Arch/x86/IRQController.h>
+#elif ARCH(AARCH64)
+#    include <Kernel/Arch/aarch64/IRQController.h>
+#else
+#    error "Unknown architecture"
+#endif

+ 17 - 0
Kernel/Arch/InterruptManagement.h

@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2022, Timon Kruiper <timonkruiper@gmail.com>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/Platform.h>
+
+#if ARCH(X86_64) || ARCH(I386)
+#    include <Kernel/Arch/x86/InterruptManagement.h>
+#elif ARCH(AARCH64)
+#    include <Kernel/Arch/aarch64/InterruptManagement.h>
+#else
+#    error "Unknown architecture"
+#endif

+ 1 - 1
Kernel/Arch/aarch64/Dummy.cpp

@@ -7,8 +7,8 @@
 #include <AK/Singleton.h>
 #include <AK/Types.h>
 
+#include <Kernel/Arch/aarch64/InterruptManagement.h>
 #include <Kernel/FileSystem/Inode.h>
-#include <Kernel/Interrupts/InterruptManagement.h>
 #include <Kernel/KString.h>
 #include <Kernel/Locking/SpinlockProtected.h>
 #include <Kernel/Memory/SharedInodeVMObject.h>

+ 31 - 0
Kernel/Arch/aarch64/IRQController.h

@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/RefCounted.h>
+#include <AK/Types.h>
+
+namespace Kernel {
+
+class GenericInterruptHandler;
+
+class IRQController : public RefCounted<IRQController> {
+public:
+    virtual ~IRQController() = default;
+
+    virtual void enable(GenericInterruptHandler const&) = 0;
+    virtual void disable(GenericInterruptHandler const&) = 0;
+
+    virtual void eoi(GenericInterruptHandler const&) const = 0;
+
+    virtual StringView model() const = 0;
+
+protected:
+    IRQController() = default;
+};
+
+}

+ 22 - 0
Kernel/Arch/aarch64/InterruptManagement.h

@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <Kernel/Arch/aarch64/IRQController.h>
+
+namespace Kernel {
+
+class InterruptManagement {
+public:
+    static InterruptManagement& the();
+
+    static u8 acquire_mapped_interrupt_number(u8 original_irq);
+
+    RefPtr<IRQController> get_responsible_irq_controller(u8 interrupt_vector);
+};
+
+}

+ 2 - 0
Kernel/Interrupts/IRQController.h → Kernel/Arch/x86/IRQController.h

@@ -11,6 +11,8 @@
 
 namespace Kernel {
 
+class GenericInterruptHandler;
+
 enum class IRQControllerType {
     i8259 = 1,   /* Intel 8259 Dual PIC */
     i82093AA = 2 /* Intel 82093AA I/O ADVANCED PROGRAMMABLE INTERRUPT CONTROLLER (IOAPIC) */

+ 1 - 1
Kernel/Interrupts/InterruptManagement.h → Kernel/Arch/x86/InterruptManagement.h

@@ -12,10 +12,10 @@
 #include <AK/RefCounted.h>
 #include <AK/RefPtr.h>
 #include <AK/Types.h>
+#include <Kernel/Arch/x86/IRQController.h>
 #include <Kernel/Firmware/ACPI/Definitions.h>
 #include <Kernel/Interrupts/GenericInterruptHandler.h>
 #include <Kernel/Interrupts/IOAPIC.h>
-#include <Kernel/Interrupts/IRQController.h>
 
 namespace Kernel {
 

+ 1 - 1
Kernel/Interrupts/InterruptManagement.cpp → Kernel/Arch/x86/common/InterruptManagement.cpp

@@ -8,11 +8,11 @@
 #include <Kernel/API/Syscall.h>
 #include <Kernel/Arch/InterruptDisabler.h>
 #include <Kernel/Arch/Interrupts.h>
+#include <Kernel/Arch/x86/InterruptManagement.h>
 #include <Kernel/CommandLine.h>
 #include <Kernel/Firmware/MultiProcessor/Parser.h>
 #include <Kernel/Interrupts/APIC.h>
 #include <Kernel/Interrupts/IOAPIC.h>
-#include <Kernel/Interrupts/InterruptManagement.h>
 #include <Kernel/Interrupts/PIC.h>
 #include <Kernel/Interrupts/SharedIRQHandler.h>
 #include <Kernel/Interrupts/SpuriousInterruptHandler.h>

+ 2 - 2
Kernel/CMakeLists.txt

@@ -159,7 +159,6 @@ set(KERNEL_SOURCES
     Interrupts/GenericInterruptHandler.cpp
     Interrupts/IOAPIC.cpp
     Interrupts/IRQHandler.cpp
-    Interrupts/InterruptManagement.cpp
     Interrupts/PIC.cpp
     Interrupts/SharedIRQHandler.cpp
     Interrupts/SpuriousInterruptHandler.cpp
@@ -331,9 +330,10 @@ if ("${SERENITY_ARCH}" STREQUAL "i686" OR "${SERENITY_ARCH}" STREQUAL "x86_64")
         ${KERNEL_SOURCES}
         
         ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/ASM_wrapper.cpp
-        ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/CrashHandler.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/CPU.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/CPUID.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/CrashHandler.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/InterruptManagement.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/Interrupts.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/PageDirectory.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/Arch/x86/common/Processor.cpp

+ 1 - 1
Kernel/GlobalProcessExposed.cpp

@@ -9,6 +9,7 @@
 #include <AK/Try.h>
 #include <AK/UBSanitizer.h>
 #include <Kernel/Arch/InterruptDisabler.h>
+#include <Kernel/Arch/InterruptManagement.h>
 #include <Kernel/Arch/x86/ProcessorInfo.h>
 #include <Kernel/Bus/PCI/API.h>
 #include <Kernel/Bus/PCI/Access.h>
@@ -20,7 +21,6 @@
 #include <Kernel/FileSystem/OpenFileDescription.h>
 #include <Kernel/Heap/kmalloc.h>
 #include <Kernel/Interrupts/GenericInterruptHandler.h>
-#include <Kernel/Interrupts/InterruptManagement.h>
 #include <Kernel/KBufferBuilder.h>
 #include <Kernel/Net/LocalSocket.h>
 #include <Kernel/Net/NetworkingManagement.h>

+ 1 - 1
Kernel/Interrupts/GenericInterruptHandler.cpp

@@ -4,10 +4,10 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
+#include <Kernel/Arch/InterruptManagement.h>
 #include <Kernel/Arch/Interrupts.h>
 #include <Kernel/Assertions.h>
 #include <Kernel/Interrupts/GenericInterruptHandler.h>
-#include <Kernel/Interrupts/InterruptManagement.h>
 
 namespace Kernel {
 GenericInterruptHandler& GenericInterruptHandler::from(u8 interrupt_number)

+ 1 - 1
Kernel/Interrupts/IOAPIC.cpp

@@ -6,10 +6,10 @@
 
 #include <AK/Optional.h>
 #include <Kernel/Arch/InterruptDisabler.h>
+#include <Kernel/Arch/x86/InterruptManagement.h>
 #include <Kernel/Debug.h>
 #include <Kernel/Interrupts/APIC.h>
 #include <Kernel/Interrupts/IOAPIC.h>
-#include <Kernel/Interrupts/InterruptManagement.h>
 #include <Kernel/Sections.h>
 
 #define IOAPIC_REDIRECTION_ENTRY_OFFSET 0x10

+ 1 - 1
Kernel/Interrupts/IOAPIC.h

@@ -6,7 +6,7 @@
 
 #pragma once
 
-#include <Kernel/Interrupts/IRQController.h>
+#include <Kernel/Arch/x86/IRQController.h>
 #include <Kernel/Memory/TypedMapping.h>
 
 namespace Kernel {

+ 1 - 1
Kernel/Interrupts/IRQHandler.cpp

@@ -5,9 +5,9 @@
  */
 
 #include <Kernel/Arch/InterruptDisabler.h>
+#include <Kernel/Arch/InterruptManagement.h>
 #include <Kernel/Debug.h>
 #include <Kernel/Interrupts/IRQHandler.h>
-#include <Kernel/Interrupts/InterruptManagement.h>
 
 namespace Kernel {
 

+ 1 - 1
Kernel/Interrupts/IRQHandler.h

@@ -8,8 +8,8 @@
 
 #include <AK/RefPtr.h>
 #include <AK/Types.h>
+#include <Kernel/Arch/IRQController.h>
 #include <Kernel/Interrupts/GenericInterruptHandler.h>
-#include <Kernel/Interrupts/IRQController.h>
 
 namespace Kernel {
 

+ 1 - 1
Kernel/Interrupts/PIC.h

@@ -7,7 +7,7 @@
 #pragma once
 
 #include <AK/Types.h>
-#include <Kernel/Interrupts/IRQController.h>
+#include <Kernel/Arch/x86/IRQController.h>
 
 namespace Kernel {
 

+ 1 - 2
Kernel/Interrupts/SharedIRQHandler.cpp

@@ -4,11 +4,10 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
+#include <Kernel/Arch/InterruptManagement.h>
 #include <Kernel/Assertions.h>
 #include <Kernel/Debug.h>
 #include <Kernel/Interrupts/IRQHandler.h>
-#include <Kernel/Interrupts/InterruptManagement.h>
-#include <Kernel/Interrupts/PIC.h>
 #include <Kernel/Interrupts/SharedIRQHandler.h>
 #include <Kernel/Sections.h>
 

+ 1 - 1
Kernel/Interrupts/SharedIRQHandler.h

@@ -9,8 +9,8 @@
 #include <AK/NonnullOwnPtr.h>
 #include <AK/RefPtr.h>
 #include <AK/Types.h>
+#include <Kernel/Arch/IRQController.h>
 #include <Kernel/Interrupts/GenericInterruptHandler.h>
-#include <Kernel/Interrupts/IRQController.h>
 
 namespace Kernel {
 class IRQHandler;

+ 1 - 1
Kernel/Interrupts/SpuriousInterruptHandler.cpp

@@ -4,8 +4,8 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
+#include <Kernel/Arch/InterruptManagement.h>
 #include <Kernel/Arch/x86/Interrupts.h>
-#include <Kernel/Interrupts/InterruptManagement.h>
 #include <Kernel/Interrupts/PIC.h>
 #include <Kernel/Interrupts/SpuriousInterruptHandler.h>
 #include <Kernel/Sections.h>

+ 1 - 1
Kernel/Interrupts/SpuriousInterruptHandler.h

@@ -8,8 +8,8 @@
 
 #include <AK/OwnPtr.h>
 #include <AK/Types.h>
+#include <Kernel/Arch/IRQController.h>
 #include <Kernel/Interrupts/GenericInterruptHandler.h>
-#include <Kernel/Interrupts/IRQController.h>
 
 namespace Kernel {
 

+ 0 - 1
Kernel/Time/HPET.cpp

@@ -7,7 +7,6 @@
 #include <AK/StringView.h>
 #include <Kernel/Debug.h>
 #include <Kernel/Firmware/ACPI/Parser.h>
-#include <Kernel/Interrupts/InterruptManagement.h>
 #include <Kernel/Memory/MemoryManager.h>
 #include <Kernel/Memory/TypedMapping.h>
 #include <Kernel/Sections.h>

+ 1 - 1
Kernel/init.cpp

@@ -5,6 +5,7 @@
  */
 
 #include <AK/Types.h>
+#include <Kernel/Arch/InterruptManagement.h>
 #include <Kernel/Arch/Processor.h>
 #include <Kernel/BootInfo.h>
 #include <Kernel/Bus/PCI/Access.h>
@@ -38,7 +39,6 @@
 #include <Kernel/Graphics/GraphicsManagement.h>
 #include <Kernel/Heap/kmalloc.h>
 #include <Kernel/Interrupts/APIC.h>
-#include <Kernel/Interrupts/InterruptManagement.h>
 #include <Kernel/Interrupts/PIC.h>
 #include <Kernel/KSyms.h>
 #include <Kernel/Memory/MemoryManager.h>