diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 2e1d010b37..7869644de0 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -143,11 +143,18 @@ set(KERNEL_SOURCES FileSystem/ProcFS.cpp FileSystem/SysFS.cpp FileSystem/SysFS/Component.cpp + FileSystem/SysFS/Registry.cpp + FileSystem/SysFS/RootDirectory.cpp FileSystem/SysFS/Subsystems/Bus/PCI/BusDirectory.cpp FileSystem/SysFS/Subsystems/Bus/PCI/DeviceAttribute.cpp FileSystem/SysFS/Subsystems/Bus/PCI/DeviceDirectory.cpp FileSystem/SysFS/Subsystems/Bus/USB/BusDirectory.cpp FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.cpp + FileSystem/SysFS/Subsystems/Bus/Directory.cpp + FileSystem/SysFS/Subsystems/Devices/BlockDevicesDirectory.cpp + FileSystem/SysFS/Subsystems/Devices/CharacterDevicesDirectory.cpp + FileSystem/SysFS/Subsystems/Devices/DeviceComponent.cpp + FileSystem/SysFS/Subsystems/Devices/Directory.cpp FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/EntryPointBlob.cpp FileSystem/SysFS/Subsystems/Firmware/BIOS/DMI/Table.cpp FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.cpp diff --git a/Kernel/Devices/Device.cpp b/Kernel/Devices/Device.cpp index 5c7ee8ab07..966325f6e7 100644 --- a/Kernel/Devices/Device.cpp +++ b/Kernel/Devices/Device.cpp @@ -13,107 +13,6 @@ namespace Kernel { -NonnullRefPtr SysFSDeviceComponent::must_create(Device const& device) -{ - // FIXME: Handle allocation failure gracefully - auto device_name = MUST(KString::formatted("{}:{}", device.major(), device.minor())); - return adopt_ref_if_nonnull(new SysFSDeviceComponent(move(device_name), device)).release_nonnull(); -} -SysFSDeviceComponent::SysFSDeviceComponent(NonnullOwnPtr major_minor_formatted_device_name, Device const& device) - : SysFSComponent() - , m_block_device(device.is_block_device()) - , m_major_minor_formatted_device_name(move(major_minor_formatted_device_name)) -{ - VERIFY(device.is_block_device() || device.is_character_device()); -} - -UNMAP_AFTER_INIT NonnullRefPtr SysFSDevicesDirectory::must_create(SysFSRootDirectory const& root_directory) -{ - auto devices_directory = adopt_ref_if_nonnull(new SysFSDevicesDirectory(root_directory)).release_nonnull(); - devices_directory->m_components.append(SysFSBlockDevicesDirectory::must_create(*devices_directory)); - devices_directory->m_components.append(SysFSCharacterDevicesDirectory::must_create(*devices_directory)); - return devices_directory; -} -SysFSDevicesDirectory::SysFSDevicesDirectory(SysFSRootDirectory const& root_directory) - : SysFSDirectory(root_directory) -{ -} - -NonnullRefPtr SysFSBlockDevicesDirectory::must_create(SysFSDevicesDirectory const& devices_directory) -{ - return adopt_ref_if_nonnull(new SysFSBlockDevicesDirectory(devices_directory)).release_nonnull(); -} -SysFSBlockDevicesDirectory::SysFSBlockDevicesDirectory(SysFSDevicesDirectory const& devices_directory) - : SysFSDirectory(devices_directory) -{ -} - -ErrorOr SysFSBlockDevicesDirectory::traverse_as_directory(FileSystemID fsid, Function(FileSystem::DirectoryEntryView const&)> callback) const -{ - VERIFY(m_parent_directory); - TRY(callback({ ".", { fsid, component_index() }, 0 })); - TRY(callback({ "..", { fsid, m_parent_directory->component_index() }, 0 })); - - return SysFSComponentRegistry::the().devices_list().with_exclusive([&](auto& list) -> ErrorOr { - for (auto& exposed_device : list) { - if (!exposed_device.is_block_device()) - continue; - TRY(callback({ exposed_device.name(), { fsid, exposed_device.component_index() }, 0 })); - } - return {}; - }); -} - -RefPtr SysFSBlockDevicesDirectory::lookup(StringView name) -{ - return SysFSComponentRegistry::the().devices_list().with_exclusive([&](auto& list) -> RefPtr { - for (auto& exposed_device : list) { - if (!exposed_device.is_block_device()) - continue; - if (exposed_device.name() == name) - return exposed_device; - } - return nullptr; - }); -} - -NonnullRefPtr SysFSCharacterDevicesDirectory::must_create(SysFSDevicesDirectory const& devices_directory) -{ - return adopt_ref_if_nonnull(new SysFSCharacterDevicesDirectory(devices_directory)).release_nonnull(); -} -SysFSCharacterDevicesDirectory::SysFSCharacterDevicesDirectory(SysFSDevicesDirectory const& devices_directory) - : SysFSDirectory(devices_directory) -{ -} -ErrorOr SysFSCharacterDevicesDirectory::traverse_as_directory(FileSystemID fsid, Function(FileSystem::DirectoryEntryView const&)> callback) const -{ - VERIFY(m_parent_directory); - TRY(callback({ ".", { fsid, component_index() }, 0 })); - TRY(callback({ "..", { fsid, m_parent_directory->component_index() }, 0 })); - - return SysFSComponentRegistry::the().devices_list().with_exclusive([&](auto& list) -> ErrorOr { - for (auto& exposed_device : list) { - if (exposed_device.is_block_device()) - continue; - TRY(callback({ exposed_device.name(), { fsid, exposed_device.component_index() }, 0 })); - } - return {}; - }); -} - -RefPtr SysFSCharacterDevicesDirectory::lookup(StringView name) -{ - return SysFSComponentRegistry::the().devices_list().with_exclusive([&](auto& list) -> RefPtr { - for (auto& exposed_device : list) { - if (exposed_device.is_block_device()) - continue; - if (exposed_device.name() == name) - return exposed_device; - } - return nullptr; - }); -} - Device::Device(MajorNumber major, MinorNumber minor) : m_major(major) , m_minor(minor) diff --git a/Kernel/Devices/Device.h b/Kernel/Devices/Device.h index 8002d069ec..60989f934d 100644 --- a/Kernel/Devices/Device.h +++ b/Kernel/Devices/Device.h @@ -22,7 +22,8 @@ #include #include #include -#include +#include +#include #include namespace Kernel { diff --git a/Kernel/FileSystem/SysFS.cpp b/Kernel/FileSystem/SysFS.cpp index ff1726be40..54b850c907 100644 --- a/Kernel/FileSystem/SysFS.cpp +++ b/Kernel/FileSystem/SysFS.cpp @@ -4,70 +4,13 @@ * SPDX-License-Identifier: BSD-2-Clause */ -#include #include -#include #include +#include #include namespace Kernel { -static Singleton s_the; - -SysFSComponentRegistry& SysFSComponentRegistry::the() -{ - return *s_the; -} - -UNMAP_AFTER_INIT void SysFSComponentRegistry::initialize() -{ - VERIFY(!s_the.is_initialized()); - s_the.ensure_instance(); -} - -UNMAP_AFTER_INIT SysFSComponentRegistry::SysFSComponentRegistry() - : m_root_directory(SysFSRootDirectory::create()) -{ -} - -UNMAP_AFTER_INIT void SysFSComponentRegistry::register_new_component(SysFSComponent& component) -{ - MutexLocker locker(m_lock); - m_root_directory->m_components.append(component); -} - -SysFSComponentRegistry::DevicesList& SysFSComponentRegistry::devices_list() -{ - return m_devices_list; -} - -NonnullRefPtr SysFSRootDirectory::create() -{ - return adopt_ref(*new (nothrow) SysFSRootDirectory); -} - -ErrorOr SysFSRootDirectory::traverse_as_directory(FileSystemID fsid, Function(FileSystem::DirectoryEntryView const&)> callback) const -{ - MutexLocker locker(SysFSComponentRegistry::the().get_lock()); - TRY(callback({ ".", { fsid, component_index() }, 0 })); - TRY(callback({ "..", { fsid, 0 }, 0 })); - - for (auto const& component : m_components) { - InodeIdentifier identifier = { fsid, component.component_index() }; - TRY(callback({ component.name(), identifier, 0 })); - } - return {}; -} - -SysFSRootDirectory::SysFSRootDirectory() -{ - auto buses_directory = SysFSBusDirectory::must_create(*this); - auto devices_directory = SysFSDevicesDirectory::must_create(*this); - m_components.append(buses_directory); - m_components.append(devices_directory); - m_buses_directory = buses_directory; -} - ErrorOr> SysFS::try_create() { return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) SysFS)); @@ -226,26 +169,4 @@ ErrorOr> SysFSDirectoryInode::lookup(StringView name) return TRY(component->to_inode(fs())); } -SysFSBusDirectory& SysFSComponentRegistry::buses_directory() -{ - return *m_root_directory->m_buses_directory; -} - -void SysFSComponentRegistry::register_new_bus_directory(SysFSDirectory& new_bus_directory) -{ - VERIFY(!m_root_directory->m_buses_directory.is_null()); - m_root_directory->m_buses_directory->m_components.append(new_bus_directory); -} - -UNMAP_AFTER_INIT NonnullRefPtr SysFSBusDirectory::must_create(SysFSRootDirectory const& parent_directory) -{ - auto directory = adopt_ref(*new (nothrow) SysFSBusDirectory(parent_directory)); - return directory; -} - -UNMAP_AFTER_INIT SysFSBusDirectory::SysFSBusDirectory(SysFSRootDirectory const& parent_directory) - : SysFSDirectory(parent_directory) -{ -} - } diff --git a/Kernel/FileSystem/SysFS.h b/Kernel/FileSystem/SysFS.h index 6fc19018c7..2813c90ad1 100644 --- a/Kernel/FileSystem/SysFS.h +++ b/Kernel/FileSystem/SysFS.h @@ -13,105 +13,6 @@ namespace Kernel { -class SysFSDevicesDirectory; -class SysFSRootDirectory final : public SysFSDirectory { - friend class SysFSComponentRegistry; - -public: - virtual StringView name() const override { return "."sv; } - static NonnullRefPtr create(); - virtual ErrorOr traverse_as_directory(FileSystemID, Function(FileSystem::DirectoryEntryView const&)>) const override; - -private: - SysFSRootDirectory(); - RefPtr m_buses_directory; -}; - -class SysFSDeviceComponent final - : public SysFSComponent - , public Weakable { - friend class SysFSComponentRegistry; - -public: - static NonnullRefPtr must_create(Device const&); - virtual StringView name() const override { return m_major_minor_formatted_device_name->view(); } - bool is_block_device() const { return m_block_device; } - -private: - SysFSDeviceComponent(NonnullOwnPtr major_minor_formatted_device_name, Device const&); - IntrusiveListNode> m_list_node; - bool m_block_device; - - NonnullOwnPtr m_major_minor_formatted_device_name; -}; - -class SysFSDevicesDirectory final : public SysFSDirectory { -public: - virtual StringView name() const override { return "dev"sv; } - static NonnullRefPtr must_create(SysFSRootDirectory const&); - -private: - explicit SysFSDevicesDirectory(SysFSRootDirectory const&); -}; - -class SysFSBlockDevicesDirectory final : public SysFSDirectory { -public: - virtual StringView name() const override { return "block"sv; } - static NonnullRefPtr must_create(SysFSDevicesDirectory const&); - virtual ErrorOr traverse_as_directory(FileSystemID, Function(FileSystem::DirectoryEntryView const&)>) const override; - virtual RefPtr lookup(StringView name) override; - -private: - explicit SysFSBlockDevicesDirectory(SysFSDevicesDirectory const&); -}; - -class SysFSCharacterDevicesDirectory final : public SysFSDirectory { -public: - virtual StringView name() const override { return "char"sv; } - static NonnullRefPtr must_create(SysFSDevicesDirectory const&); - virtual ErrorOr traverse_as_directory(FileSystemID, Function(FileSystem::DirectoryEntryView const&)>) const override; - virtual RefPtr lookup(StringView name) override; - -private: - explicit SysFSCharacterDevicesDirectory(SysFSDevicesDirectory const&); -}; - -class SysFSBusDirectory : public SysFSDirectory { - friend class SysFSComponentRegistry; - -public: - virtual StringView name() const override { return "bus"sv; } - static NonnullRefPtr must_create(SysFSRootDirectory const&); - -private: - explicit SysFSBusDirectory(SysFSRootDirectory const&); -}; - -class SysFSComponentRegistry { - using DevicesList = MutexProtected>; - -public: - static SysFSComponentRegistry& the(); - - static void initialize(); - - SysFSComponentRegistry(); - void register_new_component(SysFSComponent&); - - SysFSDirectory& root_directory() { return m_root_directory; } - Mutex& get_lock() { return m_lock; } - - void register_new_bus_directory(SysFSDirectory&); - SysFSBusDirectory& buses_directory(); - - DevicesList& devices_list(); - -private: - Mutex m_lock; - NonnullRefPtr m_root_directory; - DevicesList m_devices_list; -}; - class SysFS final : public FileSystem { friend class SysFSInode; friend class SysFSDirectoryInode; diff --git a/Kernel/FileSystem/SysFS/Component.cpp b/Kernel/FileSystem/SysFS/Component.cpp index 4e5fa752ff..e5c28bd21c 100644 --- a/Kernel/FileSystem/SysFS/Component.cpp +++ b/Kernel/FileSystem/SysFS/Component.cpp @@ -6,6 +6,7 @@ #include #include +#include namespace Kernel { diff --git a/Kernel/FileSystem/SysFS/Registry.cpp b/Kernel/FileSystem/SysFS/Registry.cpp new file mode 100644 index 0000000000..e11084651e --- /dev/null +++ b/Kernel/FileSystem/SysFS/Registry.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include + +namespace Kernel { + +static Singleton s_the; + +SysFSComponentRegistry& SysFSComponentRegistry::the() +{ + return *s_the; +} + +UNMAP_AFTER_INIT void SysFSComponentRegistry::initialize() +{ + VERIFY(!s_the.is_initialized()); + s_the.ensure_instance(); +} + +UNMAP_AFTER_INIT SysFSComponentRegistry::SysFSComponentRegistry() + : m_root_directory(SysFSRootDirectory::create()) +{ +} + +UNMAP_AFTER_INIT void SysFSComponentRegistry::register_new_component(SysFSComponent& component) +{ + MutexLocker locker(m_lock); + m_root_directory->m_components.append(component); +} + +SysFSComponentRegistry::DevicesList& SysFSComponentRegistry::devices_list() +{ + return m_devices_list; +} + +SysFSBusDirectory& SysFSComponentRegistry::buses_directory() +{ + return *m_root_directory->m_buses_directory; +} + +void SysFSComponentRegistry::register_new_bus_directory(SysFSDirectory& new_bus_directory) +{ + VERIFY(!m_root_directory->m_buses_directory.is_null()); + m_root_directory->m_buses_directory->m_components.append(new_bus_directory); +} + +} diff --git a/Kernel/FileSystem/SysFS/Registry.h b/Kernel/FileSystem/SysFS/Registry.h new file mode 100644 index 0000000000..351295d934 --- /dev/null +++ b/Kernel/FileSystem/SysFS/Registry.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace Kernel { + +class SysFSComponentRegistry { + using DevicesList = MutexProtected>; + +public: + static SysFSComponentRegistry& the(); + + static void initialize(); + + SysFSComponentRegistry(); + void register_new_component(SysFSComponent&); + + SysFSDirectory& root_directory() { return m_root_directory; } + Mutex& get_lock() { return m_lock; } + + void register_new_bus_directory(SysFSDirectory&); + SysFSBusDirectory& buses_directory(); + + DevicesList& devices_list(); + +private: + Mutex m_lock; + NonnullRefPtr m_root_directory; + DevicesList m_devices_list; +}; + +} diff --git a/Kernel/FileSystem/SysFS/RootDirectory.cpp b/Kernel/FileSystem/SysFS/RootDirectory.cpp new file mode 100644 index 0000000000..5eb21c5e57 --- /dev/null +++ b/Kernel/FileSystem/SysFS/RootDirectory.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include + +namespace Kernel { + +NonnullRefPtr SysFSRootDirectory::create() +{ + return adopt_ref(*new (nothrow) SysFSRootDirectory); +} + +ErrorOr SysFSRootDirectory::traverse_as_directory(FileSystemID fsid, Function(FileSystem::DirectoryEntryView const&)> callback) const +{ + MutexLocker locker(SysFSComponentRegistry::the().get_lock()); + TRY(callback({ ".", { fsid, component_index() }, 0 })); + TRY(callback({ "..", { fsid, 0 }, 0 })); + + for (auto const& component : m_components) { + InodeIdentifier identifier = { fsid, component.component_index() }; + TRY(callback({ component.name(), identifier, 0 })); + } + return {}; +} + +SysFSRootDirectory::SysFSRootDirectory() +{ + auto buses_directory = SysFSBusDirectory::must_create(*this); + auto devices_directory = SysFSDevicesDirectory::must_create(*this); + m_components.append(buses_directory); + m_components.append(devices_directory); + m_buses_directory = buses_directory; +} + +} diff --git a/Kernel/FileSystem/SysFS/RootDirectory.h b/Kernel/FileSystem/SysFS/RootDirectory.h new file mode 100644 index 0000000000..555e80079a --- /dev/null +++ b/Kernel/FileSystem/SysFS/RootDirectory.h @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Kernel { + +class SysFSRootDirectory final : public SysFSDirectory { + friend class SysFSComponentRegistry; + +public: + virtual StringView name() const override { return "."sv; } + static NonnullRefPtr create(); + virtual ErrorOr traverse_as_directory(FileSystemID, Function(FileSystem::DirectoryEntryView const&)>) const override; + +private: + SysFSRootDirectory(); + RefPtr m_buses_directory; +}; + +} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/Directory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Bus/Directory.cpp new file mode 100644 index 0000000000..f9d1a2bf63 --- /dev/null +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/Directory.cpp @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Kernel { + +UNMAP_AFTER_INIT NonnullRefPtr SysFSBusDirectory::must_create(SysFSRootDirectory const& parent_directory) +{ + auto directory = adopt_ref(*new (nothrow) SysFSBusDirectory(parent_directory)); + return directory; +} + +UNMAP_AFTER_INIT SysFSBusDirectory::SysFSBusDirectory(SysFSRootDirectory const& parent_directory) + : SysFSDirectory(parent_directory) +{ +} + +} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/Directory.h b/Kernel/FileSystem/SysFS/Subsystems/Bus/Directory.h new file mode 100644 index 0000000000..c8ccb14c74 --- /dev/null +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/Directory.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Kernel { + +class SysFSBusDirectory : public SysFSDirectory { + friend class SysFSComponentRegistry; + +public: + virtual StringView name() const override { return "bus"sv; } + static NonnullRefPtr must_create(SysFSRootDirectory const&); + +private: + explicit SysFSBusDirectory(SysFSRootDirectory const&); +}; + +} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/BusDirectory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/BusDirectory.cpp index 968c209485..9b46be9f4e 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/BusDirectory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/BusDirectory.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/BusDirectory.h b/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/BusDirectory.h index 5f765a354a..02df68b6bf 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/BusDirectory.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/BusDirectory.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include namespace Kernel { diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceAttribute.h b/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceAttribute.h index b6e198e80c..e361c28c13 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceAttribute.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceAttribute.h @@ -8,7 +8,7 @@ #include #include -#include +#include #include namespace Kernel { diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceDirectory.h b/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceDirectory.h index 700b86a170..55fdea729c 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceDirectory.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceDirectory.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include #include namespace Kernel { diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/BusDirectory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/BusDirectory.cpp index 6b25377019..5ff793575d 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/BusDirectory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/BusDirectory.cpp @@ -4,6 +4,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/BusDirectory.h b/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/BusDirectory.h index 440be5474c..871303c01a 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/BusDirectory.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/BusDirectory.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include #include #include diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.h b/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.h index ca9dc94d28..9ccae41742 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include #include #include #include diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/BlockDevicesDirectory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Devices/BlockDevicesDirectory.cpp new file mode 100644 index 0000000000..3dcefd70bc --- /dev/null +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/BlockDevicesDirectory.cpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Kernel { + +NonnullRefPtr SysFSBlockDevicesDirectory::must_create(SysFSDevicesDirectory const& devices_directory) +{ + return adopt_ref_if_nonnull(new SysFSBlockDevicesDirectory(devices_directory)).release_nonnull(); +} +SysFSBlockDevicesDirectory::SysFSBlockDevicesDirectory(SysFSDevicesDirectory const& devices_directory) + : SysFSDirectory(devices_directory) +{ +} + +ErrorOr SysFSBlockDevicesDirectory::traverse_as_directory(FileSystemID fsid, Function(FileSystem::DirectoryEntryView const&)> callback) const +{ + VERIFY(m_parent_directory); + TRY(callback({ ".", { fsid, component_index() }, 0 })); + TRY(callback({ "..", { fsid, m_parent_directory->component_index() }, 0 })); + + return SysFSComponentRegistry::the().devices_list().with_exclusive([&](auto& list) -> ErrorOr { + for (auto& exposed_device : list) { + if (!exposed_device.is_block_device()) + continue; + TRY(callback({ exposed_device.name(), { fsid, exposed_device.component_index() }, 0 })); + } + return {}; + }); +} + +RefPtr SysFSBlockDevicesDirectory::lookup(StringView name) +{ + return SysFSComponentRegistry::the().devices_list().with_exclusive([&](auto& list) -> RefPtr { + for (auto& exposed_device : list) { + if (!exposed_device.is_block_device()) + continue; + if (exposed_device.name() == name) + return exposed_device; + } + return nullptr; + }); +} + +} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/BlockDevicesDirectory.h b/Kernel/FileSystem/SysFS/Subsystems/Devices/BlockDevicesDirectory.h new file mode 100644 index 0000000000..8420de42ff --- /dev/null +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/BlockDevicesDirectory.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Kernel { + +class SysFSBlockDevicesDirectory final : public SysFSDirectory { +public: + virtual StringView name() const override { return "block"sv; } + static NonnullRefPtr must_create(SysFSDevicesDirectory const&); + virtual ErrorOr traverse_as_directory(FileSystemID, Function(FileSystem::DirectoryEntryView const&)>) const override; + virtual RefPtr lookup(StringView name) override; + +private: + explicit SysFSBlockDevicesDirectory(SysFSDevicesDirectory const&); +}; + +} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/CharacterDevicesDirectory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Devices/CharacterDevicesDirectory.cpp new file mode 100644 index 0000000000..0d09be1b68 --- /dev/null +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/CharacterDevicesDirectory.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Kernel { + +NonnullRefPtr SysFSCharacterDevicesDirectory::must_create(SysFSDevicesDirectory const& devices_directory) +{ + return adopt_ref_if_nonnull(new SysFSCharacterDevicesDirectory(devices_directory)).release_nonnull(); +} +SysFSCharacterDevicesDirectory::SysFSCharacterDevicesDirectory(SysFSDevicesDirectory const& devices_directory) + : SysFSDirectory(devices_directory) +{ +} +ErrorOr SysFSCharacterDevicesDirectory::traverse_as_directory(FileSystemID fsid, Function(FileSystem::DirectoryEntryView const&)> callback) const +{ + VERIFY(m_parent_directory); + TRY(callback({ ".", { fsid, component_index() }, 0 })); + TRY(callback({ "..", { fsid, m_parent_directory->component_index() }, 0 })); + + return SysFSComponentRegistry::the().devices_list().with_exclusive([&](auto& list) -> ErrorOr { + for (auto& exposed_device : list) { + if (exposed_device.is_block_device()) + continue; + TRY(callback({ exposed_device.name(), { fsid, exposed_device.component_index() }, 0 })); + } + return {}; + }); +} + +RefPtr SysFSCharacterDevicesDirectory::lookup(StringView name) +{ + return SysFSComponentRegistry::the().devices_list().with_exclusive([&](auto& list) -> RefPtr { + for (auto& exposed_device : list) { + if (exposed_device.is_block_device()) + continue; + if (exposed_device.name() == name) + return exposed_device; + } + return nullptr; + }); +} + +} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/CharacterDevicesDirectory.h b/Kernel/FileSystem/SysFS/Subsystems/Devices/CharacterDevicesDirectory.h new file mode 100644 index 0000000000..ccef4ff780 --- /dev/null +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/CharacterDevicesDirectory.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Kernel { + +class SysFSCharacterDevicesDirectory final : public SysFSDirectory { +public: + virtual StringView name() const override { return "char"sv; } + static NonnullRefPtr must_create(SysFSDevicesDirectory const&); + virtual ErrorOr traverse_as_directory(FileSystemID, Function(FileSystem::DirectoryEntryView const&)>) const override; + virtual RefPtr lookup(StringView name) override; + +private: + explicit SysFSCharacterDevicesDirectory(SysFSDevicesDirectory const&); +}; + +} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/DeviceComponent.cpp b/Kernel/FileSystem/SysFS/Subsystems/Devices/DeviceComponent.cpp new file mode 100644 index 0000000000..c4227117b3 --- /dev/null +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/DeviceComponent.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Kernel { + +NonnullRefPtr SysFSDeviceComponent::must_create(Device const& device) +{ + // FIXME: Handle allocation failure gracefully + auto device_name = MUST(KString::formatted("{}:{}", device.major(), device.minor())); + return adopt_ref_if_nonnull(new SysFSDeviceComponent(move(device_name), device)).release_nonnull(); +} +SysFSDeviceComponent::SysFSDeviceComponent(NonnullOwnPtr major_minor_formatted_device_name, Device const& device) + : SysFSComponent() + , m_block_device(device.is_block_device()) + , m_major_minor_formatted_device_name(move(major_minor_formatted_device_name)) +{ + VERIFY(device.is_block_device() || device.is_character_device()); +} + +} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/DeviceComponent.h b/Kernel/FileSystem/SysFS/Subsystems/Devices/DeviceComponent.h new file mode 100644 index 0000000000..40aaebbb3d --- /dev/null +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/DeviceComponent.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace Kernel { + +class SysFSDeviceComponent final + : public SysFSComponent + , public Weakable { + friend class SysFSComponentRegistry; + +public: + static NonnullRefPtr must_create(Device const&); + virtual StringView name() const override { return m_major_minor_formatted_device_name->view(); } + bool is_block_device() const { return m_block_device; } + +private: + SysFSDeviceComponent(NonnullOwnPtr major_minor_formatted_device_name, Device const&); + IntrusiveListNode> m_list_node; + bool m_block_device; + + NonnullOwnPtr m_major_minor_formatted_device_name; +}; + +} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/Directory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Devices/Directory.cpp new file mode 100644 index 0000000000..d2da6abd13 --- /dev/null +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/Directory.cpp @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include + +namespace Kernel { + +UNMAP_AFTER_INIT NonnullRefPtr SysFSDevicesDirectory::must_create(SysFSRootDirectory const& root_directory) +{ + auto devices_directory = adopt_ref_if_nonnull(new SysFSDevicesDirectory(root_directory)).release_nonnull(); + devices_directory->m_components.append(SysFSBlockDevicesDirectory::must_create(*devices_directory)); + devices_directory->m_components.append(SysFSCharacterDevicesDirectory::must_create(*devices_directory)); + return devices_directory; +} +SysFSDevicesDirectory::SysFSDevicesDirectory(SysFSRootDirectory const& root_directory) + : SysFSDirectory(root_directory) +{ +} + +} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/Directory.h b/Kernel/FileSystem/SysFS/Subsystems/Devices/Directory.h new file mode 100644 index 0000000000..7294e4c7e3 --- /dev/null +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/Directory.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2022, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Kernel { + +class SysFSDevicesDirectory final : public SysFSDirectory { +public: + virtual StringView name() const override { return "dev"sv; } + static NonnullRefPtr must_create(SysFSRootDirectory const&); + +private: + explicit SysFSDevicesDirectory(SysFSRootDirectory const&); +}; + +} diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.cpp index cd42377cc4..b21451678c 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.cpp @@ -4,6 +4,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include diff --git a/Kernel/Forward.h b/Kernel/Forward.h index 667fd605bf..3b27605c8f 100644 --- a/Kernel/Forward.h +++ b/Kernel/Forward.h @@ -54,6 +54,7 @@ class Scheduler; class Socket; class SysFS; class SysFSDirectory; +class SysFSRootDirectory; class SysFSBusDirectory; class SysFSDirectoryInode; class SysFSInode;