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