~kris/9p

9hist

d816200d503406772ac1b6901e3878c346a52ad1 — David du Colombier 24 years ago 822b942
Plan 9 from Bell Labs 2002-01-24
7 files changed, 40 insertions(+), 33 deletions(-)

M mtx/fns.h
M mtx/l.s
M mtx/main.c
M mtx/mmu.c
M mtx/trap.c
M pc/ether8139.c
M port/sysproc.c
M mtx/fns.h => mtx/fns.h +0 -1
@@ 18,7 18,6 @@ void	evenaddr(ulong);
void	faultpower(Ureg*, ulong addr, int read);
void	firmware(void);
void	fpinit(void);
void	fpoff(Proc*);
void	fprestore(FPsave*);
void	fpsave(FPsave*);
void	fptrap(Ureg*);

M mtx/l.s => mtx/l.s +1 -1
@@ 416,7 416,7 @@ TEXT	trapvec(SB), $-4
ktrap:
	MOVW	R1, CR
	MOVW	SPR(SAVER1), R1
	RLWNM	$0, R1, $~KZERO, R1		/* PADDR(m->proc->kstack) */
	RLWNM	$0, R1, $~KZERO, R1		/* PADDR(R1) */
	SUB	$UREGSPACE, R1
	BL	saveureg(SB)
	BL	trap(SB)

M mtx/main.c => mtx/main.c +2 -4
@@ 55,9 55,8 @@ machinit(void)
	 */
	m->loopconst = 100000;

	/* turn on caches (instruction only for now) */
//	puthid0(gethid0() | BIT(16));
puthid0(gethid0() | BIT(16) | BIT(17));	/* and data */
	/* turn on caches */
	puthid0(gethid0() | BIT(16) | BIT(17));

	active.machs = 1;
	active.exiting = 0;


@@ 262,7 261,6 @@ procsave(Proc *p)
	if(p->fpstate == FPactive){
		if(p->state != Moribund)
			fpsave(&up->fpsave);
//		fpoff(p);
		p->fpstate = FPinactive;
	}
}

M mtx/mmu.c => mtx/mmu.c +17 -6
@@ 20,6 20,8 @@ static struct {
	ulong	size;			/* number of bytes in page table */
	ulong	mask;		/* hash mask */
	int		slotgen;		/* next pte (byte offset) when pteg is full */

	int		pidlock;
	int		pidgen;		/* next mmu pid to use */
} ptab;



