Iros
 
Loading...
Searching...
No Matches
task.h
Go to the documentation of this file.
1#pragma once
2
4#include "di/sync/prelude.h"
5#include "di/util/prelude.h"
7#include "iris/core/config.h"
10#include "iris/fs/file.h"
11#include "iris/fs/tnode.h"
13
14#include IRIS_ARCH_INCLUDE(core/task.h)
15
16namespace iris {
18
20
21class TaskNamespace;
22
27
28class Task
29 : public di::IntrusiveListNode<>
30 , public di::IntrusiveRefCount<Task> {
31public:
34
35 ~Task();
36
37 [[noreturn]] void context_switch_to() {
38 // NOTE: Disable interrupts at this point because setting the userspace thread pointer may make accessing the
39 // current processor impossible. If we receive an interrupt after that point, we will crash. NMI's have to take
40 // special care to handle this scenario. Additionally, we want to avoid any possible race conditions while
41 // context switching, as these functions may need to access the current processor.
42 auto guard = InterruptDisabler {};
43 m_address_space->load();
44 m_fpu_state.load();
45 if (m_kernel_stack.raw_value() != 0) {
46 arch::load_kernel_stack(m_kernel_stack + 0x2000ZU);
47 }
49
50 m_task_state.context_switch_to();
51 }
52
53 auto task_state() const -> arch::TaskState const& { return m_task_state; }
54 void set_task_state(arch::TaskState const& state) { m_task_state = state; }
55
56 auto task_arguments() const -> di::Arc<TaskArguments> { return m_task_arguments; }
58
59 auto fpu_state() -> arch::FpuState& { return m_fpu_state; }
60 auto fpu_state() const -> arch::FpuState const& { return m_fpu_state; }
61
62 auto id() const -> TaskId { return m_id; }
63
64 auto address_space() -> mm::AddressSpace& { return *m_address_space; }
66
67 auto task_namespace() const -> TaskNamespace& { return *m_task_namespace; }
68 auto file_table() -> FileTable& { return m_file_table; }
69
71 m_task_state.set_instruction_pointer(address.raw_value());
72 }
73 void set_stack_pointer(mm::VirtualAddress address) { m_task_state.set_stack_pointer(address.raw_value()); }
74 void set_argument1(uptr value) { m_task_state.set_argument1(value); }
75 void set_argument2(uptr value) { m_task_state.set_argument2(value); }
76 void set_argument3(uptr value) { m_task_state.set_argument3(value); }
77 void set_argument4(uptr value) { m_task_state.set_argument4(value); }
78
79 auto preemption_disabled() const -> bool { return m_preemption_disabled_count.load(di::MemoryOrder::Relaxed) > 0; }
80 void disable_preemption() { m_preemption_disabled_count.fetch_add(1, di::MemoryOrder::Relaxed); }
81 void enable_preemption();
82 void set_should_be_preempted() { m_should_be_preempted.store(true, di::MemoryOrder::Relaxed); }
83
84 auto task_status() const -> di::Arc<TaskStatus> { return m_task_status; }
85
86 auto waiting() const -> bool { return m_waiting.load(di::MemoryOrder::Relaxed); }
87 void set_waiting() { m_waiting.store(true, di::MemoryOrder::Relaxed); }
88 void set_runnable() { m_waiting.store(false, di::MemoryOrder::Relaxed); }
89
90 auto kernel_stack() const -> mm::VirtualAddress { return m_kernel_stack; }
92
93 auto userspace_thread_pointer() const -> uptr { return m_userspace_thread_pointer; }
97
98 auto root_tnode() const -> di::Arc<TNode> { return m_root_tnode; }
99 void set_root_tnode(di::Arc<TNode> root_tnode) { m_root_tnode = di::move(root_tnode); }
100
101 auto cwd_tnode() const -> di::Arc<TNode> { return m_cwd_tnode; }
102 void set_cwd_tnode(di::Arc<TNode> cwd_tnode) { m_cwd_tnode = di::move(cwd_tnode); }
103
104private:
105 arch::TaskState m_task_state;
106 arch::FpuState m_fpu_state;
107 di::Arc<mm::AddressSpace> m_address_space;
108 di::Arc<TaskNamespace> m_task_namespace;
109 di::Arc<TNode> m_root_tnode;
110 di::Arc<TNode> m_cwd_tnode;
111 di::Atomic<i32> m_preemption_disabled_count;
112 di::Atomic<bool> m_should_be_preempted { false };
113 di::Arc<TaskStatus> m_task_status;
114 di::Arc<TaskArguments> m_task_arguments;
115 di::Atomic<bool> m_waiting { false };
116 mm::VirtualAddress m_kernel_stack { 0 };
117 uptr m_userspace_thread_pointer { 0 };
118 FileTable m_file_table;
119 TaskId m_id;
120};
121
126
127auto do_syscall(Task& current_task, arch::TaskState& task_state) -> Expected<u64>;
128}
Definition list_node.h:9
Definition atomic.h:15
Definition strong_int.h:44
constexpr auto raw_value() const -> Type
Definition strong_int.h:53
Definition file.h:101
Definition interrupt_disabler.h:42
Definition tnode.h:9
Definition task_arguments.h:9
Definition task_namespace.h:26
Definition task_status.h:7
Definition task.h:30
void enable_preemption()
Definition task.cpp:222
void set_cwd_tnode(di::Arc< TNode > cwd_tnode)
Definition task.h:102
auto root_tnode() const -> di::Arc< TNode >
Definition task.h:98
~Task()
Definition task.cpp:32
void context_switch_to()
Definition task.h:37
void set_runnable()
Definition task.h:88
auto address_space() -> mm::AddressSpace &
Definition task.h:64
void disable_preemption()
Definition task.h:80
void set_root_tnode(di::Arc< TNode > root_tnode)
Definition task.h:99
auto task_state() const -> arch::TaskState const &
Definition task.h:53
void set_address_space(di::Arc< mm::AddressSpace > address_space)
Definition task.h:65
auto fpu_state() -> arch::FpuState &
Definition task.h:59
auto preemption_disabled() const -> bool
Definition task.h:79
void set_task_state(arch::TaskState const &state)
Definition task.h:54
auto kernel_stack() const -> mm::VirtualAddress
Definition task.h:90
void set_argument1(uptr value)
Definition task.h:74
void set_userspace_thread_pointer(uptr userspace_thread_pointer)
Definition task.h:94
void set_stack_pointer(mm::VirtualAddress address)
Definition task.h:73
void set_waiting()
Definition task.h:87
void set_argument3(uptr value)
Definition task.h:76
void set_argument2(uptr value)
Definition task.h:75
auto id() const -> TaskId
Definition task.h:62
void set_instruction_pointer(mm::VirtualAddress address)
Definition task.h:70
void set_kernel_stack(mm::VirtualAddress kernel_stack)
Definition task.h:91
auto task_arguments() const -> di::Arc< TaskArguments >
Definition task.h:56
Task(bool userspace, di::Arc< mm::AddressSpace > address_space, di::Arc< TaskNamespace > task_namespace, TaskId task_id, FileTable file_table, di::Arc< TaskStatus > task_status)
Definition task.cpp:20
auto waiting() const -> bool
Definition task.h:86
void set_task_arguments(di::Arc< TaskArguments > task_arguments)
Definition task.h:57
auto userspace_thread_pointer() const -> uptr
Definition task.h:93
void set_argument4(uptr value)
Definition task.h:77
auto cwd_tnode() const -> di::Arc< TNode >
Definition task.h:101
void set_should_be_preempted()
Definition task.h:82
auto task_namespace() const -> TaskNamespace &
Definition task.h:67
auto fpu_state() const -> arch::FpuState const &
Definition task.h:60
auto file_table() -> FileTable &
Definition task.h:68
auto task_status() const -> di::Arc< TaskStatus >
Definition task.h:84
Definition address_space.h:52
PathViewImpl< string::TransparentEncoding > PathView
Definition path_view.h:11
uintptr_t uptr
Definition integers.h:36
IntrusivePtr< T, ArcTag > Arc
Definition arc.h:21
Definition zstring_parser.h:9
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
Definition address_space.cpp:20
di::StrongInt< VirtualAddressTag > VirtualAddress
Definition virtual_address.h:25
Definition cxx_init.cpp:12
auto do_syscall(Task &current_task, arch::TaskState &task_state) -> Expected< u64 >
Definition syscall.cpp:16
di::StrongInt< TaskIdTag > TaskId
Definition task.h:19
auto create_user_task(TaskNamespace &task_namespace, di::Arc< TNode > root_tnode, di::Arc< TNode > cwd_tnode, FileTable file_table, di::Arc< mm::AddressSpace > address_space) -> Expected< di::Arc< Task > >
Definition task.cpp:64
di::vocab::Expected< T, di::platform::GenericCode > Expected
Definition error.h:324
auto create_kernel_task(TaskNamespace &task_namespace, void(*entry)()) -> Expected< di::Arc< Task > >
Definition task.cpp:39
@ load_executable
Definition syscall.h:9
Definition core.h:18
Definition arc.h:24
Definition task.h:23
di::Arc< mm::AddressSpace > address_space
Definition task.h:24
mm::VirtualAddress kernel_stack
Definition task.h:25
Definition task.h:17
Definition task.h:71
Definition task.h:12