Annotation of MiNT/src/proc.h, revision 1.1

1.1     ! root        1: /*
        !             2: 
        !             3: Copyright 1990,1991,1992 Eric R. Smith. All rights reserved.
        !             4: 
        !             5: */
        !             6: 
        !             7: 
        !             8: 
        !             9: /* proc.h: defines for various process related things */
        !            10: 
        !            11: #ifndef _proc_h
        !            12: 
        !            13: #define _proc_h
        !            14: 
        !            15: 
        !            16: 
        !            17: #include "file.h"
        !            18: 
        !            19: 
        !            20: 
        !            21: /* a process context consists, for now, of its registers */
        !            22: 
        !            23: 
        !            24: 
        !            25: typedef struct _context {
        !            26: 
        !            27:        long    regs[15];       /* registers d0-d7, a0-a6 */
        !            28: 
        !            29:        long    usp;            /* user stack pointer (a7) */
        !            30: 
        !            31:        short   sr;             /* status register */
        !            32: 
        !            33:        long    pc;             /* program counter */
        !            34: 
        !            35:        long    ssp;            /* supervisor stack pointer */
        !            36: 
        !            37:        long    term_vec;       /* GEMDOS terminate vector (0x102) */
        !            38: 
        !            39: /*
        !            40: 
        !            41:  * AGK: if running on a TT and the user is playing with the FPU then we
        !            42: 
        !            43:  * must save and restore the context. We should also consider this for
        !            44: 
        !            45:  * I/O based co-processors, although this may be difficult due to
        !            46: 
        !            47:  * possibility of a context switch in the middle of an I/O handshaking
        !            48: 
        !            49:  * exchange.
        !            50: 
        !            51:  */
        !            52: 
        !            53:        char    fstate[216];    /* FPU internal state */
        !            54: 
        !            55:        char    fregs[12*8];    /* registers fp0-fp7 */
        !            56: 
        !            57:        long    fctrl[3];               /* FPCR/FPSR/FPIAR */
        !            58: 
        !            59: /*
        !            60: 
        !            61:  * AGK: for long (time-wise) co-processor instructions (FMUL etc.), the
        !            62: 
        !            63:  * FPU returns NULL, come-again with interrupts allowed primitives. It
        !            64: 
        !            65:  * is highly likely that a context switch will occur in one of these if
        !            66: 
        !            67:  * running a mathematically intensive application, hence we must handle
        !            68: 
        !            69:  * the mid-instruction interrupt stack. We do this by saving the extra
        !            70: 
        !            71:  * 3 long words and the stack format word here.
        !            72: 
        !            73:  */
        !            74: 
        !            75:        short   sfmt;                   /* stack frame format identifier */
        !            76: 
        !            77:        long    iar;                    /* instruction address */
        !            78: 
        !            79:        short   internal[4];    /* four words of internal info */
        !            80: 
        !            81: } CONTEXT;
        !            82: 
        !            83: 
        !            84: 
        !            85: #define PROC_CTXTS     2
        !            86: 
        !            87: #define SYSCALL                0       /* saved context from system call       */
        !            88: 
        !            89: #define CURRENT                1       /* current saved context                */
        !            90: 
        !            91: 
        !            92: 
        !            93: /*
        !            94: 
        !            95:  * Timeout events are stored in a list; the "when" field in the event
        !            96: 
        !            97:  * specifies the number of milliseconds *after* the last entry in the
        !            98: 
        !            99:  * list that the timeout should occur, so routines that manipulate
        !           100: 
        !           101:  * the list only need to check the first entry.
        !           102: 
        !           103:  */
        !           104: 
        !           105: 
        !           106: 
        !           107: typedef struct timeout {
        !           108: 
        !           109:        struct timeout *next;
        !           110: 
        !           111:        struct proc     *proc;
        !           112: 
        !           113:        long    when;
        !           114: 
        !           115:        void    (*func) P_((struct proc *)); /* function to call at timeout */
        !           116: 
        !           117: } TIMEOUT;
        !           118: 
        !           119: 
        !           120: 
        !           121: extern TIMEOUT *tlist;
        !           122: 
        !           123: 
        !           124: 
        !           125: #define NUM_REGIONS    64      /* max. number of memory regions for a proc */
        !           126: 
        !           127: #define MIN_HANDLE     (-5)    /* minimum handle number                */
        !           128: 
        !           129: #define MIN_OPEN       6       /* 0..MIN_OPEN-1 are reserved for system */
        !           130: 
        !           131: #define MAX_OPEN       32      /* max. number of open files for a proc */
        !           132: 
        !           133: #define SSTKSIZE       8000    /* size of supervisor stack (in bytes)  */
        !           134: 
        !           135: #define ISTKSIZE       2000    /* size of interrupt stack (in bytes)   */
        !           136: 
        !           137: #define STKSIZE                (ISTKSIZE + SSTKSIZE)
        !           138: 
        !           139: 
        !           140: 
        !           141: #define FRAME_MAGIC    0xf4a3e000
        !           142: 
        !           143:                                /* magic for signal call stack */
        !           144: 
        !           145: #define CTXT_MAGIC     0xabcdef98
        !           146: 
        !           147: #define CTXT2_MAGIC    0x87654321
        !           148: 
        !           149:                                /* magic #'s for contexts */
        !           150: 
        !           151: 
        !           152: 
        !           153: #define PNAMSIZ                8       /* no. of characters in a process name */
        !           154: 
        !           155: 
        !           156: 
        !           157: #define DOM_TOS                0       /* TOS process domain */
        !           158: 
        !           159: #define DOM_MINT       1       /* MiNT process domain */
        !           160: 
        !           161: 
        !           162: 
        !           163: typedef struct proc {
        !           164: 
        !           165: /* this is stuff that the public can know about */
        !           166: 
        !           167: /* NOTE: some assembly code (in intr.s and contxt.s) makes
        !           168: 
        !           169:  * assumptions about the offsets of sysstack, ctxt[0], systime,
        !           170: 
        !           171:  * and usrtime.
        !           172: 
        !           173:  */
        !           174: 
        !           175:        long    sysstack;               /* must be first                */
        !           176: 
        !           177:        CONTEXT ctxt[PROC_CTXTS];       /* must be second               */
        !           178: 
        !           179: 
        !           180: 
        !           181:        long    magic;                  /* validation for proc struct   */
        !           182: 
        !           183: 
        !           184: 
        !           185:        BASEPAGE *base;                 /* process base page            */
        !           186: 
        !           187:        short   pid, ppid, pgrp;
        !           188: 
        !           189:        short   ruid;                   /* process real user id         */
        !           190: 
        !           191:        short   rgid;                   /* process real group id        */
        !           192: 
        !           193:        short   euid, egid;             /* effective user and group ids */
        !           194: 
        !           195: 
        !           196: 
        !           197:        ushort  memflags;               /* e.g. malloc from alternate ram */
        !           198: 
        !           199:        short   pri;                    /* base process priority        */
        !           200: 
        !           201:        short   wait_q;                 /* current process queue        */
        !           202: 
        !           203: 
        !           204: 
        !           205: /* note: wait_cond should be unique for each kind of condition we might
        !           206: 
        !           207:  * want to wait for. Put a define below, or use an address in the
        !           208: 
        !           209:  * kernel as the wait condition to ensure uniqueness.
        !           210: 
        !           211:  */
        !           212: 
        !           213:        long    wait_cond;              /* condition we're waiting on   */
        !           214: 
        !           215:                                        /* (also return code from wait) */
        !           216: 
        !           217: 
        !           218: 
        !           219: #define WAIT_MB                0x3a140001L     /* wait_cond for p_msg call     */
        !           220: 
        !           221: #define WAIT_SEMA      0x3a140003L     /* wait_cond for p_semaphore    */
        !           222: 
        !           223: 
        !           224: 
        !           225:        /* (all times are in milliseconds) */
        !           226: 
        !           227:        ulong   systime;                /* time spent in kernel         */
        !           228: 
        !           229:        ulong   usrtime;                /* time spent out of kernel     */
        !           230: 
        !           231:        ulong   chldstime;              /* children's kernel time       */
        !           232: 
        !           233:        ulong   chldutime;              /* children's user time         */
        !           234: 
        !           235: 
        !           236: 
        !           237:        ulong   maxmem;                 /* max. amount of memory to use */
        !           238: 
        !           239:        ulong   maxdata;                /* max. data region for process */
        !           240: 
        !           241:        ulong   maxcore;                /* max. core memory for process */
        !           242: 
        !           243:        ulong   maxcpu;                 /* max. cpu time to use         */
        !           244: 
        !           245: 
        !           246: 
        !           247:        short   domain;                 /* process domain (TOS or UNIX) */
        !           248: 
        !           249: 
        !           250: 
        !           251:        short   curpri;                 /* current process priority     */
        !           252: 
        !           253: #define MIN_NICE -20
        !           254: 
        !           255: #define MAX_NICE 20
        !           256: 
        !           257: 
        !           258: 
        !           259: /* EVERYTHING BELOW THIS LINE IS SUBJECT TO CHANGE:
        !           260: 
        !           261:  * programs should *not* try to read this stuff via the U:\PROC dir.
        !           262: 
        !           263:  */
        !           264: 
        !           265: 
        !           266: 
        !           267:        char    name[PNAMSIZ+1];        /* process name                 */
        !           268: 
        !           269:        TIMEOUT *alarmtim;              /* alarm() event                */
        !           270: 
        !           271:        short   slices;                 /* number of time slices before this
        !           272: 
        !           273:                                           process gets to run again */
        !           274: 
        !           275: 
        !           276: 
        !           277:        short   bconmap;                /* Bconmap mapping              */
        !           278: 
        !           279:        FILEPTR *midiout;               /* MIDI output                  */
        !           280: 
        !           281:        FILEPTR *midiin;                /* MIDI input                   */
        !           282: 
        !           283:        FILEPTR *prn;                   /* printer                      */
        !           284: 
        !           285:        FILEPTR *aux;                   /* auxiliary tty                */
        !           286: 
        !           287:        FILEPTR *control;               /* control tty                  */
        !           288: 
        !           289:        FILEPTR *handle[MAX_OPEN];      /* file handles                 */
        !           290: 
        !           291: 
        !           292: 
        !           293:        uchar   fdflags[MAX_OPEN];      /* file descriptor flags        */
        !           294: 
        !           295: 
        !           296: 
        !           297:        ushort  num_reg;                /* number of memory regions allocated */
        !           298: 
        !           299:        MEMREGION **mem;                /* allocated memory regions     */
        !           300: 
        !           301:        virtaddr *addr;                 /* addresses of regions         */
        !           302: 
        !           303: 
        !           304: 
        !           305:        ulong   sigpending;             /* pending signals              */
        !           306: 
        !           307:        ulong   sigmask;                /* signals that are masked      */
        !           308: 
        !           309:        ulong   sighandle[NSIG];        /* signal handlers              */
        !           310: 
        !           311:        ushort  sigflags[NSIG];         /* signal flags                 */
        !           312: 
        !           313:        ulong   sigextra[NSIG];         /* additional signals to be masked
        !           314: 
        !           315:                                           on delivery  */
        !           316: 
        !           317:        char    *mb_ptr;                /* p_msg buffer ptr             */
        !           318: 
        !           319:        long    mb_long1, mb_long2;     /* p_msg storage                */
        !           320: 
        !           321:        long    mb_mbid;                /* p_msg id being waited for    */
        !           322: 
        !           323:        short   mb_mode;                /* p_msg mode being waiting in  */
        !           324: 
        !           325:        short   mb_writer;              /* p_msg pid of writer of msg   */
        !           326: 
        !           327: 
        !           328: 
        !           329:        short   curdrv;                 /* current drive                */
        !           330: 
        !           331:        fcookie root[NUM_DRIVES];       /* root directories             */
        !           332: 
        !           333:        fcookie curdir[NUM_DRIVES];     /* current directory            */
        !           334: 
        !           335: 
        !           336: 
        !           337:        long    usrdata;                /* user-supplied data           */
        !           338: 
        !           339:        ushort  umask;                  /* file creation mask           */
        !           340: 
        !           341: 
        !           342: 
        !           343:        DTABUF  *dta;                   /* current DTA                  */
        !           344: 
        !           345: #define NUM_SEARCH     6               /* max. number of searches      */
        !           346: 
        !           347:        DTABUF *srchdta[NUM_SEARCH];    /* for Fsfirst/next             */
        !           348: 
        !           349:        DIR     srchdir[NUM_SEARCH];    /* for Fsfirst/next             */
        !           350: 
        !           351:        long    srchtim[NUM_SEARCH];    /* for Fsfirst/next             */
        !           352: 
        !           353:        
        !           354: 
        !           355:        long    txtsize;                /* size of text region (for fork()) */
        !           356: 
        !           357: 
        !           358: 
        !           359:        long    (*criticerr) P_((long)); /* critical error handler      */
        !           360: 
        !           361:        void    *logbase;               /* logical screen base          */
        !           362: 
        !           363: 
        !           364: 
        !           365:        short   starttime;              /* time and date when process   */
        !           366: 
        !           367:        short   startdate;              /* was started                  */
        !           368: 
        !           369: 
        !           370: 
        !           371:        struct  proc *q_next;           /* next process on queue        */
        !           372: 
        !           373:        struct  proc *gl_next;          /* next process in system       */
        !           374: 
        !           375:        char    stack[STKSIZE+4];       /* stack for system calls       */
        !           376: 
        !           377: } PROC;
        !           378: 
        !           379: 
        !           380: 
        !           381: 
        !           382: 
        !           383: /* different process queues */
        !           384: 
        !           385: 
        !           386: 
        !           387: #define CURPROC_Q      0
        !           388: 
        !           389: #define READY_Q                1
        !           390: 
        !           391: #define WAIT_Q         2
        !           392: 
        !           393: #define IO_Q           3
        !           394: 
        !           395: #define ZOMBIE_Q       4
        !           396: 
        !           397: #define TSR_Q          5
        !           398: 
        !           399: #define STOP_Q         6
        !           400: 
        !           401: #define SELECT_Q       7
        !           402: 
        !           403: 
        !           404: 
        !           405: #define NUM_QUEUES     8
        !           406: 
        !           407: 
        !           408: 
        !           409: extern PROC *proclist;                 /* list of all active processes */
        !           410: 
        !           411: extern PROC *curproc;                  /* current process              */
        !           412: 
        !           413: extern PROC *rootproc;                 /* pid 0 -- MiNT itself         */
        !           414: 
        !           415: extern PROC *sys_q[NUM_QUEUES];                /* process queues               */
        !           416: 
        !           417: 
        !           418: 
        !           419: #endif /* _proc_h */
        !           420: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.