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