~kris/9p

9hist

169cd74d4cb93d140dc11ffba507182cab56d7aa — David du Colombier 34 years ago 345fba8
Plan 9 from Bell Labs 1992-09-05
6 files changed, 73 insertions(+), 42 deletions(-)

M pc/devether.c
M port/page.c
M port/swap.c
M port/taslock.c
M ss/main.c
M ss/screen.c
M pc/devether.c => pc/devether.c +60 -12
@@ 600,6 600,13 @@ typedef struct {
	};
} Wd8013;

enum {
	MENB		= 0x40,			/* memory enable */

	L16EN		= 0x40,			/* enable 16-bit LAN operation */
	M16EN		= 0x80,			/* enable 16-bit memory access */
};

#define IN(hw, m)	inb((hw)->addr+OFFSETOF(Wd8013, m))
#define OUT(hw, m, x)	outb((hw)->addr+OFFSETOF(Wd8013, m), (x))



@@ 611,6 618,27 @@ typedef struct {
	uchar	data[256-4];
} Ring;


static void
wd8013dumpregs(Hw *hw)
{
	print("msr=#%2.2ux\n", IN(hw, msr));
	print("icr=#%2.2ux\n", IN(hw, icr));
	print("iar=#%2.2ux\n", IN(hw, iar));
	print("bio=#%2.2ux\n", IN(hw, bio));
	print("irr=#%2.2ux\n", IN(hw, irr));
	print("laar=#%2.2ux\n", IN(hw, laar));
	print("ijr=#%2.2ux\n", IN(hw, ijr));
	print("gp2=#%2.2ux\n", IN(hw, gp2));
	print("lan0=#%2.2ux\n", IN(hw, lan[0]));
	print("lan1=#%2.2ux\n", IN(hw, lan[1]));
	print("lan2=#%2.2ux\n", IN(hw, lan[2]));
	print("lan3=#%2.2ux\n", IN(hw, lan[3]));
	print("lan4=#%2.2ux\n", IN(hw, lan[4]));
	print("lan5=#%2.2ux\n", IN(hw, lan[5]));
	print("id=#%2.2ux\n", IN(hw, id));
}

/*
 */
static void


@@ 619,6 647,7 @@ wd8013reset(Ctlr *cp)
	Hw *hw = cp->hw;
	int i;
	uchar msr;
	ulong ram;

	cp->rb = xspanalloc(sizeof(Buffer)*Nrb, BY2PG, 0);
	cp->nrb = Nrb;


@@ 626,11 655,17 @@ wd8013reset(Ctlr *cp)
	cp->ntb = Ntb;

	msr = IN(hw, msr);
	OUT(hw, msr, 0x40|msr);
	OUT(hw, msr, MENB|msr);

	for(i = 0; i < sizeof(cp->ea); i++)
		cp->ea[i] = IN(hw, lan[i]);

	/* get configuration info from card */
	ram = (IN(hw, msr) & 0x3f) << 13;
	ram |= KZERO|0x80000;
	hw->ram = (uchar*)ram;
print("ether ram is at %lux\n", ram);

	(*hw->init)(cp);
	setvec(Ethervec, hw->intr);
}


@@ 704,6 739,17 @@ wd8013online(Ctlr *cp, int on)
}

static void
bmemmove(void *a, void *b, int n)
{
	uchar *to, *from;

	to = a;
	from = b;
	while(n-- > 0)
		*to++ = *from++;
}

static void
wd8013receive(Ctlr *cp)
{
	Hw *hw = cp->hw;


@@ 723,14 769,18 @@ wd8013receive(Ctlr *cp)
		if(next == curr)
			break;
		cp->inpackets++;
print("*");
OUT(hw, laar, 0xC1);
print("!");
		p = &((Ring*)hw->ram)[next];
{ int ii; for(ii = 0; ii < 30; ii++) print("%2.2ux ", p->data[ii]); for(;;); }
		len = ((p->len1<<8)|p->len0)-4;
		if(p->next < hw->pstart || p->next >= hw->pstop || len < 60){
			print("%d/%d : #%2.2ux #%2.2ux  #%2.2ux #%2.2ux\n", next, len,
				p->status, p->next, p->len0, p->len1);
			panic("receive");
OUT(hw, laar, 0x01);
			dp8390rinit(cp);
			return;
			break;
		}

		rb = &cp->rb[cp->ri];


@@ 738,22 788,25 @@ wd8013receive(Ctlr *cp)
			rb->len = len;
			if((p->data+len) >= (hw->ram+hw->size)){
				len = (hw->ram+hw->size) - p->data;
				memmove(rb->pkt+len,
				bmemmove(rb->pkt+len,
					&((Ring*)hw->ram)[hw->pstart],
					(p->data+rb->len) - (hw->ram+hw->size));
			}
			memmove(rb->pkt, p->data, len);
			bmemmove(rb->pkt, p->data, len);
			rb->owner = Host;
			cp->ri = NEXT(cp->ri, cp->nrb);
		}

		p->status = 0;
		next = p->next;
OUT(hw, laar, 0x01);
print("?");
		bnry = next-1;
		if(bnry < hw->pstart)
			bnry = hw->pstop-1;
		OUT(hw, w.bnry, bnry);
	}
