From 1f812259f2bec9c285a4794a2c6ee789c7316f4f Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 19 Dec 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-12-19 --- gnot/devincon.c | 23 ++++++++++------ port/devsrv.c | 71 ++++++++++++++++++++++++++++++------------------- port/fault.c | 4 +-- port/segment.c | 2 -- port/stil.c | 2 +- port/stip.c | 2 +- port/sysproc.c | 6 ++++- 7 files changed, 66 insertions(+), 44 deletions(-) diff --git a/gnot/devincon.c b/gnot/devincon.c index f277cb4845dc6820d3e3843cab7685cbb99f9bc6..2abfb821954e970aa81e02b2594493e7fcd4f7c5 100644 --- a/gnot/devincon.c +++ b/gnot/devincon.c @@ -436,8 +436,21 @@ inconwstat(Chan *c, char *dp) * the stream routines */ +/* + * for sleeping while kproc dies + */ +static int +kNotliving(void *arg) +{ + Incon *ip; + + ip = (Incon *)arg; + return ip->kstarted == 0; +} + /* * create the kernel process for input + * first wait for any old ones to die */ static void inconstopen(Queue *q, Stream *s) @@ -448,6 +461,8 @@ inconstopen(Queue *q, Stream *s) ip = &incon[s->dev]; sprint(name, "incon%d", s->dev); q->ptr = q->other->ptr = ip; + wakeup(&ip->kr); + sleep(&ip->r, kNotliving, ip); ip->rq = q; kproc(name, inconkproc, ip); } @@ -455,14 +470,6 @@ inconstopen(Queue *q, Stream *s) /* * kill off the kernel process */ -static int -kNotliving(void *arg) -{ - Incon *ip; - - ip = (Incon *)arg; - return ip->kstarted == 0; -} static void inconstclose(Queue * q) { diff --git a/port/devsrv.c b/port/devsrv.c index 92a10e425f31825a34114d64f43cb7963e8e8d73..6673dee756a8abf3f910b953d814a4bb4409e764 100644 --- a/port/devsrv.c +++ b/port/devsrv.c @@ -9,19 +9,27 @@ typedef struct Srv Srv; struct Srv{ - Lock; - char *name; - Chan **chan; -}srv; + char name[NAMELEN]; + char owner[NAMELEN]; + ulong perm; + Chan *chan; +}; + +Lock srvlk; +Srv *srv; int srvgen(Chan *c, Dirtab *tab, int ntab, int s, Dir *dp) { + Srv *sp; + if(s >= conf.nsrv) return -1; - if(srv.chan[s] == 0) + + sp = &srv[s]; + if(sp->chan == 0) return 0; - devdir(c, (Qid){s, 0}, &srv.name[s*NAMELEN], 0, eve, 0666, dp); + devdir(c, (Qid){s, 0}, sp->name, 0, sp->owner, sp->perm, dp); return 1; } @@ -33,8 +41,7 @@ srvinit(void) void srvreset(void) { - srv.chan = ialloc(conf.nsrv*sizeof(Chan*), 0); - srv.name = ialloc(conf.nsrv*NAMELEN, 0); + srv = ialloc(conf.nsrv*sizeof(Srv), 0); } Chan * @@ -74,12 +81,12 @@ srvopen(Chan *c, int omode) c->offset = 0; return c; } - lock(&srv); + lock(&srvlk); if(waserror()){ - unlock(&srv); + unlock(&srvlk); nexterror(); } - f = srv.chan[c->qid.path]; + f = srv[c->qid.path].chan; if(f == 0) error(Eshutdown); if(omode&OTRUNC) @@ -88,7 +95,7 @@ srvopen(Chan *c, int omode) error(Eperm); close(c); incref(f); - unlock(&srv); + unlock(&srvlk); poperror(); return f; } @@ -97,28 +104,35 @@ void srvcreate(Chan *c, char *name, int omode, ulong perm) { int j, i; + Srv *sp; if(omode != OWRITE) error(Eperm); - lock(&srv); + + lock(&srvlk); if(waserror()){ - unlock(&srv); + unlock(&srvlk); nexterror(); } j = -1; for(i=0; ichan = c; + unlock(&srvlk); poperror(); - strcpy(&srv.name[j*NAMELEN], name); + strncpy(sp->name, name, NAMELEN); + strncpy(sp->owner, u->p->user, NAMELEN); + sp->perm = perm&0777; + c->qid.path = j; c->flag |= COPEN; c->mode = OWRITE; @@ -131,18 +145,19 @@ srvremove(Chan *c) if(c->qid.path == CHDIR) error(Eperm); - lock(&srv); + + lock(&srvlk); if(waserror()){ - unlock(&srv); + unlock(&srvlk); nexterror(); } - f = srv.chan[c->qid.path]; + f = srv[c->qid.path].chan; if(f == 0) error(Eshutdown); - if(strcmp(&srv.name[c->qid.path*NAMELEN], "boot") == 0) + if(strcmp(srv[c->qid.path].name, "boot") == 0) error(Eperm); - srv.chan[c->qid.path] = 0; - unlock(&srv); + srv[c->qid.path].chan = 0; + unlock(&srvlk); poperror(); close(f); } @@ -175,7 +190,7 @@ srvwrite(Chan *c, void *va, long n, ulong offset) char buf[32]; i = c->qid.path; - if(srv.chan[i] != c) /* already been written to */ + if(srv[i].chan != c) /* already been written to */ error(Egreg); if(n >= sizeof buf) error(Egreg); @@ -185,8 +200,8 @@ srvwrite(Chan *c, void *va, long n, ulong offset) f = u->p->fgrp; lock(f); fdtochan(fd, -1, 0); /* error check only */ - srv.chan[i] = f->fd[fd]; - incref(srv.chan[i]); + srv[i].chan = f->fd[fd]; + incref(srv[i].chan); unlock(f); return n; } diff --git a/port/fault.c b/port/fault.c index 860a6edee3c7b68cc5a2a760a862e5afee91865b..c355b442a6654a39ac408268ffd388ef72384197 100644 --- a/port/fault.c +++ b/port/fault.c @@ -280,9 +280,7 @@ validaddr(ulong addr, ulong len, int write) } } - pprint("invalid address %lux in sys call pc %lux sp %lux\n", - addr, ((Ureg*)UREGADDR)->pc, ((Ureg*)UREGADDR)->sp); - + pprint("invalid address 0x%lux in sys call pc=0x%lux", addr, ((Ureg*)UREGADDR)->pc); postnote(u->p, 1, "sys: bad address", NDebug); error(Ebadarg); } diff --git a/port/segment.c b/port/segment.c index 80c874b9cfd44d6739031d134493716518a8ab7b..2e0400e33e0438c8a46741b6beb3e6d36e72ffc6 100644 --- a/port/segment.c +++ b/port/segment.c @@ -6,8 +6,6 @@ #include "ureg.h" #include "errno.h" -#define DPRINT - Page *lkpage(ulong addr); Page *snewpage(ulong addr); void lkpgfree(Page*); diff --git a/port/stil.c b/port/stil.c index 73860b49571b41b5974a4c94478c7a309af6130d..7f7995273570c490035459e4dfd70bb61d1d7ccb 100644 --- a/port/stil.c +++ b/port/stil.c @@ -65,7 +65,7 @@ ilopen(Queue *q, Stream *s) ipc = &ipconv[s->dev][s->id]; ipc->ipinterface = newipifc(IP_ILPROTO, ilrcvmsg, ipconv[s->dev], - 1500, 512, ETHER_HDR, "IL"); + 1500, 60, ETHER_HDR, "IL"); ipc->readq = RD(q); RD(q)->ptr = (void *)ipc; diff --git a/port/stip.c b/port/stip.c index 85368906e595fb45f532c8ca9e8b407cb4b42838..8fa87975d657e2bb4e02a9336e199114dcc91f88 100644 --- a/port/stip.c +++ b/port/stip.c @@ -228,7 +228,7 @@ ipetheroput(Queue *q, Block *bp) if(eh->frag[0] & (IP_DF>>8)) goto drop; - seglen = (ifp->minmtu - (ETHER_HDR+ETHER_IPHDR)) & ~7; + seglen = (ifp->maxmtu - (ETHER_HDR+ETHER_IPHDR)) & ~7; if(seglen < 8) goto drop; diff --git a/port/sysproc.c b/port/sysproc.c index 03f2961222745d0642540174d660e66a286368ba..73564e08aeed26bc984a36ded727126e3a140f69 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -397,7 +397,11 @@ return0(void *a) long syssleep(ulong *arg) { - tsleep(&u->p->sleep, return0, 0, arg[0]); + if(arg[0] == 0) + sched(); + else + tsleep(&u->p->sleep, return0, 0, arg[0]); + return 0; }