Compare commits

..

No commits in common. "b0ff2392a15e1d222e51247cfc3ce0350c9ceeb3" and "753de3d9f01e186004fdfee5c5acd61c71e36103" have entirely different histories.

6 changed files with 29 additions and 78 deletions

View File

@ -189,7 +189,6 @@ namespace Kernel::IDT
else else
{ {
derrorln("Stack pointer out of bounds!"); derrorln("Stack pointer out of bounds!");
derrorln("rip {H}", interrupt_stack.rip);
derrorln("rsp {H}, stack {H}->{H}, istack {H}->{H}", derrorln("rsp {H}, stack {H}->{H}, istack {H}->{H}",
interrupt_stack.rsp, interrupt_stack.rsp,
stack.vaddr(), stack.vaddr() + stack.size(), stack.vaddr(), stack.vaddr() + stack.size(),
@ -219,23 +218,6 @@ namespace Kernel::IDT
} }
} }
} }
#if __enable_sse
else if (isr == ISR::DeviceNotAvailable)
{
asm volatile(
"movq %cr0, %rax;"
"andq $~(1 << 3), %rax;"
"movq %rax, %cr0;"
);
if (auto* current = &Thread::current(); current != Thread::sse_thread())
{
if (auto* sse = Thread::sse_thread())
sse->save_sse();
current->load_sse();
}
goto done;
}
#endif
} }
if (PageTable::current().get_page_flags(interrupt_stack.rip & PAGE_ADDR_MASK) & PageTable::Flags::Present) if (PageTable::current().get_page_flags(interrupt_stack.rip & PAGE_ADDR_MASK) & PageTable::Flags::Present)
@ -277,6 +259,7 @@ namespace Kernel::IDT
int signal = 0; int signal = 0;
switch (isr) switch (isr)
{ {
case ISR::DeviceNotAvailable:
case ISR::DivisionError: case ISR::DivisionError:
case ISR::SIMDFloatingPointException: case ISR::SIMDFloatingPointException:
case ISR::x87FloatingPointException: case ISR::x87FloatingPointException:
@ -307,11 +290,22 @@ namespace Kernel::IDT
ASSERT(Thread::current().state() != Thread::State::Terminated); ASSERT(Thread::current().state() != Thread::State::Terminated);
done: done:
#if __enable_sse
if (from_userspace)
{
ASSERT(Thread::current().state() == Thread::State::Executing);
Thread::current().load_sse();
}
#endif
return; return;
} }
extern "C" void cpp_irq_handler(uint64_t irq, InterruptStack& interrupt_stack) extern "C" void cpp_irq_handler(uint64_t irq, InterruptStack& interrupt_stack)
{ {
#if __enable_sse
Thread::current().save_sse();
#endif
if (Scheduler::current_tid()) if (Scheduler::current_tid())
{ {
Thread::current().set_return_rsp(interrupt_stack.rsp); Thread::current().set_return_rsp(interrupt_stack.rsp);
@ -332,6 +326,10 @@ done:
Scheduler::get().reschedule_if_idling(); Scheduler::get().reschedule_if_idling();
ASSERT(Thread::current().state() != Thread::State::Terminated); ASSERT(Thread::current().state() != Thread::State::Terminated);
#if __enable_sse
Thread::current().load_sse();
#endif
} }
static void flush_idt() static void flush_idt()

View File

@ -75,7 +75,7 @@ namespace Kernel
vaddr_t interrupt_stack_base() const { return m_interrupt_stack ? m_interrupt_stack->vaddr() : 0; } vaddr_t interrupt_stack_base() const { return m_interrupt_stack ? m_interrupt_stack->vaddr() : 0; }
size_t interrupt_stack_size() const { return m_interrupt_stack ? m_interrupt_stack->size() : 0; } size_t interrupt_stack_size() const { return m_interrupt_stack ? m_interrupt_stack->size() : 0; }
static Thread& current(); static Thread& current() ;
static pid_t current_tid(); static pid_t current_tid();
Process& process(); Process& process();
@ -87,9 +87,8 @@ namespace Kernel
size_t physical_page_count() const { return virtual_page_count(); } size_t physical_page_count() const { return virtual_page_count(); }
#if __enable_sse #if __enable_sse
void save_sse(); void save_sse() { asm volatile("fxsave %0" :: "m"(m_sse_storage)); }
void load_sse(); void load_sse() { asm volatile("fxrstor %0" :: "m"(m_sse_storage)); }
static Thread* sse_thread();
#endif #endif
private: private:

View File

@ -231,17 +231,6 @@ namespace Kernel
Thread* current = &current_thread(); Thread* current = &current_thread();
#if __enable_sse
if (current != Thread::sse_thread())
{
asm volatile(
"movq %cr0, %rax;"
"orq $(1 << 3), %rax;"
"movq %rax, %cr0"
);
}
#endif
while (current->state() == Thread::State::Terminated) while (current->state() == Thread::State::Terminated)
{ {
Thread* thread = m_current_thread->thread; Thread* thread = m_current_thread->thread;

View File

@ -26,6 +26,10 @@ namespace Kernel
Thread::current().set_return_rsp(interrupt_stack.rsp); Thread::current().set_return_rsp(interrupt_stack.rsp);
Thread::current().set_return_rip(interrupt_stack.rip); Thread::current().set_return_rip(interrupt_stack.rip);
#if __enable_sse
Thread::current().save_sse();
#endif
asm volatile("sti"); asm volatile("sti");
(void)arg1; (void)arg1;
@ -217,9 +221,6 @@ namespace Kernel
asm volatile("cli"); asm volatile("cli");
if (ret.is_error() && ret.error().get_error_code() == ENOTSUP)
dprintln("ENOTSUP {}", syscall);
if (ret.is_error() && ret.error().is_kernel_error()) if (ret.is_error() && ret.error().is_kernel_error())
Kernel::panic("Kernel error while returning to userspace {}", ret.error()); Kernel::panic("Kernel error while returning to userspace {}", ret.error());
@ -229,6 +230,10 @@ namespace Kernel
ASSERT(Kernel::Thread::current().state() == Kernel::Thread::State::Executing); ASSERT(Kernel::Thread::current().state() == Kernel::Thread::State::Executing);
#if __enable_sse
current_thread.load_sse();
#endif
if (ret.is_error()) if (ret.is_error())
return -ret.error().get_error_code(); return -ret.error().get_error_code();
return ret.value(); return ret.value();

View File

@ -101,16 +101,7 @@ namespace Kernel
: m_tid(tid), m_process(process) : m_tid(tid), m_process(process)
{ {
#if __enable_sse #if __enable_sse
uintptr_t cr0;
asm volatile(
"movq %%cr0, %%rax;"
"movq %%rax, %%rbx;"
"andq $~(1 << 3), %%rax;"
"movq %%rax, %%cr0;"
: "=b"(cr0)
);
save_sse(); save_sse();
asm volatile("movq %0, %%cr0" :: "r"(cr0));
#endif #endif
} }
@ -370,24 +361,4 @@ namespace Kernel
ASSERT_NOT_REACHED(); ASSERT_NOT_REACHED();
} }
#if __enable_sse
static Thread* s_sse_thread = nullptr;
void Thread::save_sse()
{
asm volatile("fxsave %0" :: "m"(m_sse_storage));
}
void Thread::load_sse()
{
asm volatile("fxrstor %0" :: "m"(m_sse_storage));
s_sse_thread = this;
}
Thread* Thread::sse_thread()
{
return s_sse_thread;
}
#endif
} }

View File

@ -13,9 +13,6 @@ extern "C" char** environ;
extern "C" void _fini(); extern "C" void _fini();
static void (*at_exit_funcs[64])();
static uint32_t at_exit_funcs_count = 0;
void abort(void) void abort(void)
{ {
fflush(nullptr); fflush(nullptr);
@ -25,8 +22,6 @@ void abort(void)
void exit(int status) void exit(int status)
{ {
for (uint32_t i = at_exit_funcs_count; i > 0; i--)
at_exit_funcs[i - 1]();
fflush(nullptr); fflush(nullptr);
__cxa_finalize(nullptr); __cxa_finalize(nullptr);
_fini(); _fini();
@ -39,15 +34,9 @@ int abs(int val)
return val < 0 ? -val : val; return val < 0 ? -val : val;
} }
int atexit(void (*func)(void)) int atexit(void(*)(void))
{ {
if (at_exit_funcs_count > sizeof(at_exit_funcs) / sizeof(*at_exit_funcs)) return -1;
{
errno = ENOBUFS;
return -1;
}
at_exit_funcs[at_exit_funcs_count++] = func;
return 0;
} }
int atoi(const char* str) int atoi(const char* str)