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 long pid,pgrp,session,leader;
164 int groups[NGROUPS];
165
166
167
168
169
170 struct task_struct *p_opptr,*p_pptr, *p_cptr, *p_ysptr, *p_osptr;
171
172
173
174
175 unsigned short uid,euid,suid;
176 unsigned short gid,egid,sgid;
177 unsigned long timeout;
178 unsigned long it_real_value, it_prof_value, it_virt_value;
179 unsigned long it_real_incr, it_prof_incr, it_virt_incr;
180 long utime,stime,cutime,cstime,start_time;
181 unsigned long min_flt, maj_flt;
182 unsigned long cmin_flt, cmaj_flt;
183 struct rlimit rlim[RLIM_NLIMITS];
184 unsigned short used_math;
185 unsigned short rss;
186 char comm[8];
187 struct vm86_struct * vm86_info;
188 unsigned long screen_bitmap;
189
190 int link_count;
191 int tty;
192 unsigned short umask;
193 struct inode * pwd;
194 struct inode * root;
195 struct inode * executable;
196 struct vm_area_struct * mmap;
197 struct {
198 struct inode * library;
199 unsigned long start;
200 unsigned long length;
201 unsigned long bss;
202 } libraries[MAX_SHARED_LIBS];
203 int numlibraries;
204 struct file * filp[NR_OPEN];
205 fd_set close_on_exec;
206
207 struct desc_struct ldt[32];
208
209 struct tss_struct tss;
210 };
211
212
213
214
215 #define PF_ALIGNWARN 0x00000001
216
217 #define PF_PTRACED 0x00000010
218 #define PF_TRACESYS 0x00000020
219
220
221
222
223
224 #define INIT_TASK \
225 { 0,15,15, \
226 0,{{ 0, },},0,0,0, \
227 0, \
228 0,0,0,0,0,0,0,0, \
229 0,0,0,0, \
230 {NOGROUP,}, \
231 &init_task,&init_task,NULL,NULL,NULL, \
232 0,0,0,0,0,0, \
233 0,0,0,0,0,0,0,0,0,0,0,0, \
234 0,0,0,0, \
235 { {0x7fffffff, 0x7fffffff}, {0x7fffffff, 0x7fffffff}, \
236 {0x7fffffff, 0x7fffffff}, {0x7fffffff, 0x7fffffff}, \
237 {0x7fffffff, 0x7fffffff}, {0x7fffffff, 0x7fffffff}}, \
238 0, \
239 2, \
240 "swapper", \
241 NULL, 0, \
242 0,-1,0022,NULL,NULL,NULL,NULL, \
243 { { NULL, 0, 0, 0}, }, 0, \
244 {NULL,}, \
245 {{ 0, }}, \
246 { \
247 {0,0}, \
248 {0x9f,0xc0c0fa00}, \
249 {0x9f,0xc0c0f200}, \
250 }, \
251 {0,sizeof(init_kernel_stack) + (long) &init_kernel_stack, \
252 0x10,0,0,0,0,(long) &swapper_pg_dir,\
253 0,0,0,0,0,0,0,0, \
254 0,0,0x17,0x17,0x17,0x17,0x17,0x17, \
255 _LDT(0),0x80000000,{0xffffffff}, \
256 { { 0, }, } \
257 } \
258 }
259
260 extern struct task_struct *task[NR_TASKS];
261 extern struct task_struct *last_task_used_math;
262 extern struct task_struct *current;
263 extern unsigned long volatile jiffies;
264 extern unsigned long startup_time;
265 extern int jiffies_offset;
266 extern int need_resched;
267 extern int hard_math;
268
269 #define CURRENT_TIME (startup_time+(jiffies+jiffies_offset)/HZ)
270
271 extern void add_timer(long jiffies, void (*fn)(void));
272
273 extern void sleep_on(struct wait_queue ** p);
274 extern void interruptible_sleep_on(struct wait_queue ** p);
275 extern void wake_up(struct wait_queue ** p);
276 extern void wake_up_interruptible(struct wait_queue ** p);
277
278 extern int send_sig(long sig,struct task_struct * p,int priv);
279 extern int in_group_p(gid_t grp);
280
281 extern int request_irq(unsigned int irq,void (*handler)(int));
282 extern void free_irq(unsigned int irq);
283 extern int irqaction(unsigned int irq,struct sigaction * new);
284
285
286
287
288
289 #define FIRST_TSS_ENTRY 4
290 #define FIRST_LDT_ENTRY (FIRST_TSS_ENTRY+1)
291 #define _TSS(n) ((((unsigned long) n)<<4)+(FIRST_TSS_ENTRY<<3))
292 #define _LDT(n) ((((unsigned long) n)<<4)+(FIRST_LDT_ENTRY<<3))
293 #define ltr(n) __asm__("ltr %%ax"::"a" (_TSS(n)))
294 #define lldt(n) __asm__("lldt %%ax"::"a" (_LDT(n)))
295 #define str(n) \
296 __asm__("str %%ax\n\t" \
297 "subl %2,%%eax\n\t" \
298 "shrl $4,%%eax" \
299 :"=a" (n) \
300 :"0" (0),"i" (FIRST_TSS_ENTRY<<3))
301
302
303
304
305
306
307 #define switch_to(n) {\
308 struct {long a,b;} __tmp; \
309 __asm__("cmpl %%ecx,_current\n\t" \
310 "je 1f\n\t" \
311 "movw %%dx,%1\n\t" \
312 "cli\n\t" \
313 "xchgl %%ecx,_current\n\t" \
314 "ljmp %0\n\t" \
315 "sti\n\t" \
316 "cmpl %%ecx,_last_task_used_math\n\t" \
317 "jne 1f\n\t" \
318 "clts\n" \
319 "1:" \
320 ::"m" (*&__tmp.a),"m" (*&__tmp.b), \
321 "d" (_TSS(n)),"c" ((long) task[n]) \
322 :"cx"); \
323 }
324
325 #define PAGE_ALIGN(n) (((n)+0xfff)&0xfffff000)
326
327 #define _set_base(addr,base) \
328 __asm__("movw %%dx,%0\n\t" \
329 "rorl $16,%%edx\n\t" \
330 "movb %%dl,%1\n\t" \
331 "movb %%dh,%2" \
332 ::"m" (*((addr)+2)), \
333 "m" (*((addr)+4)), \
334 "m" (*((addr)+7)), \
335 "d" (base) \
336 :"dx")
337
338 #define _set_limit(addr,limit) \
339 __asm__("movw %%dx,%0\n\t" \
340 "rorl $16,%%edx\n\t" \
341 "movb %1,%%dh\n\t" \
342 "andb $0xf0,%%dh\n\t" \
343 "orb %%dh,%%dl\n\t" \
344 "movb %%dl,%1" \
345 ::"m" (*(addr)), \
346 "m" (*((addr)+6)), \
347 "d" (limit) \
348 :"dx")
349
350 #define set_base(ldt,base) _set_base( ((char *)&(ldt)) , base )
351 #define set_limit(ldt,limit) _set_limit( ((char *)&(ldt)) , (limit-1)>>12 )
352
353
354
355
356
357
358 extern inline void add_wait_queue(struct wait_queue ** p, struct wait_queue * wait)
359 {
360 unsigned long flags;
361
362 #ifdef DEBUG
363 if (wait->next) {
364 unsigned long pc;
365 __asm__ __volatile__("call 1f\n"
366 "1:\tpopl %0":"=r" (pc));
367 printk("add_wait_queue (%08x): wait->next = %08x\n",pc,wait->next);
368 }
369 #endif
370 __asm__ __volatile__("pushfl ; popl %0 ; cli":"=r" (flags));
371 if (!*p) {
372 wait->next = wait;
373 *p = wait;
374 } else {
375 wait->next = (*p)->next;
376 (*p)->next = wait;
377 }
378 __asm__ __volatile__("pushl %0 ; popfl"::"r" (flags));
379 }
380
381 extern inline void remove_wait_queue(struct wait_queue ** p, struct wait_queue * wait)
382 {
383 unsigned long flags;
384 struct wait_queue * tmp;
385 #ifdef DEBUG
386 unsigned long ok = 0;
387 #endif
388
389 __asm__ __volatile__("pushfl ; popl %0 ; cli":"=r" (flags));
390 if ((*p == wait) &&
391 #ifdef DEBUG
392 (ok = 1) &&
393 #endif
394 ((*p = wait->next) == wait)) {
395 *p = NULL;
396 } else {
397 tmp = wait;
398 while (tmp->next != wait) {
399 tmp = tmp->next;
400 #ifdef DEBUG
401 if (tmp == *p)
402 ok = 1;
403 #endif
404 }
405 tmp->next = wait->next;
406 }
407 wait->next = NULL;
408 __asm__ __volatile__("pushl %0 ; popfl"::"r" (flags));
409 #ifdef DEBUG
410 if (!ok) {
411 printk("removed wait_queue not on list.\n");
412 printk("list = %08x, queue = %08x\n",p,wait);
413 __asm__("call 1f\n1:\tpopl %0":"=r" (ok));
414 printk("eip = %08x\n",ok);
415 }
416 #endif
417 }
418
419 extern inline void select_wait(struct wait_queue ** wait_address, select_table * p)
420 {
421 struct select_table_entry * entry;
422
423 if (!p || !wait_address)
424 return;
425 if (p->nr >= __MAX_SELECT_TABLE_ENTRIES)
426 return;
427 entry = p->entry + p->nr;
428 entry->wait_address = wait_address;
429 entry->wait.task = current;
430 entry->wait.next = NULL;
431 add_wait_queue(wait_address,&entry->wait);
432 p->nr++;
433 }
434
435 static inline unsigned long _get_base(char * addr)
436 {
437 unsigned long __base;
438 __asm__("movb %3,%%dh\n\t"
439 "movb %2,%%dl\n\t"
440 "shll $16,%%edx\n\t"
441 "movw %1,%%dx"
442 :"=&d" (__base)
443 :"m" (*((addr)+2)),
444 "m" (*((addr)+4)),
445 "m" (*((addr)+7)));
446 return __base;
447 }
448
449 #define get_base(ldt) _get_base( ((char *)&(ldt)) )
450
451 static inline unsigned long get_limit(unsigned long segment)
452 {
453 unsigned long __limit;
454 __asm__("lsll %1,%0"
455 :"=r" (__limit):"r" (segment));
456 return __limit+1;
457 }
458
459 #define REMOVE_LINKS(p) \
460 if ((p)->p_osptr) \
461 (p)->p_osptr->p_ysptr = (p)->p_ysptr; \
462 if ((p)->p_ysptr) \
463 (p)->p_ysptr->p_osptr = (p)->p_osptr; \
464 else \
465 (p)->p_pptr->p_cptr = (p)->p_osptr
466
467 #define SET_LINKS(p) \
468 (p)->p_ysptr = NULL; \
469 if (((p)->p_osptr = (p)->p_pptr->p_cptr) != NULL) \
470 (p)->p_osptr->p_ysptr = p; \
471 (p)->p_pptr->p_cptr = p
472
473 #endif