feat: lunadbg GDB plugin to ease kernel debugging process.
[lunaix-os.git] / lunaix-os / includes / lunaix / process.h
1 #ifndef __LUNAIX_PROCESS_H
2 #define __LUNAIX_PROCESS_H
3
4 #include <lunaix/clock.h>
5 #include <lunaix/ds/waitq.h>
6 #include <lunaix/fs.h>
7 #include <lunaix/mm/mm.h>
8 #include <lunaix/mm/region.h>
9 #include <lunaix/signal.h>
10 #include <lunaix/timer.h>
11 #include <lunaix/types.h>
12 #include <stdint.h>
13 #include <sys/interrupts.h>
14
15 // 虽然内核不是进程,但为了区分,这里使用Pid=-1来指代内核。这主要是方便物理页所有权检查。
16 #define KERNEL_PID -1
17
18 /*
19     |C|Bk|De|Tn|Pu|Rn|
20          \----/
21             Dt
22
23     Group Dt: whether this process is terminated.
24
25     Rn: Running
26     Tn: Terminated
27     De: Destoryed
28     Pu: Paused
29     Bk: Blocked
30     C : Created
31 */
32
33 #define PS_READY 0
34 #define PS_RUNNING 1
35 #define PS_TERMNAT 2
36 #define PS_DESTROY 4
37 #define PS_PAUSED 8
38 #define PS_BLOCKED 16
39 #define PS_CREATED 32
40
41 #define PS_GrBP (PS_PAUSED | PS_BLOCKED)
42 #define PS_GrDT (PS_TERMNAT | PS_DESTROY)
43
44 #define proc_terminated(proc) (((proc)->state) & PS_GrDT)
45 #define proc_hanged(proc) (((proc)->state) & PS_BLOCKED)
46 #define proc_runnable(proc) (((proc)->state) & PS_PAUSED)
47
48 struct sigact
49 {
50     struct sigact* prev;
51     sigset_t sa_mask;
52     void* sa_actor;
53     void* sa_handler;
54     pid_t sender;
55 };
56
57 struct sighail
58 {
59     sigset_t sig_pending;
60     sigset_t sig_mask;
61     struct sigact* inprogress;
62     struct sigact signals[_SIG_NUM];
63 };
64
65 struct proc_sig
66 {
67     int sig_num;
68     void* sigact;
69     void* sighand;
70     isr_param* saved_ictx;
71 } __attribute__((packed));
72
73 struct proc_info
74 {
75     /*
76         Any change to *critical section*, including layout, size
77         must be reflected in arch/i386/interrupt.S.inc to avoid
78         disaster!
79      */
80
81     /* ---- critical section start ---- */
82
83     pid_t pid;
84     struct proc_info* parent;
85     isr_param* intr_ctx;
86     ptr_t ustack_top;
87     ptr_t page_table;
88
89     /* ---- critical section end ---- */
90
91     struct llist_header tasks;
92     struct llist_header siblings;
93     struct llist_header children;
94     struct llist_header grp_member;
95     waitq_t waitqueue;
96
97     struct
98     {
99         struct llist_header sleepers;
100         time_t wakeup_time;
101         time_t alarm_time;
102     } sleep;
103
104     struct proc_mm mm;
105     time_t created;
106     u8_t state;
107     int32_t exit_code;
108     int32_t k_status;
109     struct sighail sigctx;
110     struct v_fdtable* fdtable;
111     struct v_dnode* cwd;
112     pid_t pgid;
113 };
114
115 extern volatile struct proc_info* __current;
116
117 static inline void
118 block_current()
119 {
120     __current->state = PS_BLOCKED;
121 }
122
123 static inline void
124 pause_current()
125 {
126     __current->state = PS_PAUSED;
127 }
128
129 static inline void
130 resume_current()
131 {
132     __current->state = PS_RUNNING;
133 }
134
135 /**
136  * @brief 分配并初始化一个进程控制块
137  *
138  * @return struct proc_info*
139  */
140 struct proc_info*
141 alloc_process();
142
143 /**
144  * @brief 初始化进程用户空间
145  *
146  * @param pcb
147  */
148 void
149 init_proc_user_space(struct proc_info* pcb);
150
151 /**
152  * @brief 向系统发布一个进程,使其可以被调度。
153  *
154  * @param process
155  */
156 void
157 commit_process(struct proc_info* process);
158
159 pid_t
160 destroy_process(pid_t pid);
161
162 void
163 copy_kernel_stack(struct proc_info* proc, ptr_t kstack_from);
164
165 /**
166  * @brief 复制当前进程(LunaixOS的类 fork (unix) 实现)
167  *
168  */
169 pid_t
170 dup_proc();
171
172 /**
173  * @brief 创建新进程(LunaixOS的类 CreateProcess (Windows) 实现)
174  *
175  */
176 void
177 new_proc();
178
179 /**
180  * @brief 终止(退出)当前进程
181  *
182  */
183 void
184 terminate_proc(int exit_code);
185
186 int
187 orphaned_proc(pid_t pid);
188
189 struct proc_info*
190 get_process(pid_t pid);
191
192 void
193 proc_setsignal(struct proc_info* proc, int signum);
194
195 void
196 proc_clear_signal(struct proc_info* proc);
197
198 // enable interrupt upon transfer
199 #define TRANSFER_IE 1
200
201 /**
202  * @brief Setup process initial context, used to initiate first switch
203  *
204  * @param proc
205  * @param stop
206  * @param target
207  * @param flags
208  */
209 void
210 proc_init_transfer(struct proc_info* proc, ptr_t stop, ptr_t target, int flags);
211
212 #endif /* __LUNAIX_PROCESS_H */