#include "thread/Thread.h" #include 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; regs.rflags = 1 << 9; // IF (Interrupt enable flag) } 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) } 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) { if (!old_thread->is_idle()) memcpy(&old_thread->regs, regs, sizeof(Registers)); memcpy(regs, &new_thread->regs, sizeof(Registers)); }