~kris/9p

9hist

d477c0a1a355367a90d69c2f84bf4c00f3cdb612 — David du Colombier 34 years ago 4db7c36
Plan 9 from Bell Labs 1992-01-01
13 files changed, 148 insertions(+), 70 deletions(-)

M gnot/fns.h
M pc/devuart.c
M pc/fns.h
M port/chan.c
M port/devip.c
M port/stil.c
M port/stip.c
M port/stream.c
M power/fns.h
M power/main.c
M ss/fns.h
M ss/main.c
M ss/mmu.c
M gnot/fns.h => gnot/fns.h +1 -0
@@ 60,3 60,4 @@ int	splduart(void);
int	tas(char*);
void	touser(void);
#define	waserror()	(u->nerrlab++, setlabel(&u->errlab[u->nerrlab-1]))
#define	kmapperm(x)	kmap(x)

M pc/devuart.c => pc/devuart.c +2 -0
@@ 140,6 140,8 @@ uartrts(Uart *up, int n)
void
uartbreak(Uart *up, int ms)
{
	if(ms == 0)
		ms = 200;
	uartwrreg(up, Format, Break);
	tsleep(&u->p->sleep, return0, 0, ms);
	uartwrreg(up, Format, 0);

M pc/fns.h => pc/fns.h +1 -0
@@ 62,3 62,4 @@ void	uartclock(void);
void	uartintr0(Ureg*);
void	vgainit(void);
#define	waserror()	(u->nerrlab++, setlabel(&u->errlab[u->nerrlab-1]))
#define	kmapperm(x)	kmap(x)

M port/chan.c => port/chan.c +8 -4
@@ 634,7 634,7 @@ skipslash(char *name)
	return name;
}

