summaryrefslogtreecommitdiff
path: root/emu/port/dat.h
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2006-12-22 17:07:39 +0000
committerCharles.Forsyth <devnull@localhost>2006-12-22 17:07:39 +0000
commit37da2899f40661e3e9631e497da8dc59b971cbd0 (patch)
treecbc6d4680e347d906f5fa7fca73214418741df72 /emu/port/dat.h
parent54bc8ff236ac10b3eaa928fd6bcfc0cdb2ba46ae (diff)
20060303a
Diffstat (limited to 'emu/port/dat.h')
-rw-r--r--emu/port/dat.h512
1 files changed, 512 insertions, 0 deletions
diff --git a/emu/port/dat.h b/emu/port/dat.h
new file mode 100644
index 00000000..b245b61c
--- /dev/null
+++ b/emu/port/dat.h
@@ -0,0 +1,512 @@
+typedef struct Block Block;
+typedef struct Chan Chan;
+typedef struct Cmdbuf Cmdbuf;
+typedef struct Cmdtab Cmdtab;
+typedef struct Cname Cname;
+typedef struct Dev Dev;
+typedef struct Dirtab Dirtab;
+typedef struct Egrp Egrp;
+typedef struct Evalue Evalue;
+typedef struct Fgrp Fgrp;
+typedef struct Mount Mount;
+typedef struct Mntcache Mntcache;
+typedef struct Mntparam Mntparam;
+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 Queue Queue;
+typedef struct Ref Ref;
+typedef struct Rendez Rendez;
+typedef struct Rept Rept;
+typedef struct Rootdata Rootdata;
+/*typedef struct RWlock RWlock;*/
+typedef struct RWLock RWlock;
+typedef struct Procs Procs;
+typedef struct Signerkey Signerkey;
+typedef struct Skeyset Skeyset;
+typedef struct Uqid Uqid;
+typedef struct Uqidtab Uqidtab;
+typedef struct Walkqid Walkqid;
+
+#include "lib9.h"
+#undef CHDIR
+#undef NAMELEN
+#undef ERRLEN
+
+#pragma incomplete Queue
+#pragma incomplete Mntrpc
+
+#include "fcall.h"
+
+#include "pool.h"
+
+typedef int Devgen(Chan*, char*, Dirtab*, int, int, Dir*);
+
+enum
+{
+ NERR = 32,
+ KNAMELEN = 28,
+ MAXROOT = 5*KNAMELEN, /* Maximum root pathname len of devfs-* */
+ NUMSIZE = 11,
+ PRINTSIZE = 256,
+ READSTR = 1000 /* temporary buffer size for device reads */
+};
+
+struct Ref
+{
+ Lock lk;
+ long ref;
+};
+
+struct Rendez
+{
+ Lock l;
+ 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 */
+};
+
+/*
+ * Access types in namec & channel flags
+ */
+enum
+{
+ Aaccess, /* as in access, stat */
+ Abind, /* for left-hand-side of bind */
+ Atodir, /* as in chdir */
+ Aopen, /* for i/o */
+ Amount, /* to be mounted upon */
+ Acreate, /* file is to be created */
+ Aremove, /* will be removed by caller */
+
+ COPEN = 0x0001, /* for i/o */
+ CMSG = 0x0002, /* the message channel for a mount */
+/*rsc CCREATE = 0x0004, /* permits creation if c->mnt */
+ CCEXEC = 0x0008, /* close on exec */
+ CFREE = 0x0010, /* not in use */
+ CRCLOSE = 0x0020, /* remove on close */
+ CCACHE = 0x0080 /* client cache */
+};
+
+struct Chan
+{
+ Lock l;
+ Ref r;
+ 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 */
+ void* aux; /* device specific data */
+ Chan* mchan; /* channel to mounted server */
+ Qid mqid; /* qid of root of mount point */
+ Cname *name;
+};
+
+struct Cname
+{
+ Ref r;
+ int alen; /* allocated length */
+ int len; /* strlen(s) */
+ char *s;
+};
+
+struct Dev
+{
+ int dc;
+ char* name;
+
+ void (*init)(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);
+};
+
+enum
+{
+ BINTR = (1<<0),
+ BFREE = (1<<1),
+ BMORE = (1<<2) /* continued in next block */
+};
+
+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*);
+ ulong flag;
+};
+#define BLEN(s) ((s)->wp - (s)->rp)
+#define BALLOC(s) ((s)->lim - (s)->base)
+
+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 r;
+ RWlock lock;
+ Chan* from; /* channel mounted upon */
+ Mount* mount; /* what's mounted upon it */
+ Mhead* hash; /* Hash chain */
+};
+
+struct Mnt
+{
+ Lock l;
+ /* 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; /* Multiplexor id for channel check */
+ Mnt* list; /* Free list */
+ int flags; /* cache */
+ int msize; /* data + IOHDRSZ */
+ char *version; /* 9P version */
+ Queue *q; /* input queue */
+};
+
+enum
+{
+ 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 r; /* also used as a lock when mounting */
+ ulong pgrpid;
+ 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;
+};
+
+enum
+{
+ Nopin = -1
+};
+
+struct Fgrp
+{
+ Lock l;
+ Ref r;
+ 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 r;
+ QLock l;
+ ulong path;
+ ulong vers;
+ Evalue *entries;
+};
+
+struct Signerkey
+{
+ Ref r;
+ char* owner;
+ ushort footprint;
+ ulong expires;
+ void* alg;
+ void* pk;
+ void (*pkfree)(void*);
+};
+
+struct Skeyset
+{
+ Ref r;
+ QLock l;
+ ulong flags;
+ char* devs;
+ int nkey;
+ Signerkey *keys[MAXKEY];
+};
+
+struct Uqid
+{
+ Ref r;
+ int type;
+ int dev;
+ vlong oldpath;
+ vlong newpath;
+ Uqid* next;
+};
+
+enum
+{
+ Nqidhash = 32
+};
+
+struct Uqidtab
+{
+ QLock l;
+ Uqid* qids[Nqidhash];
+ ulong pathgen;
+};
+
+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 */
+ char* user; /* Inferno user name */
+ FPU fpu; /* Floating point thread state */
+ int uid; /* Numeric user id for host system */
+ int gid; /* Numeric group id for host system */
+ void *ui; /* User info for NT */
+};
+
+enum
+{
+ Unknown = 0xdeadbabe,
+ IdleGC = 0x16,
+ Interp = 0x17,
+ BusyGC = 0x18,
+ Moribund
+};
+
+struct Proc
+{
+ int type; /* interpreter or not */
+ char text[KNAMELEN];
+ Proc* qnext; /* list of processes waiting on a Qlock */
+ long pid;
+ Proc* next; /* list of created processes */
+ Proc* prev;
+ Lock rlock; /* sync between sleep/swiproc for r */
+ Rendez* r; /* rendezvous point slept on */
+ Rendez sleep; /* place to sleep */
+ int killed; /* by swiproc */
+ int swipend; /* software interrupt pending for Prog */
+ int syscall; /* set true under sysio for interruptable syscalls */
+ int intwait; /* spin wait for note to turn up */
+ int sigid; /* handle used for signal/note/exception */
+ Lock sysio; /* note handler lock */
+ char genbuf[128]; /* buffer used e.g. for last name element from namec */
+ int nerr; /* error stack SP */
+ osjmpbuf estack[NERR]; /* vector of error jump labels */
+ char* kstack;
+ void (*func)(void*); /* saved trampoline pointer for kproc */
+ void* arg; /* arg for invoked kproc function */
+ void* iprog; /* work for Prog after release */
+ void* prog; /* fake prog for slaves eg. exportfs */
+ Osenv* env; /* effective operating system environment */
+ Osenv defenv; /* default env for slaves with no prog */
+ osjmpbuf privstack; /* private stack for making new kids */
+ osjmpbuf sharestack;
+ Proc *kid;
+ void *kidsp;
+ void *os; /* host os specific data */
+};
+
+#define poperror() up->nerr--
+#define waserror() (up->nerr++, ossetjmp(up->estack[up->nerr-1]))
+
+enum
+{
+ /* kproc flags */
+ KPDUPPG = (1<<0),
+ KPDUPFDG = (1<<1),
+ KPDUPENVG = (1<<2),
+ KPX11 = (1<<8), /* needs silly amount of stack */
+ KPDUP = (KPDUPPG|KPDUPFDG|KPDUPENVG)
+};
+
+struct Procs
+{
+ Lock l;
+ Proc* head;
+ Proc* tail;
+};
+
+struct Rootdata
+{
+ int dotdot;
+ void *ptr;
+ int size;
+ int *sizep;
+};
+
+extern Dev* devtab[];
+extern char *ossysname;
+extern char *eve;
+extern Queue* kbdq;
+extern Queue* gkbdq;
+extern Queue* gkscanq;
+extern int Xsize;
+extern int Ysize;
+extern Pool* mainmem;
+extern char rootdir[MAXROOT]; /* inferno root */
+extern Procs procs;
+extern int sflag;
+extern int xtblbit;
+extern int globfs;
+extern int greyscale;
+extern uint qiomaxatomic;
+
+/*
+ * floating point control and status register masks
+ */
+enum
+{
+ INVAL = 0x0001,
+ ZDIV = 0x0002,
+ OVFL = 0x0004,
+ UNFL = 0x0008,
+ INEX = 0x0010,
+ RND_NR = 0x0000,
+ RND_NINF = 0x0100,
+ RND_PINF = 0x0200,
+ RND_Z = 0x0300,
+ RND_MASK = 0x0300
+};
+
+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 */
+};
+
+/* 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 type "I" uchar*
+#pragma varargck type "E" uchar*
+
+extern void (*mainmonitor)(int, void*, ulong);