root/include/linux/sched.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


   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];   /* 8*10 bytes for each FP-reg = 80 bytes */
  49 };
  50 
  51 struct tss_struct {
  52         long    back_link;      /* 16 high bits zero */
  53         long    esp0;
  54         long    ss0;            /* 16 high bits zero */
  55         long    esp1;
  56         long    ss1;            /* 16 high bits zero */
  57         long    esp2;
  58         long    ss2;            /* 16 high bits zero */
  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;             /* 16 high bits zero */
  68         long    cs;             /* 16 high bits zero */
  69         long    ss;             /* 16 high bits zero */
  70         long    ds;             /* 16 high bits zero */
  71         long    fs;             /* 16 high bits zero */
  72         long    gs;             /* 16 high bits zero */
  73         long    ldt;            /* 16 high bits zero */
  74         long    trace_bitmap;   /* bits: trace 0, bitmap 16-31 */
  75         struct i387_struct i387;
  76 };
  77 
  78 struct task_struct {
  79 /* these are hardcoded - don't touch */
  80         long state;     /* -1 unrunnable, 0 runnable, >0 stopped */
  81         long counter;
  82         long priority;
  83         long signal;
  84         struct sigaction sigaction[32];
  85         long blocked;   /* bitmap of masked signals */
  86 /* various fields */
  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 /* file system info */
  96         int tty;                /* -1 if no tty, so it must be signed */
  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 /* ldt for this task 0 - zero 1 - cs 2 - ds&ss */
 103         struct desc_struct ldt[3];
 104 /* tss for this task */
 105         struct tss_struct tss;
 106 };
 107 
 108 /*
 109  *  INIT_TASK is used to set up the first task table, touch at
 110  * your own risk!. Base=0, limit=0x9ffff (=640kB)
 111  */
 112 #define INIT_TASK \
 113 /* state etc */ { 0,15,15, \
 114 /* signals */   0,{{},},0, \
 115 /* ec,brk... */ 0,0,0,0,0, \
 116 /* pid etc.. */ 0,-1,0,0,0, \
 117 /* uid etc */   0,0,0,0,0,0, \
 118 /* alarm */     0,0,0,0,0,0, \
 119 /* math */      0, \
 120 /* fs info */   -1,0022,NULL,NULL,0, \
 121 /* filp */      {NULL,}, \
 122         { \
 123                 {0,0}, \
 124 /* ldt */       {0x9f,0xc0fa00}, \
 125                 {0x9f,0xc0f200}, \
 126         }, \
 127 /*tss*/ {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  * Entry into gdt where to find first TSS. 0-nul, 1-cs, 2-ds, 3-syscall
 150  * 4-TSS0, 5-LDT0, 6-TSS1 etc ...
 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  *      switch_to(n) should switch tasks to task nr n, first
 166  * checking that n isn't the current task, in which case it does nothing.
 167  * This also clears the TS-flag if the task we switched to has used
 168  * tha math co-processor latest.
 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

/* [previous][next][first][last][top][bottom][index][help] */