diff --git a/Kernel/Arch/aarch64/init.cpp b/Kernel/Arch/aarch64/init.cpp index 78ad3c91ce..7a690cce94 100644 --- a/Kernel/Arch/aarch64/init.cpp +++ b/Kernel/Arch/aarch64/init.cpp @@ -175,7 +175,6 @@ extern "C" [[noreturn]] void init() Processor::disable_interrupts(); TimeManagement::initialize(0); - ProcFSComponentRegistry::initialize(); JailManagement::the(); Process::initialize(); diff --git a/Kernel/Arch/x86_64/init.cpp b/Kernel/Arch/x86_64/init.cpp index 4e62011afc..cc2b2757c2 100644 --- a/Kernel/Arch/x86_64/init.cpp +++ b/Kernel/Arch/x86_64/init.cpp @@ -47,7 +47,6 @@ #include #include #include -#include #include #include #include @@ -232,7 +231,6 @@ extern "C" [[noreturn]] UNMAP_AFTER_INIT void init(BootInfo const& boot_info) __stack_chk_guard = get_fast_random(); - ProcFSComponentRegistry::initialize(); JailManagement::the(); Process::initialize(); diff --git a/Kernel/Bus/PCI/Access.cpp b/Kernel/Bus/PCI/Access.cpp index 507e968145..322471a929 100644 --- a/Kernel/Bus/PCI/Access.cpp +++ b/Kernel/Bus/PCI/Access.cpp @@ -18,7 +18,6 @@ #include #include #include -#include #include namespace Kernel::PCI { diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 8d1734e923..f880747190 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -141,9 +141,9 @@ set(KERNEL_SOURCES FileSystem/Plan9FS/FileSystem.cpp FileSystem/Plan9FS/Inode.cpp FileSystem/Plan9FS/Message.cpp - FileSystem/ProcFS/ComponentRegistry.cpp FileSystem/ProcFS/FileSystem.cpp FileSystem/ProcFS/Inode.cpp + FileSystem/ProcFS/ProcessExposed.cpp FileSystem/RAMFS/FileSystem.cpp FileSystem/RAMFS/Inode.cpp FileSystem/SysFS/Component.cpp @@ -255,10 +255,7 @@ set(KERNEL_SOURCES Net/UDPSocket.cpp PerformanceEventBuffer.cpp Process.cpp - ProcessExposed.cpp - ProcessSpecificExposed.cpp ProcessGroup.cpp - ProcessProcFSTraits.cpp Random.cpp Scheduler.cpp ScopedCritical.cpp diff --git a/Kernel/FileSystem/ProcFS/ComponentRegistry.cpp b/Kernel/FileSystem/ProcFS/ComponentRegistry.cpp deleted file mode 100644 index d0437ad302..0000000000 --- a/Kernel/FileSystem/ProcFS/ComponentRegistry.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2018-2021, Andreas Kling - * Copyright (c) 2021, Spencer Dixon - * Copyright (c) 2021, Liav A. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include -#include -#include - -namespace Kernel { - -static Singleton s_the; - -ProcFSComponentRegistry& ProcFSComponentRegistry::the() -{ - return *s_the; -} - -UNMAP_AFTER_INIT void ProcFSComponentRegistry::initialize() -{ - VERIFY(!s_the.is_initialized()); - s_the.ensure_instance(); -} - -UNMAP_AFTER_INIT ProcFSComponentRegistry::ProcFSComponentRegistry() - : m_root_directory(ProcFSRootDirectory::must_create()) -{ -} - -} diff --git a/Kernel/FileSystem/ProcFS/Definitions.h b/Kernel/FileSystem/ProcFS/Definitions.h new file mode 100644 index 0000000000..d47ddf0563 --- /dev/null +++ b/Kernel/FileSystem/ProcFS/Definitions.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2023, Liav A. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Kernel { + +struct segmented_global_inode_index { + StringView name; + u8 file_type; + u32 primary; + u16 subdirectory; + u32 property; +}; + +constexpr segmented_global_inode_index global_inode_ids[] = { + { "."sv, DT_DIR, 0, 0, 1 }, // NOTE: This is here for the root directory + { "self"sv, DT_DIR, 0, 0, 2 } +}; + +struct segmented_process_directory_entry { + StringView name; + u8 file_type; + u16 subdirectory; + u32 property; +}; + +constexpr segmented_process_directory_entry main_process_directory_root_entry = { "."sv, DT_DIR, 0, 0 }; +constexpr segmented_process_directory_entry process_fd_subdirectory_root_entry = { "."sv, DT_DIR, 1, 0 }; +constexpr segmented_process_directory_entry process_stacks_subdirectory_root_entry = { "."sv, DT_DIR, 2, 0 }; +constexpr segmented_process_directory_entry process_children_subdirectory_root_entry = { "."sv, DT_DIR, 3, 0 }; + +constexpr segmented_process_directory_entry process_fd_directory_entry = { "fd"sv, DT_DIR, 1, 0 }; +constexpr segmented_process_directory_entry process_stacks_directory_entry = { "stacks"sv, DT_DIR, 2, 0 }; +constexpr segmented_process_directory_entry process_children_directory_entry = { "children"sv, DT_DIR, 3, 0 }; +constexpr segmented_process_directory_entry process_unveil_list_entry = { "unveil"sv, DT_REG, 0, 1 }; +constexpr segmented_process_directory_entry process_pledge_list_entry = { "pledge"sv, DT_REG, 0, 2 }; +constexpr segmented_process_directory_entry process_fds_list_entry = { "fds"sv, DT_REG, 0, 3 }; +constexpr segmented_process_directory_entry process_exe_symlink_entry = { "exe"sv, DT_LNK, 0, 4 }; +constexpr segmented_process_directory_entry process_cwd_symlink_entry = { "cwd"sv, DT_LNK, 0, 5 }; +constexpr segmented_process_directory_entry process_perf_events_entry = { "perf_events"sv, DT_REG, 0, 6 }; +constexpr segmented_process_directory_entry process_vm_entry = { "vm"sv, DT_REG, 0, 7 }; +constexpr segmented_process_directory_entry process_cmdline_entry = { "cmdline"sv, DT_REG, 0, 8 }; +constexpr segmented_process_directory_entry main_process_directory_entries[] = { + process_fd_directory_entry, + process_stacks_directory_entry, + process_children_directory_entry, + process_unveil_list_entry, + process_pledge_list_entry, + process_fds_list_entry, + process_exe_symlink_entry, + process_cwd_symlink_entry, + process_perf_events_entry, + process_vm_entry, + process_cmdline_entry, +}; + +} diff --git a/Kernel/FileSystem/ProcFS/FileSystem.cpp b/Kernel/FileSystem/ProcFS/FileSystem.cpp index e573c3ff37..1423424327 100644 --- a/Kernel/FileSystem/ProcFS/FileSystem.cpp +++ b/Kernel/FileSystem/ProcFS/FileSystem.cpp @@ -8,7 +8,6 @@ #include #include -#include namespace Kernel { @@ -20,9 +19,16 @@ ErrorOr> ProcFS::try_create() ProcFS::ProcFS() = default; ProcFS::~ProcFS() = default; +ErrorOr> ProcFS::get_inode(InodeIdentifier inode_id) const +{ + if (inode_id.index() == 1) + return *m_root_inode; + return TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcFSInode(const_cast(*this), inode_id.index()))); +} + ErrorOr ProcFS::initialize() { - m_root_inode = TRY(ProcFSComponentRegistry::the().root_directory().to_inode(*this)); + m_root_inode = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcFSInode(const_cast(*this), 1))); return {}; } diff --git a/Kernel/FileSystem/ProcFS/FileSystem.h b/Kernel/FileSystem/ProcFS/FileSystem.h index 217ab7b7e2..fbec219017 100644 --- a/Kernel/FileSystem/ProcFS/FileSystem.h +++ b/Kernel/FileSystem/ProcFS/FileSystem.h @@ -16,6 +16,7 @@ namespace Kernel { class ProcFSInode; class ProcFS final : public FileSystem { friend class ProcFSInode; + friend class Process; public: virtual ~ProcFS() override; @@ -29,6 +30,8 @@ public: private: ProcFS(); + ErrorOr> get_inode(InodeIdentifier) const; + LockRefPtr m_root_inode; }; diff --git a/Kernel/FileSystem/ProcFS/Inode.cpp b/Kernel/FileSystem/ProcFS/Inode.cpp index 536b275c83..11ff289b24 100644 --- a/Kernel/FileSystem/ProcFS/Inode.cpp +++ b/Kernel/FileSystem/ProcFS/Inode.cpp @@ -1,189 +1,125 @@ /* * Copyright (c) 2018-2021, Andreas Kling * Copyright (c) 2021, Spencer Dixon - * Copyright (c) 2021-2022, Liav A. + * Copyright (c) 2021-2023, Liav A. * * SPDX-License-Identifier: BSD-2-Clause */ #include #include -#include +#include namespace Kernel { ProcFSInode::~ProcFSInode() = default; -ErrorOr ProcFSInode::flush_metadata() +static mode_t determine_procfs_process_inode_mode(u32 subdirectory, u32 property) { - return {}; -} - -ErrorOr ProcFSInode::add_child(Inode&, StringView, mode_t) -{ - return EROFS; -} - -ErrorOr> ProcFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID) -{ - return EROFS; -} - -ErrorOr ProcFSInode::remove_child(StringView) -{ - return EROFS; -} - -ErrorOr ProcFSInode::chmod(mode_t) -{ - return EPERM; -} - -ErrorOr ProcFSInode::chown(UserID, GroupID) -{ - return EPERM; -} - -ErrorOr ProcFSInode::replace_child(StringView, Inode&) -{ - return EROFS; -} - -ErrorOr ProcFSInode::write_bytes_locked(off_t, size_t, UserOrKernelBuffer const&, OpenFileDescription*) -{ - return EROFS; -} - -ErrorOr ProcFSInode::truncate(u64) -{ - return EROFS; -} - -ErrorOr ProcFSInode::update_timestamps(Optional