This source file includes following definitions.
- add_wait_queue
- remove_wait_queue
- select_wait
- _get_base
- get_limit
1 #ifndef _LINUX_SCHED_H
2 #define _LINUX_SCHED_H
3
4
5
6
7
8
9
10
11
12
13 #define HZ 100
14
15
16
17
18 #define NR_TASKS 64
19
20
21
22
23
24 #define TASK_SIZE 0xc0000000
25
26
27
28
29 #define IO_BITMAP_SIZE 32
30
31
32
33
34
35
36
37
38
39
40
41 extern unsigned long avenrun[];
42
43 #define FSHIFT 11
44 #define FIXED_1 (1<<FSHIFT)
45 #define LOAD_FREQ (5*HZ)
46 #define EXP_1 1884
47 #define EXP_5 2014
48 #define EXP_15 2037
49
50 #define CALC_LOAD(load,exp,n) \
51 load *= exp; \
52 load += n*(FIXED_1-exp); \
53 load >>= FSHIFT;
54
55 #define CT_TO_SECS(x) ((x) / HZ)
56 #define CT_TO_USECS(x) (((x) % HZ) * 1000000/HZ)
57
58 #define FIRST_TASK task[0]
59 #define LAST_TASK task[NR_TASKS-1]
60
61 #include <linux/head.h>
62 #include <linux/fs.h>
63 #include <linux/mm.h>
64 #include <linux/signal.h>
65 #include <linux/time.h>
66 #include <linux/param.h>
67 #include <linux/resource.h>
68 #include <linux/vm86.h>
69 #include <linux/math_emu.h>
70
71 #define TASK_RUNNING 0
72 #define TASK_INTERRUPTIBLE 1
73 #define TASK_UNINTERRUPTIBLE 2
74 #define TASK_ZOMBIE 3
75 #define TASK_STOPPED 4
76 #define TASK_SWAPPING 5
77
78 #ifndef NULL
79 #define NULL ((void *) 0)
80 #endif
81
82 #define MAX_SHARED_LIBS 16
83
84 extern void sched_init(void);
85 extern void show_state(void);
86 extern void schedule(void);
87 extern void trap_init(void);
88 extern void panic(const char * str);
89
90 typedef int (*fn_ptr)();
91
92 union i387_union {
93 struct i387_hard_struct {
94 long cwd;
95 long swd;
96 long twd;
97 long fip;
98 long fcs;
99 long foo;
100 long fos;
101 long st_space[20];
102 } hard;
103 struct i387_soft_struct {
104 long cwd;
105 long swd;
106 long twd;
107 long fip;
108 long fcs;
109 long foo;
110 long fos;
111 long top;
112 struct fpu_reg regs[8];
113 unsigned char lookahead;
114 struct info *info;
115 unsigned long entry_eip;
116 } soft;
117 };
118
119 struct tss_struct {
120 unsigned long back_link;
121 unsigned long esp0;
122 unsigned long ss0;
123 unsigned long esp1;
124 unsigned long ss1;
125 unsigned long esp2;
126 unsigned long ss2;
127 unsigned long cr3;
128 unsigned long eip;
129 unsigned long eflags;
130 unsigned long eax,ecx,edx,ebx;
131 unsigned long esp;
132 unsigned long ebp;
133 unsigned long esi;
134 unsigned long edi;
135 unsigned long es;
136 unsigned long cs;
137 unsigned long ss;
138 unsigned long ds;
139 unsigned long fs;
140 unsigned long gs;
141 unsigned long ldt;
142 unsigned long trace_bitmap;
143 unsigned long io_bitmap[IO_BITMAP_SIZE];
144 union i387_union i387;
145 };
146
147 struct task_struct {
148
149 long state;
150 long counter;
151 long priority;
152 long signal;
153 struct sigaction sigaction[32];
154 long blocked;
155 unsigned long saved_kernel_stack;
156 unsigned long kernel_stack_page;
157 unsigned int flags;
158
159 int exit_code;
160 int dumpable:1;
161 int swappable:1;
162 unsigned long start_code,end_code,end_data,brk,start_stack;
163 unsigned long arg_start, arg_end, env_start, env_end;
164 long pid,pgrp,session,leader;
165 int groups[NGROUPS];
166
167
168
169
170
171 struct task_struct *p_opptr,*p_pptr, *p_cptr, *p_ysptr, *p_osptr;
172
173
174
175
176 unsigned short uid,euid,suid;
177 unsigned short gid,egid,sgid;
178 unsigned long timeout;
179 unsigned long it_real_value, it_prof_value, it_virt_value;
180 unsigned long it_real_incr, it_prof_incr, it_virt_incr;
181 long utime,stime,cutime,cstime,start_time;
182 unsigned long min_flt, maj_flt;
183 unsigned long cmin_flt, cmaj_flt;
184 struct rlimit rlim[RLIM_NLIMITS];
185 unsigned short used_math;
186 unsigned short rss;
187 char comm[16];
188 struct vm86_struct * vm86_info;
189 unsigned long screen_bitmap;
190
191 int link_count;
192 int tty;
193 unsigned short umask;
194 struct inode * pwd;
195 struct inode * root;
196 struct inode * executable;
197 struct vm_area_struct * mmap;
198 struct {
199 struct inode * library;
200 unsigned long start;
201 unsigned long length;
202 unsigned long bss;
203 } libraries[MAX_SHARED_LIBS];
204 int numlibraries;
205 struct file * filp[NR_OPEN];
206 fd_set close_on_exec;
207
208 struct desc_struct ldt[32];
209
210 struct tss_struct tss;
211 };
212
213
214
215
216 #define PF_ALIGNWARN 0x00000001
217
218 #define PF_PTRACED 0x00000010
219 #define PF_TRACESYS 0x00000020
220
221
222
223
224
225 #define INIT_TASK \
226 { 0,15,15, \
227 0,{{ 0, },},0,0,0, \
228 0, \
229 0,0,0,0,0,0,0,0, \
230 0,0,0,0, \
231 0,0,0,0, \
232 {NOGROUP,}, \
233 &init_task,&init_task,NULL,NULL,NULL, \
234 0,0,0,0,0,0, \
235 0,0,0,0,0,0,0,0,0,0,0,0, \
236 0,0,0,0, \
237 { {0x7fffffff, 0x7fffffff}, {0x7fffffff, 0x7fffffff}, \
238 {0x7fffffff, 0x7fffffff}, {0x7fffffff, 0x7fffffff}, \
239 {0x7fffffff, 0x7fffffff}, {0x7fffffff, 0x7fffffff}}, \
240 0, \
241 2, \
242 "swapper", \
243 NULL, 0, \
244 0,-1,0022,NULL,NULL,NULL,NULL, \
245 { { NULL, 0, 0, 0}, }, 0, \
246 {NULL,}, \
247 {{ 0, }}, \
248 { \
249 {0,0}, \
250 {0x9f,0xc0c0fa00}, \
251 {0x9f,0xc0c0f200}, \
252 }, \
253 {0,sizeof(init_kernel_stack) + (long) &init_kernel_stack, \
254 0x10,0,0,0,0,(long) &swapper_pg_dir,\
255 0,0,0,0,0,0,0,0, \
256 0,0,0x17,0x17,0x17,0x17,0x17,0x17, \
257 _LDT(0),0x80000000,{0xffffffff}, \
258 { { 0, }, } \
259 } \
260 }
261
262 extern struct task_struct *task[NR_TASKS];
263 extern struct task_struct *last_task_used_math;
264 extern struct task_struct *current;
265 extern unsigned long volatile jiffies;
266 extern unsigned long startup_time;
267 extern int jiffies_offset;
268 extern int need_resched;
269 extern int hard_math;
270
271 #define CURRENT_TIME (startup_time+(jiffies+jiffies_offset)/HZ)
272
273 extern void add_timer(long jiffies, void (*fn)(void));
274
275 extern void sleep_on(struct wait_queue ** p);
276 extern void interruptible_sleep_on(struct wait_queue ** p);
277 extern void wake_up(struct wait_queue ** p);
278 extern void wake_up_interruptible(struct wait_queue ** p);
279
280 extern int send_sig(long sig,struct task_struct * p,int priv);
281 extern int in_group_p(gid_t grp);
282
283 extern int request_irq(unsigned int irq,void (*handler)(int));
284 extern void free_irq(unsigned int irq);
285 extern int irqaction(unsigned int irq,struct sigaction * new);
286
287
288
289
290
291 #define FIRST_TSS_ENTRY 4
292 #define FIRST_LDT_ENTRY (FIRST_TSS_ENTRY+1)
293 #define _TSS(n) ((((unsigned long) n)<<4)+(FIRST_TSS_ENTRY<<3))
294 #define _LDT(n) ((((unsigned long) n)<<4)+(FIRST_LDT_ENTRY<<3))
295 #define load_TR(n) __asm__("ltr %%ax"::"a" (_TSS(n)))
296 #define load_ldt(n) __asm__("lldt %%ax"::"a" (_LDT(n)))
297 #define store_TR(n) \
298 __asm__("str %%ax\n\t" \
299 "subl %2,%%eax\n\t" \
300 "shrl $4,%%eax" \
301 :"=a" (n) \
302 :"0" (0),"i" (FIRST_TSS_ENTRY<<3))
303
304
305
306
307
308
309 #define switch_to(n) {\
310 struct {long a,b;} __tmp; \
311 __asm__("cmpl %%ecx,_current\n\t" \
312 "je 1f\n\t" \
313 "movw %%dx,%1\n\t" \
314 "cli\n\t" \
315 "xchgl %%ecx,_current\n\t" \
316 "ljmp %0\n\t" \
317 "sti\n\t" \
318 "cmpl %%ecx,_last_task_used_math\n\t" \
319 "jne 1f\n\t" \
320 "clts\n" \
321 "1:" \
322 ::"m" (*&__tmp.a),"m" (*&__tmp.b), \
323 "d" (_TSS(n)),"c" ((long) task[n]) \
324 :"cx"); \
325 }
326
327 #define PAGE_ALIGN(n) (((n)+0xfff)&0xfffff000)
328
329 #define _set_base(addr,base) \
330 __asm__("movw %%dx,%0\n\t" \
331 "rorl $16,%%edx\n\t" \
332 "movb %%dl,%1\n\t" \
333 "movb %%dh,%2" \
334 ::"m" (*((addr)+2)), \
335 "m" (*((addr)+4)), \
336 "m" (*((addr)+7)), \
337 "d" (base) \
338 :"dx")
339
340 #define _set_limit(addr,limit) \
341 __asm__("movw %%dx,%0\n\t" \
342 "rorl $16,%%edx\n\t" \
343 "movb %1,%%dh\n\t" \
344 "andb $0xf0,%%dh\n\t" \
345 "orb %%dh,%%dl\n\t" \
346 "movb %%dl,%1" \
347 ::"m" (*(addr)), \
348 "m" (*((addr)+6)), \
349 "d" (limit) \
350 :"dx")
351
352 #define set_base(ldt,base) _set_base( ((char *)&(ldt)) , base )
353 #define set_limit(ldt,limit) _set_limit( ((char *)&(ldt)) , (limit-1)>>12 )
354
355
356
357
358
359
360 extern inline void add_wait_queue(struct wait_queue ** p, struct wait_queue * wait)
361 {
362 unsigned long flags;
363
364 #ifdef DEBUG
365 if (wait->next) {
366 unsigned long pc;
367 __asm__ __volatile__("call 1f\n"
368 "1:\tpopl %0":"=r" (pc));
369 printk("add_wait_queue (%08x): wait->next = %08x\n",pc,wait->next);
370 }
371 #endif
372 __asm__ __volatile__("pushfl ; popl %0 ; cli":"=r" (flags));
373 if (!*p) {
374 wait->next = wait;
375 *p = wait;
376 } else {
377 wait->next = (*p)->next;
378 (*p)->next = wait;
379 }
380 __asm__ __volatile__("pushl %0 ; popfl"::"r" (flags));
381 }
382
383 extern inline void remove_wait_queue(struct wait_queue ** p, struct wait_queue * wait)
384 {
385 unsigned long flags;
386 struct wait_queue * tmp;
387 #ifdef DEBUG
388 unsigned long ok = 0;
389 #endif
390
391 __asm__ __volatile__("pushfl ; popl %0 ; cli":"=r" (flags));
392 if ((*p == wait) &&
393 #ifdef DEBUG
394 (ok = 1) &&
395 #endif
396 ((*p = wait->next) == wait)) {
397 *p = NULL;
398 } else {
399 tmp = wait;
400 while (tmp->next != wait) {
401 tmp = tmp->next;
402 #ifdef DEBUG
403 if (tmp == *p)
404 ok = 1;
405 #endif
406 }
407 tmp->next = wait->next;
408 }
409 wait->next = NULL;
410 __asm__ __volatile__("pushl %0 ; popfl"::"r" (flags));
411 #ifdef DEBUG
412 if (!ok) {
413 printk("removed wait_queue not on list.\n");
414 printk("list = %08x, queue = %08x\n",p,wait);
415 __asm__("call 1f\n1:\tpopl %0":"=r" (ok));
416 printk("eip = %08x\n",ok);
417 }
418 #endif
419 }
420
421 extern inline void select_wait(struct wait_queue ** wait_address, select_table * p)
422 {
423 struct select_table_entry * entry;
424
425 if (!p || !wait_address)
426 return;
427 if (p->nr >= __MAX_SELECT_TABLE_ENTRIES)
428 return;
429 entry = p->entry + p->nr;
430 entry->wait_address = wait_address;
431 entry->wait.task = current;
432 entry->wait.next = NULL;
433 add_wait_queue(wait_address,&entry->wait);
434 p->nr++;
435 }
436
437 static inline unsigned long _get_base(char * addr)
438 {
439 unsigned long __base;
440 __asm__("movb %3,%%dh\n\t"
441 "movb %2,%%dl\n\t"
442 "shll $16,%%edx\n\t"
443 "movw %1,%%dx"
444 :"=&d" (__base)
445 :"m" (*((addr)+2)),
446 "m" (*((addr)+4)),
447 "m" (*((addr)+7)));
448 return __base;
449 }
450
451 #define get_base(ldt) _get_base( ((char *)&(ldt)) )
452
453 static inline unsigned long get_limit(unsigned long segment)
454 {
455 unsigned long __limit;
456 __asm__("lsll %1,%0"
457 :"=r" (__limit):"r" (segment));
458 return __limit+1;
459 }
460
461 #define REMOVE_LINKS(p) \
462 if ((p)->p_osptr) \
463 (p)->p_osptr->p_ysptr = (p)->p_ysptr; \
464 if ((p)->p_ysptr) \
465 (p)->p_ysptr->p_osptr = (p)->p_osptr; \
466 else \
467 (p)->p_pptr->p_cptr = (p)->p_osptr
468
469 #define SET_LINKS(p) \
470 (p)->p_ysptr = NULL; \
471 if (((p)->p_osptr = (p)->p_pptr->p_cptr) != NULL) \
472 (p)->p_osptr->p_ysptr = p; \
473 (p)->p_pptr->p_cptr = p
474
475 #endif