Kernel: Make sse initialization thread safe

This commit is contained in:
Bananymous 2025-06-27 19:12:26 +03:00
parent d68c88c3f9
commit 05a727979a
1 changed files with 13 additions and 4 deletions

View File

@ -37,10 +37,20 @@ namespace Kernel
static pid_t s_next_tid = 1; static pid_t s_next_tid = 1;
alignas(16) static uint8_t s_default_sse_storage[512]; alignas(16) static uint8_t s_default_sse_storage[512];
static bool s_default_sse_storage_initialized = false; static BAN::Atomic<bool> s_default_sse_storage_initialized = false;
static void initialize_default_sse_storage() static void initialize_default_sse_storage()
{ {
static BAN::Atomic<bool> is_initializing { false };
bool expected { false };
if (!is_initializing.compare_exchange(expected, true))
{
while (!s_default_sse_storage_initialized)
__builtin_ia32_pause();
asm volatile("" ::: "memory");
return;
}
const uint32_t mxcsr = 0x1F80; const uint32_t mxcsr = 0x1F80;
asm volatile( asm volatile(
"finit;" "finit;"
@ -49,6 +59,8 @@ namespace Kernel
: [storage]"=m"(s_default_sse_storage) : [storage]"=m"(s_default_sse_storage)
: [mxcsr]"m"(mxcsr) : [mxcsr]"m"(mxcsr)
); );
s_default_sse_storage_initialized = true;
} }
BAN::ErrorOr<Thread*> Thread::create_kernel(entry_t entry, void* data, Process* process) BAN::ErrorOr<Thread*> Thread::create_kernel(entry_t entry, void* data, Process* process)
@ -126,10 +138,7 @@ namespace Kernel
: m_tid(tid), m_process(process) : m_tid(tid), m_process(process)
{ {
if (!s_default_sse_storage_initialized) if (!s_default_sse_storage_initialized)
{
initialize_default_sse_storage(); initialize_default_sse_storage();
s_default_sse_storage_initialized = true;
}
memcpy(m_sse_storage, s_default_sse_storage, sizeof(m_sse_storage)); memcpy(m_sse_storage, s_default_sse_storage, sizeof(m_sse_storage));
} }