@@ 75,6 77,12 @@ mmuswitch(Proc *p)
{
	int i, mp;

	if(p->kp) {
		for(i = 0; i < 8; i++)
			putsr(i<<28, 0);
		return;
	}

	if(p->newtlb) {
		p->mmupid = 0;
		p->newtlb = 0;


@@ 113,13 121,13 @@ putmmu(ulong va, ulong pa, Page *pg)
	p = (ulong*)pteg;
	ep = (ulong*)(pteg+BY2PTEG);
	q = nil;
	lock(&ptab);
	ilock(&ptab);
	tlbflush(va);
	while(p < ep) {
		x = p[0];
		if(x == ptehi) {
			q = p;
if(q[1] == pa) panic("putmmu already set pte");
if(q[1] == pa) print("putmmu already set pte\n");
			break;
		}
		if(q == nil && (x & BIT(0)) == 0)


@@ 133,7 141,7 @@ if(q[1] == pa) panic("putmmu already set pte");
	q[0] = ptehi;
	q[1] = pa;
	sync();
	unlock(&ptab);
	iunlock(&ptab);

	ctl = &pg->cachectl[m->machno];
	switch(*ctl) {


@@ 156,11 164,14 @@ newmmupid(void)
{
	int pid;

	lock(&ptab);
	/* can't use lock() here as we're called from within sched() */
	while(!tas(&ptab.pidlock))
		;
	pid = ptab.pidgen++;
	unlock(&ptab);
	if(pid > PIDMAX)
		panic("newmmupid");
		pid = PIDBASE;
	ptab.pidlock = 0;
	coherence();
	up->mmupid = pid;
	return pid;
}

M mtx/trap.c => mtx/trap.c +17 -20
@@ 313,12 313,10 @@ faultpower(Ureg *ureg, ulong addr, int read)
	user = (ureg->srr1 & MSR_PR) != 0;
	insyscall = up->insyscall;
	up->insyscall = 1;
	spllo();
	n = fault(addr, read);
	if(n < 0){
		if(!user){
			dumpregs(ureg);
//			_dumpstack(ureg);
			panic("fault: 0x%lux", addr);
		}
		sprint(buf, "sys: trap: fault %s addr=0x%lux", read? "read" : "write", addr);


@@ 427,16 425,6 @@ fpexcname(Ureg *ur, ulong fpscr, char *buf)
	return buf;
}

void
fpoff(Proc *p)
{
	Ureg *ur;

	ur = p->dbgreg;
	if(ur != nil)
		ur->srr1 &= ~MSR_FP;
}

/*
 * Fill in enough of Ureg to get a stack trace, and call a function.
 * Used by debugging interface rdb.


@@ 462,19 450,30 @@ callwithureg(void (*fn)(Ureg*))
static void
_dumpstack(Ureg *ureg)
{
	ulong l, v;
	ulong l, sl, el, v;
	int i;

	if(up == 0)
	l = (ulong)&l;
	if(up == 0){
		el = (ulong)m+BY2PG;
		sl = el-KSTACK;
	}
	else{
		sl = (ulong)up->kstack;
		el = sl + KSTACK;
	}
	if(l > el || l < sl){
		el = (ulong)m+BY2PG;
		sl = el-KSTACK;
	}
	if(l > el || l < sl)
		return;

	print("ktrace /kernel/path %.8lux %.8lux %.8lux\n", ureg->pc, ureg->sp, ureg->lr);
	i = 0;
	for(l=(ulong)&l; l<(ulong)(up->kstack+KSTACK); l+=4){
	for(; l < el; l += 4){
		v = *(ulong*)l;
		if(KTZERO < v && v < (ulong)etext){
			print("%.8lux=%.8lux ", l, v);
//delay(1);
			if(i++ == 4){
				print("\n");
				i = 0;


@@ 494,9 493,9 @@ dumpregs(Ureg *ur)
{
	int i;
	ulong *l;

	if(up) {
		print("registers for %s %ld\n", up->text, up->pid);
print("ur %lux\n", ur);
		if(ur->srr1 & MSR_PR == 0)
		if(ur->usp < (ulong)up->kstack || ur->usp > (ulong)up->kstack+KSTACK)
			print("invalid stack ptr\n");


@@ 741,7 740,6 @@ notify(Ureg* ur)
		qunlock(&up->debug);
		pexit(n->msg, n->flag!=NDebug);
	}
print("notify: old usp %lux\n", ur->usp);
	sp = ur->usp & ~(BY2V-1);
	sp -= sizeof(Ureg);



@@ 768,7 766,6 @@ print("notify: old usp %lux\n", ur->usp);
	up->nnote--;
	memmove(&up->lastnote, &up->note[0], sizeof(Note));
	memmove(&up->note[0], &up->note[1], up->nnote*sizeof(Note));
print("notify: usp %lux\n", ur->usp);

	qunlock(&up->debug);
	splx(s);

M pc/ether8139.c => pc/ether8139.c +1 -1
@@ 169,7 169,7 @@ enum {					/* Tsd0 */
};

enum {
	Rblen		= Rblen64K,	/* Receive BUffer Length */
	Rblen		= Rblen64K,	/* Receive Buffer Length */
	Ntd		= 4,		/* Number of Transmit Descriptors */
	Tdbsz		= ROUNDUP(sizeof(Etherpkt), 4),
};

M port/sysproc.c => port/sysproc.c +2 -0
@@ 640,6 640,8 @@ generrstr(char *buf, uint nbuf)
{
	char tmp[ERRMAX];

	if(nbuf == 0)
		error(Ebadarg);
	validaddr((ulong)buf, nbuf, 1);
	if(nbuf > sizeof tmp)
		nbuf = sizeof tmp;