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)