diff options
| author | Charles.Forsyth <devnull@localhost> | 2006-12-22 21:39:35 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2006-12-22 21:39:35 +0000 |
| commit | 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a (patch) | |
| tree | c6e220ba61db3a6ea4052e6841296d829654e664 /os/port/portdat.h | |
| parent | 46439007cf417cbd9ac8049bb4122c890097a0fa (diff) | |
20060303
Diffstat (limited to 'os/port/portdat.h')
| -rw-r--r-- | os/port/portdat.h | 673 |
1 files changed, 673 insertions, 0 deletions
diff --git a/os/port/portdat.h b/os/port/portdat.h new file mode 100644 index 00000000..103961e0 --- /dev/null +++ b/os/port/portdat.h @@ -0,0 +1,673 @@ +typedef struct Alarms Alarms; +typedef struct Block Block; +typedef struct Bkpt Bkpt; +typedef struct BkptCond BkptCond; +typedef struct Chan Chan; +typedef struct Cmdbuf Cmdbuf; +typedef struct Cmdtab Cmdtab; +typedef struct Cname Cname; +typedef struct Crypt Crypt; +typedef struct Dev Dev; +typedef struct DevConf DevConf; +typedef struct Dirtab Dirtab; +typedef struct Edf Edf; +typedef struct Egrp Egrp; +typedef struct Evalue Evalue; +typedef struct Fgrp Fgrp; +typedef struct List List; +typedef struct Log Log; +typedef struct Logflag Logflag; +typedef struct Mntcache Mntcache; +typedef struct Mntparam Mntparam; +typedef struct Mount Mount; +typedef struct Mntrpc Mntrpc; +typedef struct Mntwalk Mntwalk; +typedef struct Mnt Mnt; +typedef struct Mhead Mhead; +typedef struct Osenv Osenv; +typedef struct Pgrp Pgrp; +typedef struct Proc Proc; +typedef struct QLock QLock; +typedef struct Queue Queue; +typedef struct Ref Ref; +typedef struct Rendez Rendez; +typedef struct Rept Rept; +typedef struct Rootdata Rootdata; +typedef struct RWlock RWlock; +typedef struct Signerkey Signerkey; +typedef struct Skeyset Skeyset; +typedef struct Talarm Talarm; +typedef struct Timer Timer; +typedef struct Timers Timers; +typedef struct Uart Uart; +typedef struct Walkqid Walkqid; +typedef int Devgen(Chan*, char*, Dirtab*, int, int, Dir*); + +#pragma incomplete DevConf +#pragma incomplete Edf +#pragma incomplete Mntcache +#pragma incomplete Mntrpc +#pragma incomplete Queue +#pragma incomplete Timers + +#include "fcall.h" +#include <pool.h> + +#define nelem(n) (sizeof(n)/sizeof(n[0])) + +struct Ref +{ + Lock l; + long ref; +}; + +struct Rendez +{ + Lock; + Proc *p; +}; + +struct Rept +{ + Lock l; + Rendez r; + void *o; + int t; + int (*active)(void*); + int (*ck)(void*, int); + void (*f)(void*); /* called with VM acquire()'d */ +}; + +struct Osenv +{ + char *syserrstr; /* last error from a system call, errbuf0 or 1 */ + char *errstr; /* reason we're unwinding the error stack, errbuf1 or 0 */ + char errbuf0[ERRMAX]; + char errbuf1[ERRMAX]; + Pgrp* pgrp; /* Ref to namespace, working dir and root */ + Fgrp* fgrp; /* Ref to file descriptors */ + Egrp* egrp; /* Environment vars */ + Skeyset* sigs; /* Signed module keys */ + Rendez* rend; /* Synchro point */ + Queue* waitq; /* Info about dead children */ + Queue* childq; /* Info about children for debuggers */ + void* debug; /* Debugging master */ + int uid; /* Numeric user id for system */ + int gid; /* Numeric group id for system */ + char* user; /* Inferno user name */ + FPenv fpu; /* Floating point thread state */ +}; + +enum +{ + Nopin = -1 +}; + +struct QLock +{ + Lock use; /* to access Qlock structure */ + Proc *head; /* next process waiting for object */ + Proc *tail; /* last process waiting for object */ + int locked; /* flag */ +}; + +struct RWlock +{ + Lock; /* Lock modify lock */ + QLock x; /* Mutual exclusion lock */ + QLock k; /* Lock for waiting writers */ + int readers; /* Count of readers in lock */ +}; + +struct Talarm +{ + Lock; + Proc* list; +}; + +struct Alarms +{ + QLock; + Proc* head; +}; + +struct Rootdata +{ + int dotdot; + void *ptr; + int size; + int *sizep; +}; + +/* + * Access types in namec & channel flags + */ +enum +{ + Aaccess, /* as in stat, wstat */ + Abind, /* for left-hand-side of bind */ + Atodir, /* as in chdir */ + Aopen, /* for i/o */ + Amount, /* to be mounted or mounted upon */ + Acreate, /* is to be created */ + Aremove, /* will be removed by caller */ + + COPEN = 0x0001, /* for i/o */ + CMSG = 0x0002, /* the message channel for a mount */ + CCEXEC = 0x0008, /* close on exec */ + CFREE = 0x0010, /* not in use */ + CRCLOSE = 0x0020, /* remove on close */ + CCACHE = 0x0080, /* client cache */ +}; + +enum +{ + BINTR = (1<<0), + BFREE = (1<<1), + Bipck = (1<<2), /* ip checksum */ + Budpck = (1<<3), /* udp checksum */ + Btcpck = (1<<4), /* tcp checksum */ + Bpktck = (1<<5), /* packet checksum */ +}; + +struct Block +{ + Block* next; + Block* list; + uchar* rp; /* first unconsumed byte */ + uchar* wp; /* first empty byte */ + uchar* lim; /* 1 past the end of the buffer */ + uchar* base; /* start of the buffer */ + void (*free)(Block*); + ushort flag; + ushort checksum; /* IP checksum of complete packet (minus media header) */ +}; +#define BLEN(s) ((s)->wp - (s)->rp) +#define BALLOC(s) ((s)->lim - (s)->base) + +struct Chan +{ + Lock; + Ref; + Chan* next; /* allocation */ + Chan* link; + vlong offset; /* in file */ + ushort type; + ulong dev; + ushort mode; /* read/write */ + ushort flag; + Qid qid; + int fid; /* for devmnt */ + ulong iounit; /* chunk size for i/o; 0==default */ + Mhead* umh; /* mount point that derived Chan; used in unionread */ + Chan* umc; /* channel in union; held for union read */ + QLock umqlock; /* serialize unionreads */ + int uri; /* union read index */ + int dri; /* devdirread index */ + ulong mountid; + Mntcache *mcp; /* Mount cache pointer */ + Mnt *mux; /* Mnt for clients using me for messages */ + union { + void* aux; + char tag[4]; /* for iproute */ + }; + Chan* mchan; /* channel to mounted server */ + Qid mqid; /* qid of root of mount point */ + Cname *name; +}; + +struct Cname +{ + Ref; + int alen; /* allocated length */ + int len; /* strlen(s) */ + char *s; +}; + +struct Dev +{ + int dc; + char* name; + + void (*reset)(void); + void (*init)(void); + void (*shutdown)(void); + Chan* (*attach)(char*); + Walkqid* (*walk)(Chan*, Chan*, char**, int); + int (*stat)(Chan*, uchar*, int); + Chan* (*open)(Chan*, int); + void (*create)(Chan*, char*, int, ulong); + void (*close)(Chan*); + long (*read)(Chan*, void*, long, vlong); + Block* (*bread)(Chan*, long, ulong); + long (*write)(Chan*, void*, long, vlong); + long (*bwrite)(Chan*, Block*, ulong); + void (*remove)(Chan*); + int (*wstat)(Chan*, uchar*, int); + void (*power)(int); /* power mgt: power(1) → on, power (0) → off */ + int (*config)(int, char*, DevConf*); +}; + +struct Dirtab +{ + char name[KNAMELEN]; + Qid qid; + vlong length; + long perm; +}; + +struct Walkqid +{ + Chan *clone; + int nqid; + Qid qid[1]; +}; + +enum +{ + NSMAX = 1000, + NSLOG = 7, + NSCACHE = (1<<NSLOG), +}; + +struct Mntwalk /* state for /proc/#/ns */ +{ + int cddone; + ulong id; + Mhead* mh; + Mount* cm; +}; + +struct Mount +{ + ulong mountid; + Mount* next; + Mhead* head; + Mount* copy; + Mount* order; + Chan* to; /* channel replacing channel */ + int mflag; + char *spec; +}; + +struct Mhead +{ + Ref; + RWlock lock; + Chan* from; /* channel mounted upon */ + Mount* mount; /* what's mounted upon it */ + Mhead* hash; /* Hash chain */ +}; + +struct Mnt +{ + Lock; + /* references are counted using c->ref; channels on this mount point incref(c->mchan) == Mnt.c */ + Chan *c; /* Channel to file service */ + Proc *rip; /* Reader in progress */ + Mntrpc *queue; /* Queue of pending requests on this channel */ + ulong id; /* Multiplexer id for channel check */ + Mnt *list; /* Free list */ + int flags; /* cache */ + int msize; /* data + IOHDRSZ */ + char *version; /* 9P version */ + Queue *q; /* input queue */ +}; + +enum +{ + RENDLOG = 5, + RENDHASH = 1<<RENDLOG, /* Hash to lookup rendezvous tags */ + MNTLOG = 5, + MNTHASH = 1<<MNTLOG, /* Hash to walk mount table */ + DELTAFD= 20, /* allocation quantum for process file descriptors */ + MAXNFD = 4000, /* max per process file descriptors */ + MAXKEY = 8, /* keys for signed modules */ +}; +#define MOUNTH(p,qid) ((p)->mnthash[(qid).path&((1<<MNTLOG)-1)]) + +struct Mntparam { + Chan* chan; + Chan* authchan; + char* spec; + int flags; +}; + +struct Pgrp +{ + Ref; /* also used as a lock when mounting */ + ulong pgrpid; + QLock debug; /* single access via devproc.c */ + RWlock ns; /* Namespace n read/one write lock */ + QLock nsh; + Mhead* mnthash[MNTHASH]; + int progmode; + int privatemem; /* deny access to /prog by debuggers */ + Chan* dot; + Chan* slash; + int nodevs; + int pin; +}; + +struct Fgrp +{ + Lock; + Ref; + Chan** fd; + int nfd; /* number of fd slots */ + int maxfd; /* highest fd in use */ + int minfd; /* lower bound on free fd */ +}; + +struct Evalue +{ + char *var; + char *val; + int len; + Qid qid; + Evalue *next; +}; + +struct Egrp +{ + Ref; + QLock; + Evalue *entries; + ulong path; /* qid.path of next Evalue to be allocated */ + ulong vers; /* of Egrp */ +}; + +struct Signerkey +{ + Ref; + char* owner; + ushort footprint; + ulong expires; + void* alg; + void* pk; + void (*pkfree)(void*); +}; + +struct Skeyset +{ + Ref; + QLock; + ulong flags; + char* devs; + int nkey; + Signerkey *keys[MAXKEY]; +}; + +/* + * fasttick timer interrupts + */ +enum { + /* Mode */ + Trelative, /* timer programmed in ns from now */ + Tabsolute, /* timer programmed in ns since epoch */ + Tperiodic, /* periodic timer, period in ns */ +}; + +struct Timer +{ + /* Public interface */ + int tmode; /* See above */ + vlong tns; /* meaning defined by mode */ + void (*tf)(Ureg*, Timer*); + void *ta; + /* Internal */ + Lock; + Timers *tt; /* Timers queue this timer runs on */ + vlong twhen; /* ns represented in fastticks */ + Timer *tnext; +}; + +enum +{ + Dead = 0, /* Process states */ + Moribund, + Ready, + Scheding, + Running, + Queueing, + Wakeme, + Broken, + Stopped, + Rendezvous, + Waitrelease, + + Proc_stopme = 1, /* devproc requests */ + Proc_exitme, + Proc_traceme, + Proc_exitbig, + + NERR = 30, + + Unknown = 0, + IdleGC, + Interp, + BusyGC, + + PriLock = 0, /* Holding Spin lock */ + PriEdf, /* active edf processes */ + PriRelease, /* released edf processes */ + PriRealtime, /* Video telephony */ + PriHicodec, /* MPEG codec */ + PriLocodec, /* Audio codec */ + PriHi, /* Important task */ + PriNormal, + PriLo, + PriBackground, + PriExtra, /* edf processes we don't care about */ + Nrq +}; + +struct Proc +{ + Label sched; /* known to l.s */ + char* kstack; /* known to l.s */ + Mach* mach; /* machine running this proc */ + char text[KNAMELEN]; + Proc* rnext; /* next process in run queue */ + Proc* qnext; /* next process on queue for a QLock */ + QLock* qlock; /* addrof qlock being queued for DEBUG */ + int state; + int type; + void* prog; /* Dummy Prog for interp release */ + void* iprog; + Osenv* env; + Osenv defenv; + int swipend; /* software interrupt pending for Prog */ + Lock sysio; /* note handler lock */ + char* psstate; /* What /proc/#/status reports */ + ulong pid; + int fpstate; + int procctl; /* Control for /proc debugging */ + ulong pc; /* DEBUG only */ + Lock rlock; /* sync between sleep/swiproc for r */ + Rendez* r; /* rendezvous point slept on */ + Rendez sleep; /* place for syssleep/debug */ + int killed; /* by swiproc */ + int kp; /* true if a kernel process */ + ulong alarm; /* Time of call */ + int pri; /* scheduler priority */ + ulong twhen; + Rendez* trend; + Proc* tlink; + int (*tfn)(void*); + void (*kpfun)(void*); + void* arg; + FPU fpsave; + int scallnr; + int nerrlab; + Label errlab[NERR]; + char genbuf[128]; /* buffer used e.g. for last name element from namec */ + Mach* mp; /* machine this process last ran on */ + Mach* wired; + ulong movetime; /* next time process should switch processors */ + ulong delaysched; + int preempted; /* process yielding in interrupt */ + ulong qpc; /* last call that blocked in qlock */ + void* dbgreg; /* User registers for devproc */ + int dbgstop; /* don't run this kproc */ + Edf* edf; /* if non-null, real-time proc, edf contains scheduling params */ +}; + +enum +{ + /* kproc flags */ + KPDUPPG = (1<<0), + KPDUPFDG = (1<<1), + KPDUPENVG = (1<<2), + KPDUP = KPDUPPG | KPDUPFDG | KPDUPENVG +}; + +enum { + BrkSched, + BrkNoSched, +}; + +struct BkptCond +{ + uchar op; + ulong val; + BkptCond *next; +}; + +struct Bkpt +{ + int id; + ulong addr; + BkptCond *conditions; + Instr instr; + void (*handler)(Bkpt*); + void *aux; + Bkpt *next; + Bkpt *link; +}; + +enum +{ + PRINTSIZE = 256, + NUMSIZE = 12, /* size of formatted number */ + MB = (1024*1024), + READSTR = 1000, /* temporary buffer size for device reads */ +}; + +extern Conf conf; +extern char* conffile; +extern int consoleprint; +extern Dev* devtab[]; +extern char* eve; +extern int hwcurs; +extern FPU initfp; +extern Queue *kbdq; +extern Queue *kscanq; +extern Ref noteidalloc; +extern Queue *printq; +extern uint qiomaxatomic; +extern char* statename[]; +extern char* sysname; +extern Talarm talarm; + +/* + * action log + */ +struct Log { + Lock; + int opens; + char* buf; + char *end; + char *rptr; + int len; + int nlog; + int minread; + + int logmask; /* mask of things to debug */ + + QLock readq; + Rendez readr; +}; + +struct Logflag { + char* name; + int mask; +}; + +struct Cmdbuf +{ + char *buf; + char **f; + int nf; +}; + +struct Cmdtab +{ + int index; /* used by client to switch on result */ + char *cmd; /* command name */ + int narg; /* expected #args; 0 ==> variadic */ +}; + +enum +{ + MAXPOOL = 8, +}; + +extern Pool* mainmem; +extern Pool* heapmem; +extern Pool* imagmem; + +/* queue state bits, Qmsg, Qcoalesce, and Qkick can be set in qopen */ +enum +{ + /* Queue.state */ + Qstarve = (1<<0), /* consumer starved */ + Qmsg = (1<<1), /* message stream */ + Qclosed = (1<<2), /* queue has been closed/hungup */ + Qflow = (1<<3), /* producer flow controlled */ + Qcoalesce = (1<<4), /* coallesce packets on read */ + Qkick = (1<<5), /* always call the kick routine after qwrite */ +}; + +#define DEVDOTDOT -1 + +#pragma varargck argpos print 1 +#pragma varargck argpos snprint 3 +#pragma varargck argpos seprint 3 +#pragma varargck argpos sprint 2 +#pragma varargck argpos fprint 2 +#pragma varargck argpos iprint 1 +#pragma varargck argpos panic 1 +#pragma varargck argpos kwerrstr 1 +#pragma varargck argpos kprint 1 + +#pragma varargck type "lld" vlong +#pragma varargck type "llx" vlong +#pragma varargck type "lld" uvlong +#pragma varargck type "llx" uvlong +#pragma varargck type "lx" void* +#pragma varargck type "ld" long +#pragma varargck type "lx" long +#pragma varargck type "ld" ulong +#pragma varargck type "lx" ulong +#pragma varargck type "d" int +#pragma varargck type "x" int +#pragma varargck type "c" int +#pragma varargck type "C" int +#pragma varargck type "d" uint +#pragma varargck type "x" uint +#pragma varargck type "c" uint +#pragma varargck type "C" uint +#pragma varargck type "f" double +#pragma varargck type "e" double +#pragma varargck type "g" double +#pragma varargck type "s" char* +#pragma varargck type "S" Rune* +#pragma varargck type "r" void +#pragma varargck type "%" void +#pragma varargck type "I" uchar* +#pragma varargck type "V" uchar* +#pragma varargck type "E" uchar* +#pragma varargck type "M" uchar* +#pragma varargck type "p" void* +#pragma varargck type "q" char* |
