~kris/9p

9hist

6b4b62d8458322cf02775059cf746a08a0581dd1 — David du Colombier 34 years ago cdc029f
Plan 9 from Bell Labs 1991-10-07
9 files changed, 32 insertions(+), 28 deletions(-)

M gnot/clock.c
M gnot/fns.h
M gnot/lib.h
M pc/fns.h
M port/devkprof.c
M port/proc.c
M power/fns.h
M ss/fns.h
M ss/mmu.c
M gnot/clock.c => gnot/clock.c +1 -0
@@ 35,6 35,7 @@ clock(Ureg *ur)
	kbdclock();
	mouseclock();
	duartclock();
	kproftimer(ur->pc);
	if((ur->sr&SPL(7)) == 0 && p && p->state==Running){
		if(anyready()){
			if(p->hasspin)

M gnot/fns.h => gnot/fns.h +0 -1
@@ 17,7 17,6 @@ void	fault68020(Ureg*, FFrame*);
#define	flushapage(x)
void	flushcpucache(void);
#define	flushpage(x) if(x)
#define	flushvirt()
int	fpcr(int);
void	fpregrestore(char*);
void	fpregsave(char*);

M gnot/lib.h => gnot/lib.h +3 -1
@@ 22,6 22,7 @@ extern	char	*strncat(char*, char*, long);
extern	char	*strncpy(char*, char*, long);
extern	int	strncmp(char*, char*, long);
extern	long	strlen(char*);
extern	int	atoi(char*);

/*
 * print routines


@@ 53,8 54,9 @@ extern	int	print(char*, ...);
 */
extern	long	strtol(char*, char**, int);
extern	ulong	strtoul(char*, char**, int);
extern	long	etext;
extern	long	edata;
extern	long	end;

/*
 * Syscall data structures
 */

M pc/fns.h => pc/fns.h +0 -1
@@ 13,7 13,6 @@ void	fault386(Ureg*);
void	faultinit(void);
void	fclock(Ureg*);
void	fclockinit(void);
#define	flushvirt();
void	fpinit(void);
void	fpoff(void);
void	fprestore(FPsave*);

M port/devkprof.c => port/devkprof.c +3 -3
@@ 160,11 160,11 @@ kproftimer(ulong pc)
	if(pc>=(ulong)spllo && pc<=(ulong)spldone)
		pc = m->splpc;

	kprof.buf[0]++;
	kprof.buf[0] += TK2MS(1);
	if(kprof.minpc<=pc && pc<kprof.maxpc){
		pc -= kprof.minpc;
		pc >>= LRES;
		kprof.buf[pc]++;
		kprof.buf[pc] += TK2MS(1);
	} else
		kprof.buf[1]++;
		kprof.buf[1] += TK2MS(1);
}

M port/proc.c => port/proc.c +0 -1
@@ 560,7 560,6 @@ pexit(char *exitstr, int freemem)
	if(!freemem)
		addbroken(c);

	flushvirt();
	es = &c->seg[NSEG];
	for(s = c->seg; s < es; s++)
		if(os = *s) {

M power/fns.h => power/fns.h +0 -1
@@ 22,7 22,6 @@ void	faultmips(Ureg*, int, int);
ulong	fcr31(void);
void	flushmmu(void);
#define	flushpage(s)	icflush((void*)(s), BY2PG)
#define	flushvirt()
void	gettlb(int, ulong*);
ulong	gettlbvirt(int);
void	gotopc(ulong);

M ss/fns.h => ss/fns.h +0 -1
@@ 10,7 10,6 @@ void	faultasync(Ureg*);
void	faultsparc(Ureg*);
void	flushcpucache(void);
#define	flushpage(x)
#define	flushvirt()	flushmmu()
int	fpcr(int);
void	fpregrestore(char*);
void	fpregsave(char*);

M ss/mmu.c => ss/mmu.c +25 -19
@@ 23,6 23,7 @@ struct
int	newpid(Proc*);
void	purgepid(int);
void	flushcontext(void);
void	putpmegnf(ulong, ulong);

int	pidtime[NTLBPID];	/* should be per m */



@@ 36,12 37,7 @@ mapstack(Proc *p)
	ulong tlbphys;

	if(p->newtlb) {
		flushcontext();
		tp = u->p->pidonmach[m->machno];
		if(tp)
			pidtime[tp] = 0;
		/* easiest is to forget what pid we had.... */
		memset(u->p->pidonmach, 0, sizeof u->p->pidonmach);
		mmurelease(p);
		p->newtlb = 0;
	}



@@ 55,16 51,22 @@ mapstack(Proc *p)
	tlbphys = PPN(p->upage->pa)|PTEVALID|PTEWRITE|PTEKERNEL|PTEMAINMEM;
	putcontext(tp-1);
	/*
	 * shouldn't need putpmeg because nothing has been mapped at
	 * USERADDR in this context except this page.  however, it crashes.
	 * Don't need to flush cache because no other page has been
	 * mapped at USERADDR in this context; can call putpmegnf.
	 */
	putpmeg(USERADDR, tlbphys);
	putpmegnf(USERADDR, tlbphys);
	u = (User*)USERADDR;
}

void
mmurelease(Proc *p)
{
	int tp;

	tp = p->pidonmach[m->machno];
	if(tp)
		pidtime[tp] = 0;
	/* easiest is to forget what pid we had.... */
	memset(p->pidonmach, 0, sizeof p->pidonmach);
}



@@ 80,7 82,7 @@ newpid(Proc *p)

	t = ~0;
	i = 1+((m->ticks)&(NCONTEXT-1));	/* random guess */
	for(j=1; j<NTLBPID; j++)
	for(j=1; t && j<NTLBPID; j++)
		if(pidtime[j] < t){
			i = j;
			t = pidtime[j];


@@ 105,7 107,7 @@ newpid(Proc *p)
		putsegm(UZERO+j*BY2SEGM, INVALIDPMEG);
	putsegm(TSTKTOP-BY2SEGM, kmapalloc.lowpmeg+NKLUDGE*i+(NKLUDGE-1));
	for(j=0; j<PG2SEGM; j++)
		putpmeg((TSTKTOP-BY2SEGM)+j*BY2PG, INVALIDPTE);
		putpmegnf((TSTKTOP-BY2SEGM)+j*BY2PG, INVALIDPTE);
	return i+1;
}



@@ 242,7 244,7 @@ print("putmmu %lux %d %s\n", tlbvirt, seg, p->text);
	for(j=p->nmmuseg; j<=seg; j++){
		putsegm(l, kmapalloc.lowpmeg+tp+j);
		for(k=0; k<PG2SEGM; k++,l+=BY2PG)
			putpmeg(l, INVALIDPTE);
			putpmegnf(l, INVALIDPTE);
	}
	p->nmmuseg = seg+1;
    put:


@@ 267,18 269,22 @@ putpmeg(ulong virt, ulong phys)
}

void
putpmegnf(ulong virt, ulong phys)	/* no need to flush */
{
	virt &= VAMASK;
	virt &= ~(BY2PG-1);
	putw4(virt, phys);
}

int nflushmmu;
void
flushmmu(void)
{
	int tp;

nflushmmu++;
	splhi();
	flushcontext();
	tp = u->p->pidonmach[m->machno];
	if(tp)
		pidtime[tp] = 0;
	/* easiest is to forget what pid we had.... */
	memset(u->p->pidonmach, 0, sizeof u->p->pidonmach);
	/* ....then get a new one by trying to map our stack */
	u->p->newtlb = 1;
	mapstack(u->p);
	spllo();
}