Kernel: Make sse initialization thread safe
This commit is contained in:
parent
d68c88c3f9
commit
05a727979a
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue