-
Notifications
You must be signed in to change notification settings - Fork 1
/
task.h
124 lines (99 loc) · 1.81 KB
/
task.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#ifndef TASK_H
#define TASK_H
#include "stddef.h"
#include "stdbool.h"
#include "fs/vfs.h"
#define MAX_TASKS 128
#define MAX_FDS 64
typedef struct tss
{
ushort link;
ushort _res_1;
uint esp0;
ushort ss0;
ushort _res_2;
uint esp1;
ushort ss1;
ushort _res_3;
uint esp2;
ushort ss2;
ushort _res_4;
uint cr3;
uint eip;
uint eflags;
uint eax;
uint ecx;
uint edx;
uint ebx;
uint esp;
uint ebp;
uint esi;
uint edi;
ushort es;
ushort _res_5;
ushort cs;
ushort _res_6;
ushort ss;
ushort _res_7;
ushort ds;
ushort _res_8;
ushort fs;
ushort _res_9;
ushort gs;
ushort _res_10;
ushort ldtr;
ushort _res_11;
ushort _res_12;
ushort iopb;
}
__attribute__((__packed__)) tss_t;
typedef enum task_state
{
SLEEPING,
RUNNING,
IO_WAIT,
KILLED,
}
task_state_t;
typedef struct task
{
// must be first member, so the offsets of members are known.
tss_t tss;
uint pid;
uint* page_directory;
task_state_t state;
char kernel_stack[8192];
vfs_stream_t* fds[MAX_FDS];
uint exception_handler;
}
__attribute__((__packed__)) /* so i can access the struct straight from assembly */ task_t;
typedef struct regs
{
uint es;
uint fs;
uint gs;
uint ds;
uint edi;
uint esi;
uint ebp;
uint esp;
uint ebx;
uint edx;
uint ecx;
uint eax;
}
__attribute__((__packed__)) regs_t;
task_t* task_get(uint pid);
void task_init(uint base_physical, uint high_memory);
uint alloc_page();
void free_page(uint page);
task_t* task_create(uint size, void* code, uint stack_size);
task_t* task_dup(task_t* task);
void task_kill_and_free(task_t* task);
uint task_add_page(task_t* task);
void task_del_page(task_t* task, uint virtual);
void task_add_virtual(task_t*, uint virtual);
void task_switch();
task_t* task_current();
void task_peek(task_t* task, uint virtual, uint length, void* buffer);
#endif