forked from Bananymous/banan-os
Kernel: Scheduler/Thread add inline assembly for i386
This commit is contained in:
parent
d920785256
commit
c0dff5e203
|
@ -19,7 +19,13 @@ namespace Kernel
|
||||||
|
|
||||||
ALWAYS_INLINE static void load_temp_stack()
|
ALWAYS_INLINE static void load_temp_stack()
|
||||||
{
|
{
|
||||||
|
#if ARCH(x86_64)
|
||||||
asm volatile("movq %0, %%rsp" :: "rm"(Processor::current_stack_top()));
|
asm volatile("movq %0, %%rsp" :: "rm"(Processor::current_stack_top()));
|
||||||
|
#elif ARCH(i386)
|
||||||
|
asm volatile("movl %0, %%esp" :: "rm"(Processor::current_stack_top()));
|
||||||
|
#else
|
||||||
|
#error
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<void> Scheduler::initialize()
|
BAN::ErrorOr<void> Scheduler::initialize()
|
||||||
|
@ -209,11 +215,21 @@ namespace Kernel
|
||||||
#if __enable_sse
|
#if __enable_sse
|
||||||
if (current != Thread::sse_thread())
|
if (current != Thread::sse_thread())
|
||||||
{
|
{
|
||||||
|
#if ARCH(x86_64)
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"movq %cr0, %rax;"
|
"movq %cr0, %rax;"
|
||||||
"orq $(1 << 3), %rax;"
|
"orq $(1 << 3), %rax;"
|
||||||
"movq %rax, %cr0"
|
"movq %rax, %cr0"
|
||||||
);
|
);
|
||||||
|
#elif ARCH(i386)
|
||||||
|
asm volatile(
|
||||||
|
"movl %cr0, %eax;"
|
||||||
|
"orl $(1 << 3), %eax;"
|
||||||
|
"movl %eax, %cr0"
|
||||||
|
);
|
||||||
|
#else
|
||||||
|
#error
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -99,16 +99,33 @@ namespace Kernel
|
||||||
: m_tid(tid), m_process(process)
|
: m_tid(tid), m_process(process)
|
||||||
{
|
{
|
||||||
#if __enable_sse
|
#if __enable_sse
|
||||||
|
#if ARCH(x86_64)
|
||||||
uintptr_t cr0;
|
uintptr_t cr0;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"movq %%cr0, %%rax;"
|
"movq %%cr0, %%rax;"
|
||||||
"movq %%rax, %%rbx;"
|
"movq %%rax, %[cr0];"
|
||||||
"andq $~(1 << 3), %%rax;"
|
"andq $~(1 << 3), %%rax;"
|
||||||
"movq %%rax, %%cr0;"
|
"movq %%rax, %%cr0;"
|
||||||
: "=b"(cr0)
|
: [cr0]"=r"(cr0)
|
||||||
|
:: "rax"
|
||||||
);
|
);
|
||||||
save_sse();
|
save_sse();
|
||||||
asm volatile("movq %0, %%cr0" :: "r"(cr0));
|
asm volatile("movq %0, %%cr0" :: "r"(cr0));
|
||||||
|
#elif ARCH(i386)
|
||||||
|
uintptr_t cr0;
|
||||||
|
asm volatile(
|
||||||
|
"movl %%cr0, %%eax;"
|
||||||
|
"movl %%eax, %[cr0];"
|
||||||
|
"andl $~(1 << 3), %%eax;"
|
||||||
|
"movl %%eax, %%cr0;"
|
||||||
|
: [cr0]"=r"(cr0)
|
||||||
|
:: "eax"
|
||||||
|
);
|
||||||
|
save_sse();
|
||||||
|
asm volatile("movl %0, %%cr0" :: "r"(cr0));
|
||||||
|
#else
|
||||||
|
#error
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue