portdat.h - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       portdat.h (21802B)
       ---
            1 // Plan 9 VX
            2 struct vxseg;
            3 struct vxproc;
            4 
            5 typedef struct Alarms        Alarms;
            6 typedef struct Block        Block;
            7 typedef struct Chan        Chan;
            8 typedef struct Cmdbuf        Cmdbuf;
            9 typedef struct Cmdtab        Cmdtab;
           10 typedef struct Dev        Dev;
           11 typedef struct Dirtab        Dirtab;
           12 typedef struct Edf        Edf;
           13 typedef struct Egrp        Egrp;
           14 typedef struct Evalue        Evalue;
           15 typedef struct Fgrp        Fgrp;
           16 typedef struct DevConf        DevConf;
           17 typedef struct Image        Image;
           18 typedef struct Log        Log;
           19 typedef struct Logflag        Logflag;
           20 typedef struct Mntcache Mntcache;
           21 typedef struct Mount        Mount;
           22 typedef struct Mntrpc        Mntrpc;
           23 typedef struct Mntwalk        Mntwalk;
           24 typedef struct Mnt        Mnt;
           25 typedef struct Mhead        Mhead;
           26 typedef struct Note        Note;
           27 typedef struct Path        Path;
           28 typedef struct Palloc        Palloc;
           29 typedef struct Pallocmem        Pallocmem;
           30 typedef struct Perf        Perf;
           31 typedef struct PhysUart        PhysUart;
           32 typedef struct Pgrp        Pgrp;
           33 typedef struct Physseg        Physseg;
           34 typedef struct Pte        Pte;
           35 typedef struct QLock        QLock;
           36 typedef struct Queue        Queue;
           37 typedef struct Ref        Ref;
           38 typedef struct Rendez        Rendez;
           39 typedef struct Rgrp        Rgrp;
           40 typedef struct RWlock        RWlock;
           41 typedef struct Sargs        Sargs;
           42 typedef struct Schedq        Schedq;
           43 typedef struct Segment        Segment;
           44 typedef struct Sema        Sema;
           45 typedef struct Timer        Timer;
           46 typedef struct Timers        Timers;
           47 typedef struct Uart        Uart;
           48 typedef struct Waitq        Waitq;
           49 typedef struct Walkqid        Walkqid;
           50 typedef struct Watchdog        Watchdog;
           51 typedef int    Devgen(Chan*, char*, Dirtab*, int, int, Dir*);
           52 
           53 
           54 #include "fcall.h"
           55 
           56 struct Ref
           57 {
           58         Lock lk;
           59         long        ref;
           60 };
           61 
           62 struct Rendez
           63 {
           64         Lock lk;
           65         Proc        *p;
           66 };
           67 
           68 struct QLock
           69 {
           70         Lock        use;                /* to access Qlock structure */
           71         Proc        *head;                /* next process waiting for object */
           72         Proc        *tail;                /* last process waiting for object */
           73         int        locked;                /* flag */
           74 };
           75 
           76 struct RWlock
           77 {
           78         Lock        use;
           79         Proc        *head;                /* list of waiting processes */
           80         Proc        *tail;
           81         ulong        wpc;                /* pc of writer */
           82         Proc        *wproc;                /* writing proc */
           83         int        readers;        /* number of readers */
           84         int        writer;                /* number of writers */
           85 };
           86 
           87 struct Alarms
           88 {
           89         QLock lk;
           90         Proc        *head;
           91 };
           92 
           93 struct Sargs
           94 {
           95         uint32        args[MAXSYSARG];
           96 };
           97 
           98 /*
           99  * Access types in namec & channel flags
          100  */
          101 enum
          102 {
          103         Aaccess,                        /* as in stat, wstat */
          104         Abind,                                /* for left-hand-side of bind */
          105         Atodir,                                /* as in chdir */
          106         Aopen,                                /* for i/o */
          107         Amount,                                /* to be mounted or mounted upon */
          108         Acreate,                        /* is to be created */
          109         Aremove,                        /* will be removed by caller */
          110 
          111         COPEN        = 0x0001,                /* for i/o */
          112         CMSG        = 0x0002,                /* the message channel for a mount */
          113         CCEXEC        = 0x0008,                /* close on exec */
          114         CFREE        = 0x0010,                /* not in use */
          115         CRCLOSE        = 0x0020,                /* remove on close */
          116         CCACHE        = 0x0080,                /* client cache */
          117 };
          118 
          119 /* flag values */
          120 enum
          121 {
          122         BINTR        =        (1<<0),
          123         BFREE        =        (1<<1),
          124         Bipck        =        (1<<2),                /* ip checksum */
          125         Budpck        =        (1<<3),                /* udp checksum */
          126         Btcpck        =        (1<<4),                /* tcp checksum */
          127         Bpktck        =        (1<<5),                /* packet checksum */
          128 };
          129 
          130 struct Block
          131 {
          132         long        ref;
          133         Block*        next;
          134         Block*        list;
          135         uchar*        rp;                        /* first unconsumed byte */
          136         uchar*        wp;                        /* first empty byte */
          137         uchar*        lim;                        /* 1 past the end of the buffer */
          138         uchar*        base;                        /* start of the buffer */
          139         void        (*free)(Block*);
          140         ushort        flag;
          141         ushort        checksum;                /* IP checksum of complete packet (minus media header) */
          142 };
          143 
          144 #define BLEN(s)        ((s)->wp - (s)->rp)
          145 #define BALLOC(s) ((s)->lim - (s)->base)
          146 
          147 struct Chan
          148 {
          149         Ref ref;                                /* the Lock in this Ref is also Chan's lock */
          150         Chan*        next;                        /* allocation */
          151         Chan*        link;
          152         vlong        offset;                        /* in fd */
          153         vlong        devoffset;                /* in underlying device; see read */
          154         ushort        type;
          155         ulong        dev;
          156         ushort        mode;                        /* read/write */
          157         ushort        flag;
          158         Qid        qid;
          159         int        fid;                        /* for devmnt */
          160         ulong        iounit;                        /* chunk size for i/o; 0==default */
          161         Mhead*        umh;                        /* mount point that derived Chan; used in unionread */
          162         Chan*        umc;                        /* channel in union; held for union read */
          163         QLock        umqlock;                /* serialize unionreads */
          164         int        uri;                        /* union read index */
          165         int        dri;                        /* devdirread index */
          166         uchar*        dirrock;                /* directory entry rock for translations */
          167         int        nrock;
          168         int        mrock;
          169         QLock        rockqlock;
          170         int        ismtpt;
          171         Mntcache*mcp;                        /* Mount cache pointer */
          172         Mnt*        mux;                        /* Mnt for clients using me for messages */
          173         union {
          174                 void*        aux;
          175                 Qid        pgrpid;                /* for #p/notepg */
          176                 ulong        mid;                /* for ns in devproc */
          177         };
          178         Chan*        mchan;                        /* channel to mounted server */
          179         Qid        mqid;                        /* qid of root of mount point */
          180         Path*        path;
          181 };
          182 
          183 struct Path
          184 {
          185         Ref ref;
          186         char        *s;
          187         Chan        **mtpt;                        /* mtpt history */
          188         int        len;                        /* strlen(s) */
          189         int        alen;                        /* allocated length of s */
          190         int        mlen;                        /* number of path elements */
          191         int        malen;                        /* allocated length of mtpt */
          192 };
          193 
          194 struct Dev
          195 {
          196         int        dc;
          197         char*        name;
          198 
          199         void        (*reset)(void);
          200         void        (*init)(void);
          201         void        (*shutdown)(void);
          202         Chan*        (*attach)(char*);
          203         Walkqid*(*walk)(Chan*, Chan*, char**, int);
          204         int        (*stat)(Chan*, uchar*, int);
          205         Chan*        (*open)(Chan*, int);
          206         void        (*create)(Chan*, char*, int, ulong);
          207         void        (*close)(Chan*);
          208         long        (*read)(Chan*, void*, long, vlong);
          209         Block*        (*bread)(Chan*, long, ulong);
          210         long        (*write)(Chan*, void*, long, vlong);
          211         long        (*bwrite)(Chan*, Block*, ulong);
          212         void        (*remove)(Chan*);
          213         int        (*wstat)(Chan*, uchar*, int);
          214         void        (*power)(int);        /* power mgt: power(1) => on, power (0) => off */
          215         int        (*config)(int, char*, DevConf*);        /* returns nil on error */
          216 };
          217 
          218 struct Dirtab
          219 {
          220         char        name[KNAMELEN];
          221         Qid        qid;
          222         vlong        length;
          223         long        perm;
          224 };
          225 
          226 struct Walkqid
          227 {
          228         Chan        *clone;
          229         int        nqid;
          230         Qid        qid[1];
          231 };
          232 
          233 enum
          234 {
          235         NSMAX        =        1000,
          236         NSLOG        =        7,
          237         NSCACHE        =        (1<<NSLOG),
          238 };
          239 
          240 struct Mntwalk                                /* state for /proc/#/ns */
          241 {
          242         int        cddone;
          243         Mhead*        mh;
          244         Mount*        cm;
          245 };
          246 
          247 struct Mount
          248 {
          249         ulong        mountid;
          250         Mount*        next;
          251         Mhead*        head;
          252         Mount*        copy;
          253         Mount*        order;
          254         Chan*        to;                        /* channel replacing channel */
          255         int        mflag;
          256         char        *spec;
          257 };
          258 
          259 struct Mhead
          260 {
          261         Ref ref;
          262         RWlock        lock;
          263         Chan*        from;                        /* channel mounted upon */
          264         Mount*        mount;                        /* what's mounted upon it */
          265         Mhead*        hash;                        /* Hash chain */
          266 };
          267 
          268 struct Mnt
          269 {
          270         Lock lk;
          271         /* references are counted using c->ref; channels on this mount point incref(c->mchan) == Mnt.c */
          272         Chan        *c;                /* Channel to file service */
          273         Proc        *rip;                /* Reader in progress */
          274         Mntrpc        *queue;                /* Queue of pending requests on this channel */
          275         ulong        id;                /* Multiplexer id for channel check */
          276         Mnt        *list;                /* Free list */
          277         int        flags;                /* cache */
          278         int        msize;                /* data + IOHDRSZ */
          279         char        *version;        /* 9P version */
          280         Queue        *q;                /* input queue */
          281 };
          282 
          283 enum
          284 {
          285         NUser,                                /* note provided externally */
          286         NExit,                                /* deliver note quietly */
          287         NDebug,                                /* print debug message */
          288 };
          289 
          290 struct Note
          291 {
          292         char        msg[ERRMAX];
          293         int        flag;                        /* whether system posted it */
          294 };
          295 
          296 enum
          297 {
          298         PG_NOFLUSH        = 0,
          299         PG_TXTFLUSH        = 1,                /* flush dcache and invalidate icache */
          300         PG_DATFLUSH        = 2,                /* flush both i & d caches (UNUSED) */
          301         PG_NEWCOL        = 3,                /* page has been recolored */
          302 
          303         PG_MOD                = 0x01,                /* software modified bit */
          304         PG_REF                = 0x02,                /* software referenced bit */
          305 };
          306 
          307 struct Page
          308 {
          309         Lock lk;
          310         ulong        pa;                        /* Physical address in memory */
          311         ulong        va;                        /* Virtual address for user */
          312         ulong        daddr;                        /* Disc address on swap */
          313         ushort        ref;                        /* Reference count */
          314         char        modref;                        /* Simulated modify/reference bits */
          315         char        color;                        /* Cache coloring */
          316         Image        *image;                        /* Associated text or swap image */
          317         Page        *next;                        /* Lru free list */
          318         Page        *prev;
          319         Page        *hash;                        /* Image hash chains */
          320 };
          321 
          322 struct Swapalloc
          323 {
          324         Lock lk;                                /* Free map lock */
          325         int        free;                        /* currently free swap pages */
          326         uchar*        swmap;                        /* Base of swap map in memory */
          327         uchar*        alloc;                        /* Round robin allocator */
          328         uchar*        last;                        /* Speed swap allocation */
          329         uchar*        top;                        /* Top of swap map */
          330         Rendez        r;                        /* Pager kproc idle sleep */
          331         ulong        highwater;                /* Pager start threshold */
          332         ulong        headroom;                /* Space pager frees under highwater */
          333 }swapalloc;
          334 
          335 struct Image
          336 {
          337         Ref ref;
          338         Chan        *c;                        /* channel to text file */
          339         Qid         qid;                        /* Qid for page cache coherence */
          340         Qid        mqid;
          341         Chan        *mchan;
          342         ushort        type;                        /* Device type of owning channel */
          343         Segment *s;                        /* TEXT segment for image if running */
          344         Image        *hash;                        /* Qid hash chains */
          345         Image        *next;                        /* Free list */
          346         int        notext;                        /* no file associated */
          347 };
          348 
          349 struct Pte
          350 {
          351         Page        *pages[PTEPERTAB];        /* Page map for this chunk of pte */
          352         Page        **first;                /* First used entry */
          353         Page        **last;                        /* Last used entry */
          354 };
          355 
          356 /* Segment types */
          357 enum
          358 {
          359         SG_TYPE                = 07,                /* Mask type of segment */
          360         SG_TEXT                = 00,
          361         SG_DATA                = 01,
          362         SG_BSS                = 02,
          363         SG_STACK        = 03,
          364         SG_SHARED        = 04,
          365         SG_PHYSICAL        = 05,
          366 
          367         SG_RONLY        = 0040,                /* Segment is read only */
          368         SG_CEXEC        = 0100,                /* Detach at exec */
          369 };
          370 
          371 #define PG_ONSWAP        1
          372 #define onswap(s)        (((ulong)s)&PG_ONSWAP)
          373 #define pagedout(s)        (((ulong)s)==0 || onswap(s))
          374 #define swapaddr(s)        (((ulong)s)&~PG_ONSWAP)
          375 
          376 #define SEGMAXSIZE        (SEGMAPSIZE*PTEMAPMEM)
          377 
          378 struct Physseg
          379 {
          380         ulong        attr;                        /* Segment attributes */
          381         char        *name;                        /* Attach name */
          382         ulong        pa;                        /* Physical address */
          383         ulong        size;                        /* Maximum segment size in pages */
          384         Page        *(*pgalloc)(Segment*, ulong);        /* Allocation if we need it */
          385         void        (*pgfree)(Page*);
          386 };
          387 
          388 struct Sema
          389 {
          390         Rendez rendez;
          391         long        *addr;
          392         int        waiting;
          393         Sema        *next;
          394         Sema        *prev;
          395 };
          396 
          397 struct Segment
          398 {
          399         Ref ref;
          400         QLock        lk;
          401         ushort        steal;                /* Page stealer lock */
          402         ushort        type;                /* segment type */
          403         ulong        base;                /* virtual base */
          404         ulong        top;                /* virtual top */
          405         ulong        size;                /* size in pages */
          406         ulong        fstart;                /* start address in file for demand load */
          407         ulong        flen;                /* length of segment in file */
          408         int        flushme;        /* maintain icache for this segment */
          409         Image        *image;                /* text in file attached to this segment */
          410         Physseg *pseg;
          411         ulong*        profile;        /* Tick profile area */
          412         Pte        **map;
          413         int        mapsize;
          414         Pte        *ssegmap[SSEGMAPSIZE];
          415         Lock        semalock;
          416         Sema        sema;
          417         ulong        mark;                /* portcountrefs */
          418 };
          419 
          420 enum
          421 {
          422         RENDLOG        =        5,
          423         RENDHASH =        1<<RENDLOG,        /* Hash to lookup rendezvous tags */
          424         MNTLOG        =        5,
          425         MNTHASH =        1<<MNTLOG,        /* Hash to walk mount table */
          426         NFD =                100,                /* per process file descriptors */
          427         PGHLOG  =        9,
          428         PGHSIZE        =        1<<PGHLOG,        /* Page hash for image lookup */
          429 };
          430 #define REND(p,s)        ((p)->rendhash[(s)&((1<<RENDLOG)-1)])
          431 #define MOUNTH(p,qid)        ((p)->mnthash[(qid).path&((1<<MNTLOG)-1)])
          432 
          433 struct Pgrp
          434 {
          435         Ref ref;                                /* also used as a lock when mounting */
          436         int        noattach;
          437         ulong        pgrpid;
          438         QLock        debug;                        /* single access via devproc.c */
          439         RWlock        ns;                        /* Namespace n read/one write lock */
          440         Mhead        *mnthash[MNTHASH];
          441 };
          442 
          443 struct Rgrp
          444 {
          445         Ref ref;                                /* the Ref's lock is also the Rgrp's lock */
          446         Proc        *rendhash[RENDHASH];        /* Rendezvous tag hash */
          447 };
          448 
          449 struct Egrp
          450 {
          451         Ref ref;
          452         RWlock lk;
          453         Evalue        **ent;
          454         int        nent;
          455         int        ment;
          456         ulong        path;        /* qid.path of next Evalue to be allocated */
          457         ulong        vers;        /* of Egrp */
          458 };
          459 
          460 struct Evalue
          461 {
          462         char        *name;
          463         char        *value;
          464         int        len;
          465         Evalue        *link;
          466         Qid        qid;
          467 };
          468 
          469 struct Fgrp
          470 {
          471         Ref ref;
          472         Chan        **fd;
          473         int        nfd;                        /* number allocated */
          474         int        maxfd;                        /* highest fd in use */
          475         int        exceed;                        /* debugging */
          476 };
          477 
          478 enum
          479 {
          480         DELTAFD        = 20                /* incremental increase in Fgrp.fd's */
          481 };
          482 
          483 struct Pallocmem
          484 {
          485         ulong base;
          486         ulong npage;
          487 };
          488 
          489 struct Palloc
          490 {
          491         Lock lk;
          492         Pallocmem        mem[4];
          493         Page        *head;                        /* most recently used */
          494         Page        *tail;                        /* least recently used */
          495         ulong        freecount;                /* how many pages on free list now */
          496         Page        *pages;                        /* array of all pages */
          497         ulong        user;                        /* how many user pages */
          498         Page        *hash[PGHSIZE];
          499         Lock        hashlock;
          500         Rendez        r;                        /* Sleep for free mem */
          501         QLock        pwait;                        /* Queue of procs waiting for memory */
          502 };
          503 
          504 struct Waitq
          505 {
          506         Waitmsg        w;
          507         Waitq        *next;
          508 };
          509 
          510 /*
          511  * fasttick timer interrupts
          512  */
          513 enum {
          514         /* Mode */
          515         Trelative,        /* timer programmed in ns from now */
          516         Tperiodic,        /* periodic timer, period in ns */
          517 };
          518 
          519 struct Timer
          520 {
          521         /* Public interface */
          522         int        tmode;                /* See above */
          523         vlong        tns;                /* meaning defined by mode */
          524         void        (*tf)(Ureg*, Timer*);
          525         void        *ta;
          526         /* Internal */
          527         Lock lk;
          528         Timers        *tt;                /* Timers queue this timer runs on */
          529         Tval        tticks;                /* tns converted to ticks */
          530         Tval        twhen;                /* ns represented in fastticks */
          531         Timer        *tnext;
          532 };
          533 // Plan 9 VX added for help with FreeBSD
          534 #undef RFNAMEG
          535 #undef RFENVG
          536 #undef RFFDG
          537 #undef RFPROC
          538 #undef RFMEM
          539 #undef RFNOWAIT
          540 #undef RFCNAMEG
          541 #undef RFCENVG
          542 #undef RFCFDG
          543 #undef RFREND
          544 #undef RFNOMNT
          545 #undef RFNOTEG
          546 
          547 
          548 enum
          549 {
          550         RFNAMEG                = (1<<0),
          551         RFENVG                = (1<<1),
          552         RFFDG                = (1<<2),
          553         RFNOTEG                = (1<<3),
          554         RFPROC                = (1<<4),
          555         RFMEM                = (1<<5),
          556         RFNOWAIT        = (1<<6),
          557         RFCNAMEG        = (1<<10),
          558         RFCENVG                = (1<<11),
          559         RFCFDG                = (1<<12),
          560         RFREND                = (1<<13),
          561         RFNOMNT                = (1<<14),
          562 };
          563 
          564 /*
          565  *  process memory segments - NSEG always last !
          566  */
          567 enum
          568 {
          569         SSEG, TSEG, DSEG, BSEG, ESEG, LSEG, SEG1, SEG2, SEG3, SEG4, NSEG
          570 };
          571 
          572 enum
          573 {
          574         Dead = 0,                /* Process states */
          575         Moribund,
          576         Ready,
          577         Scheding,
          578         Running,
          579         Queueing,
          580         QueueingR,
          581         QueueingW,
          582         Wakeme,
          583         Broken,
          584         Stopped,
          585         Rendezvous,
          586         Waitrelease,
          587 
          588         Proc_stopme = 1,         /* devproc requests */
          589         Proc_exitme,
          590         Proc_traceme,
          591         Proc_exitbig,
          592         Proc_tracesyscall,
          593 
          594         TUser = 0,                 /* Proc.time */
          595         TSys,
          596         TReal,
          597         TCUser,
          598         TCSys,
          599         TCReal,
          600 
          601         NERR = 64,
          602         NNOTE = 5,
          603 
          604         Npriq                = 20,                /* number of scheduler priority levels */
          605         Nrq                = Npriq+2,        /* number of priority levels including real time */
          606         PriRelease        = Npriq,        /* released edf processes */
          607         PriEdf                = Npriq+1,        /* active edf processes */
          608         PriNormal        = 10,                /* base priority for normal processes */
          609         PriExtra        = Npriq-1,        /* edf processes at high best-effort pri */
          610         PriKproc        = 13,                /* base priority for kernel processes */
          611         PriRoot                = 13,                /* base priority for root processes */
          612 };
          613 
          614 struct Schedq
          615 {
          616         Lock lk;
          617         Proc*        head;
          618         Proc*        tail;
          619         int        n;
          620 };
          621 
          622 struct Proc
          623 {
          624         Label        sched;                /* known to l.s */
          625         char        *kstack;        /* known to l.s */
          626         Mach        *mach;                /* machine running this proc */
          627         char        *text;
          628         char        *user;
          629         char        *args;
          630         int        nargs;                /* number of bytes of args */
          631         Proc        *rnext;                /* next process in run queue */
          632         Proc        *qnext;                /* next process on queue for a QLock */
          633         QLock        *qlock;                /* addr of qlock being queued for DEBUG */
          634         int        state;
          635         char        *psstate;        /* What /proc/#/status reports */
          636         Segment        *seg[NSEG];
          637         QLock        seglock;        /* locked whenever seg[] changes */
          638         ulong        pid;
          639         ulong        noteid;                /* Equivalent of note group */
          640         Proc        *pidhash;        /* next proc in pid hash */
          641 
          642         Lock        exl;                /* Lock count and waitq */
          643         Waitq        *waitq;                /* Exited processes wait children */
          644         int        nchild;                /* Number of living children */
          645         int        nwait;                /* Number of uncollected wait records */
          646         QLock        qwaitr;
          647         Rendez        waitr;                /* Place to hang out in wait */
          648         Proc        *parent;
          649 
          650         Pgrp        *pgrp;                /* Process group for namespace */
          651         Egrp         *egrp;                /* Environment group */
          652         Fgrp        *fgrp;                /* File descriptor group */
          653         Rgrp        *rgrp;                /* Rendez group */
          654 
          655         Fgrp        *closingfgrp;        /* used during teardown */
          656 
          657         ulong        parentpid;
          658         ulong        time[6];        /* User, Sys, Real; child U, S, R */
          659 
          660         uvlong        kentry;                /* Kernel entry time stamp (for profiling) */
          661         /*
          662          * pcycles: cycles spent in this process (updated on procsave/restore)
          663          * when this is the current proc and we're in the kernel
          664          * (procrestores outnumber procsaves by one)
          665          * the number of cycles spent in the proc is pcycles + cycles()
          666          * when this is not the current process or we're in user mode
          667          * (procrestores and procsaves balance), it is pcycles.
          668          */
          669         vlong        pcycles;
          670 
          671         int        insyscall;
          672         int        fpstate;
          673 
          674         QLock        debug;                /* to access debugging elements of User */
          675         Proc        *pdbg;                /* the debugging process */
          676         ulong        procmode;        /* proc device file mode */
          677         ulong        privatemem;        /* proc does not let anyone read mem */
          678         int        hang;                /* hang at next exec for debug */
          679         int        procctl;        /* Control for /proc debugging */
          680         ulong        pc;                /* DEBUG only */
          681 
          682         Lock        rlock;                /* sync sleep/wakeup with postnote */
          683         Rendez        *r;                /* rendezvous point slept on */
          684         Rendez        sleep;                /* place for syssleep/debug */
          685         int        notepending;        /* note issued but not acted on */
          686         int        kp;                /* true if a kernel process */
          687         Proc        *palarm;        /* Next alarm time */
          688         ulong        alarm;                /* Time of call */
          689         int        newtlb;                /* Pager has changed my pte's, I must flush */
          690         int        noswap;                /* process is not swappable */
          691 
          692         uintptr        rendtag;        /* Tag for rendezvous */
          693         uintptr        rendval;        /* Value for rendezvous */
          694         Proc        *rendhash;        /* Hash list for tag values */
          695 
          696         Timer timer;                        /* For tsleep and real-time */
          697         Rendez        *trend;
          698         int        (*tfn)(void*);
          699         void        (*kpfun)(void*);
          700         void        *kparg;
          701 
          702         FPsave        fpsave;                /* address of this is known by db */
          703         int        scallnr;        /* sys call number - known by db */
          704         Sargs        s;                /* address of this is known by db */
          705         int        nerrlab;
          706         Label        errlab[NERR];
          707         char        *syserrstr;        /* last error from a system call, errbuf0 or 1 */
          708         char        *errstr;        /* reason we're unwinding the error stack, errbuf1 or 0 */
          709         char        errbuf0[ERRMAX];
          710         char        errbuf1[ERRMAX];
          711         char        genbuf[128];        /* buffer used e.g. for last name element from namec */
          712         Chan        *slash;
          713         Chan        *dot;
          714 
          715         Note        note[NNOTE];
          716         short        nnote;
          717         short        notified;        /* sysnoted is due */
          718         Note        lastnote;
          719         ulong        notify;
          720 
          721         Lock        *lockwait;
          722         Lock        *lastlock;        /* debugging */
          723         Lock        *lastilock;        /* debugging */
          724 
          725         Mach        *wired;
          726         Mach        *mp;                /* machine this process last ran on */
          727         Ref        nlocks;                /* number of locks held by proc */
          728         ulong        delaysched;
          729         ulong        priority;        /* priority level */
          730         ulong        basepri;        /* base priority level */
          731         uchar        fixedpri;        /* priority level deson't change */
          732         ulong        cpu;                /* cpu average */
          733         ulong        lastupdate;
          734         uchar        yield;                /* non-zero if the process just did a sleep(0) */
          735         ulong        readytime;        /* time process came ready */
          736         ulong        movetime;        /* last time process switched processors */
          737         int        preempted;        /* true if this process hasn't finished the interrupt
          738                                  *  that last preempted it
          739                                  */
          740         Edf        *edf;                /* if non-null, real-time proc, edf contains scheduling params */
          741         int        trace;                /* process being traced? */
          742 
          743         ulong        qpc;                /* pc calling last blocking qlock */
          744 
          745         int        setargs;
          746 
          747         ulong        ureg;                /* User registers for notes */
          748         void        *dbgreg;        /* User registers for devproc */
          749         Notsave notsave;
          750 
          751         /*
          752          *  machine specific MMU
          753          */
          754         PMMU pmmu;
          755         /* syscall trace */
          756         char *syscalltrace;
          757 };
          758 
          759 enum
          760 {
          761         PRINTSIZE =        256,
          762         MAXCRYPT =         127,
          763         NUMSIZE        =        12,                /* size of formatted number */
          764         MB =                (1024*1024),
          765         /* READSTR was 1000, which is way too small for usb's ctl file */
          766         READSTR =        4000,                /* temporary buffer size for device reads */
          767 };
          768 
          769 extern        Conf        conf;
          770 extern        char*        conffile;
          771 extern        int        cpuserver;
          772 extern        Dev*        devtab[];
          773 extern        char*        eve;
          774 extern        char        hostdomain[];
          775 extern        uchar        initcode[];
          776 extern        int        kbdbuttons;
          777 extern        Queue*        kbdq;
          778 extern        Queue*        kprintoq;
          779 extern         Ref        noteidalloc;
          780 extern        int        nsyscall;
          781 extern        Palloc        palloc;
          782 extern        Queue*        serialoq;
          783 extern        char*        statename[];
          784 extern        Image        swapimage;
          785 extern        char*        sysname;
          786 extern        uint        qiomaxatomic;
          787 
          788 enum
          789 {
          790         LRESPROF        = 3,
          791 };
          792 
          793 /*
          794  *  action log
          795  */
          796 struct Log {
          797         Lock lk;
          798         int        opens;
          799         char*        buf;
          800         char        *end;
          801         char        *rptr;
          802         int        len;
          803         int        nlog;
          804         int        minread;
          805 
          806         int        logmask;        /* mask of things to debug */
          807 
          808         QLock        readq;
          809         Rendez        readr;
          810 };
          811 
          812 struct Logflag {
          813         char*        name;
          814         int        mask;
          815 };
          816 
          817 enum
          818 {
          819         NCMDFIELD = 128
          820 };
          821 
          822 struct Cmdbuf
          823 {
          824         char        *buf;
          825         char        **f;
          826         int        nf;
          827 };
          828 
          829 struct Cmdtab
          830 {
          831         int        index;        /* used by client to switch on result */
          832         char        *cmd;        /* command name */
          833         int        narg;        /* expected #args; 0 ==> variadic */
          834 };
          835 
          836 /*
          837  *  routines to access UART hardware
          838  */
          839 struct PhysUart
          840 {
          841         char*        name;
          842         Uart*        (*pnp)(void);
          843         void        (*enable)(Uart*, int);
          844         void        (*disable)(Uart*);
          845         void        (*kick)(Uart*);
          846         void        (*dobreak)(Uart*, int);
          847         int        (*baud)(Uart*, int);
          848         int        (*bits)(Uart*, int);
          849         int        (*stop)(Uart*, int);
          850         int        (*parity)(Uart*, int);
          851         void        (*modemctl)(Uart*, int);
          852         void        (*rts)(Uart*, int);
          853         void        (*dtr)(Uart*, int);
          854         long        (*status)(Uart*, void*, long, long);
          855         void        (*fifo)(Uart*, int);
          856         void        (*power)(Uart*, int);
          857         int        (*getc)(Uart*);        /* polling versions, for iprint, rdb */
          858         void        (*putc)(Uart*, int);
          859 };
          860 
          861 enum {
          862         Stagesize=        2048
          863 };
          864 
          865 /*
          866  *  software UART
          867  */
          868 struct Uart
          869 {
          870         void*        regs;                        /* hardware stuff */
          871         void*        saveregs;                /* place to put registers on power down */
          872         char*        name;                        /* internal name */
          873         ulong        freq;                        /* clock frequency */
          874         int        bits;                        /* bits per character */
          875         int        stop;                        /* stop bits */
          876         int        parity;                        /* even, odd or no parity */
          877         int        baud;                        /* baud rate */
          878         PhysUart*phys;
          879         int        console;                /* used as a serial console */
          880         int        special;                /* internal kernel device */
          881         Uart*        next;                        /* list of allocated uarts */
          882 
          883         QLock lk;
          884         int        type;                        /* ?? */
          885         int        dev;
          886         int        opens;
          887 
          888         int        enabled;
          889         Uart        *elist;                        /* next enabled interface */
          890 
          891         int        perr;                        /* parity errors */
          892         int        ferr;                        /* framing errors */
          893         int        oerr;                        /* rcvr overruns */
          894         int        berr;                        /* no input buffers */
          895         int        serr;                        /* input queue overflow */
          896 
          897         /* buffers */
          898         int        (*putc)(Queue*, int);
          899         Queue        *iq;
          900         Queue        *oq;
          901 
          902         Lock        rlock;
          903         uchar        istage[Stagesize];
          904         uchar        *iw;
          905         uchar        *ir;
          906         uchar        *ie;
          907 
          908         Lock        tlock;                        /* transmit */
          909         uchar        ostage[Stagesize];
          910         uchar        *op;
          911         uchar        *oe;
          912         int        drain;
          913 
          914         int        modem;                        /* hardware flow control on */
          915         int        xonoff;                        /* software flow control on */
          916         int        blocked;
          917         int        cts, dsr, dcd;        /* keep track of modem status */ 
          918         int        ctsbackoff;
          919         int        hup_dsr, hup_dcd;        /* send hangup upstream? */
          920         int        dohup;
          921 
          922         Rendez        r;
          923 };
          924 
          925 extern        Uart*        consuart;
          926 
          927 /*
          928  *  performance timers, all units in perfticks
          929  */
          930 struct Perf
          931 {
          932         ulong        intrts;                /* time of last interrupt */
          933         ulong        inintr;                /* time since last clock tick in interrupt handlers */
          934         ulong        avg_inintr;        /* avg time per clock tick in interrupt handlers */
          935         ulong        inidle;                /* time since last clock tick in idle loop */
          936         ulong        avg_inidle;        /* avg time per clock tick in idle loop */
          937         ulong        last;                /* value of perfticks() at last clock tick */
          938         ulong        period;                /* perfticks() per clock tick */
          939 };
          940 
          941 struct Watchdog
          942 {
          943         void        (*enable)(void);        /* watchdog enable */
          944         void        (*disable)(void);        /* watchdog disable */
          945         void        (*restart)(void);        /* watchdog restart */
          946         void        (*stat)(char*, char*);        /* watchdog statistics */
          947 };
          948 
          949 
          950 /* queue state bits,  Qmsg, Qcoalesce, and Qkick can be set in qopen */
          951 enum
          952 {
          953         /* Queue.state */
          954         Qstarve                = (1<<0),        /* consumer starved */
          955         Qmsg                = (1<<1),        /* message stream */
          956         Qclosed                = (1<<2),        /* queue has been closed/hungup */
          957         Qflow                = (1<<3),        /* producer flow controlled */
          958         Qcoalesce        = (1<<4),        /* coallesce packets on read */
          959         Qkick                = (1<<5),        /* always call the kick routine after qwrite */
          960 };
          961 
          962 #define DEVDOTDOT -1
          963 
          964 void        printmap(void);        // Plan 9 VX
          965