2022-12-07 15:02:46 +01:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <luna/LinkedList.h>
|
|
|
|
#include <luna/Result.h>
|
2022-12-18 18:43:17 +01:00
|
|
|
#include <luna/Stack.h>
|
2022-12-07 15:02:46 +01:00
|
|
|
|
|
|
|
#ifdef ARCH_X86_64
|
|
|
|
#include "arch/x86_64/CPU.h"
|
|
|
|
#else
|
|
|
|
#error "Unknown architecture."
|
|
|
|
#endif
|
|
|
|
|
2022-12-07 15:14:58 +01:00
|
|
|
enum class ThreadState
|
|
|
|
{
|
|
|
|
Idle,
|
|
|
|
Runnable,
|
2022-12-18 18:43:34 +01:00
|
|
|
Sleeping,
|
|
|
|
Dying
|
2022-12-07 15:14:58 +01:00
|
|
|
};
|
|
|
|
|
2022-12-19 12:43:23 +01:00
|
|
|
struct Thread : public LinkedListNode<Thread>
|
2022-12-07 15:02:46 +01:00
|
|
|
{
|
|
|
|
Registers regs;
|
|
|
|
|
|
|
|
u64 id;
|
|
|
|
|
|
|
|
u64 ticks = 0;
|
|
|
|
u64 ticks_in_user = 0;
|
|
|
|
u64 ticks_in_kernel = 0;
|
|
|
|
|
|
|
|
u64 ticks_left;
|
2022-12-07 15:55:58 +01:00
|
|
|
u64 sleep_ticks_left;
|
2022-12-07 15:02:46 +01:00
|
|
|
|
2022-12-18 18:43:17 +01:00
|
|
|
Stack stack;
|
|
|
|
|
2022-12-07 15:14:58 +01:00
|
|
|
ThreadState state = ThreadState::Runnable;
|
|
|
|
|
|
|
|
bool is_idle()
|
|
|
|
{
|
|
|
|
return state == ThreadState::Idle;
|
|
|
|
}
|
2022-12-07 15:02:46 +01:00
|
|
|
|
|
|
|
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();
|
2022-12-17 10:50:49 +01:00
|
|
|
|
|
|
|
static void init();
|
2022-12-07 15:02:46 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
void switch_context(Thread* old_thread, Thread* new_thread, Registers* regs);
|
|
|
|
|
|
|
|
bool is_in_kernel(Registers* regs);
|
|
|
|
|
|
|
|
Result<Thread*> new_thread();
|
|
|
|
|
2022-12-19 12:43:23 +01:00
|
|
|
extern LinkedList<Thread> g_threads;
|