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 #include <linux/tasks.h>
16
17
18
19
20
21 #define TASK_SIZE 0xc0000000
22
23
24
25
26 #define IO_BITMAP_SIZE 32
27
28
29
30
31
32
33
34
35
36
37
38 extern unsigned long avenrun[];
39
40 #define FSHIFT 11
41 #define FIXED_1 (1<<FSHIFT)
42 #define LOAD_FREQ (5*HZ)
43 #define EXP_1 1884
44 #define EXP_5 2014
45 #define EXP_15 2037
46
47 #define CALC_LOAD(load,exp,n) \
48 load *= exp; \
49 load += n*(FIXED_1-exp); \
50 load >>= FSHIFT;
51
52 #define CT_TO_SECS(x) ((x) / HZ)
53 #define CT_TO_USECS(x) (((x) % HZ) * 1000000/HZ)
54
55 #define FIRST_TASK task[0]
56 #define LAST_TASK task[NR_TASKS-1]
57
58 #include <linux/head.h>
59 #include <linux/fs.h>
60 #include <linux/mm.h>
61 #include <linux/signal.h>
62 #include <linux/time.h>
63 #include <linux/param.h>
64 #include <linux/resource.h>
65 #include <linux/vm86.h>
66 #include <linux/math_emu.h>
67
68 #define TASK_RUNNING 0
69 #define TASK_INTERRUPTIBLE 1
70 #define TASK_UNINTERRUPTIBLE 2
71 #define TASK_ZOMBIE 3
72 #define TASK_STOPPED 4
73 #define TASK_SWAPPING 5
74
75 #ifndef NULL
76 #define NULL ((void *) 0)
77 #endif
78
79 #define MAX_SHARED_LIBS 16
80
81 extern void sched_init(void);
82 extern void show_state(void);
83 extern void schedule(void);
84 extern void trap_init(void);
85 extern void panic(const char * str);
86
87 typedef int (*fn_ptr)();
88
89 union i387_union {
90 struct i387_hard_struct {
91 long cwd;
92 long swd;
93 long twd;
94 long fip;
95 long fcs;
96 long foo;
97 long fos;
98 long st_space[20];
99 } hard;
100 struct i387_soft_struct {
101 long cwd;
102 long swd;
103 long twd;
104 long fip;
105 long fcs;
106 long foo;
107 long fos;
108 long top;
109 struct fpu_reg regs[8];
110 unsigned char lookahead;
111 struct info *info;
112 unsigned long entry_eip;
113 } soft;
114 };
115
116 struct tss_struct {
117 unsigned long back_link;
118 unsigned long esp0;
119 unsigned long ss0;
120 unsigned long esp1;
121 unsigned long ss1;
122 unsigned long esp2;
123 unsigned long ss2;
124 unsigned long cr3;
125 unsigned long eip;
126 unsigned long eflags;
127 unsigned long eax,ecx,edx,ebx;
128 unsigned long esp;
129 unsigned long ebp;
130 unsigned long esi;
131 unsigned long edi;
132 unsigned long es;
133 unsigned long cs;
134 unsigned long ss;
135 unsigned long ds;
136 unsigned long fs;
137 unsigned long gs;
138 unsigned long ldt;
139 unsigned long trace_bitmap;
140 unsigned long io_bitmap[IO_BITMAP_SIZE];
141 union i387_union i387;
142 };
143
144 struct task_struct {
145
146 long state;
147 long counter;
148 long priority;
149 long signal;
150 struct sigaction sigaction[32];
151 long blocked;
152 unsigned long saved_kernel_stack;
153 unsigned long kernel_stack_page;
154 unsigned int flags;
155
156 int exit_code;
157 int dumpable:1;
158 int swappable:1;
159 unsigned long start_code,end_code,end_data,brk,start_stack;
160 unsigned long arg_start, arg_end, env_start, env_end;
161 long pid,pgrp,session,leader;
162 int groups[NGROUPS];
163
164
165
166
167
168 struct task_struct *p_opptr,*p_pptr, *p_cptr, *p_ysptr, *p_osptr;
169
170
171
172
173 unsigned short uid,euid,suid;
174 unsigned short gid,egid,sgid;
175 unsigned long timeout;
176 unsigned long it_real_value, it_prof_value, it_virt_value;
177 unsigned long it_real_incr, it_prof_incr, it_virt_incr;
178 long utime,stime,cutime,cstime,start_time;
179 unsigned long min_flt, maj_flt;
180 unsigned long cmin_flt, cmaj_flt;
181 struct rlimit rlim[RLIM_NLIMITS];
182 unsigned short used_math;
183 unsigned short rss;
184 char comm[16];
185 struct vm86_struct * vm86_info;
186 unsigned long screen_bitmap;
187
188 int link_count;
189 int tty;
190 unsigned short umask;
191 struct inode * pwd;
192 struct inode * root;
193 struct inode * executable;
194 struct vm_area_struct * mmap;
195 struct {
196 struct inode * library;
197 unsigned long start;
198 unsigned long length;
199 unsigned long bss;
200 } libraries[MAX_SHARED_LIBS];
201 int numlibraries;
202 struct file * filp[NR_OPEN];
203 fd_set close_on_exec;
204
205 struct desc_struct ldt[32];
206
207 struct tss_struct tss;
208 };
209
210
211
212
213 #define PF_ALIGNWARN 0x00000001
214
215 #define PF_PTRACED 0x00000010
216 #define PF_TRACESYS 0x00000020
217
218
219
220
221
222 #define INIT_TASK \
223 { 0,15,15, \
224 0,{{ 0, },},0,0,0, \
225 0, \
226 0,0,0,0,0,0,0,0, \
227 0,0,0,0, \
228 0,0,0,0, \
229 {NOGROUP,}, \
230 &init_task,&init_task,NULL,NULL,NULL, \
231 0,0,0,0,0,0, \
232 0,0,0,0,0,0,0,0,0,0,0,0, \
233 0,0,0,0, \
234 { {0x7fffffff, 0x7fffffff}, {0x7fffffff, 0x7fffffff}, \
235 {0x7fffffff, 0x7fffffff}, {0x7fffffff, 0x7fffffff}, \
236 {0x7fffffff, 0x7fffffff}, {0x7fffffff, 0x7fffffff}}, \
237 0, \
238 2, \
239 "swapper", \
240 NULL, 0, \
241 0,-1,0022,NULL,NULL,NULL,NULL, \
242 { { NULL, 0, 0, 0}, }, 0, \
243 {NULL,}, \
244 {{ 0, }}, \
245 { \
246 {0,0}, \
247 {0x1ff,0xc0c0fa00}, \
248 {0x1ff,0xc0c0f200}, \
249 }, \
250 {0,sizeof(init_kernel_stack) + (long) &init_kernel_stack, \
251 0x10,0,0,0,0,(long) &swapper_pg_dir,\
252 0,0,0,0,0,0,0,0, \
253 0,0,0x17,0x17,0x17,0x17,0x17,0x17, \
254 _LDT(0),0x80000000,{0xffffffff}, \
255 { { 0, }, } \
256 } \
257 }
258
259 extern struct task_struct *task[NR_TASKS];
260 extern struct task_struct *last_task_used_math;
261 extern struct task_struct *current;
262 extern unsigned long volatile jiffies;
263 extern unsigned long startup_time;
264 extern int jiffies_offset;
265 extern int need_resched;
266 extern int hard_math;
267 extern int ignore_irq13;
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 load_TR(n) __asm__("ltr %%ax"::"a" (_TSS(n)))
294 #define load_ldt(n) __asm__("lldt %%ax"::"a" (_LDT(n)))
295 #define store_TR(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