summaryrefslogtreecommitdiff
path: root/os/port/portdat.h
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2006-12-22 21:39:35 +0000
committerCharles.Forsyth <devnull@localhost>2006-12-22 21:39:35 +0000
commit74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a (patch)
treec6e220ba61db3a6ea4052e6841296d829654e664 /os/port/portdat.h
parent46439007cf417cbd9ac8049bb4122c890097a0fa (diff)
20060303
Diffstat (limited to 'os/port/portdat.h')
-rw-r--r--os/port/portdat.h673
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*