InterruptManagement.h 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. * Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Function.h>
  8. #include <AK/NonnullOwnPtr.h>
  9. #include <AK/OwnPtr.h>
  10. #include <AK/RefCounted.h>
  11. #include <AK/RefPtr.h>
  12. #include <AK/Types.h>
  13. #include <Kernel/ACPI/Definitions.h>
  14. #include <Kernel/Interrupts/GenericInterruptHandler.h>
  15. #include <Kernel/Interrupts/IOAPIC.h>
  16. #include <Kernel/Interrupts/IRQController.h>
  17. namespace Kernel {
  18. class ISAInterruptOverrideMetadata {
  19. public:
  20. ISAInterruptOverrideMetadata(u8 bus, u8 source, u32 global_system_interrupt, u16 flags)
  21. : m_bus(bus)
  22. , m_source(source)
  23. , m_global_system_interrupt(global_system_interrupt)
  24. , m_flags(flags)
  25. {
  26. }
  27. u8 bus() const { return m_bus; }
  28. u8 source() const { return m_source; }
  29. u32 gsi() const { return m_global_system_interrupt; }
  30. u16 flags() const { return m_flags; }
  31. private:
  32. const u8 m_bus;
  33. const u8 m_source;
  34. const u32 m_global_system_interrupt;
  35. const u16 m_flags;
  36. };
  37. class InterruptManagement {
  38. public:
  39. static InterruptManagement& the();
  40. static void initialize();
  41. static bool initialized();
  42. static u8 acquire_mapped_interrupt_number(u8 original_irq);
  43. static u8 acquire_irq_number(u8 mapped_interrupt_vector);
  44. virtual void switch_to_pic_mode();
  45. virtual void switch_to_ioapic_mode();
  46. bool smp_enabled() const { return m_smp_enabled; }
  47. RefPtr<IRQController> get_responsible_irq_controller(u8 interrupt_vector);
  48. const Vector<ISAInterruptOverrideMetadata>& isa_overrides() const { return m_isa_interrupt_overrides; }
  49. u8 get_mapped_interrupt_vector(u8 original_irq);
  50. u8 get_irq_vector(u8 mapped_interrupt_vector);
  51. void enumerate_interrupt_handlers(Function<void(GenericInterruptHandler&)>);
  52. IRQController& get_interrupt_controller(int index);
  53. protected:
  54. virtual ~InterruptManagement() = default;
  55. private:
  56. InterruptManagement();
  57. PhysicalAddress search_for_madt();
  58. void locate_apic_data();
  59. bool m_smp_enabled { false };
  60. Vector<RefPtr<IRQController>> m_interrupt_controllers;
  61. Vector<ISAInterruptOverrideMetadata> m_isa_interrupt_overrides;
  62. Vector<PCIInterruptOverrideMetadata> m_pci_interrupt_overrides;
  63. PhysicalAddress m_madt;
  64. };
  65. }