Luna/kernel/src/thread/Thread.h
apio 3a84e4998c
All checks were successful
continuous-integration/drone/push Build is passing
kernel/Thread: Add FIXME
2023-01-31 17:02:49 +01:00

76 lines
1.3 KiB
C

#pragma once
#include "arch/MMU.h"
#include "memory/UserVM.h"
#include <luna/LinkedList.h>
#include <luna/OwnedPtr.h>
#include <luna/Result.h>
#include <luna/Stack.h>
#ifdef ARCH_X86_64
#include "arch/x86_64/CPU.h"
#else
#error "Unknown architecture."
#endif
enum class ThreadState
{
Idle,
Runnable,
Sleeping,
Dying
};
// FIXME: Save floating point state. (SSE registers on x86_64 using FXSAVE and FXRSTOR)
struct Thread : public LinkedListNode<Thread>
{
Registers regs;
u64 id;
u64 ticks = 0;
u64 ticks_in_user = 0;
u64 ticks_in_kernel = 0;
u64 ticks_left;
u64 sleep_ticks_left;
Stack stack;
Stack kernel_stack;
OwnedPtr<UserVM> vm_allocator;
ThreadState state = ThreadState::Runnable;
bool is_kernel { true };
PageDirectory* directory;
bool is_idle()
{
return state == ThreadState::Idle;
}
void init_regs_kernel();
void init_regs_user();
void set_arguments(u64 arg1, u64 arg2, u64 arg3, u64 arg4);
void set_ip(u64 ip);
u64 ip();
void set_sp(u64 sp);
u64 sp();
static void init();
};
void switch_context(Thread* old_thread, Thread* new_thread, Registers* regs);
bool is_in_kernel(Registers* regs);
Result<Thread*> new_thread();
extern LinkedList<Thread> g_threads;