From bf0bd192895d7c44164ffd71b850768a54ee027a Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 18 Aug 2026 10:25:53 +0300 Subject: [PATCH] Kernel: Refactor includes to reduce include dependencies Now modifying Scheduler.h or Thread.h doesnt trigger practically a full kernel rebuild. This required moving Mutex and RWLock of of line but that should be fine :^) --- kernel/CMakeLists.txt | 2 + kernel/include/kernel/ACPI/ACPI.h | 1 + .../include/kernel/ACPI/EmbeddedController.h | 3 +- kernel/include/kernel/APIC.h | 1 + .../kernel/Audio/HDAudio/Definitions.h | 1 + kernel/include/kernel/Epoll.h | 1 + kernel/include/kernel/FS/DevFS/FileSystem.h | 3 +- kernel/include/kernel/FS/EventFD.h | 1 + kernel/include/kernel/FS/Ext2/FileSystem.h | 3 +- kernel/include/kernel/FS/FAT/FileSystem.h | 1 + kernel/include/kernel/FS/FileSystem.h | 3 +- kernel/include/kernel/FS/ProcFS/FileSystem.h | 3 +- kernel/include/kernel/FS/ProcFS/Inode.h | 3 +- kernel/include/kernel/IDT.h | 15 -- kernel/include/kernel/InterruptNumbers.h | 23 +++ kernel/include/kernel/Lock/Mutex.h | 126 ++-------------- kernel/include/kernel/Lock/RWLock.h | 54 +------ .../kernel/Memory/MemoryBackedRegion.h | 1 + .../kernel/Memory/SharedMemoryObject.h | 2 + kernel/include/kernel/Networking/ARPTable.h | 2 - kernel/include/kernel/Networking/IPv4Layer.h | 1 - kernel/include/kernel/Networking/Loopback.h | 1 + kernel/include/kernel/Networking/TCPSocket.h | 1 - .../include/kernel/Networking/UNIX/Socket.h | 1 + kernel/include/kernel/PCI.h | 2 + kernel/include/kernel/Process.h | 3 +- kernel/include/kernel/Processor.h | 17 ++- kernel/include/kernel/SchedulerQueueNode.h | 2 +- .../include/kernel/Terminal/PseudoTerminal.h | 1 + kernel/include/kernel/Thread.h | 5 +- kernel/include/kernel/ThreadBlocker.h | 10 +- kernel/include/kernel/USB/Hub/HubDriver.h | 1 - kernel/kernel/ACPI/ACPI.cpp | 1 + kernel/kernel/ACPI/BatterySystem.cpp | 3 +- kernel/kernel/ACPI/EmbeddedController.cpp | 2 + kernel/kernel/Audio/Controller.cpp | 1 + kernel/kernel/Epoll.cpp | 1 + kernel/kernel/FS/EventFD.cpp | 1 + kernel/kernel/FS/Ext2/FileSystem.cpp | 1 + kernel/kernel/FS/FAT/FileSystem.cpp | 1 + kernel/kernel/FS/FAT/Inode.cpp | 1 + kernel/kernel/FS/ProcFS/FileSystem.cpp | 1 + kernel/kernel/FS/ProcFS/Inode.cpp | 1 + kernel/kernel/IDT.cpp | 2 + kernel/kernel/Input/InputDevice.cpp | 2 + kernel/kernel/Input/PS2/Controller.cpp | 2 + kernel/kernel/Lock/Mutex.cpp | 134 ++++++++++++++++++ kernel/kernel/Lock/RWLock.cpp | 58 ++++++++ kernel/kernel/Networking/E1000/E1000.cpp | 2 + kernel/kernel/Networking/Loopback.cpp | 2 + kernel/kernel/Networking/RTL8169/RTL8169.cpp | 2 + kernel/kernel/Networking/TCPSocket.cpp | 1 + kernel/kernel/PIC.cpp | 1 + kernel/kernel/Processor.cpp | 4 + kernel/kernel/Scheduler.cpp | 1 + kernel/kernel/Storage/ATA/AHCI/Device.cpp | 1 + kernel/kernel/Terminal/PseudoTerminal.cpp | 1 + kernel/kernel/ThreadBlocker.cpp | 5 +- kernel/kernel/Timer/HPET.cpp | 1 + kernel/kernel/Timer/PIT.cpp | 1 + kernel/kernel/USB/Hub/HubDriver.cpp | 6 +- kernel/kernel/USB/XHCI/Controller.cpp | 1 + 62 files changed, 321 insertions(+), 214 deletions(-) create mode 100644 kernel/include/kernel/InterruptNumbers.h create mode 100644 kernel/kernel/Lock/Mutex.cpp create mode 100644 kernel/kernel/Lock/RWLock.cpp diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index 2351f441..d86801f0 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -51,6 +51,8 @@ set(KERNEL_SOURCES kernel/Interruptable.cpp kernel/InterruptController.cpp kernel/kernel.cpp + kernel/Lock/Mutex.cpp + kernel/Lock/RWLock.cpp kernel/Lock/SpinLock.cpp kernel/Memory/ByteRingBuffer.cpp kernel/Memory/DMARegion.cpp diff --git a/kernel/include/kernel/ACPI/ACPI.h b/kernel/include/kernel/ACPI/ACPI.h index e0174cf4..c56369b0 100644 --- a/kernel/include/kernel/ACPI/ACPI.h +++ b/kernel/include/kernel/ACPI/ACPI.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include diff --git a/kernel/include/kernel/ACPI/EmbeddedController.h b/kernel/include/kernel/ACPI/EmbeddedController.h index 81136983..5afc18c8 100644 --- a/kernel/include/kernel/ACPI/EmbeddedController.h +++ b/kernel/include/kernel/ACPI/EmbeddedController.h @@ -1,11 +1,12 @@ #pragma once #include +#include #include #include #include -#include +#include namespace Kernel::ACPI { diff --git a/kernel/include/kernel/APIC.h b/kernel/include/kernel/APIC.h index 5d81543d..add944ea 100644 --- a/kernel/include/kernel/APIC.h +++ b/kernel/include/kernel/APIC.h @@ -2,6 +2,7 @@ #include #include +#include #include #include diff --git a/kernel/include/kernel/Audio/HDAudio/Definitions.h b/kernel/include/kernel/Audio/HDAudio/Definitions.h index cdacd656..4a7932f2 100644 --- a/kernel/include/kernel/Audio/HDAudio/Definitions.h +++ b/kernel/include/kernel/Audio/HDAudio/Definitions.h @@ -1,5 +1,6 @@ #pragma once +#include #include namespace Kernel::HDAudio diff --git a/kernel/include/kernel/Epoll.h b/kernel/include/kernel/Epoll.h index 57b835fe..f11880cf 100644 --- a/kernel/include/kernel/Epoll.h +++ b/kernel/include/kernel/Epoll.h @@ -3,6 +3,7 @@ #include #include #include +#include #include diff --git a/kernel/include/kernel/FS/DevFS/FileSystem.h b/kernel/include/kernel/FS/DevFS/FileSystem.h index 5244a9ad..e36ee991 100644 --- a/kernel/include/kernel/FS/DevFS/FileSystem.h +++ b/kernel/include/kernel/FS/DevFS/FileSystem.h @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include #include @@ -9,6 +8,8 @@ namespace Kernel { + class Device; + class DevFileSystem final : public TmpFileSystem { public: diff --git a/kernel/include/kernel/FS/EventFD.h b/kernel/include/kernel/FS/EventFD.h index 631fa63a..14416bf7 100644 --- a/kernel/include/kernel/FS/EventFD.h +++ b/kernel/include/kernel/FS/EventFD.h @@ -2,6 +2,7 @@ #include #include +#include namespace Kernel { diff --git a/kernel/include/kernel/FS/Ext2/FileSystem.h b/kernel/include/kernel/FS/Ext2/FileSystem.h index 4c5d1842..3b8902dc 100644 --- a/kernel/include/kernel/FS/Ext2/FileSystem.h +++ b/kernel/include/kernel/FS/Ext2/FileSystem.h @@ -2,8 +2,9 @@ #include #include -#include #include +#include +#include namespace Kernel { diff --git a/kernel/include/kernel/FS/FAT/FileSystem.h b/kernel/include/kernel/FS/FAT/FileSystem.h index 740def36..1af2139a 100644 --- a/kernel/include/kernel/FS/FAT/FileSystem.h +++ b/kernel/include/kernel/FS/FAT/FileSystem.h @@ -5,6 +5,7 @@ #include #include #include +#include namespace Kernel { diff --git a/kernel/include/kernel/FS/FileSystem.h b/kernel/include/kernel/FS/FileSystem.h index 58d8f422..e407b768 100644 --- a/kernel/include/kernel/FS/FileSystem.h +++ b/kernel/include/kernel/FS/FileSystem.h @@ -1,11 +1,12 @@ #pragma once -#include #include namespace Kernel { + class BlockDevice; + class FileSystem : public BAN::RefCounted { public: diff --git a/kernel/include/kernel/FS/ProcFS/FileSystem.h b/kernel/include/kernel/FS/ProcFS/FileSystem.h index fa1aa862..ae0deaac 100644 --- a/kernel/include/kernel/FS/ProcFS/FileSystem.h +++ b/kernel/include/kernel/FS/ProcFS/FileSystem.h @@ -2,11 +2,12 @@ #include #include -#include namespace Kernel { + class Process; + class ProcFileSystem final : public TmpFileSystem { public: diff --git a/kernel/include/kernel/FS/ProcFS/Inode.h b/kernel/include/kernel/FS/ProcFS/Inode.h index c14c6c58..c1d2c3b8 100644 --- a/kernel/include/kernel/FS/ProcFS/Inode.h +++ b/kernel/include/kernel/FS/ProcFS/Inode.h @@ -2,11 +2,12 @@ #include #include -#include namespace Kernel { + class Process; + class ProcPidInode final : public TmpDirectoryInode { // FIXME: dynamically update ruid/rgid. diff --git a/kernel/include/kernel/IDT.h b/kernel/include/kernel/IDT.h index 594a540d..999622b2 100644 --- a/kernel/include/kernel/IDT.h +++ b/kernel/include/kernel/IDT.h @@ -10,21 +10,6 @@ namespace Kernel { - // IDT entries - // 0x00->0x1F (32): ISR - // 0x20->0x7F (96): PIC/IOAPIC - // 0x80->0xEF (112): MSI - // 0xF0->0xFE (15): internal - - constexpr uint8_t IRQ_VECTOR_BASE = 0x20; - constexpr uint8_t IRQ_MSI_BASE = 0x80; - constexpr uint8_t IRQ_MSI_END = 0xF0; -#if ARCH(i686) - constexpr uint8_t IRQ_SYSCALL = 0xF0; // hard coded in kernel/API/Syscall.h -#endif - constexpr uint8_t IRQ_IPI = 0xF1; - constexpr uint8_t IRQ_TIMER = 0xF2; - #if ARCH(x86_64) struct GateDescriptor { diff --git a/kernel/include/kernel/InterruptNumbers.h b/kernel/include/kernel/InterruptNumbers.h new file mode 100644 index 00000000..e092ea73 --- /dev/null +++ b/kernel/include/kernel/InterruptNumbers.h @@ -0,0 +1,23 @@ +#pragma once + +#include + +namespace Kernel +{ + + // IDT entries + // 0x00->0x1F (32): ISR + // 0x20->0x7F (96): PIC/IOAPIC + // 0x80->0xEF (112): MSI + // 0xF0->0xFE (15): internal + + constexpr uint8_t IRQ_VECTOR_BASE = 0x20; + constexpr uint8_t IRQ_MSI_BASE = 0x80; + constexpr uint8_t IRQ_MSI_END = 0xF0; +#if ARCH(i686) + constexpr uint8_t IRQ_SYSCALL = 0xF0; // hard coded in kernel/API/Syscall.h +#endif + constexpr uint8_t IRQ_IPI = 0xF1; + constexpr uint8_t IRQ_TIMER = 0xF2; + +} diff --git a/kernel/include/kernel/Lock/Mutex.h b/kernel/include/kernel/Lock/Mutex.h index d28689e9..3bc48d58 100644 --- a/kernel/include/kernel/Lock/Mutex.h +++ b/kernel/include/kernel/Lock/Mutex.h @@ -2,7 +2,6 @@ #include #include -#include #include @@ -27,63 +26,14 @@ namespace Kernel public: Mutex() = default; - void lock() override - { - const auto tid = Thread::current_tid(); - if (tid == m_locker) - ASSERT(m_lock_depth > 0); - else - { - ASSERT(!tid || !Thread::current().has_spinlock()); - pid_t expected = -1; - while (!m_locker.compare_exchange(expected, tid)) - { - ASSERT(Processor::get_interrupt_state() == InterruptState::Enabled); - Processor::yield(); - expected = -1; - } - ASSERT(m_lock_depth == 0); - if (tid) - Thread::current().add_mutex(); - } - m_lock_depth++; - } - - bool try_lock() - { - const auto tid = Thread::current_tid(); - if (tid == m_locker) - ASSERT(m_lock_depth > 0); - else - { - pid_t expected = -1; - if (!m_locker.compare_exchange(expected, tid)) - return false; - ASSERT(m_lock_depth == 0); - if (tid) - Thread::current().add_mutex(); - } - m_lock_depth++; - return true; - } - - void unlock() override - { - const auto tid = Thread::current_tid(); - ASSERT(m_locker == tid); - ASSERT(m_lock_depth > 0); - if (--m_lock_depth == 0) - { - m_locker = -1; - if (tid) - Thread::current().remove_mutex(); - } - } + bool try_lock(); + void lock() override; + void unlock() override; pid_t locker() const { return m_locker; } bool is_locked() const { return m_locker != -1; } uint32_t lock_depth() const override { return m_lock_depth; } - bool is_locked_by_current_thread() const override { return m_locker == Thread::current_tid(); } + bool is_locked_by_current_thread() const override; private: BAN::Atomic m_locker { -1 }; @@ -98,74 +48,14 @@ namespace Kernel public: PriorityMutex() = default; - void lock() override - { - const auto tid = Thread::current_tid(); - - if (tid == m_locker) - ASSERT(m_lock_depth > 0); - else - { - ASSERT(!tid || !Thread::current().has_spinlock()); - bool has_priority = tid ? !Thread::current().is_userspace() : true; - if (has_priority) - m_queue_length++; - pid_t expected = -1; - while (!(has_priority || m_queue_length == 0) || !m_locker.compare_exchange(expected, tid)) - { - ASSERT(Processor::get_interrupt_state() == InterruptState::Enabled); - Processor::yield(); - expected = -1; - } - ASSERT(m_lock_depth == 0); - if (tid) - Thread::current().add_mutex(); - } - m_lock_depth++; - } - - bool try_lock() - { - const auto tid = Thread::current_tid(); - - if (tid == m_locker) - ASSERT(m_lock_depth > 0); - else - { - bool has_priority = tid ? !Thread::current().is_userspace() : true; - pid_t expected = -1; - if (!(has_priority || m_queue_length == 0) || !m_locker.compare_exchange(expected, tid)) - return false; - if (has_priority) - m_queue_length++; - ASSERT(m_lock_depth == 0); - if (tid) - Thread::current().add_mutex(); - } - m_lock_depth++; - return true; - } - - void unlock() override - { - const auto tid = Thread::current_tid(); - ASSERT(m_locker == tid); - ASSERT(m_lock_depth > 0); - if (--m_lock_depth == 0) - { - bool has_priority = tid ? !Thread::current().is_userspace() : true; - if (has_priority) - m_queue_length--; - m_locker = -1; - if (tid) - Thread::current().remove_mutex(); - } - } + bool try_lock(); + void lock() override; + void unlock() override; pid_t locker() const { return m_locker; } bool is_locked() const { return m_locker != -1; } uint32_t lock_depth() const override { return m_lock_depth; } - bool is_locked_by_current_thread() const override { return m_locker == Thread::current_tid(); } + bool is_locked_by_current_thread() const override; private: BAN::Atomic m_locker { -1 }; diff --git a/kernel/include/kernel/Lock/RWLock.h b/kernel/include/kernel/Lock/RWLock.h index 39c57b27..c150c576 100644 --- a/kernel/include/kernel/Lock/RWLock.h +++ b/kernel/include/kernel/Lock/RWLock.h @@ -1,7 +1,7 @@ #pragma once -#include #include +#include namespace Kernel { @@ -13,54 +13,10 @@ namespace Kernel public: RWLock() = default; - void rd_lock() - { - SpinLockGuard _(m_lock); - while (m_writers_waiting > 0 || m_writer != -1) - { - BlockableSpinLock block(m_lock); - m_thread_blocker.block_indefinite(&block); - } - m_readers_active++; - } - - void rd_unlock() - { - SpinLockGuard _(m_lock); - if (--m_readers_active == 0) - m_thread_blocker.unblock(); - } - - void wr_lock() - { - if (m_writer == Thread::current_tid()) - { - m_writer_depth++; - return; - } - - SpinLockGuard _(m_lock); - - m_writers_waiting++; - while (m_readers_active > 0 || m_writer != -1) - { - BlockableSpinLock block(m_lock); - m_thread_blocker.block_indefinite(&block); - } - m_writers_waiting--; - - m_writer = Thread::current_tid(); - m_writer_depth = 1; - } - - void wr_unlock() - { - if (--m_writer_depth != 0) - return; - SpinLockGuard _(m_lock); - m_writer = -1; - m_thread_blocker.unblock(); - } + void rd_lock(); + void rd_unlock(); + void wr_lock(); + void wr_unlock(); private: SpinLock m_lock; diff --git a/kernel/include/kernel/Memory/MemoryBackedRegion.h b/kernel/include/kernel/Memory/MemoryBackedRegion.h index 718c0b9a..45c5fcfe 100644 --- a/kernel/include/kernel/Memory/MemoryBackedRegion.h +++ b/kernel/include/kernel/Memory/MemoryBackedRegion.h @@ -1,5 +1,6 @@ #pragma once +#include #include namespace Kernel diff --git a/kernel/include/kernel/Memory/SharedMemoryObject.h b/kernel/include/kernel/Memory/SharedMemoryObject.h index 0f09cec9..c16500a7 100644 --- a/kernel/include/kernel/Memory/SharedMemoryObject.h +++ b/kernel/include/kernel/Memory/SharedMemoryObject.h @@ -1,7 +1,9 @@ #pragma once #include +#include #include +#include #include #include #include diff --git a/kernel/include/kernel/Networking/ARPTable.h b/kernel/include/kernel/Networking/ARPTable.h index 0aca85c0..80292af4 100644 --- a/kernel/include/kernel/Networking/ARPTable.h +++ b/kernel/include/kernel/Networking/ARPTable.h @@ -4,8 +4,6 @@ #include #include #include -#include -#include namespace Kernel { diff --git a/kernel/include/kernel/Networking/IPv4Layer.h b/kernel/include/kernel/Networking/IPv4Layer.h index 40e9e412..56a49670 100644 --- a/kernel/include/kernel/Networking/IPv4Layer.h +++ b/kernel/include/kernel/Networking/IPv4Layer.h @@ -11,7 +11,6 @@ #include #include #include -#include namespace Kernel { diff --git a/kernel/include/kernel/Networking/Loopback.h b/kernel/include/kernel/Networking/Loopback.h index eb6f0fdd..169b460b 100644 --- a/kernel/include/kernel/Networking/Loopback.h +++ b/kernel/include/kernel/Networking/Loopback.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace Kernel { diff --git a/kernel/include/kernel/Networking/TCPSocket.h b/kernel/include/kernel/Networking/TCPSocket.h index 95528da9..589c78bc 100644 --- a/kernel/include/kernel/Networking/TCPSocket.h +++ b/kernel/include/kernel/Networking/TCPSocket.h @@ -7,7 +7,6 @@ #include #include #include -#include #include namespace Kernel diff --git a/kernel/include/kernel/Networking/UNIX/Socket.h b/kernel/include/kernel/Networking/UNIX/Socket.h index 362f2710..d2df4762 100644 --- a/kernel/include/kernel/Networking/UNIX/Socket.h +++ b/kernel/include/kernel/Networking/UNIX/Socket.h @@ -6,6 +6,7 @@ #include #include #include +#include #include namespace Kernel diff --git a/kernel/include/kernel/PCI.h b/kernel/include/kernel/PCI.h index 3cc4c99f..46a2fc9a 100644 --- a/kernel/include/kernel/PCI.h +++ b/kernel/include/kernel/PCI.h @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include #include diff --git a/kernel/include/kernel/Process.h b/kernel/include/kernel/Process.h index 6fa94371..0a25e09f 100644 --- a/kernel/include/kernel/Process.h +++ b/kernel/include/kernel/Process.h @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -26,8 +27,6 @@ #include #include -struct epoll_event; - namespace Kernel { diff --git a/kernel/include/kernel/Processor.h b/kernel/include/kernel/Processor.h index 3359133e..395da162 100644 --- a/kernel/include/kernel/Processor.h +++ b/kernel/include/kernel/Processor.h @@ -1,17 +1,14 @@ #pragma once +#include #include -#include +#include #include #include #include -#include -#include -#include #include #include -#include namespace Kernel { @@ -22,6 +19,12 @@ namespace Kernel Enabled, }; + class GDT; + class IDT; + class Scheduler; + class SchedulerQueueNode; + class Thread; + #if ARCH(x86_64) || ARCH(i686) class Processor { @@ -51,8 +54,8 @@ namespace Kernel union { TLBEntry flush_tlb; - SchedulerQueue::Node* new_thread; - SchedulerQueue::Node* unblock_thread; + SchedulerQueueNode* new_thread; + SchedulerQueueNode* unblock_thread; bool dummy; }; }; diff --git a/kernel/include/kernel/SchedulerQueueNode.h b/kernel/include/kernel/SchedulerQueueNode.h index 0b0f4e03..a94761f0 100644 --- a/kernel/include/kernel/SchedulerQueueNode.h +++ b/kernel/include/kernel/SchedulerQueueNode.h @@ -1,7 +1,7 @@ #pragma once +#include #include -#include namespace Kernel { diff --git a/kernel/include/kernel/Terminal/PseudoTerminal.h b/kernel/include/kernel/Terminal/PseudoTerminal.h index 3833729f..df55dd65 100644 --- a/kernel/include/kernel/Terminal/PseudoTerminal.h +++ b/kernel/include/kernel/Terminal/PseudoTerminal.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include namespace Kernel diff --git a/kernel/include/kernel/Thread.h b/kernel/include/kernel/Thread.h index d090c77c..0503beab 100644 --- a/kernel/include/kernel/Thread.h +++ b/kernel/include/kernel/Thread.h @@ -5,8 +5,8 @@ #include #include #include +#include #include -#include #include @@ -18,6 +18,7 @@ namespace Kernel class MemoryBackedRegion; class Process; + class ThreadBlocker; class Thread { @@ -191,7 +192,7 @@ namespace Kernel vaddr_t m_fsbase { 0 }; vaddr_t m_gsbase { 0 }; - SchedulerQueue::Node* m_scheduler_node { nullptr }; + SchedulerQueueNode* m_scheduler_node { nullptr }; YieldRegisters m_yield_registers { }; diff --git a/kernel/include/kernel/ThreadBlocker.h b/kernel/include/kernel/ThreadBlocker.h index e9fd91b9..dfa14984 100644 --- a/kernel/include/kernel/ThreadBlocker.h +++ b/kernel/include/kernel/ThreadBlocker.h @@ -1,12 +1,14 @@ #pragma once #include +#include #include -#include namespace Kernel { + class SchedulerQueueNode; + class ThreadBlocker { public: @@ -27,11 +29,11 @@ namespace Kernel } private: - void add_thread_to_block_queue(SchedulerQueue::Node*); - void remove_thread_from_block_queue(SchedulerQueue::Node*); + void add_thread_to_block_queue(SchedulerQueueNode*); + void remove_thread_from_block_queue(SchedulerQueueNode*); private: - SchedulerQueue::Node* m_block_chain { nullptr }; + SchedulerQueueNode* m_block_chain { nullptr }; SpinLock m_lock; friend class Scheduler; diff --git a/kernel/include/kernel/USB/Hub/HubDriver.h b/kernel/include/kernel/USB/Hub/HubDriver.h index 66c8f54b..c8152971 100644 --- a/kernel/include/kernel/USB/Hub/HubDriver.h +++ b/kernel/include/kernel/USB/Hub/HubDriver.h @@ -1,6 +1,5 @@ #pragma once -#include #include namespace Kernel diff --git a/kernel/kernel/ACPI/ACPI.cpp b/kernel/kernel/ACPI/ACPI.cpp index f39b503b..6d6117e1 100644 --- a/kernel/kernel/ACPI/ACPI.cpp +++ b/kernel/kernel/ACPI/ACPI.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #define RSPD_SIZE 20 diff --git a/kernel/kernel/ACPI/BatterySystem.cpp b/kernel/kernel/ACPI/BatterySystem.cpp index 460d58af..11a707bf 100644 --- a/kernel/kernel/ACPI/BatterySystem.cpp +++ b/kernel/kernel/ACPI/BatterySystem.cpp @@ -1,5 +1,6 @@ #include -#include +#include +#include #include namespace Kernel::ACPI diff --git a/kernel/kernel/ACPI/EmbeddedController.cpp b/kernel/kernel/ACPI/EmbeddedController.cpp index 7811f0bd..2a4528d6 100644 --- a/kernel/kernel/ACPI/EmbeddedController.cpp +++ b/kernel/kernel/ACPI/EmbeddedController.cpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include namespace Kernel::ACPI diff --git a/kernel/kernel/Audio/Controller.cpp b/kernel/kernel/Audio/Controller.cpp index 21fbe940..c691424e 100644 --- a/kernel/kernel/Audio/Controller.cpp +++ b/kernel/kernel/Audio/Controller.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include diff --git a/kernel/kernel/Epoll.cpp b/kernel/kernel/Epoll.cpp index ba3bc9d1..97aa0f4d 100644 --- a/kernel/kernel/Epoll.cpp +++ b/kernel/kernel/Epoll.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include namespace Kernel diff --git a/kernel/kernel/FS/EventFD.cpp b/kernel/kernel/FS/EventFD.cpp index ffba4f3c..6db4bc0c 100644 --- a/kernel/kernel/FS/EventFD.cpp +++ b/kernel/kernel/FS/EventFD.cpp @@ -1,5 +1,6 @@ #include #include +#include #include diff --git a/kernel/kernel/FS/Ext2/FileSystem.cpp b/kernel/kernel/FS/Ext2/FileSystem.cpp index 568a56b2..ecb0090a 100644 --- a/kernel/kernel/FS/Ext2/FileSystem.cpp +++ b/kernel/kernel/FS/Ext2/FileSystem.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #define EXT2_DEBUG_PRINT 0 #define EXT2_VERIFY_INODE 0 diff --git a/kernel/kernel/FS/FAT/FileSystem.cpp b/kernel/kernel/FS/FAT/FileSystem.cpp index 3c1f701a..145290c4 100644 --- a/kernel/kernel/FS/FAT/FileSystem.cpp +++ b/kernel/kernel/FS/FAT/FileSystem.cpp @@ -1,3 +1,4 @@ +#include #include #include diff --git a/kernel/kernel/FS/FAT/Inode.cpp b/kernel/kernel/FS/FAT/Inode.cpp index a1f2b0a3..444fcdc3 100644 --- a/kernel/kernel/FS/FAT/Inode.cpp +++ b/kernel/kernel/FS/FAT/Inode.cpp @@ -1,5 +1,6 @@ #include +#include #include #include diff --git a/kernel/kernel/FS/ProcFS/FileSystem.cpp b/kernel/kernel/FS/ProcFS/FileSystem.cpp index 83e1d0f4..0160a476 100644 --- a/kernel/kernel/FS/ProcFS/FileSystem.cpp +++ b/kernel/kernel/FS/ProcFS/FileSystem.cpp @@ -1,6 +1,7 @@ #include #include #include +#include namespace Kernel { diff --git a/kernel/kernel/FS/ProcFS/Inode.cpp b/kernel/kernel/FS/ProcFS/Inode.cpp index 3f79c410..c021328a 100644 --- a/kernel/kernel/FS/ProcFS/Inode.cpp +++ b/kernel/kernel/FS/ProcFS/Inode.cpp @@ -1,4 +1,5 @@ #include +#include #include diff --git a/kernel/kernel/IDT.cpp b/kernel/kernel/IDT.cpp index de1d17e3..1f751924 100644 --- a/kernel/kernel/IDT.cpp +++ b/kernel/kernel/IDT.cpp @@ -1,7 +1,9 @@ #include #include +#include #include #include +#include #include #include #include diff --git a/kernel/kernel/Input/InputDevice.cpp b/kernel/kernel/Input/InputDevice.cpp index 0ddba30d..14dc6119 100644 --- a/kernel/kernel/Input/InputDevice.cpp +++ b/kernel/kernel/Input/InputDevice.cpp @@ -4,7 +4,9 @@ #include #include #include +#include #include +#include #include #include diff --git a/kernel/kernel/Input/PS2/Controller.cpp b/kernel/kernel/Input/PS2/Controller.cpp index bf4a61fc..4cbf91a6 100644 --- a/kernel/kernel/Input/PS2/Controller.cpp +++ b/kernel/kernel/Input/PS2/Controller.cpp @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include namespace Kernel::Input diff --git a/kernel/kernel/Lock/Mutex.cpp b/kernel/kernel/Lock/Mutex.cpp new file mode 100644 index 00000000..4517b735 --- /dev/null +++ b/kernel/kernel/Lock/Mutex.cpp @@ -0,0 +1,134 @@ +#include +#include + +namespace Kernel +{ + + bool Mutex::try_lock() + { + const auto tid = Thread::current_tid(); + if (tid == m_locker) + ASSERT(m_lock_depth > 0); + else + { + pid_t expected = -1; + if (!m_locker.compare_exchange(expected, tid)) + return false; + ASSERT(m_lock_depth == 0); + if (tid) + Thread::current().add_mutex(); + } + m_lock_depth++; + return true; + } + + void Mutex::lock() + { + const auto tid = Thread::current_tid(); + if (tid == m_locker) + ASSERT(m_lock_depth > 0); + else + { + ASSERT(!tid || !Thread::current().has_spinlock()); + pid_t expected = -1; + while (!m_locker.compare_exchange(expected, tid)) + { + ASSERT(Processor::get_interrupt_state() == InterruptState::Enabled); + Processor::yield(); + expected = -1; + } + ASSERT(m_lock_depth == 0); + if (tid) + Thread::current().add_mutex(); + } + m_lock_depth++; + } + + void Mutex::unlock() + { + const auto tid = Thread::current_tid(); + ASSERT(m_locker == tid); + ASSERT(m_lock_depth > 0); + if (--m_lock_depth == 0) + { + m_locker = -1; + if (tid) + Thread::current().remove_mutex(); + } + } + + bool Mutex::is_locked_by_current_thread() const + { + return m_locker == Thread::current_tid(); + } + + bool PriorityMutex::try_lock() + { + const auto tid = Thread::current_tid(); + + if (tid == m_locker) + ASSERT(m_lock_depth > 0); + else + { + bool has_priority = tid ? !Thread::current().is_userspace() : true; + pid_t expected = -1; + if (!(has_priority || m_queue_length == 0) || !m_locker.compare_exchange(expected, tid)) + return false; + if (has_priority) + m_queue_length++; + ASSERT(m_lock_depth == 0); + if (tid) + Thread::current().add_mutex(); + } + m_lock_depth++; + return true; + } + + void PriorityMutex::lock() + { + const auto tid = Thread::current_tid(); + + if (tid == m_locker) + ASSERT(m_lock_depth > 0); + else + { + ASSERT(!tid || !Thread::current().has_spinlock()); + bool has_priority = tid ? !Thread::current().is_userspace() : true; + if (has_priority) + m_queue_length++; + pid_t expected = -1; + while (!(has_priority || m_queue_length == 0) || !m_locker.compare_exchange(expected, tid)) + { + ASSERT(Processor::get_interrupt_state() == InterruptState::Enabled); + Processor::yield(); + expected = -1; + } + ASSERT(m_lock_depth == 0); + if (tid) + Thread::current().add_mutex(); + } + m_lock_depth++; + } + + void PriorityMutex::unlock() + { + const auto tid = Thread::current_tid(); + ASSERT(m_locker == tid); + ASSERT(m_lock_depth > 0); + if (--m_lock_depth == 0) + { + bool has_priority = tid ? !Thread::current().is_userspace() : true; + if (has_priority) + m_queue_length--; + m_locker = -1; + if (tid) + Thread::current().remove_mutex(); + } + } + + bool PriorityMutex::is_locked_by_current_thread() const + { + return m_locker == Thread::current_tid(); + } + +} diff --git a/kernel/kernel/Lock/RWLock.cpp b/kernel/kernel/Lock/RWLock.cpp new file mode 100644 index 00000000..4a4f8a76 --- /dev/null +++ b/kernel/kernel/Lock/RWLock.cpp @@ -0,0 +1,58 @@ + +#include +#include +#include + +namespace Kernel +{ + + void RWLock::rd_lock() + { + SpinLockGuard _(m_lock); + while (m_writers_waiting > 0 || m_writer != -1) + { + BlockableSpinLock block(m_lock); + m_thread_blocker.block_indefinite(&block); + } + m_readers_active++; + } + + void RWLock::rd_unlock() + { + SpinLockGuard _(m_lock); + if (--m_readers_active == 0) + m_thread_blocker.unblock(); + } + + void RWLock::wr_lock() + { + if (m_writer == Thread::current_tid()) + { + m_writer_depth++; + return; + } + + SpinLockGuard _(m_lock); + + m_writers_waiting++; + while (m_readers_active > 0 || m_writer != -1) + { + BlockableSpinLock block(m_lock); + m_thread_blocker.block_indefinite(&block); + } + m_writers_waiting--; + + m_writer = Thread::current_tid(); + m_writer_depth = 1; + } + + void RWLock::wr_unlock() + { + if (--m_writer_depth != 0) + return; + SpinLockGuard _(m_lock); + m_writer = -1; + m_thread_blocker.unblock(); + } + +} diff --git a/kernel/kernel/Networking/E1000/E1000.cpp b/kernel/kernel/Networking/E1000/E1000.cpp index e6c5b4e9..e6aa02d3 100644 --- a/kernel/kernel/Networking/E1000/E1000.cpp +++ b/kernel/kernel/Networking/E1000/E1000.cpp @@ -6,6 +6,8 @@ #include #include #include +#include +#include namespace Kernel { diff --git a/kernel/kernel/Networking/Loopback.cpp b/kernel/kernel/Networking/Loopback.cpp index 3f795500..6d2f670d 100644 --- a/kernel/kernel/Networking/Loopback.cpp +++ b/kernel/kernel/Networking/Loopback.cpp @@ -1,6 +1,8 @@ #include #include #include +#include +#include namespace Kernel { diff --git a/kernel/kernel/Networking/RTL8169/RTL8169.cpp b/kernel/kernel/Networking/RTL8169/RTL8169.cpp index 8d9a075f..006fcc32 100644 --- a/kernel/kernel/Networking/RTL8169/RTL8169.cpp +++ b/kernel/kernel/Networking/RTL8169/RTL8169.cpp @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include namespace Kernel diff --git a/kernel/kernel/Networking/TCPSocket.cpp b/kernel/kernel/Networking/TCPSocket.cpp index 5827ca01..6cc214c6 100644 --- a/kernel/kernel/Networking/TCPSocket.cpp +++ b/kernel/kernel/Networking/TCPSocket.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include diff --git a/kernel/kernel/PIC.cpp b/kernel/kernel/PIC.cpp index b9fea420..3ad7fa7b 100644 --- a/kernel/kernel/PIC.cpp +++ b/kernel/kernel/PIC.cpp @@ -1,4 +1,5 @@ #include +#include #include #include diff --git a/kernel/kernel/Processor.cpp b/kernel/kernel/Processor.cpp index e216ab9a..3bf8afa3 100644 --- a/kernel/kernel/Processor.cpp +++ b/kernel/kernel/Processor.cpp @@ -1,8 +1,12 @@ #include +#include +#include #include +#include #include #include #include +#include #include #include #include diff --git a/kernel/kernel/Scheduler.cpp b/kernel/kernel/Scheduler.cpp index 6611cef7..7be42f6e 100644 --- a/kernel/kernel/Scheduler.cpp +++ b/kernel/kernel/Scheduler.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include diff --git a/kernel/kernel/Storage/ATA/AHCI/Device.cpp b/kernel/kernel/Storage/ATA/AHCI/Device.cpp index 7b661fea..6f95e6a5 100644 --- a/kernel/kernel/Storage/ATA/AHCI/Device.cpp +++ b/kernel/kernel/Storage/ATA/AHCI/Device.cpp @@ -1,3 +1,4 @@ +#include #include #include #include diff --git a/kernel/kernel/Terminal/PseudoTerminal.cpp b/kernel/kernel/Terminal/PseudoTerminal.cpp index 56828137..48b58780 100644 --- a/kernel/kernel/Terminal/PseudoTerminal.cpp +++ b/kernel/kernel/Terminal/PseudoTerminal.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include diff --git a/kernel/kernel/ThreadBlocker.cpp b/kernel/kernel/ThreadBlocker.cpp index 49969339..ad32a1f1 100644 --- a/kernel/kernel/ThreadBlocker.cpp +++ b/kernel/kernel/ThreadBlocker.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -44,7 +45,7 @@ namespace Kernel m_block_chain = nullptr; } - void ThreadBlocker::add_thread_to_block_queue(SchedulerQueue::Node* node) + void ThreadBlocker::add_thread_to_block_queue(SchedulerQueueNode* node) { SpinLockGuard _(m_lock); @@ -60,7 +61,7 @@ namespace Kernel m_block_chain = node; } - void ThreadBlocker::remove_thread_from_block_queue(SchedulerQueue::Node* node) + void ThreadBlocker::remove_thread_from_block_queue(SchedulerQueueNode* node) { SpinLockGuard _(m_lock); diff --git a/kernel/kernel/Timer/HPET.cpp b/kernel/kernel/Timer/HPET.cpp index aebd8b36..72f35961 100644 --- a/kernel/kernel/Timer/HPET.cpp +++ b/kernel/kernel/Timer/HPET.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #define HPET_PERIOD_MAX 0x05F5E100 diff --git a/kernel/kernel/Timer/PIT.cpp b/kernel/kernel/Timer/PIT.cpp index 06f58677..bffa09a0 100644 --- a/kernel/kernel/Timer/PIT.cpp +++ b/kernel/kernel/Timer/PIT.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #define PIT_IRQ 0 diff --git a/kernel/kernel/USB/Hub/HubDriver.cpp b/kernel/kernel/USB/Hub/HubDriver.cpp index 39060c54..e4c89949 100644 --- a/kernel/kernel/USB/Hub/HubDriver.cpp +++ b/kernel/kernel/USB/Hub/HubDriver.cpp @@ -1,7 +1,9 @@ #include +#include +#include +#include #include #include -#include namespace Kernel { @@ -192,7 +194,7 @@ namespace Kernel auto result = m_device.send_request(request, m_data_region->paddr()); if (result.is_error() || result.value() != sizeof(USBHub::PortStatus)) { - dwarnln("Failed to get port {} status"); + dwarnln("Failed to get port {} status", port_id); continue; } diff --git a/kernel/kernel/USB/XHCI/Controller.cpp b/kernel/kernel/USB/XHCI/Controller.cpp index a2f82813..17ef4d13 100644 --- a/kernel/kernel/USB/XHCI/Controller.cpp +++ b/kernel/kernel/USB/XHCI/Controller.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include