From 1fd95ca6a71de3f7900bdae8fc3c03e09a0ea8f4 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 11 Nov 1994 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1994-11-11 --- boot/boot.c | 6 +- pc/devastar.c | 197 ++++++++++++++++++++++++++++++++++++++++---------- pc/main.c | 3 +- 3 files changed, 167 insertions(+), 39 deletions(-) diff --git a/boot/boot.c b/boot/boot.c index 538c37478fac35066b13ea5ad4f92957caf30922..8b9a97b8a6602686455b7f243ff63bdaa51af231 100644 --- a/boot/boot.c +++ b/boot/boot.c @@ -19,6 +19,7 @@ int mflag; int fflag; int kflag; int aflag; +int nflag; int pflag; int afd = -1; @@ -65,6 +66,9 @@ boot(int argc, char *argv[]) case 'k': kflag = 1; break; + case 'n': + nflag = 1; + break; case 'm': pflag = 1; mflag = 1; @@ -125,7 +129,7 @@ boot(int argc, char *argv[]) if(mount(fd, "/", MAFTER|MCREATE, "") < 0) fatal("mount"); close(fd); - if(cpuflag == 0) + if(cpuflag == 0 && nflag == 0) newkernel(); /* diff --git a/pc/devastar.c b/pc/devastar.c index 561935e9287b9ca282454b399d6bcd202b0da4f2..d1658af4619047c7b04e7a4e92e00e2a8955044e 100644 --- a/pc/devastar.c +++ b/pc/devastar.c @@ -7,7 +7,6 @@ #include "../port/error.h" #include "devtab.h" -#include "../port/netif.h" /* * Stargate's Avanstar serial board. There are ISA, EISA, microchannel @@ -215,9 +214,10 @@ struct Astar { ISAConf; int id; /* from plan9.ini */ + int nchan; /* number of channels */ + Astarchan *c; /* channels */ int ramsize; /* 16k or 256k */ GCB *gbc; /* board comm area */ - Astarchan *c; /* channels */ }; /* host per channel info */ @@ -227,27 +227,89 @@ struct Astarchan Astar *a; /* controller */ CCB *ccb; /* control block */ + int perm; /* buffers */ Queue *iq; Queue *oq; - - - /* staging areas to avoid some of the per character costs */ - uchar istage[Stagesize]; - uchar *ip; - uchar *ie; - - uchar ostage[Stagesize]; - uchar *op; - uchar *oe; }; Astar *astar[Maxcard]; -int nastar; +static int nastar; + +enum +{ + Qmem= 0, + Qdata, + Qctl, + Qstat, +}; +#define TYPE(x) ((x)&0xff) +#define BOARD(x) ((((x)&~CHDIR)>>16)&0xff) +#define CHAN(x) ((((x)&~CHDIR)>>8)&0xff) +#define QID(b,c,t) (((b)<<16)|((c)<<8)|(t)) static int astarsetup(Astar*); +int +devgen(Chan *c, Dirtab *tab, int ntab, int i, Dir *db) +{ + int dev, sofar, ch, t; + + USED(tab, ntab); + sofar = 0; + + for(dev = 0; dev < nstar; dev++){ + if(sofar == i){ + sprint(db->name, "atar%dmem", astar[dev].id); + db->qid = QID(dev, 0, Qmem); + db->mode = 0660; + break; + } + + if(i < sofar + 3*astar[dev].nchan){ + i -= sofar; + ch = i/3; + t = i%3; + switch(t){ + case 0: + sprint(db->name, "eia%d%2.2d", dev, ch); + db->mode = astar[dev]->c[ch].perm; + db->qid = QID(dev, 0, Qdata); + break; + case 1: + sprint(db->name, "eia%d%2.2dctl", dev, ch); + db->mode = astar[dev]->c[ch].perm; + db->qid = QID(dev, 0, Qctl); + break; + case 2: + sprint(db->name, "eia%d%2.2dstat", dev, ch); + db->mode = 0444; + db->qid = QID(dev, 0, Qstat); + break; + break; + } + + sofar += 1 + 3*astar[dev].nchan; + } + + if(j == nstar) + return -1; + + db->atime = seconds(); + db->mtime = kerndate; + db->hlength = 0; + db->length = length; + memmove(db->uid, eve, NAMELEN); + memmove(db->gid, eve, NAMELEN); + db->type = devchar[c->type]; + db->dev = c->dev; + if(c->flag&CMSG) + db->mode |= CHMOUNT; + + return 1; +} + void astarreset(void) { @@ -283,30 +345,6 @@ astarreset(void) } nastar++; } - - ndir = 3*nuart; - ns16552dir = xalloc(ndir * sizeof(Dirtab)); - dp = ns16552dir; - for(i = 0; i < nuart; i++){ - /* 3 directory entries per port */ - sprint(dp->name, "eia%d", i); - dp->qid.path = NETQID(i, Ndataqid); - dp->perm = 0660; - dp++; - sprint(dp->name, "eia%dctl", i); - dp->qid.path = NETQID(i, Nctlqid); - dp->perm = 0660; - dp++; - sprint(dp->name, "eia%dstat", i); - dp->qid.path = NETQID(i, Nstatqid); - dp->perm = 0444; - dp++; - } -} - -void -astarinit(void) -{ } /* isa ports an ax00i can appear at */ @@ -363,3 +401,88 @@ astarsetup(Astar *a) return 0; } + +void +astarinit(void) +{ +} + +Chan* +astarattach(char *spec) +{ + return devattach('g', spec); +} + +Chan* +astarclone(Chan *c, Chan *nc) +{ + return devclone(c, nc); +} + +int +astarwalk(Chan *c, char *name) +{ + return devwalk(c, name, 0, 0, astargen); +} + +void +astarstat(Chan *c, char *dp) +{ + devstat(c, dp, 0, 0, astargen); +} + +Chan* +astaropen(Chan *c, int omode) +{ + Uart *p; + + c = devopen(c, omode, 0, 0, astargen); + + return c; +} + +void +astarcreate(Chan *c, char *name, int omode, ulong perm) +{ + USED(c, name, omode, perm); + error(Eperm); +} + +void +astarclose(Chan *c) +{ + USED(c); +} + +long +astarread(Chan *c, void *buf, long n, ulong offset) +{ + Astar *a; + + if(c->qid.path & CHDIR) + return devdirread(c, buf, n, 0, 0, astargen); + + switch(TYPE(c->qid.path)){ + case Qmem: + a = astar[ + return qread(p->iq, buf, n); + } + + return 0; +} + +long +astarwrite(Chan *c, void *buf, long n, ulong offset) +{ + Uart *p; + + if(c->qid.path & CHDIR) + error(Eperm); + + switch(TYPE(c->qid.path)){ + case Qmem: + return qread(p->iq, buf, n); + } + + return 0; +} diff --git a/pc/main.c b/pc/main.c index 8c0b30ec938125651e54b57cdb58b9bf736b723b..7500b40ffdc146bdb8c18abd98a212faefd632a9 100644 --- a/pc/main.c +++ b/pc/main.c @@ -237,7 +237,8 @@ bootargs(ulong base) } else if(strncmp(cp, "sd!", 3) == 0){ sprint(buf, "local!#w/sd%ddisk", atoi(cp+3)); av[ac++] = pusharg(buf); - } + } else if(strncmp(cp, "e!", 2) == 0) + av[ac++] = pusharg("-n"); if(buf[0]){ cp = strchr(buf, '!'); if(cp){