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

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