2022-12-07 14:02:46 +00:00
|
|
|
#include "thread/Thread.h"
|
2022-12-16 19:40:04 +00:00
|
|
|
#include <luna/CString.h>
|
2022-12-07 14:02:46 +00:00
|
|
|
|
|
|
|
bool is_in_kernel(Registers* regs)
|
|
|
|
{
|
|
|
|
return regs->cs == 8;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Thread::set_ip(u64 ip)
|
|
|
|
{
|
|
|
|
regs.rip = ip;
|
|
|
|
}
|
|
|
|
|
|
|
|
u64 Thread::ip()
|
|
|
|
{
|
|
|
|
return regs.rip;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Thread::set_sp(u64 sp)
|
|
|
|
{
|
|
|
|
regs.rsp = sp;
|
|
|
|
}
|
|
|
|
|
|
|
|
u64 Thread::sp()
|
|
|
|
{
|
|
|
|
return regs.rsp;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Thread::init_regs_kernel()
|
|
|
|
{
|
|
|
|
memset(®s, 0, sizeof(Registers));
|
|
|
|
regs.cs = 0x08;
|
|
|
|
regs.ss = 0x10;
|
2022-12-07 14:55:58 +00:00
|
|
|
regs.rflags = 1 << 9; // IF (Interrupt enable flag)
|
2022-12-07 14:02:46 +00:00
|
|
|
}
|
|
|
|
|
2022-12-26 11:46:07 +00:00
|
|
|
void Thread::init_regs_user()
|
|
|
|
{
|
|
|
|
memset(®s, 0, sizeof(Registers));
|
|
|
|
regs.cs = 0x18 | 3;
|
|
|
|
regs.ss = 0x20 | 3;
|
|
|
|
regs.rflags = 1 << 9; // IF (Interrupt enable flag)
|
|
|
|
}
|
|
|
|
|
2022-12-07 14:02:46 +00:00
|
|
|
void Thread::set_arguments(u64 arg1, u64 arg2, u64 arg3, u64 arg4)
|
|
|
|
{
|
|
|
|
regs.rdi = arg1;
|
|
|
|
regs.rsi = arg2;
|
|
|
|
regs.rdx = arg3;
|
|
|
|
regs.rcx = arg4;
|
|
|
|
}
|
|
|
|
|
|
|
|
void switch_context(Thread* old_thread, Thread* new_thread, Registers* regs)
|
|
|
|
{
|
2022-12-07 14:14:58 +00:00
|
|
|
if (!old_thread->is_idle()) memcpy(&old_thread->regs, regs, sizeof(Registers));
|
2022-12-07 14:02:46 +00:00
|
|
|
|
|
|
|
memcpy(regs, &new_thread->regs, sizeof(Registers));
|
|
|
|
}
|