~kris/9p

9hist

7e7a0ef4da268453a2fb56c35a8f5a3d83ca0754 — David du Colombier 34 years ago b3c31eb
Plan 9 from Bell Labs 1992-06-17
6 files changed, 83 insertions(+), 16 deletions(-)

M boot/aux.c
M pc/mmu.c
M port/devcons.c
M port/devscc.c
M port/portdat.h
M port/proc.c
M boot/aux.c => boot/aux.c +4 -2
@@ 129,12 129,14 @@ outin(char *prompt, char *def, int len)
	int n;
	char buf[256];

	alarm(60*1000);
	if(cpuflag)
		alarm(60*1000);
	do{
		print("%s[%s]: ", prompt, *def ? def : "no default");
		n = read(0, buf, len);
	}while(n==0);
	alarm(0);
	if(cpuflag)
		alarm(0);
	if(n < 0)
		fatal("can't read #c/cons or timeout; please reboot");
	if(n != 1){

M pc/mmu.c => pc/mmu.c +21 -13
@@ 195,24 195,13 @@ flushmmu(void)
{
	int s;
	Proc *p;
	Page *pg;
	ulong *top;

	if(u == 0)
		return;

	p = u->p;
	p->newtlb = 1;
	s = splhi();
	if(p->mmutop && p->mmuused){
		top = (ulong*)p->mmutop->va;
		for(pg = p->mmuused; pg->next; pg = pg->next)
			top[pg->daddr] = 0;
		top[pg->daddr] = 0;
		pg->next = p->mmufree;
		p->mmufree = p->mmuused;
		p->mmuused = 0;
	}
	mapstack(u->p);
	mapstack(p);
	splx(s);
}



@@ 227,10 216,29 @@ mapstack(Proc *p)
	ulong tlbphys;
	int i;
	Page *pg;
	ulong *top;

	if(p->upage->va != (USERADDR|(p->pid&0xFFFF)) && p->pid != 0)
		panic("mapstack %d 0x%lux 0x%lux", p->pid, p->upage->pa, p->upage->va);

	if(p->newtlb){
		/*
		 *  bin the current second level page tables.  newtlb
		 *  set means that they are inconsistent with the segment.c
		 *  data structures.
		 */
		if(p->mmutop && p->mmuused){
			top = (ulong*)p->mmutop->va;
			for(pg = p->mmuused; pg->next; pg = pg->next)
				top[pg->daddr] = 0;
			top[pg->daddr] = 0;
			pg->next = p->mmufree;
			p->mmufree = p->mmuused;
			p->mmuused = 0;
		}
		p->newtlb = 0;
	}

	/* map in u area */
	upt[0] = PPN(p->upage->pa) | PTEVALID | PTEKERNEL | PTEWRITE;


M port/devcons.c => port/devcons.c +5 -0
@@ 331,6 331,7 @@ enum{
	Qconsctl,
	Qcputime,
	Qcrypt,
	Qhz,
	Qkey,
	Qklog,
	Qlights,


@@ 355,6 356,7 @@ Dirtab consdir[]={
	"consctl",	{Qconsctl},	0,		0220,
	"cputime",	{Qcputime},	6*NUMSIZE,	0444,
	"crypt",	{Qcrypt},	0,		0666,
	"hz",		{Qhz},		NUMSIZE,	0666,
	"key",		{Qkey},		DESKEYLEN,	0622,
	"klog",		{Qklog},	0,		0444,
	"lights",	{Qlights},	0,		0220,


@@ 647,6 649,9 @@ consread(Chan *c, void *buf, long n, ulong offset)
	case Qmsec:
		return readnum(offset, buf, n, TK2MS(MACHP(0)->ticks), NUMSIZE);

	case Qhz:
		return readnum(offset, buf, n, HZ, NUMSIZE);

	case Qsysstat:
		j = 0;
		xbuf[0] = 0;

M port/devscc.c => port/devscc.c +41 -0
@@ 31,6 31,7 @@ enum
	Rx7bits=	1<<6,
	Rx6bits=	2<<6,
	Rx8bits=	3<<6,
	Rxbitmask=	3<<6,

	/* wr 4 */
	ParEven=	3<<0,


@@ 52,6 53,7 @@ enum
	Tx7bits=	1<<5,
	Tx6bits=	2<<5,
	Tx8bits=	3<<5,
	Txbitmask=	3<<5,

	/* wr 9 */
	IntEna=		1<<3,


@@ 187,6 189,40 @@ sccparity(SCC *sp, char type)
}

/*
 *  set bits/character, default 8
 */
void
sccbits(SCC *sp, int n)
{
	int val;
	int rbits, tbits;

	switch(n){
	case 5:
		rbits = Rx5bits;
		tbits = Tx5bits;
		break;
	case 6:
		rbits = Rx6bits;
		tbits = Tx6bits;
		break;
	case 7:
		rbits = Rx7bits;
		tbits = Tx7bits;
		break;
	case 8:
	default:
		rbits = Rx8bits;
		tbits = Tx8bits;
		break;
	}
	sp->sticky[3] = (sp->sticky[3]&~Rxbitmask) | rbits;
	sccwrreg(sp, 3, 0);
	sp->sticky[5] = (sp->sticky[5]&~Txbitmask) | tbits;
	sccwrreg(sp, 5, 0);
}

/*
 *  toggle DTR
 */
void


@@ 530,6 566,11 @@ sccoput(Queue *q, Block *bp)
		case 'd':
			sccdtr(sp, n);
			break;
		case 'L':
		case 'l':
			sccbits(sp, n);
			break;

		case 'P':
		case 'p':
			sccparity(sp, *(bp->rptr+1));

M port/portdat.h => port/portdat.h +1 -0
@@ 561,6 561,7 @@ struct Proc
	ulong	twhen;
	Rendez	*trend;
	Proc	*tlink;
	int	(*tfn)(void*);

	/*
	 *  machine specific MMU goo

M port/proc.c => port/proc.c +11 -1
@@ 313,6 313,15 @@ sleep(Rendez *r, int (*f)(void*), void *arg)
	}
}

int
tfn(void *arg)
{
	Proc *p;

	p = u->p;
	return MACHP(0)->ticks >= p->twhen || (*p->tfn)(arg);
}

void
tsleep(Rendez *r, int (*fn)(void*), void *arg, int ms)
{


@@ 335,10 344,11 @@ tsleep(Rendez *r, int (*fn)(void*), void *arg, int ms)
	p->trend = r;
	p->twhen = when;
	p->tlink = *i;
	p->tfn = fn;
	*i = p;
	unlock(&talarm);

	sleep(r, fn, arg);
	sleep(r, tfn, arg);
	p->twhen = 0;
}