From df257755f7a0bc43eeb8061e5b7c1504c6c772d1 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sat, 4 Apr 2026 23:35:33 +0300 Subject: [PATCH] Kernel: If userspace sets fs or gs, dont overwrite it Current cpu index is stored at either segment. If userspace sets that segment, kernel will not overwrite it on every reschedule. This is fine as long as user program does not use anything that relies on it :) --- kernel/include/kernel/Thread.h | 2 ++ kernel/kernel/Process.cpp | 8 ++++++-- kernel/kernel/Thread.cpp | 8 ++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/kernel/include/kernel/Thread.h b/kernel/include/kernel/Thread.h index 9c3c9e4f..42d094aa 100644 --- a/kernel/include/kernel/Thread.h +++ b/kernel/include/kernel/Thread.h @@ -177,7 +177,9 @@ namespace Kernel bool m_is_userspace { false }; bool m_delete_process { false }; + bool m_has_custom_fsbase { false }; vaddr_t m_fsbase { 0 }; + bool m_has_custom_gsbase { false }; vaddr_t m_gsbase { 0 }; SchedulerQueue::Node* m_scheduler_node { nullptr }; diff --git a/kernel/kernel/Process.cpp b/kernel/kernel/Process.cpp index 255991f3..eb0eb4ae 100644 --- a/kernel/kernel/Process.cpp +++ b/kernel/kernel/Process.cpp @@ -3302,7 +3302,9 @@ namespace Kernel BAN::ErrorOr Process::sys_set_fsbase(void* addr) { - Thread::current().set_fsbase(reinterpret_cast(addr)); + auto& thread = Thread::current(); + thread.m_has_custom_fsbase = true; + thread.set_fsbase(reinterpret_cast(addr)); Processor::load_fsbase(); return 0; } @@ -3314,7 +3316,9 @@ namespace Kernel BAN::ErrorOr Process::sys_set_gsbase(void* addr) { - Thread::current().set_gsbase(reinterpret_cast(addr)); + auto& thread = Thread::current(); + thread.m_has_custom_gsbase = true; + thread.set_gsbase(reinterpret_cast(addr)); Processor::load_gsbase(); return 0; } diff --git a/kernel/kernel/Thread.cpp b/kernel/kernel/Thread.cpp index 2eafc640..485cceb6 100644 --- a/kernel/kernel/Thread.cpp +++ b/kernel/kernel/Thread.cpp @@ -305,6 +305,14 @@ namespace Kernel if (!is_userspace() || !has_process()) return; +#if ARCH(x86_64) + if (m_has_custom_gsbase) + return; +#elif ARCH(i686) + if (m_has_custom_fsbase) + return; +#endif + const vaddr_t vaddr = process().shared_page_vaddr() + Processor::current_index(); #if ARCH(x86_64)