~kris/9p

9hist

61040d288c136254e5258c89737a9911ef228224 — David du Colombier 34 years ago 5039de6
Plan 9 from Bell Labs 1992-01-22
10 files changed, 54 insertions(+), 39 deletions(-)

M gnot/dat.h
M gnot/fns.h
M gnot/main.c
M pc/fns.h
M pc/main.c
M port/devkprof.c
M port/error.h
M port/portfns.h
M port/proc.c
M power/fns.h
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);