M gnot/dat.h => gnot/dat.h +1 -0
@@ 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];
M gnot/fns.h => gnot/fns.h +2 -2
@@ 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*);
M gnot/main.c => gnot/main.c +5 -9
@@ 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
M pc/fns.h => pc/fns.h +2 -2
@@ 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);
M pc/main.c => pc/main.c +2 -2
@@ 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)
{
}
M port/devkprof.c => port/devkprof.c +37 -16
@@ 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<kprof.maxpc){
pc -= kprof.minpc;
pc >>= LRES;
- buf[pc] += TK2MS(1);
+ kprof.buf[pc] += TK2MS(1);
} else
- buf[1] += TK2MS(1);
+ kprof.buf[1] += TK2MS(1);
}
M port/error.h => port/error.h +1 -1
@@ 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 */
M port/portfns.h => port/portfns.h +0 -2
@@ 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*);
M port/proc.c => port/proc.c +2 -3
@@ 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;
}
M power/fns.h => power/fns.h +2 -2
@@ 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);