diff --git a/kernel/include/kernel/APIC.h b/kernel/include/kernel/APIC.h index 3553dbfc..a2e31a1d 100644 --- a/kernel/include/kernel/APIC.h +++ b/kernel/include/kernel/APIC.h @@ -2,6 +2,7 @@ #include #include +#include #include namespace Kernel @@ -52,6 +53,7 @@ namespace Kernel }; private: + SpinLock m_lock; BAN::Vector m_processors; Kernel::paddr_t m_local_apic_paddr = 0; Kernel::vaddr_t m_local_apic_vaddr = 0; diff --git a/kernel/include/kernel/PIC.h b/kernel/include/kernel/PIC.h index b5da20a6..e761059a 100644 --- a/kernel/include/kernel/PIC.h +++ b/kernel/include/kernel/PIC.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace Kernel { @@ -20,8 +21,12 @@ namespace Kernel private: static PIC* create(); - friend class InterruptController; + + private: + SpinLock m_lock; uint16_t m_reserved_irqs { 0 }; + + friend class InterruptController; }; } diff --git a/kernel/kernel/APIC.cpp b/kernel/kernel/APIC.cpp index d08e41cc..b1b3abcb 100644 --- a/kernel/kernel/APIC.cpp +++ b/kernel/kernel/APIC.cpp @@ -223,7 +223,7 @@ namespace Kernel void APIC::enable_irq(uint8_t irq) { - CriticalScope _; + SpinLockGuard _(m_lock); uint32_t gsi = m_irq_overrides[irq]; @@ -268,7 +268,7 @@ namespace Kernel BAN::ErrorOr APIC::reserve_irq(uint8_t irq) { - CriticalScope _; + SpinLockGuard _(m_lock); uint32_t gsi = m_irq_overrides[irq]; @@ -301,7 +301,7 @@ namespace Kernel BAN::Optional APIC::get_free_irq() { - CriticalScope _; + SpinLockGuard _(m_lock); for (int irq = 0; irq <= 0xFF; irq++) { uint32_t gsi = m_irq_overrides[irq]; diff --git a/kernel/kernel/PIC.cpp b/kernel/kernel/PIC.cpp index c3ee85a8..ce106e4f 100644 --- a/kernel/kernel/PIC.cpp +++ b/kernel/kernel/PIC.cpp @@ -1,4 +1,3 @@ -#include #include #include #include @@ -71,7 +70,7 @@ namespace Kernel void PIC::eoi(uint8_t irq) { - ASSERT(!interrupts_enabled()); + SpinLockGuard _(m_lock); if (irq >= 8) IO::outb(PIC2_CMD, PIC_EOI); IO::outb(PIC1_CMD, PIC_EOI); @@ -79,7 +78,7 @@ namespace Kernel void PIC::enable_irq(uint8_t irq) { - CriticalScope _; + SpinLockGuard _(m_lock); ASSERT(irq < 16); ASSERT(m_reserved_irqs & (1 << irq)); @@ -99,7 +98,7 @@ namespace Kernel dwarnln("PIC only supports 16 irqs"); return BAN::Error::from_errno(EFAULT); } - CriticalScope _; + SpinLockGuard _(m_lock); if (m_reserved_irqs & (1 << irq)) { dwarnln("irq {} is already reserved", irq); @@ -111,7 +110,7 @@ namespace Kernel BAN::Optional PIC::get_free_irq() { - CriticalScope _; + SpinLockGuard _(m_lock); for (int irq = 0; irq < 16; irq++) { if (m_reserved_irqs & (1 << irq)) @@ -119,12 +118,12 @@ namespace Kernel m_reserved_irqs |= 1 << irq; return irq; } - return {}; } bool PIC::is_in_service(uint8_t irq) { + SpinLockGuard _(m_lock); uint16_t port = PIC1_CMD; if (irq >= 8) {