From 37da2899f40661e3e9631e497da8dc59b971cbd0 Mon Sep 17 00:00:00 2001 From: "Charles.Forsyth" Date: Fri, 22 Dec 2006 17:07:39 +0000 Subject: 20060303a --- emu/port/dat.h | 512 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 512 insertions(+) create mode 100644 emu/port/dat.h (limited to 'emu/port/dat.h') 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<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<mnthash[(qid).path&((1<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); -- cgit v1.2.3