From 9594ee8e477b4be48871cedfc441560d761415c9 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Thu, 22 Feb 2024 15:53:48 +0200 Subject: [PATCH] Kernel: Start making device numbers unique for each device --- kernel/include/kernel/Device/DeviceNumbers.h | 24 +++++++++++++++++++ kernel/include/kernel/FS/DevFS/FileSystem.h | 1 - kernel/include/kernel/FS/Ext2/FileSystem.h | 2 ++ kernel/include/kernel/FS/FileSystem.h | 2 ++ kernel/include/kernel/FS/TmpFS/FileSystem.h | 4 ++++ kernel/include/kernel/FS/TmpFS/Inode.h | 4 ++-- kernel/include/kernel/FS/VirtualFileSystem.h | 3 +++ kernel/include/kernel/Input/PS2/Device.h | 6 +++-- kernel/kernel/Device/DebugDevice.cpp | 7 ++++-- kernel/kernel/Device/FramebufferDevice.cpp | 6 +++-- kernel/kernel/Device/NullDevice.cpp | 7 ++++-- kernel/kernel/Device/ZeroDevice.cpp | 7 ++++-- kernel/kernel/FS/DevFS/FileSystem.cpp | 10 +------- kernel/kernel/FS/TmpFS/FileSystem.cpp | 12 +++++++++- kernel/kernel/FS/TmpFS/Inode.cpp | 5 ++++ kernel/kernel/Input/PS2/Device.cpp | 5 ++-- kernel/kernel/Networking/NetworkInterface.cpp | 9 ++----- kernel/kernel/Storage/ATA/ATADevice.cpp | 9 ++----- kernel/kernel/Storage/NVMe/Controller.cpp | 9 ++----- kernel/kernel/Storage/NVMe/Namespace.cpp | 9 ++----- kernel/kernel/Terminal/Serial.cpp | 4 ++-- kernel/kernel/Terminal/VirtualTTY.cpp | 4 ++-- 22 files changed, 92 insertions(+), 57 deletions(-) create mode 100644 kernel/include/kernel/Device/DeviceNumbers.h diff --git a/kernel/include/kernel/Device/DeviceNumbers.h b/kernel/include/kernel/Device/DeviceNumbers.h new file mode 100644 index 00000000..a60184e8 --- /dev/null +++ b/kernel/include/kernel/Device/DeviceNumbers.h @@ -0,0 +1,24 @@ +#pragma once + +#include + +namespace Kernel +{ + + enum class DeviceNumber : dev_t + { + Framebuffer = 1, + TTY, + Serial, + Null, + Zero, + Debug, + Input, + SCSI, + NVMeController, + NVMeNamespace, + Ethernet, + TmpFS, + }; + +} diff --git a/kernel/include/kernel/FS/DevFS/FileSystem.h b/kernel/include/kernel/FS/DevFS/FileSystem.h index a23ac63f..333201e7 100644 --- a/kernel/include/kernel/FS/DevFS/FileSystem.h +++ b/kernel/include/kernel/FS/DevFS/FileSystem.h @@ -19,7 +19,6 @@ namespace Kernel void add_device(BAN::RefPtr); void add_inode(BAN::StringView path, BAN::RefPtr); - dev_t get_next_dev() const; int get_next_input_device() const; void initiate_sync(bool should_block); diff --git a/kernel/include/kernel/FS/Ext2/FileSystem.h b/kernel/include/kernel/FS/Ext2/FileSystem.h index 167410f6..95ab1978 100644 --- a/kernel/include/kernel/FS/Ext2/FileSystem.h +++ b/kernel/include/kernel/FS/Ext2/FileSystem.h @@ -49,6 +49,8 @@ namespace Kernel virtual BAN::RefPtr root_inode() override { return m_root_inode; } + virtual dev_t dev() const override { return m_block_device->rdev(); }; + private: Ext2FS(BAN::RefPtr block_device) : m_block_device(block_device) diff --git a/kernel/include/kernel/FS/FileSystem.h b/kernel/include/kernel/FS/FileSystem.h index de7258ef..35798e51 100644 --- a/kernel/include/kernel/FS/FileSystem.h +++ b/kernel/include/kernel/FS/FileSystem.h @@ -10,6 +10,8 @@ namespace Kernel public: virtual ~FileSystem() {} virtual BAN::RefPtr root_inode() = 0; + + virtual dev_t dev() const = 0; }; } diff --git a/kernel/include/kernel/FS/TmpFS/FileSystem.h b/kernel/include/kernel/FS/TmpFS/FileSystem.h index 2148aa74..3a33dac8 100644 --- a/kernel/include/kernel/FS/TmpFS/FileSystem.h +++ b/kernel/include/kernel/FS/TmpFS/FileSystem.h @@ -46,6 +46,8 @@ namespace Kernel virtual BAN::RefPtr root_inode() override { return m_root_inode; } + virtual dev_t dev() const override { return m_rdev; } + BAN::ErrorOr> open_inode(ino_t ino); BAN::ErrorOr add_to_cache(BAN::RefPtr); @@ -115,6 +117,8 @@ namespace Kernel paddr_t find_indirect(PageInfo root, size_t index, size_t depth); private: + const dev_t m_rdev; + RecursiveSpinLock m_lock; BAN::HashMap> m_inode_cache; diff --git a/kernel/include/kernel/FS/TmpFS/Inode.h b/kernel/include/kernel/FS/TmpFS/Inode.h index 5a78c974..11763af0 100644 --- a/kernel/include/kernel/FS/TmpFS/Inode.h +++ b/kernel/include/kernel/FS/TmpFS/Inode.h @@ -35,8 +35,8 @@ namespace Kernel virtual timespec ctime() const override { return m_inode_info.ctime; } virtual blksize_t blksize() const override { return PAGE_SIZE; } virtual blkcnt_t blocks() const override { return m_inode_info.blocks; } - virtual dev_t dev() const override { return 0; } // TODO - virtual dev_t rdev() const override { return 0; } // TODO + virtual dev_t dev() const override; + virtual dev_t rdev() const override { return 0; } public: static BAN::ErrorOr> create_from_existing(TmpFileSystem&, ino_t, const TmpInodeInfo&); diff --git a/kernel/include/kernel/FS/VirtualFileSystem.h b/kernel/include/kernel/FS/VirtualFileSystem.h index 0d3be37c..803caed9 100644 --- a/kernel/include/kernel/FS/VirtualFileSystem.h +++ b/kernel/include/kernel/FS/VirtualFileSystem.h @@ -17,6 +17,9 @@ namespace Kernel virtual BAN::RefPtr root_inode() override { return m_root_fs->root_inode(); } + // FIXME: + virtual dev_t dev() const override { return 0; } + BAN::ErrorOr mount(const Credentials&, BAN::StringView, BAN::StringView); BAN::ErrorOr mount(const Credentials&, FileSystem*, BAN::StringView); diff --git a/kernel/include/kernel/Input/PS2/Device.h b/kernel/include/kernel/Input/PS2/Device.h index e49e08db..2ec4cbfa 100644 --- a/kernel/include/kernel/Input/PS2/Device.h +++ b/kernel/include/kernel/Input/PS2/Device.h @@ -9,7 +9,6 @@ namespace Kernel::Input class PS2Device : public CharacterDevice, public Interruptable { public: - PS2Device(PS2Controller&); virtual ~PS2Device() {} virtual void send_initialize() = 0; @@ -27,9 +26,12 @@ namespace Kernel::Input virtual void update() final override { m_controller.update_command_queue(); } + protected: + PS2Device(PS2Controller&); + private: - const BAN::String m_name; const dev_t m_rdev; + const BAN::String m_name; PS2Controller& m_controller; }; diff --git a/kernel/kernel/Device/DebugDevice.cpp b/kernel/kernel/Device/DebugDevice.cpp index 380823c2..35615204 100644 --- a/kernel/kernel/Device/DebugDevice.cpp +++ b/kernel/kernel/Device/DebugDevice.cpp @@ -1,14 +1,17 @@ #include -#include +#include #include #include +#include + namespace Kernel { BAN::ErrorOr> DebugDevice::create(mode_t mode, uid_t uid, gid_t gid) { - auto* result = new DebugDevice(mode, uid, gid, DevFileSystem::get().get_next_dev()); + static uint32_t minor = 0; + auto* result = new DebugDevice(mode, uid, gid, makedev(DeviceNumber::Debug, minor++)); if (result == nullptr) return BAN::Error::from_errno(ENOMEM); return BAN::RefPtr::adopt(result); diff --git a/kernel/kernel/Device/FramebufferDevice.cpp b/kernel/kernel/Device/FramebufferDevice.cpp index ad7fe3f2..f2a0fb5a 100644 --- a/kernel/kernel/Device/FramebufferDevice.cpp +++ b/kernel/kernel/Device/FramebufferDevice.cpp @@ -1,10 +1,12 @@ #include +#include #include #include #include #include #include +#include namespace Kernel { @@ -23,7 +25,7 @@ namespace Kernel return BAN::Error::from_errno(ENOTSUP); auto* device_ptr = new FramebufferDevice( 0660, 0, 900, - DevFileSystem::get().get_next_dev(), + makedev(DeviceNumber::Framebuffer, get_framebuffer_device_index()), g_boot_info.framebuffer.address, g_boot_info.framebuffer.width, g_boot_info.framebuffer.height, @@ -39,7 +41,7 @@ namespace Kernel FramebufferDevice::FramebufferDevice(mode_t mode, uid_t uid, gid_t gid, dev_t rdev, paddr_t paddr, uint32_t width, uint32_t height, uint32_t pitch, uint8_t bpp) : CharacterDevice(mode, uid, gid) - , m_name(BAN::String::formatted("fb{}", get_framebuffer_device_index())) + , m_name(BAN::String::formatted("fb{}", minor(rdev))) , m_rdev(rdev) , m_video_memory_paddr(paddr) , m_width(width) diff --git a/kernel/kernel/Device/NullDevice.cpp b/kernel/kernel/Device/NullDevice.cpp index 5201d75b..eca59b23 100644 --- a/kernel/kernel/Device/NullDevice.cpp +++ b/kernel/kernel/Device/NullDevice.cpp @@ -1,12 +1,15 @@ +#include #include -#include + +#include namespace Kernel { BAN::ErrorOr> NullDevice::create(mode_t mode, uid_t uid, gid_t gid) { - auto* result = new NullDevice(mode, uid, gid, DevFileSystem::get().get_next_dev()); + static uint32_t minor = 0; + auto* result = new NullDevice(mode, uid, gid, makedev(DeviceNumber::Null, minor++)); if (result == nullptr) return BAN::Error::from_errno(ENOMEM); return BAN::RefPtr::adopt(result); diff --git a/kernel/kernel/Device/ZeroDevice.cpp b/kernel/kernel/Device/ZeroDevice.cpp index 34c9ccf6..7c62a0f1 100644 --- a/kernel/kernel/Device/ZeroDevice.cpp +++ b/kernel/kernel/Device/ZeroDevice.cpp @@ -1,12 +1,15 @@ +#include #include -#include + +#include namespace Kernel { BAN::ErrorOr> ZeroDevice::create(mode_t mode, uid_t uid, gid_t gid) { - auto* result = new ZeroDevice(mode, uid, gid, DevFileSystem::get().get_next_dev()); + static uint32_t minor = 0; + auto* result = new ZeroDevice(mode, uid, gid, makedev(DeviceNumber::Zero, minor++)); if (result == nullptr) return BAN::Error::from_errno(ENOMEM); return BAN::RefPtr::adopt(result); diff --git a/kernel/kernel/FS/DevFS/FileSystem.cpp b/kernel/kernel/FS/DevFS/FileSystem.cpp index 038d5c2c..2e615d20 100644 --- a/kernel/kernel/FS/DevFS/FileSystem.cpp +++ b/kernel/kernel/FS/DevFS/FileSystem.cpp @@ -122,17 +122,9 @@ namespace Kernel MUST(static_cast(root_inode().ptr())->link_inode(*inode, path)); } - dev_t DevFileSystem::get_next_dev() const - { - LockGuard _(m_device_lock); - static dev_t next_dev = 1; - return next_dev++; - } - int DevFileSystem::get_next_input_device() const { - LockGuard _(m_device_lock); - static dev_t next_dev = 0; + static BAN::Atomic next_dev = 0; return next_dev++; } diff --git a/kernel/kernel/FS/TmpFS/FileSystem.cpp b/kernel/kernel/FS/TmpFS/FileSystem.cpp index 8bf2fd68..582afb35 100644 --- a/kernel/kernel/FS/TmpFS/FileSystem.cpp +++ b/kernel/kernel/FS/TmpFS/FileSystem.cpp @@ -1,9 +1,18 @@ +#include #include #include +#include + namespace Kernel { + static dev_t get_next_rdev() + { + static dev_t minor = 0; + return makedev(DeviceNumber::TmpFS, minor++); + } + BAN::ErrorOr TmpFileSystem::create(size_t max_pages, mode_t mode, uid_t uid, gid_t gid) { if (max_pages < 2) @@ -17,7 +26,8 @@ namespace Kernel } TmpFileSystem::TmpFileSystem(size_t max_pages) - : m_max_pages(max_pages) + : m_rdev(get_next_rdev()) + , m_max_pages(max_pages) { } BAN::ErrorOr TmpFileSystem::initialize(mode_t mode, uid_t uid, gid_t gid) diff --git a/kernel/kernel/FS/TmpFS/Inode.cpp b/kernel/kernel/FS/TmpFS/Inode.cpp index f6aa3abd..60adb594 100644 --- a/kernel/kernel/FS/TmpFS/Inode.cpp +++ b/kernel/kernel/FS/TmpFS/Inode.cpp @@ -41,6 +41,11 @@ namespace Kernel /* GENERAL INODE */ + dev_t TmpInode::dev() const + { + return m_fs.dev(); + } + BAN::ErrorOr> TmpInode::create_from_existing(TmpFileSystem& fs, ino_t ino, const TmpInodeInfo& info) { TmpInode* inode_ptr = nullptr; diff --git a/kernel/kernel/Input/PS2/Device.cpp b/kernel/kernel/Input/PS2/Device.cpp index 27103b25..b5181d6a 100644 --- a/kernel/kernel/Input/PS2/Device.cpp +++ b/kernel/kernel/Input/PS2/Device.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -10,8 +11,8 @@ namespace Kernel::Input PS2Device::PS2Device(PS2Controller& controller) : CharacterDevice(0440, 0, 901) - , m_name(BAN::String::formatted("input{}", DevFileSystem::get().get_next_input_device())) - , m_rdev(makedev(DevFileSystem::get().get_next_dev(), 0)) + , m_rdev(makedev(DeviceNumber::Input, DevFileSystem::get().get_next_input_device())) + , m_name(BAN::String::formatted("input{}", minor(m_rdev))) , m_controller(controller) { } diff --git a/kernel/kernel/Networking/NetworkInterface.cpp b/kernel/kernel/Networking/NetworkInterface.cpp index d4d1be2a..6518414a 100644 --- a/kernel/kernel/Networking/NetworkInterface.cpp +++ b/kernel/kernel/Networking/NetworkInterface.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -8,12 +9,6 @@ namespace Kernel { - static dev_t get_network_rdev_major() - { - static dev_t major = DevFileSystem::get().get_next_dev(); - return major; - } - static dev_t get_network_rdev_minor() { static dev_t minor = 0; @@ -23,7 +18,7 @@ namespace Kernel NetworkInterface::NetworkInterface() : CharacterDevice(0400, 0, 0) , m_type(Type::Ethernet) - , m_rdev(makedev(get_network_rdev_major(), get_network_rdev_minor())) + , m_rdev(makedev(DeviceNumber::Ethernet, get_network_rdev_minor())) { ASSERT(minor(m_rdev) < 10); ASSERT(m_type == Type::Ethernet); diff --git a/kernel/kernel/Storage/ATA/ATADevice.cpp b/kernel/kernel/Storage/ATA/ATADevice.cpp index 0f22373b..a0f8d5b2 100644 --- a/kernel/kernel/Storage/ATA/ATADevice.cpp +++ b/kernel/kernel/Storage/ATA/ATADevice.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -9,12 +10,6 @@ namespace Kernel { - static dev_t get_ata_dev_major() - { - static dev_t major = DevFileSystem::get().get_next_dev(); - return major; - } - static dev_t get_ata_dev_minor() { static dev_t minor = 0; @@ -22,7 +17,7 @@ namespace Kernel } detail::ATABaseDevice::ATABaseDevice() - : m_rdev(makedev(get_ata_dev_major(), get_ata_dev_minor())) + : m_rdev(makedev(DeviceNumber::SCSI, get_ata_dev_minor())) { strcpy(m_name, "sda"); m_name[2] += minor(m_rdev); diff --git a/kernel/kernel/Storage/NVMe/Controller.cpp b/kernel/kernel/Storage/NVMe/Controller.cpp index 47d12851..216fe462 100644 --- a/kernel/kernel/Storage/NVMe/Controller.cpp +++ b/kernel/kernel/Storage/NVMe/Controller.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -11,12 +12,6 @@ namespace Kernel { - static dev_t get_ctrl_dev_major() - { - static dev_t major = DevFileSystem::get().get_next_dev(); - return major; - } - static dev_t get_ctrl_dev_minor() { static dev_t minor = 0; @@ -36,7 +31,7 @@ namespace Kernel NVMeController::NVMeController(PCI::Device& pci_device) : CharacterDevice(0600, 0, 0) , m_pci_device(pci_device) - , m_rdev(makedev(get_ctrl_dev_major(), get_ctrl_dev_minor())) + , m_rdev(makedev(DeviceNumber::NVMeController, get_ctrl_dev_minor())) { ASSERT(minor(m_rdev) < 10); strcpy(m_name, "nvmeX"); diff --git a/kernel/kernel/Storage/NVMe/Namespace.cpp b/kernel/kernel/Storage/NVMe/Namespace.cpp index d371fe66..ca494ed1 100644 --- a/kernel/kernel/Storage/NVMe/Namespace.cpp +++ b/kernel/kernel/Storage/NVMe/Namespace.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -7,12 +8,6 @@ namespace Kernel { - static dev_t get_ns_dev_major() - { - static dev_t major = DevFileSystem::get().get_next_dev(); - return major; - } - static dev_t get_ns_dev_minor() { static dev_t minor = 0; @@ -34,7 +29,7 @@ namespace Kernel , m_nsid(nsid) , m_block_size(block_size) , m_block_count(block_count) - , m_rdev(makedev(get_ns_dev_major(), get_ns_dev_minor())) + , m_rdev(makedev(DeviceNumber::NVMeNamespace, get_ns_dev_minor())) { ASSERT(minor(m_rdev) < 10); ASSERT(m_controller.name().size() + 2 < sizeof(m_name)); diff --git a/kernel/kernel/Terminal/Serial.cpp b/kernel/kernel/Terminal/Serial.cpp index a624d283..c7c64ba0 100644 --- a/kernel/kernel/Terminal/Serial.cpp +++ b/kernel/kernel/Terminal/Serial.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -42,9 +43,8 @@ namespace Kernel static dev_t next_rdev() { - static dev_t major = DevFileSystem::get().get_next_dev(); static dev_t minor = 0; - return makedev(major, minor++); + return makedev(DeviceNumber::Serial, minor++); } void Serial::initialize() diff --git a/kernel/kernel/Terminal/VirtualTTY.cpp b/kernel/kernel/Terminal/VirtualTTY.cpp index fc64b9fb..59b5806c 100644 --- a/kernel/kernel/Terminal/VirtualTTY.cpp +++ b/kernel/kernel/Terminal/VirtualTTY.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -26,9 +27,8 @@ namespace Kernel static dev_t next_rdev() { - static dev_t major = DevFileSystem::get().get_next_dev(); static dev_t minor = 0; - return makedev(major, minor++); + return makedev(DeviceNumber::TTY, minor++); } BAN::ErrorOr> VirtualTTY::create(TerminalDriver* driver)