From f6679eb4b51d1f4adbabf9462fcc3ee8c129b565 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 20 May 2026 19:13:25 +0300 Subject: [PATCH] Kernel: Expose CPU load information under /proc/cpu/ --- kernel/include/kernel/FS/ProcFS/FileSystem.h | 2 ++ kernel/kernel/FS/ProcFS/FileSystem.cpp | 29 ++++++++++++++++++++ kernel/kernel/kernel.cpp | 2 ++ 3 files changed, 33 insertions(+) diff --git a/kernel/include/kernel/FS/ProcFS/FileSystem.h b/kernel/include/kernel/FS/ProcFS/FileSystem.h index 3337269d..fa1aa862 100644 --- a/kernel/include/kernel/FS/ProcFS/FileSystem.h +++ b/kernel/include/kernel/FS/ProcFS/FileSystem.h @@ -13,6 +13,8 @@ namespace Kernel static void initialize(); static ProcFileSystem& get(); + void post_scheduler_initialize(); + BAN::ErrorOr on_process_create(Process&); void on_process_delete(Process&); diff --git a/kernel/kernel/FS/ProcFS/FileSystem.cpp b/kernel/kernel/FS/ProcFS/FileSystem.cpp index bfb03b57..83e1d0f4 100644 --- a/kernel/kernel/FS/ProcFS/FileSystem.cpp +++ b/kernel/kernel/FS/ProcFS/FileSystem.cpp @@ -49,6 +49,35 @@ namespace Kernel MUST(static_cast(s_instance->root_inode().ptr())->link_inode(*self_inode, "self"_sv)); } + void ProcFileSystem::post_scheduler_initialize() + { + MUST(s_instance->root_inode()->create_directory("cpu"_sv, Inode::Mode::IFDIR | 0555, 0, 0)); + auto cpu_directory = MUST(s_instance->root_inode()->find_inode("cpu"_sv)); + + for (size_t i = 0; i < Processor::count(); i++) + { + auto cpu_inode = MUST(ProcROInode::create_new( + [](off_t offset, BAN::ByteSpan buffer, void* index_ptr) -> BAN::ErrorOr + { + ASSERT(offset >= 0); + + const size_t index = reinterpret_cast(index_ptr); + const auto load_stats = Processor::get_load_stats(index); + + auto string = TRY(BAN::String::formatted("{} {}", load_stats.ns_idle, load_stats.ns_total)); + if (static_cast(offset) >= string.size()) + return 0; + + const size_t bytes = BAN::Math::min(string.size() - offset, buffer.size()); + memcpy(buffer.data(), string.data() + offset, bytes); + return bytes; + }, + *s_instance, reinterpret_cast(i), 0444, 0, 0 + )); + MUST(cpu_directory->link_inode(MUST(BAN::String::formatted("{}", i)), cpu_inode)); + } + } + ProcFileSystem& ProcFileSystem::get() { ASSERT(s_instance); diff --git a/kernel/kernel/kernel.cpp b/kernel/kernel/kernel.cpp index 9b5d76c1..cb05ff45 100644 --- a/kernel/kernel/kernel.cpp +++ b/kernel/kernel/kernel.cpp @@ -211,6 +211,8 @@ static void init2(void*) SystemTimer::get().initialize_tsc(); + ProcFileSystem::get().post_scheduler_initialize(); + auto console = MUST(DevFileSystem::get().root_inode()->find_inode(cmdline.console)); ASSERT(console->is_tty()); static_cast(console.ptr())->set_as_current();