Iros
 
Loading...
Searching...
No Matches
task.h
Go to the documentation of this file.
1#pragma once
2
3#include <iris/uapi/syscall.h>
4
5#include "di/types/prelude.h"
6#include "di/util/prelude.h"
7#include "iris/core/error.h"
9
10namespace iris::arch {
11// This is x86_64 specific.
12struct TaskState {
13 explicit TaskState(bool userspace);
14
15 auto syscall_number() const -> SystemCall { return SystemCall(rax); }
16
17 auto in_kernel() const -> bool { return (cs & 0x3) == 0; }
18
19 auto syscall_arg1() const -> u64 { return rdi; }
20 auto syscall_arg2() const -> u64 { return rsi; }
21 auto syscall_arg3() const -> u64 { return rdx; }
22 auto syscall_arg4() const -> u64 { return r10; }
23 auto syscall_arg5() const -> u64 { return r8; }
24 auto syscall_arg6() const -> u64 { return r9; }
25
27 if (value) {
28 rdx = 0;
29 rax = *value;
30 } else {
31 rdx = di::to_underlying(value.error().value());
32 }
33 }
34
35 void set_instruction_pointer(uptr value) { rip = value; }
36 void set_stack_pointer(uptr value) { rsp = value; }
37 void set_argument1(uptr value) { rdi = value; }
38 void set_argument2(uptr value) { rsi = value; }
39 void set_argument3(uptr value) { rdx = value; }
40 void set_argument4(uptr value) { rcx = value; }
41
43 [[noreturn]] void context_switch_to();
44
45 // These are the main x86_64 registers.
46 u64 r15 { 0 };
47 u64 r14 { 0 };
48 u64 r13 { 0 };
49 u64 r12 { 0 };
50 u64 r11 { 0 };
51 u64 r10 { 0 };
52 u64 r9 { 0 };
53 u64 r8 { 0 };
54 u64 rbp { 0 };
55 u64 rdi { 0 };
56 u64 rsi { 0 };
57 u64 rdx { 0 };
58 u64 rcx { 0 };
59 u64 rbx { 0 };
60 u64 rax { 0 };
61
62 // This is the task state present on the stack after
63 // an interrupt occurs.
64 u64 rip { 0 };
65 u64 cs { 0 };
66 u64 rflags { 0 };
67 u64 rsp { 0 };
68 u64 ss { 0 };
69};
70
71struct FpuState {
72 FpuState() = default;
73
74 ~FpuState();
75
78
82
85 void load();
86
89 void save();
90
93 byte* fpu_state { nullptr };
94
95private:
96 auto allocate_fpu_state() -> Expected<byte*>;
97};
98
100void load_userspace_thread_pointer(uptr userspace_thread_pointer, TaskState& task_state);
101}
uintptr_t uptr
Definition integers.h:36
__UINT64_TYPE__ u64
Definition integers.h:12
constexpr auto to_underlying
Definition to_underlying.h:15
Definition cxx_init.cpp:12
void load_kernel_stack(mm::VirtualAddress base)
Definition tss.cpp:8
void load_userspace_thread_pointer(uptr userspace_thread_pointer, arch::TaskState &task_state)
Definition gdt.cpp:22
di::StrongInt< VirtualAddressTag > VirtualAddress
Definition virtual_address.h:25
di::vocab::Expected< T, di::platform::GenericCode > Expected
Definition error.h:324
SystemCall
Definition syscall.h:4
byte * fpu_state
Definition task.h:93
auto setup_fpu_state() -> Expected< void >
Setup the task's FPU state. This must be called for userspace tasks.
Definition task.cpp:61
auto setup_initial_fpu_state() -> Expected< void >
Definition task.cpp:71
void load()
Definition task.cpp:91
void save()
Definition task.cpp:102
~FpuState()
Definition task.cpp:55
void set_argument1(uptr value)
Definition task.h:37
u64 rdx
Definition task.h:57
u64 rax
Definition task.h:60
u64 rbx
Definition task.h:59
u64 rsp
Definition task.h:67
u64 rsi
Definition task.h:56
u64 r11
Definition task.h:50
auto syscall_arg6() const -> u64
Definition task.h:24
u64 r8
Definition task.h:53
u64 rip
Definition task.h:64
u64 rdi
Definition task.h:55
void set_syscall_return(Expected< uptr > value)
Definition task.h:26
auto syscall_arg4() const -> u64
Definition task.h:22
auto syscall_arg5() const -> u64
Definition task.h:23
u64 r15
Definition task.h:46
void set_instruction_pointer(uptr value)
Definition task.h:35
u64 rflags
Definition task.h:66
void set_stack_pointer(uptr value)
Definition task.h:36
void set_argument3(uptr value)
Definition task.h:39
u64 rbp
Definition task.h:54
auto syscall_arg2() const -> u64
Definition task.h:20
u64 ss
Definition task.h:68
void set_argument4(uptr value)
Definition task.h:40
u64 r13
Definition task.h:48
u64 r14
Definition task.h:47
auto syscall_arg3() const -> u64
Definition task.h:21
u64 rcx
Definition task.h:58
void set_argument2(uptr value)
Definition task.h:38
auto syscall_number() const -> SystemCall
Definition task.h:15
u64 r9
Definition task.h:52
u64 cs
Definition task.h:65
auto in_kernel() const -> bool
Definition task.h:17
void context_switch_to()
Function to perform a context switch.
Definition task.cpp:21
auto syscall_arg1() const -> u64
Definition task.h:19
u64 r10
Definition task.h:51
TaskState(bool userspace)
Definition task.cpp:9
u64 r12
Definition task.h:49