1 #ifndef _SCHED_H
2 #define _SCHED_H
3
4 #define NR_TASKS 64
5 #define HZ 100
6
7 #define FIRST_TASK task[0]
8 #define LAST_TASK task[NR_TASKS-1]
9
10 #include <linux/head.h>
11 #include <linux/fs.h>
12 #include <linux/mm.h>
13
14 #if (NR_OPEN > 32)
15 #error "Currently the close-on-exec-flags are in one word, max 32 files/proc"
16 #endif
17
18 #define TASK_RUNNING 0
19 #define TASK_INTERRUPTIBLE 1
20 #define TASK_UNINTERRUPTIBLE 2
21 #define TASK_ZOMBIE 3
22 #define TASK_STOPPED 4
23
24 #ifndef NULL
25 #define NULL ((void *) 0)
26 #endif
27
28 extern int copy_page_tables(unsigned long from, unsigned long to, long size);
29 extern int free_page_tables(unsigned long from, long size);
30
31 extern void sched_init(void);
32 extern void schedule(void);
33 extern void trap_init(void);
34 extern void panic(const char * str);
35 extern int tty_write(unsigned minor,char * buf,int count);
36
37 typedef int (*fn_ptr)();
38
39 struct i387_struct {
40 long cwd;
41 long swd;
42 long twd;
43 long fip;
44 long fcs;
45 long foo;
46 long fos;
47 long st_space[20];
48 };
49
50 struct tss_struct {
51 long back_link;
52 long esp0;
53 long ss0;
54 long esp1;
55 long ss1;
56 long esp2;
57 long ss2;
58 long cr3;
59 long eip;
60 long eflags;
61 long eax,ecx,edx,ebx;
62 long esp;
63 long ebp;
64 long esi;
65 long edi;
66 long es;
67 long cs;
68 long ss;
69 long ds;
70 long fs;
71 long gs;
72 long ldt;
73 long trace_bitmap;
74 struct i387_struct i387;
75 };
76
77 struct task_struct {
78
79 long state;
80 long counter;
81 long priority;
82 long signal;
83 fn_ptr sig_restorer;
84 fn_ptr sig_fn[32];
85
86 int exit_code;
87 unsigned long end_code,end_data,brk,start_stack;
88 long pid,father,pgrp,session,leader;
89 unsigned short uid,euid,suid;
90 unsigned short gid,egid,sgid;
91 long alarm;
92 long utime,stime,cutime,cstime,start_time;
93 unsigned short used_math;
94
95 int tty;
96 unsigned short umask;
97 struct m_inode * pwd;
98 struct m_inode * root;
99 unsigned long close_on_exec;
100 struct file * filp[NR_OPEN];
101
102 struct desc_struct ldt[3];
103
104 struct tss_struct tss;
105 };
106
107
108
109
110
111 #define INIT_TASK \
112 { 0,15,15, \
113 0,NULL,{(fn_ptr) 0,}, \
114 0,0,0,0,0, \
115 0,-1,0,0,0, \
116 0,0,0,0,0,0, \
117 0,0,0,0,0,0, \
118 0, \
119 -1,0133,NULL,NULL,0, \
120 {NULL,}, \
121 { \
122 {0,0}, \
123 {0x9f,0xc0fa00}, \
124 {0x9f,0xc0f200}, \
125 }, \
126 {0,PAGE_SIZE+(long)&init_task,0x10,0,0,0,0,(long)&pg_dir,\
127 0,0,0,0,0,0,0,0, \
128 0,0,0x17,0x17,0x17,0x17,0x17,0x17, \
129 _LDT(0),0x80000000, \
130 {} \
131 }, \
132 }
133
134 extern struct task_struct *task[NR_TASKS];
135 extern struct task_struct *last_task_used_math;
136 extern struct task_struct *current;
137 extern long volatile jiffies;
138 extern long startup_time;
139
140 #define CURRENT_TIME (startup_time+jiffies/HZ)
141
142 extern void sleep_on(struct task_struct ** p);
143 extern void interruptible_sleep_on(struct task_struct ** p);
144 extern void wake_up(struct task_struct ** p);
145
146
147
148
149
150 #define FIRST_TSS_ENTRY 4
151 #define FIRST_LDT_ENTRY (FIRST_TSS_ENTRY+1)
152 #define _TSS(n) ((((unsigned long) n)<<4)+(FIRST_TSS_ENTRY<<3))
153 #define _LDT(n) ((((unsigned long) n)<<4)+(FIRST_LDT_ENTRY<<3))
154 #define ltr(n) __asm__("ltr %%ax"::"a" (_TSS(n)))
155 #define lldt(n) __asm__("lldt %%ax"::"a" (_LDT(n)))
156 #define str(n) \
157 __asm__("str %%ax\n\t" \
158 "subl %2,%%eax\n\t" \
159 "shrl $4,%%eax" \
160 :"=a" (n) \
161 :"a" (0),"i" (FIRST_TSS_ENTRY<<3))
162
163
164
165
166
167
168 #define switch_to(n) {\
169 struct {long a,b;} __tmp; \
170 __asm__("cmpl %%ecx,_current\n\t" \
171 "je 1f\n\t" \
172 "xchgl %%ecx,_current\n\t" \
173 "movw %%dx,%1\n\t" \
174 "ljmp %0\n\t" \
175 "cmpl %%ecx,%2\n\t" \
176 "jne 1f\n\t" \
177 "clts\n" \
178 "1:" \
179 ::"m" (*&__tmp.a),"m" (*&__tmp.b), \
180 "m" (last_task_used_math),"d" _TSS(n),"c" ((long) task[n])); \
181 }
182
183 #define PAGE_ALIGN(n) (((n)+0xfff)&0xfffff000)
184
185 #define _set_base(addr,base) \
186 __asm__("movw %%dx,%0\n\t" \
187 "rorl $16,%%edx\n\t" \
188 "movb %%dl,%1\n\t" \
189 "movb %%dh,%2" \
190 ::"m" (*((addr)+2)), \
191 "m" (*((addr)+4)), \
192 "m" (*((addr)+7)), \
193 "d" (base) \
194 :"dx")
195
196 #define _set_limit(addr,limit) \
197 __asm__("movw %%dx,%0\n\t" \
198 "rorl $16,%%edx\n\t" \
199 "movb %1,%%dh\n\t" \
200 "andb $0xf0,%%dh\n\t" \
201 "orb %%dh,%%dl\n\t" \
202 "movb %%dl,%1" \
203 ::"m" (*(addr)), \
204 "m" (*((addr)+6)), \
205 "d" (limit) \
206 :"dx")
207
208 #define set_base(ldt,base) _set_base( ((char *)&(ldt)) , base )
209 #define set_limit(ldt,limit) _set_limit( ((char *)&(ldt)) , (limit-1)>>12 )
210
211 #define _get_base(addr) ({\
212 unsigned long __base; \
213 __asm__("movb %3,%%dh\n\t" \
214 "movb %2,%%dl\n\t" \
215 "shll $16,%%edx\n\t" \
216 "movw %1,%%dx" \
217 :"=d" (__base) \
218 :"m" (*((addr)+2)), \
219 "m" (*((addr)+4)), \
220 "m" (*((addr)+7))); \
221 __base;})
222
223 #define get_base(ldt) _get_base( ((char *)&(ldt)) )
224
225 #define get_limit(segment) ({ \
226 unsigned long __limit; \
227 __asm__("lsll %1,%0\n\tincl %0":"=r" (__limit):"r" (segment)); \
228 __limit;})
229
230 #endif