char isfrog[]={
char isfrog[256]={
	/*NUL*/	1, 1, 1, 1, 1, 1, 1, 1,
	/*BKS*/	1, 1, 1, 1, 1, 1, 1, 1,
	/*DLE*/	1, 1, 1, 1, 1, 1, 1, 1,


@@ 642,6 642,10 @@ char isfrog[]={
	[' ']	1,
	['/']	1,
	[0x7f]	1,
/*0x80+	  NUL*/	1, 1, 1, 1, 1, 1, 1, 1,
	/*BKS*/	1, 1, 1, 1, 1, 1, 1, 1,
	/*DLE*/	1, 1, 1, 1, 1, 1, 1, 1,
	/*CAN*/	1, 1, 1, 1, 1, 1, 1, 1,
};

void


@@ 651,7 655,7 @@ nameok(char *elem)

	eelem = elem+NAMELEN;
	while(*elem) {
		if((*elem&0x80) || isfrog[*elem])
		if(isfrog[*(uchar*)elem])
			error(Ebadchar);
		elem++;
		if(elem >= eelem)


@@ 681,8 685,8 @@ nextelem(char *name, char *elem)
			end = e;
	}
	while(name < end){
		c = *name++;
		if((c&0x80) || isfrog[c])
		c = *(uchar*)name++;
		if(isfrog[c])
			error(Ebadchar);
		*elem++ = c;
	}

M port/devip.c => port/devip.c +82 -24
@@ 683,14 683,76 @@ tcpstclose(Queue *q)
}


/* 
 * ptcl_csum - protcol checksum routine
 */
static	short	endian	= 1;
static	char*	aendian	= (char*)&endian;
#define	LITTLE	*aendian

ushort
ptcl_bsum(uchar *addr, int len)
{
	ulong losum, hisum, mdsum, x;
	ulong t1, t2;

	losum = 0;
	hisum = 0;
	mdsum = 0;

	x = 0;
	if((ulong)addr & 1) {
		if(len) {
			hisum += addr[0];
			len--;
			addr++;
		}
		x = 1;
	}
	while(len >= 16) {
		t1 = *(ushort*)(addr+0);
		t2 = *(ushort*)(addr+2);	mdsum += t1;
		t1 = *(ushort*)(addr+4);	mdsum += t2;
		t2 = *(ushort*)(addr+6);	mdsum += t1;
		t1 = *(ushort*)(addr+8);	mdsum += t2;
		t2 = *(ushort*)(addr+10);	mdsum += t1;
		t1 = *(ushort*)(addr+12);	mdsum += t2;
		t2 = *(ushort*)(addr+14);	mdsum += t1;
		mdsum += t2;
		len -= 16;
		addr += 16;
	}
	while(len >= 2) {
		mdsum += *(ushort*)addr;
		len -= 2;
		addr += 2;
	}
	if(x) {
		if(len)
			losum += addr[0];
		if(LITTLE)
			losum += mdsum;
		else
			hisum += mdsum;
	} else {
		if(len)
			hisum += addr[0];
		if(LITTLE)
			hisum += mdsum;
		else
			losum += mdsum;
	}

	losum += hisum >> 8;
	losum += (hisum & 0xff) << 8;
	while(hisum = losum>>16)
		losum = hisum + (losum & 0xffff);

	return losum & 0xffff;
}

ushort
ptcl_csum(Block *bp, int offset, int len)
{
	uchar *addr;
	ulong losum = 0, hisum = 0;
	ulong losum, hisum;
	ushort csum;
	int odd, blen, x;



@@ 704,26 766,24 @@ ptcl_csum(Block *bp, int offset, int len)

	addr = bp->rptr + offset;
	blen = BLEN(bp) - offset;

	if(bp->next == 0)
		return ~ptcl_bsum(addr, MIN(len, blen)) & 0xffff;

	losum = 0;
	hisum = 0;

	odd = 0;
	while(len) {
		if(odd) {
			losum += *addr++;
			blen--;
			len--;
			odd = 0;
		}
		for(x = MIN(len, blen); x > 1; x -= 2) {
			hisum += addr[0];
			losum += addr[1];
			len -= 2;
			blen -= 2;
			addr += 2;
		}
		if(blen && x) {
			odd = 1;
			hisum += addr[0];
			len--;
		}
		x = MIN(len, blen);
		csum = ptcl_bsum(addr, x);
		if(odd)
			hisum += csum;
		else
			losum += csum;
		odd = (odd+x) & 1;
		len -= x;

		bp = bp->next;
		if(bp == 0)
			break;


@@ 736,8 796,6 @@ ptcl_csum(Block *bp, int offset, int len)
	while((csum = losum>>16) != 0)
		losum = csum + (losum & 0xffff);

	losum &= 0xffff;

	return ~losum & 0xffff;
}


M port/stil.c => port/stil.c +6 -4
@@ 465,13 465,15 @@ ilrexmit(Ilcb *ic)
	Block *nb;
	Ilhdr *h;

	if(ic->unacked == 0)
		return;

	nb = 0;
	qlock(&ic->ackq);
	nb = copyb(ic->unacked, blen(ic->unacked));
	if(ic->unacked)
		nb = copyb(ic->unacked, blen(ic->unacked));
	qunlock(&ic->ackq);

	if(nb == 0)
		return;

	h = (Ilhdr*)nb->rptr;
	DBG("rxmit %d.", nhgetl(h->ilid));


M port/stip.c => port/stip.c +24 -25
@@ 389,19 389,23 @@ ip_reassemble(int offset, Block *bp, Etherhdr *ip)
	Ipaddr src, dst;
	ushort id;
	Block *bl, **l, *last, *prev;
	int ovlap, len, fragsize;
	int ovlap, len, fragsize, pktposn;

	src = nhgetl(ip->src);
	dst = nhgetl(ip->dst);
	id = nhgets(ip->id);

	qlock(&fraglock);
	for(f = flisthead; f; f = f->next) {
		if(f->src == src && f->dst == dst && f->id == id)
		if(f->src == src)
		if(f->dst == dst)
		if(f->id == id)
			break;
	}
	qunlock(&fraglock);

	if(!ip->tos && (offset & ~(IP_MF|IP_DF)) == 0) {
		if(f) {
		if(f != 0) {
			qlock(f);
			ipfragfree(f);
		}


@@ 415,10 419,6 @@ ip_reassemble(int offset, Block *bp, Etherhdr *ip)
	/* First fragment allocates a reassembly queue */
	if(f == 0) {
		f = ipfragallo();
		if(f == 0) {
			freeb(bp);
			return 0;
		}
		qlock(f);
		f->id = id;
		f->src = src;


@@ 475,17 475,18 @@ ip_reassemble(int offset, Block *bp, Etherhdr *ip)
		}
	}

	/* Now look for a completed queue */
	pktposn = 0;
	for(bl = f->blist; bl; bl = bl->next) {
		if(BLKFRAG(bl)->foff != pktposn)
			break;
		if((BLKIP(bl)->frag[0]&(IP_MF>>8)) == 0)
			goto complete;
		if(bl->next == 0 ||
		   BLKFRAG(bl)->foff+BLKFRAG(bl)->flen != BLKFRAG(bl->next)->foff)
			break;

		pktposn += BLKFRAG(bl)->flen;
	}
	qunlock(f);
	return 0;
	

complete:
	bl = f->blist;
	last = bl;


@@ 519,16 520,13 @@ complete:
void
ipfragfree(Fragq *frag)
{
	Block *f, *next;
	Fragq *fl, **l;

	for(f = frag->blist; f; f = next) {
		next = f->next;
		freeb(f);
	}
	freeb(frag->blist);

	frag->src = 0;
	frag->id = 0;
	frag->blist = 0;
	qunlock(frag);

	qlock(&fraglock);


@@ 546,8 544,6 @@ ipfragfree(Fragq *frag)
	fragfree = frag;

	qunlock(&fraglock);


}

/*


@@ 559,20 555,23 @@ ipfragallo(void)
	Fragq *f;

	qlock(&fraglock);
	if(!fragfree) {
		qunlock(&fraglock);
		print("ipfragallo: no queue\n");
		return 0;
	while(fragfree == 0) {
		for(f = flisthead; f; f = f->next)
			if(canqlock(f)) {
				qunlock(&fraglock);
				ipfragfree(f);
				break;
			}
		qlock(&fraglock);
	}
	f = fragfree;
	fragfree = f->next;
	f->next = flisthead;
	flisthead = f;
	f->age = TK2MS(MACHP(0)->ticks)/1000 + 600;
	f->age = TK2MS(MACHP(0)->ticks) + 30000;

	qunlock(&fraglock);
	return f;

}

/*

M port/stream.c => port/stream.c +1 -1
@@ 116,7 116,7 @@ newblock(Bclass *bcp)
	uchar *cp;

	page = newpage(1, 0, 0);
	page->va = VA(kmap(page));
	page->va = VA(kmapperm(page));
	if(bcp == bclass){
		/*
		 *  create some level zero blocks and return

M power/fns.h => power/fns.h +1 -0
@@ 69,3 69,4 @@ void	vector80(void);
void	vmereset(void);
void	wbflush(void);
#define	waserror()	setlabel(&u->errlab[u->nerrlab++])
#define	kmapperm(x)	kmap(x)

M power/main.c => power/main.c +2 -2
@@ 561,7 561,7 @@ confinit(void)
	 *  set minimal default values
	 */
	conf.nmach = 1;
	conf.nproc = 32;
	conf.nproc = 100;
	conf.npgrp = conf.nproc / 4;
	conf.npgenv = 4 * conf.npgrp;
	conf.nenv = 4 * conf.nproc;


@@ 578,7 578,7 @@ confinit(void)
	conf.nstream = 2 * conf.nproc;
	conf.nalarm = 500;
	conf.nmount = 500;
	conf.nsrv = 3;
	conf.nsrv = 20;
	conf.nnoifc = 1;
	conf.nnoconv = 32;
	conf.nurp = 25;

M ss/fns.h => ss/fns.h +1 -0
@@ 25,6 25,7 @@ void	kbdrepeat(int);
KMap*	kmap(Page*);
void	kmapinit(void);
KMap*	kmappa(ulong, ulong);
KMap*	kmapperm(Page*);
int	kprint(char*, ...);
void	kproftimer(ulong);
void	kunmap(KMap*);

M ss/main.c => ss/main.c +5 -5
@@ 51,7 51,7 @@ intrinit(void)
{
	KMap *k;

	k = kmappa(INTRREG, PTEIO);
	k = kmappa(INTRREG, PTEIO|PTENOCACHE);
	intrreg = (uchar*)k->va;
}



@@ 259,10 259,10 @@ lancesetup(Lance *lp)
	ulong pa, pte, va;
	int i, j;

	k = kmappa(ETHER, PTEIO);
	k = kmappa(ETHER, PTEIO|PTENOCACHE);
	lp->rdp = (void*)(k->va+0);
	lp->rap = (void*)(k->va+2);
	k = kmappa(EEPROM, PTEIO);
	k = kmappa(EEPROM, PTEIO|PTENOCACHE);
	cp = (uchar*)(k->va+0x7da);
	for(i=0; i<6; i++)
		lp->ea[i] = *cp++;


@@ 280,7 280,7 @@ lancesetup(Lance *lp)
	 */
	pa = (ulong)ialloc(BY2PG, 1)&~KZERO;	/* one whole page */
	/* map at LANCESEGM */
	k = kmappa(pa, PTEMAINMEM);
	k = kmappa(pa, PTEMAINMEM|PTENOCACHE);
	lp->lanceram = (ushort*)k->va;
	lp->lm = (Lancemem*)k->va;



@@ 294,7 294,7 @@ lancesetup(Lance *lp)
	pa = (ulong)ialloc(i*BY2PG, 1)&~KZERO;
	va = 0;
	for(j=i-1; j>=0; j--){
		k = kmappa(pa+j*BY2PG, PTEMAINMEM);
		k = kmappa(pa+j*BY2PG, PTEMAINMEM|PTENOCACHE);
		if(va){
			if(va != k->va+BY2PG)
				panic("lancesetup va unordered");

M ss/mmu.c => ss/mmu.c +14 -5
@@ 341,20 341,29 @@ kmappa(ulong pa, ulong flag)
	kmapalloc.free = k->next;
	unlock(&kmapalloc);
	k->pa = pa;
	s = splhi();
	putpmeg(k->va, PPN(pa)|PTEVALID|PTEKERNEL|PTEWRITE|flag);
	splx(s);
	return k;
}

KMap*
kmap(Page *pg)
{
	/*
	 * Cache is virtual and a pain to deal with.
	 * Must avoid having the same entry in the cache twice, so
	 * must use NOCACHE or else extreme cleverness elsewhere.
	 */
	s = splhi();
	putpmeg(k->va, PPN(pa)|PTEVALID|PTEKERNEL|PTEWRITE|PTENOCACHE|flag);
	splx(s);
	return k;
	return kmappa(pg->pa, PTEMAINMEM|PTENOCACHE);
}

KMap*
kmap(Page *pg)
kmapperm(Page *pg)
{
	/*
	 * Here we know it's a permanent entry and can be cached.
	 */
	return kmappa(pg->pa, PTEMAINMEM);
}