print(">");
}

static void


@@ 767,7 820,7 @@ wd8013transmit(Ctlr *cp)
	tb = &cp->tb[cp->ti];
	if(tb->busy == 0 && tb->owner == Interface){
		hw = cp->hw;
		memmove(hw->ram, tb->pkt, tb->len);
		bmemmove(hw->ram, tb->pkt, tb->len);
		OUT(hw, w.tbcr0, tb->len & 0xFF);
		OUT(hw, w.tbcr1, (tb->len>>8) & 0xFF);
		OUT(hw, w.cr, 0x26);		/* Page0|RD2|TXP|STA */


@@ 823,7 876,7 @@ wd8013intr(Ureg *ur)

static Hw wd8013 = {
	0x360,					/* I/O base address */
	KZERO|0xC8000,				/* shared memory address */
	KZERO|0xF0000,				/* shared memory address */
	8*1024,
	0,
	HOWMANY(sizeof(Etherpkt), 256),


@@ 836,8 889,3 @@ static Hw wd8013 = {
	wd8013transmit,
	wd8013intr,
};

void
consdebug(void)
{
}

M port/page.c => port/page.c +8 -5
@@ 66,6 66,7 @@ newpage(int clear, Segment **s, ulong va)
	KMap *k;
	int hw, i, dontalloc;

retry:
	lock(&palloc);

	hw = swapalloc.highwater;


@@ 112,10 113,10 @@ newpage(int clear, Segment **s, ulong va)
	unlock(&palloc);

	lock(p);

	if(p->ref != 0)
		panic("newpage");

	if(p->ref != 0) {			/* lookpage has priority on steal */
		unlock(p);
		goto retry;
	}
	uncachepage(p);
	p->ref++;
	p->va = va;


@@ 185,6 186,8 @@ putpage(Page *p)
void
simpleputpage(Page *pg)			/* Always call with palloc locked */
{
	if(pg->ref != 1)
		panic("simpleputpage");
	pg->ref = 0;
	palloc.freecount++;
	if(palloc.head == 0) {


@@ 237,7 240,7 @@ duppage(Page *p)				/* Always call with p locked */
	unlock(&palloc);

	lock(np);				/* Cache the new version */
	if(np->ref != 0) {			/* Stolen by new page */
	if(np->ref != 0) {			/* Stolen by lookpage */
		uncachepage(p);
		unlock(np);
		return;

M port/swap.c => port/swap.c +1 -1
@@ 15,7 15,7 @@ int	canflush(Proc *p, Segment*);

enum
{
	Maxpages = 500,		/* Max number of pageouts per segment pass */
	Maxpages = 500,	/* Max number of pageouts per segment pass */
};

Image 	swapimage;

M port/taslock.c => port/taslock.c +1 -12
@@ 5,9 5,6 @@
#include "fns.h"
#include "../port/error.h"

ulong spinner;
ulong spinpc;

void
lock(Lock *l)
{


@@ 16,21 13,13 @@ lock(Lock *l)
	ulong pc;

	pc = getcallerpc(((uchar*)&l) - sizeof(l));
    	if (tas(&ll->key) == 0){
		if(u)
			u->p->hasspin = 1;
		ll->pc = pc;
		return;
	}
	for(i = 0; i < 1000000; i++){
	for(i = 0; i < 10000000; i++){
    		if (tas(&ll->key) == 0){
			if(u)
				u->p->hasspin = 1;
			ll->pc = pc;
			return;
		}
spinner++;
spinpc = pc;
	}
	i = l->key;
	l->key = 0;

M ss/main.c => ss/main.c +0 -1
@@ 141,7 141,6 @@ init0(void)
	print("bank 0: %dM  1: %dM\n", bank[0], bank[1]);
	print("frame buffer id %lux slot %ld %s\n", conf.monitor, fbslot, fbstr);
	print("NKLUDGE %d\n", NKLUDGE);
mapcrap();
	if(conf.npage1 != conf.base1)
		print("kernel mem from second bank: reboot and fix!\n");


M ss/screen.c => ss/screen.c +3 -11
@@ 35,6 35,7 @@ struct Video
	uchar	pad2[3];
	uchar	ovrl;		/* overlay palette */
	uchar	pad3[3];
#ifdef notright
	/* Sun-4 video chip */
	uchar	mcr;		/* master control register */
	uchar	sr;		/* status register */


@@ 52,7 53,8 @@ struct Video
	uchar	vsc;		/* vertical sync clear */
	uchar	xcs;		/* transfer cycle hold off set */
	uchar	xcc;		/* transfer cycle hold off clear */
}*vid;
#endif
} *vid;

GBitmap gscreen;



@@ 143,16 145,6 @@ screeninit(char *str, int slot)
	}
}

void
mapcrap(void)
{
	uchar *v;
	int i;

	v = &vid->mcr;
	for(i=0; i<16; i++,v++)
		print("%lux %.2ux\n", v, *v);
}

void
screenputnl(void)