From 61040d288c136254e5258c89737a9911ef228224 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 22 Jan 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-01-22 --- gnot/dat.h | 1 + gnot/fns.h | 4 ++-- gnot/main.c | 14 +++++-------- pc/fns.h | 4 ++-- pc/main.c | 4 ++-- port/devkprof.c | 53 ++++++++++++++++++++++++++++++++++--------------- port/error.h | 2 +- port/portfns.h | 2 -- port/proc.c | 5 ++--- power/fns.h | 4 ++-- 10 files changed, 54 insertions(+), 39 deletions(-) diff --git a/gnot/dat.h b/gnot/dat.h index d0c13e294ae6d514b71a9c9ee577bb2fa4c8da42..c2604a40517c1a217dd8fe32a0f93ef07aa2e77d 100644 --- a/gnot/dat.h +++ b/gnot/dat.h @@ -178,6 +178,7 @@ struct User { Proc *p; FPsave fpsave; /* address of this is known by vdb */ + uchar balusave[64]; /* #include botch */ int nerrlab; Label errlab[NERR]; char error[ERRLEN]; diff --git a/gnot/fns.h b/gnot/fns.h index d716717da3652788b8b76119c85f4efee3efdff8..8201663f09f661b886b7a1542f73e0a5318f00d5 100644 --- a/gnot/fns.h +++ b/gnot/fns.h @@ -31,8 +31,8 @@ void mmuinit(void); void mousebuttons(int); void mouseclock(void); int portprobe(char*, int, int, int, long); -void procrestore(Proc*, uchar*); -void procsave(uchar*, int); +void procrestore(Proc*); +void procsave(Proc*); void procsetup(Proc*); void putkmmu(ulong, ulong); void restartprint(Alarm*); diff --git a/gnot/main.c b/gnot/main.c index 2939c3013c280ae73e379ed01106445dead17f0f..f6cedbfb57f8a900080c3763ed6347efc3b6c743 100644 --- a/gnot/main.c +++ b/gnot/main.c @@ -303,13 +303,10 @@ procsetup(Proc *p) * Save the part of the process state. */ void -procsave(uchar *state, int len) +procsave(Proc *p) { - Balu *balu; + Balu *balu = (Balu *)u->balusave; - if(len < sizeof(Balu)) - panic("save state too small"); - balu = (Balu *)state; fpsave(&u->fpsave); if(u->fpsave.type){ if(u->fpsave.size > sizeof u->fpsave.junk) @@ -332,11 +329,10 @@ procsave(uchar *state, int len) * Procsave() makes sure that what state points to is long enough */ void -procrestore(Proc *p, uchar *state) +procrestore(Proc *p) { - Balu *balu; + Balu *balu = (Balu *)u->balusave; - balu = (Balu *)state; if(p->fpstate != m->fpstate){ if(p->fpstate == FPinit){ u->p->fpstate = FPinit; @@ -349,7 +345,7 @@ procrestore(Proc *p, uchar *state) } } if(balu->cr0 != 0xFFFFFFFF) /* balu busy */ - memmove(BALU, balu, sizeof balu); + memmove(BALU, balu, sizeof BALU); } void diff --git a/pc/fns.h b/pc/fns.h index 8d04c80a43d54ce727afaf8018eaa1ed176f38e6..91f965c32383b8120e9ec02efa0039aee23acdcc 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -42,8 +42,8 @@ void pmulights(int); int pmumodem(int); int pmuserial(int); void prhex(ulong); -void procrestore(Proc*, uchar*); -void procsave(uchar*, int); +void procrestore(Proc*); +void procsave(Proc*); void procsetup(Proc*); void putgdt(Segdesc*, int); void putidt(Segdesc*, int); diff --git a/pc/main.c b/pc/main.c index 640947dd32a303907df953c7f5542041a5fb09da..af52c58eeb57e53b1bba4f7b59abb7bf38184288 100644 --- a/pc/main.c +++ b/pc/main.c @@ -333,7 +333,7 @@ procsetup(Proc *p) * Save the mach dependent part of the process state. */ void -procsave(uchar *state, int len) +procsave(Proc *p) { if(u->p->fpstate == FPactive){ fpsave(&u->fpsave); @@ -345,7 +345,7 @@ procsave(uchar *state, int len) * Restore what procsave() saves */ void -procrestore(Proc *p, uchar *state) +procrestore(Proc *p) { } diff --git a/port/devkprof.c b/port/devkprof.c index 9a929af064a2d615445c53ce6d77266819987dda..2d8eb5d3543e68807d1f4d381f4c9516b248fc3d 100644 --- a/port/devkprof.c +++ b/port/devkprof.c @@ -8,6 +8,7 @@ #include "devtab.h" #define LRES 3 /* log of PC resolution */ +#define SZ 4 /* sizeof of count cell; well known as 4 */ struct { @@ -35,11 +36,16 @@ void kproftimer(ulong); void kprofreset(void) { + ulong n; + kprof.minpc = KTZERO; kprof.maxpc = (ulong)&etext; kprof.nbuf = (kprof.maxpc-kprof.minpc) >> LRES; - kprof.buf = ialloc(conf.nmach * kprof.nbuf*sizeof kprof.buf[0], 0); - kproftab[0].length = conf.nmach * kprof.nbuf*sizeof kprof.buf[0]; + n = kprof.nbuf*SZ; + kprof.buf = ialloc(n, 0); + kproftab[0].length = n; + if(SZ != sizeof kprof.buf[0]) + panic("kprof size"); } void @@ -111,24 +117,41 @@ kprofclose(Chan *c) } long -kprofread(Chan *c, void *a, long n, ulong offset) +kprofread(Chan *c, void *va, long n, ulong offset) { ulong end; - switch((int)(c->qid.path&~CHDIR)){ + ulong w, *bp; + uchar *a, *ea; + + switch(c->qid.path & ~CHDIR){ case Kprofdirqid: - return devdirread(c, a, n, kproftab, Nkproftab, devgen); + return devdirread(c, va, n, kproftab, Nkproftab, devgen); + case Kprofdataqid: - end = conf.nmach * kprof.nbuf*sizeof kprof.buf[0]; + end = kprof.nbuf*SZ; + if(offset & (SZ-1)) + error(Ebadarg); if(offset >= end){ n = 0; break; } if(offset+n > end) n = end-offset; - memmove(a, ((char *)kprof.buf)+offset, n); + n &= ~(SZ-1); + a = va; + ea = a + n; + bp = kprof.buf + offset/SZ; + while(a < ea){ + w = *bp++; + *a++ = w>>24; + *a++ = w>>16; + *a++ = w>>8; + *a++ = w>>0; + } break; + default: - n=0; + n = 0; break; } return n; @@ -140,7 +163,7 @@ kprofwrite(Chan *c, char *a, long n, ulong offset) switch((int)(c->qid.path&~CHDIR)){ case Kprofctlqid: if(strncmp(a, "startclr", 8) == 0){ - memset((char *)kprof.buf, 0, conf.nmach * kprof.nbuf*sizeof kprof.buf[0]); + memset((char *)kprof.buf, 0, kprof.nbuf*SZ); kprof.time = 1; }else if(strncmp(a, "start", 5) == 0) kprof.time = 1; @@ -157,23 +180,21 @@ void kproftimer(ulong pc) { extern void spldone(void); - ulong *buf; if(kprof.time == 0) return; /* - * if the pc is coming out of slplo pr splx, then use - * the pc saved when we went splhi. + * if the pc is coming out of slplo pr splx, + * use the pc saved when we went splhi. */ if(pc>=(ulong)spllo && pc<=(ulong)spldone) pc = m->splpc; - buf = kprof.buf+kprof.nbuf*m->machno; - buf[0] += TK2MS(1); + kprof.buf[0] += TK2MS(1); if(kprof.minpc<=pc && pc>= LRES; - buf[pc] += TK2MS(1); + kprof.buf[pc] += TK2MS(1); } else - buf[1] += TK2MS(1); + kprof.buf[1] += TK2MS(1); } diff --git a/port/error.h b/port/error.h index 3ef4c7ca67eef2fc71e519ee4acd6b4de52d8838..3fb3f8ca275626f18c3d5adfc217eb74b0bf5c71 100644 --- a/port/error.h +++ b/port/error.h @@ -45,7 +45,7 @@ extern char Enovmem[]; /* virtual memory allocation failed */ extern char Ebadld[]; /* illegal line discipline */ extern char Ebadfd[]; /* fd out of range or not open */ extern char Eisstream[]; /* seek on a stream */ -extern char Ebadexec[]; /* a.out header invalid */ +extern char Ebadexec[]; /* exec header invalid */ extern char Etimedout[]; /* connection timed out */ extern char Econrefused[]; /* connection refused */ extern char Enetunreach[]; /* network unreachable */ diff --git a/port/portfns.h b/port/portfns.h index 5471c2598712fd4b1c78087486005d9247995127..f45bc6dec17a3ad28d8856b7c0ef7d800f3f7aa1 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -1,4 +1,3 @@ - Alarm* alarm(int, void (*)(Alarm*), void*); void alarminit(void); Block* allocb(ulong); @@ -149,7 +148,6 @@ void nullput(Queue*, Block*); int openmode(ulong); Block* padb(Block*, int); void pageinit(void); -int pagemeis0(void*); void panic(char*, ...); void pexit(char*, int); void pgrpcpy(Pgrp*, Pgrp*); diff --git a/port/proc.c b/port/proc.c index 1be929e40f261b562ee0a8834e4ac668f5cc064d..10c31795827b607adddf0408479ae22fcded7283 100644 --- a/port/proc.c +++ b/port/proc.c @@ -94,19 +94,18 @@ schedinit(void) /* never returns */ void sched(void) { - uchar procstate[64]; Proc *p; if(u){ splhi(); m->cs++; - procsave(procstate, sizeof(procstate)); + procsave(u->p); if(setlabel(&u->p->sched)){ /* woke up */ p = u->p; p->state = Running; p->mach = m; m->proc = p; - procrestore(p, procstate); + procrestore(p); spllo(); return; } diff --git a/power/fns.h b/power/fns.h index 3d71f263983cca0beefe293c8c56361d5d73f5fb..94b566da0810a4b37fae001f2da09497d9cab9fa 100644 --- a/power/fns.h +++ b/power/fns.h @@ -44,8 +44,8 @@ Block* prepend(Block*, int); void prflush(void); void printslave(void); #define procsetup(p) ((p)->fpstate = FPinit) -#define procsave(x,y) -#define procrestore(x,y) +#define procsave(p) +#define procrestore(p) void purgetlb(int); void putstlb(ulong, ulong); void putstrn(char*, long);