~kris/9p

9hist

56793053fd0a265cd1784eb8a70480934d98fdbc — David du Colombier 35 years ago ab29c26
Plan 9 from Bell Labs 1991-06-06
M gnot/boot.c => gnot/boot.c +4 -4
@@ 120,9 120,9 @@ dkconfig(void)
		 *  make it 9600 baud,
		 *  push the async protocol onto it,
		 */
		cfd = open("#c/rs232ctl", 2);
		cfd = open("#t/tty0ctl", 2);
		if(cfd < 0)
			error("opening #c/rs232ctl");
			error("opening #t/tty0ctl");
		sendmsg(cfd, "B9600");
		sendmsg(cfd, "push async");
		break;


@@ 133,9 133,9 @@ dkconfig(void)
		 *  make it 19200 baud,
		 *  push the async protocol onto it,
		 */
		cfd = open("#c/rs232ctl", 2);
		cfd = open("#t/tty0ctl", 2);
		if(cfd < 0)
			error("opening #c/rs232ctl");
			error("opening #t/tty0ctl");
		sendmsg(cfd, "B19200");
		sendmsg(cfd, "push async");
		break;

M gnot/boot.h => gnot/boot.h +66 -66
@@ 227,17 227,17 @@ ulong bootcode[]={
	0x07273b200,
	0x0676a4878,
	0x00002486e,
	0x083ce6100,
	0x083ca6100,
	0x007e22f40,
	0x000084aaf,
	0x00008508f,
	0x06c0a486e,
	0x083d56100,
	0x083d16100,
	0x00568588f,
	0x0486e83e4,
	0x0486e83e0,
	0x02f2f0004,
	0x06100052a,
	0x0486e83ef,
	0x0486e83eb,
	0x02f2f000c,
	0x06100051e,
	0x0610007a4,


@@ 253,17 253,17 @@ ulong bootcode[]={
	0x00796588f,
	0x060f260ec,
	0x048780002,
	0x0486e839c,
	0x0486e839a,
	0x061000778,
	0x02f400008,
	0x04aaf0008,
	0x06c0a486e,
	0x083a86100,
	0x083a56100,
	0x00500588f,
	0x0486e83bc,
	0x0486e83b8,
	0x02f2f000c,
	0x0610004c2,
	0x0486e83c3,
	0x0486e83bf,
	0x02f2f0014,
	0x0610004b6,
	0x04fef0018,


@@ 274,13 274,13 @@ ulong bootcode[]={
	0x007362f40,
	0x000084aaf,
	0x000086c0a,
	0x0486e8377,
	0x0486e8376,
	0x0610004be,
	0x0588f486e,
	0x0838b2f2f,
	0x083892f2f,
	0x0000c6100,
	0x00480486e,
	0x083912f2f,
	0x0838f2f2f,
	0x000146100,
	0x004744fef,
	0x000186000,


@@ 288,24 288,24 @@ ulong bootcode[]={
	0x0fff042af,
	0x000044878,
	0x00002486e,
	0x084056100,
	0x084016100,
	0x006ee4a80,
	0x042e72f40,
	0x0001644df,
	0x06c0a486e,
	0x0840f6100,
	0x0840b6100,
	0x00474588f,
	0x048780002,
	0x0486e8421,
	0x0486e841d,
	0x0610006cc,
	0x04a8042e7,
	0x02f40001a,
	0x044df6c0a,
	0x0486e842a,
	0x0486e8426,
	0x061000452,
	0x0588f486e,
	0x0867e486e,
	0x0843b486e,
	0x08437486e,
	0x0859e6100,
	0x005de486e,
	0x0859e6100,


@@ 317,7 317,7 @@ ulong bootcode[]={
	0x0b0af002c,
	0x0661e486e,
	0x0867e486e,
	0x0846e6100,
	0x0846a6100,
	0x004e22f2f,
	0x0003c6100,
	0x0064e202f,


@@ 325,11 325,11 @@ ulong bootcode[]={
	0x000484e75,
	0x07005b0af,
	0x00030660a,
	0x0486e8446,
	0x0486e8442,
	0x0610003f2,
	0x0588f486e,
	0x0867e486e,
	0x0844e6100,
	0x0844a6100,
	0x004b22f2f,
	0x000406100,
	0x0061e2f2f,


@@ 341,7 341,7 @@ ulong bootcode[]={
	0x042ae801a,
	0x042ae801e,
	0x042a7486e,
	0x0847f6100,
	0x0847b6100,
	0x0061a4a80,
	0x06d744878,
	0x0003f486e,


@@ 373,7 373,7 @@ ulong bootcode[]={
	0x060f27001,
	0x02d40801a,
	0x060ea42a7,
	0x0486e848b,
	0x0486e8487,
	0x061000598,
	0x04a806d1e,
	0x048780001,


@@ 384,7 384,7 @@ ulong bootcode[]={
	0x000206100,
	0x005564fef,
	0x0001042a7,
	0x0486e8499,
	0x0486e8495,
	0x06100056c,
	0x04a806d20,
	0x048780040,


@@ 395,12 395,12 @@ ulong bootcode[]={
	0x000286100,
	0x0052a4fef,
	0x000304e75,
	0x0486e84a7,
	0x0486e84a3,
	0x0486e867e,
	0x0610004dc,
	0x0518f60ea,
	0x0598f486e,
	0x084ab6100,
	0x084a76100,
	0x003961d7c,
	0x000328602,
	0x03d7cffff,


@@ 414,7 414,7 @@ ulong bootcode[]={
	0x06100051c,
	0x0b0af0018,
	0x0670a486e,
	0x084b26100,
	0x084ae6100,
	0x00290588f,
	0x048780064,
	0x0486e859e,


@@ 427,7 427,7 @@ ulong bootcode[]={
	0x04a8142e7,
	0x02f410026,
	0x044df6e0e,
	0x0486e84bc,
	0x0486e84b8,
	0x06100025a,
	0x0222f0028,
	0x0588f2f01,


@@ 444,14 444,14 @@ ulong bootcode[]={
	0x0102e859e,
	0x049c02f00,
	0x02f2f0040,
	0x0486e84c5,
	0x0486e84c1,
	0x0610002e4,
	0x0486e84e8,
	0x0486e84e4,
	0x06100020e,
	0x04fef001c,
	0x00c2e0033,
	0x08602670a,
	0x0486e84f3,
	0x0486e84ef,
	0x0610001fa,
	0x0588f4fef,
	0x000344e75,


@@ 465,7 465,7 @@ ulong bootcode[]={
	0x04fef000c,
	0x06000ff62,
	0x0598f486e,
	0x084fc6100,
	0x084f86100,
	0x002921d7c,
	0x000348602,
	0x03d7cffff,


@@ 479,7 479,7 @@ ulong bootcode[]={
	0x061000418,
	0x0b0af0018,
	0x0670a486e,
	0x085076100,
	0x085036100,
	0x0018c588f,
	0x048780064,
	0x0486e859e,


@@ 488,43 488,43 @@ ulong bootcode[]={
	0x02f400024,
	0x04aaf0024,
	0x06e0a486e,
	0x085156100,
	0x085116100,
	0x00168588f,
	0x02f2f0024,
	0x0486e8602,
	0x0486e859e,
	0x061000c8c,
	0x04a80660a,
	0x0486e8522,
	0x0486e851e,
	0x06100014a,
	0x0588f0c2e,
	0x000378602,
	0x06618486e,
	0x08608486e,
	0x085316100,
	0x0852d6100,
	0x00202486e,
	0x086086100,
	0x0012c4fef,
	0x0000c0c2e,
	0x000358602,
	0x0670a486e,
	0x0853b6100,
	0x085376100,
	0x00118588f,
	0x04fef0034,
	0x04e754fef,
	0x0fff042a7,
	0x0486e8548,
	0x0486e8544,
	0x061000368,
	0x04a806c0a,
	0x0202f001c,
	0x04fef0018,
	0x04e75486e,
	0x0854d6100,
	0x085496100,
	0x001ba486f,
	0x0000c6100,
	0x0031a4a80,
	0x06c0a486e,
	0x085546100,
	0x085506100,
	0x000d8588f,
	0x06100032c,
	0x04fef0010,


@@ 553,19 553,19 @@ ulong bootcode[]={
	0x0610002b4,
	0x04aae801a,
	0x0671842a7,
	0x0486e856b,
	0x0486e8563,
	0x0486e855e,
	0x0486e8567,
	0x0486e855f,
	0x0486e855a,
	0x061000228,
	0x04fef002c,
	0x060aa42a7,
	0x0486e857c,
	0x0486e8574,
	0x0486e856f,
	0x0486e8578,
	0x0486e8570,
	0x0486e856b,
	0x061000210,
	0x04fef002c,
	0x06092486e,
	0x085596134,
	0x085556134,
	0x0588f6092,
	0x0598f2f2f,
	0x0000c6100,


@@ 584,7 584,7 @@ ulong bootcode[]={
	0x0027c486f,
	0x000042f2f,
	0x0004c486e,
	0x0857f4878,
	0x0857b4878,
	0x000026100,
	0x0011a42a7,
	0x061744fef,


@@ 2980,26 2980,25 @@ ulong bootcode[]={
	0x0002f3638,
	0x03032302f,
	0x0696e6974,
	0x00023632f,
	0x072733233,
	0x03263746c,
	0x0006f7065,
	0x06e696e67,
	0x02023632f,
	0x072733233,
	0x03263746c,
	0x000423936,
	0x030300070,
	0x075736820,
	0x06173796e,
	0x063002363,
	0x02f727332,
	0x033326374,
	0x06c006f70,
	0x0656e696e,
	0x067202363,
	0x02f727332,
	0x033326374,
	0x00023742f,
	0x074747930,
	0x063746c00,
	0x06f70656e,
	0x0696e6720,
	0x023742f74,
	0x074793063,
	0x0746c0042,
	0x039363030,
	0x000707573,
	0x068206173,
	0x0796e6300,
	0x023742f74,
	0x074793063,
	0x0746c006f,
	0x070656e69,
	0x06e672023,
	0x0742f7474,
	0x079306374,
	0x06c004231,
	0x039323030,
	0x000707573,


@@ 3117,6 3116,7 @@ ulong bootcode[]={
	0x0743a2025,
	0x0733a2025,
	0x0730a0000,
	0x000000000,
	0x04e614e00,
	0x02b496e66,
	0x0002d496e,

M gnot/devduart.c => gnot/devduart.c +2 -2
@@ 100,7 100,7 @@ struct Duartport
	Alarm	*a;		/* alarm for waking the kernel process */
	int	delay;		/* between character input and waking kproc */
 	int	kstarted;	/* kproc started */
	uchar	delim[256];	/* characters that act as delimiters */
	uchar	delim[256/8];	/* characters that act as delimiters */
};
Duartport	duartport[1];



@@ 424,7 424,7 @@ duartrintr(char ch)
		(*cq->putc)(cq, ch);
	else {
		putc(cq, ch);
		if(dp->delim[ch])
		if(dp->delim[ch/8] & (1<<(ch&7)) )
			wakeup(&cq->r);
	}
}

M gnot/fns.h => gnot/fns.h +24 -25
@@ 7,16 7,8 @@
#define	P_write(sel, addr, val, type)	P_oper(sel, *(type *)(PORT+addr) = val)

void	addportintr(int (*)(void));
int	cangetc(void*);
int	canputc(void*);
void	clearmmucache(void);
void	duartbaud(int);
void	duartbreak(int);
void	duartdtr(int);
int	duartinputport(void);
void	duartrs232start(char);
void	duartrs232stop(void);
void	duartrs232xmit(char);
void	duartinit(void);
void	duartstarttimer(void);
void	duartstoptimer(void);
#define	evenaddr(x)	/* 68020 doesn't care */


@@ 30,36 22,20 @@ void	fpregrestore(char*);
void	fpregsave(char*);
void	fprestore(FPsave*);
void	fpsave(FPsave*);
int	getc(IOQ*);
int	gets(IOQ*, void*, int);
void	incontoggle(void);
void	initq(IOQ*);
int	kbdputc(IOQ*, int);
void	kbdclock(void);
void	kbdrepeat(int);
KMap*	kmap(Page*);
void	kmapinit(void);
int	kprint(char*, ...);
void	kunmap(KMap*);
void	mmuinit(void);
void	mousebuttons(int);
void	mouseclock(void);
int	mouseputc(IOQ*, int);
int	portprobe(char*, int, int, int, long);
void	printinit(void);
void	procrestore(Proc*, uchar*);
void	procsave(uchar*, int);
void	procsetup(Proc*);
int	putc(IOQ*, int);
void	puts(IOQ*, void*, int);
void	putkmmu(ulong, ulong);
void	putstr(char*);
void	putstrn(char*, long);
void	restartprint(Alarm*);
void	restfpregs(FPsave*);
void	rs232puts(IOQ*, char*, int);
void	rs232rintr(char);
void	rs232xintr(void);
void	screeninit(void);
void	screenputc(int);
void	screenputs(char*, int);


@@ 81,3 57,26 @@ int	splduart(void);
int	tas(char*);
void	touser(void);
#define	waserror()	(u->nerrlab++, setlabel(&u->errlab[u->nerrlab-1]))

/*
 *  for queues (to go into portfns.h)
 */
int	cangetc(void*);
int	canputc(void*);
int	getc(IOQ*);
int	gets(IOQ*, void*, int);
void	initq(IOQ*);
int	putc(IOQ*, int);
void	puts(IOQ*, void*, int);

/*
 *  for devcons (to go into portfns.h)
 */
void	kbdclock(void);
void	kbdrepeat(int);
int	kbdputc(IOQ*, int);
int	kprint(char*, ...);
int	mouseputc(IOQ*, int);
void	printinit(void);
void	putstr(char*);
void	putstrn(char*, long);

M gnot/lock.c => gnot/lock.c +7 -0
@@ 3,6 3,7 @@
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "errno.h"

#define PCOFF -1



@@ 57,3 58,9 @@ unlock(Lock *l)
	l->pc = 0;
	l->key = 0;
}

void
mklockseg(Seg *s)
{
	error(Esegaddr);
}

M gnot/mem.h => gnot/mem.h +1 -0
@@ 12,6 12,7 @@
#define	BY2PG		8192			/* bytes per page */
#define	WD2PG		(BY2PG/BY2WD)		/* words per page */
#define	PGSHIFT		13			/* log(BY2PG) */
#define PGROUND(s)	(((s)+(BY2PG-1))&~(BY2PG-1))

#define	MAXMACH		1			/* max # cpus system can run */


M port/devnonet.c => port/devnonet.c +2 -2
@@ 1204,7 1204,7 @@ nonetrcvmsg(Noconv *cp, Block *bp)
	/*
	 *  ignore old messages and process the acknowledgement
	 */
	if(h->mid != mp->mid){
	if(h->mid!=mp->mid || (f&NO_NULL)){
		DPRINT("old msg %d instead of %d r==%d\n", h->mid, mp->mid, r);
		if(r == 0){
			norack(cp, h->ack);


@@ 1469,7 1469,7 @@ loop:
			 */
			while(cp->afirst!=cp->anext && cp->rq->next->len<16*1024){
				DPRINT("sending ack %d\n", cp->ack[cp->afirst]);
				nosendctl(cp, 0, 0);
				nosendctl(cp, NO_NULL, 0);
			}
			qunlock(cp);
		}

M port/devscc.c => port/devscc.c +5 -5
@@ 101,7 101,7 @@ struct SCC
	Alarm	*a;		/* alarm for waking the kernel process */
	int	delay;		/* between character input and waking kproc */
 	int	kstarted;	/* kproc started */
	uchar	delim[256];	/* characters that act as delimiters */
	uchar	delim[256/8];	/* characters that act as delimiters */
};
SCC	scc[2];



@@ 296,7 296,7 @@ sccintr0(SCC *sp, uchar x)
				(*cq->putc)(cq, ch);
			else {
				putc(cq, ch);
				if(sp->delim[ch])
				if(sp->delim[ch/8] & (1<<(ch&7)) )
					wakeup(&cq->r);
			}
		}


@@ 331,7 331,7 @@ sccintr(void)
 *  turn on a port's interrupts.  set DTR and RTS
 */
void
sccdevice(SCC *sp)
sccenable(SCC *sp)
{
	/*
	 *  set up i/o routines


@@ 371,7 371,7 @@ sccspecial(int port, IOQ *oq, IOQ *iq, int baud)
	sp->nostream = 1;
	sp->oq = oq;
	sp->iq = iq;
	sccdevice(sp);
	sccenable(sp);
	sccsetbaud(sp, baud);
}



@@ 580,7 580,7 @@ sccreset(void)
		initq(sp->iq);
		sp->oq = ialloc(sizeof(IOQ), 0);
		initq(sp->oq);
		sccdevice(sp);
		sccenable(sp);
	}
}


M port/fault.c => port/fault.c +24 -18
@@ 9,7 9,7 @@
int
fault(ulong addr, int read)
{
	ulong mmuvirt, mmuphys, n;
	ulong mmuvirt, mmuphys = 0, n;
	Seg *s;
	PTE *opte, *pte, *npte;
	Orig *o;


@@ 64,13 64,15 @@ fault(ulong addr, int read)
	if(pte->page == 0){
		touched = 1;
		if(o->chan==0 || addr>(o->va+(o->maxca-o->minca))){
			/*
			 * Zero fill page.  If we are really doing a copy-on-write
			 * (e.g. into shared bss) we'll move the page later.
			 */
			pte->page = newpage(0, o, addr);
			o->npage++;
			/* Make a new bss or lock segment page */
			if(s - u->p->seg == LSEG) {
				pte->page = lkpage(o, addr);
				mmuphys = PTEUNCACHE;
			}
			else
				pte->page = newpage(0, o, addr);
			zeroed = 1;
			o->npage++;
		}else{
			/*
			 * Demand load.  Release o because it could take a while.


@@ 157,8 159,10 @@ fault(ulong addr, int read)
			head = 0;
		}
		pg = pte->page;
		if(zeroed){	/* move page */
			pg->ref--;
		/* when creating pages in the bss which are zfod we create a double
		 * increment on the mod list which must be removed
		 */
		if(zeroed){
			o->npage--;
			opte->page = 0;
		}else{		/* copy page */


@@ 170,20 174,21 @@ fault(ulong addr, int read)
			kunmap(k1);
			if(pg->ref <= 1)
				panic("pg->ref <= 1");
			pg->ref--;
		}
		pg->ref--;

    easy:
		mmuphys = PTEWRITE;
		mmuphys |= PTEWRITE;
	}else{
		mmuphys = PTERONLY;
		mmuphys |= PTERONLY;
		if(o->flag & OWRPERM)
			if(o->flag & OPURE){
				if(!head && pte->page->ref==1)
					mmuphys = PTEWRITE;
					mmuphys |= PTEWRITE;
			}else
				if((head && o->nproc==1)
	  			  || (!head && pte->page->ref==1))
					mmuphys = PTEWRITE;
					mmuphys |= PTEWRITE;
	}
	mmuvirt = addr;
	mmuphys |= PPN(pte->page->pa) | PTEVALID;


@@ 212,7 217,8 @@ validaddr(ulong addr, ulong len, int write)

	if((long)len < 0){
    Err:
		pprint("invalid address %lux in sys call pc %lux sp %lux\n", addr, ((Ureg*)UREGADDR)->pc, ((Ureg*)UREGADDR)->sp);
		pprint("invalid address %lux in sys call pc %lux sp %lux\n", 
			addr, ((Ureg*)UREGADDR)->pc, ((Ureg*)UREGADDR)->sp);
		postnote(u->p, 1, "sys: bad address", NDebug);
		error(Ebadarg);
	}


@@ 261,10 267,10 @@ vmemchr(void *s, int c, int n)
Seg*
seg(Proc *p, ulong addr)
{
	int i;
	Seg *s;
	Seg *s, *et;

	for(i=0,s=p->seg; i<NSEG; i++,s++)
	et = &p->seg[NSEG];
	for(s=p->seg; s < et; s++)
		if(s->o && s->minva<=addr && addr<s->maxva)
			return s;
	return 0;

M port/page.c => port/page.c +37 -9
@@ 61,17 61,15 @@ ialloc(ulong n, int align)
		print("ialloc bad\n");
	if(palloc.addr == 0)
		palloc.addr = ((ulong)&end)&~KZERO;
	if(align){
		palloc.addr += BY2PG-1;
		palloc.addr &= ~(BY2PG-1);
	}
	if(align)
		palloc.addr = PGROUND(palloc.addr);

	memset((void*)(palloc.addr|KZERO), 0, n);
	p = palloc.addr;
	palloc.addr += n;
	if(align){
		palloc.addr += BY2PG-1;
		palloc.addr &= ~(BY2PG-1);
	}
	if(align)
		palloc.addr = PGROUND(palloc.addr);

	if(palloc.addr >= conf.maxialloc)
		panic("keep bill joy away");
	return (void*)(p|KZERO);


@@ 549,7 547,7 @@ segaddr(Seg *s, ulong min, ulong max)
		return 0;
	if(min != s->minva)	/* can't grow down yet (stacks: fault.c) */
		return 0;
	max = (max+(BY2PG-1)) & ~(BY2PG-1);
	max = PGROUND(max);
	o = s->o;
	if(max == s->maxva)
		return 1;


@@ 709,3 707,33 @@ compactpte(Orig *o, ulong n)
	print("compactpte fails addr %lux %lux %d\n", o->va+n*BY2PG, o->va, n);
	return 0;
}

long
ibrk(ulong addr, int seg)
{
	Seg *s;

	s = &u->p->seg[seg];
	if(seg == LSEG && s->o == 0)
		mklockseg(s);

	/* Allows us to determine the base of the segment */
	if(addr == 0)
		return s->minva;

	if(addr < s->endseg){
		pprint("addr below segment\n");
		pexit("Suicide", 0);
		error(Esegaddr);
	}

	if(addr > PGROUND(s->endseg))
		if(segaddr(s, s->minva, addr) == 0){
			pprint("bad segaddr in brk\n");
			pexit("Suicide", 0);
			error(Esegaddr);
		}

	s->endseg = addr;
	return 0;
}

M port/portdat.h => port/portdat.h +2 -2
@@ 297,7 297,8 @@ struct Seg
	ulong	minva;			/* va of 0th pte (not necessarily Seg->o->va) */
	ulong	maxva;			/* va of last pte */
	PTE	*mod;			/* list of modified pte's */
	ulong	pad[3]; /**/
	ulong	endseg;			/* segments end */
	ulong	pad[2]; /**/
};

/*


@@ 343,7 344,6 @@ struct Proc
	int	state;
	Page	*upage;			/* BUG: should be unlinked from page list */
	Seg	seg[NSEG];
	ulong	bssend;			/* initial top of bss seg */
	ulong	pid;
	int	nchild;
	QLock	wait;			/* exiting children to be waited for */

M port/portfns.h => port/portfns.h +3 -0
@@ 70,17 70,20 @@ Block*	getq(Queue*);
void	gotolabel(Label*);
void	growpte(Orig*, ulong);
void*	ialloc(ulong, int);
long	ibrk(ulong, int);
int	incref(Ref*);
void	insert(List**, List*, List*);
void	invalidateu(void);
void	isdir(Chan*);
void	kproc(char*, void(*)(void*), void*);
void	lights(int);
Page*	lkpage(Orig*, ulong);
void	lock(Lock*);
void	lockinit(void);
Orig*	lookorig(ulong, ulong, int, Chan*);
void	machinit(void);
void	mapstack(Proc*);
void	mklockseg(Seg*);
void	mmurelease(Proc*);
int	mount(Chan*, Chan*, int);
Chan*	namec(char*, int, int, ulong);

M port/queue.c => port/queue.c +1 -1
@@ 10,10 10,10 @@ void
initq(IOQ *q)
{
	lock(q);
	unlock(q);
	q->in = q->out = q->buf;
	q->puts = puts;
	q->putc = putc;
	unlock(q);
}

int

M port/sysproc.c => port/sysproc.c +5 -53
@@ 125,7 125,6 @@ sysfork(ulong *arg)
	p->parent = u->p;
	p->parentpid = u->p->pid;
	p->pgrp = u->p->pgrp;
	p->bssend = u->p->bssend;
	p->fpstate = u->p->fpstate;
	incref(p->pgrp);
	u->p->nchild++;


@@ 338,7 337,7 @@ sysexec(ulong *arg)

	close(tc);

	p->bssend = bssend;
	p->seg[BSEG].endseg = bssend;

	/*
	 * Move the stack


@@ 525,58 524,11 @@ sysnoted(ulong *arg)
long
sysbrk_(ulong *arg)
{
	ulong addr;
	Seg *s;

	addr = arg[0];
	if(addr < u->p->bssend){
		pprint("addr below bss\n");
		pexit("Suicide", 0);
		error(Esegaddr);
	}
	if(addr <= ((u->p->bssend+(BY2PG-1))&~(BY2PG-1)))	/* still in DSEG */
		goto Return;
	if(segaddr(&u->p->seg[BSEG], u->p->seg[BSEG].minva, arg[0]) == 0){
		pprint("bad segaddr in brk\n");
		pexit("Suicide", 0);
		error(Esegaddr);
	}
    Return:
	u->p->bssend = addr;
	return 0;
	return ibrk(arg[0], BSEG);
}
/*

long
syslkbrk(ulong *arg)
syslkbrk_(ulong *arg)
{
	ulong addr;
	Orig *o;
	Seg *s;

	addr = arg[0];
	s = &u->p->seg[LSEG];
	if(addr < LKSEGBASE)
		error(Esegaddr);

	/* If we have never seen a lock segment create one */
	if(s->o == 0) {
		s->proc = u->p;
		s->minva = LKSEGBASE;
		s->maxva = addr;
		o = neworig(s->minva, (addr-LKSEGBASE)>>PGSHIFT, OWRPERM, 0);
		o->minca = 0;
		o->maxca = 0;
		s->o = o;
		s->mod = 0;
	}
	if(addr < s->maxva)
		return 0;
	if(segaddr(&u->p->seg[LSEG], s->minva, addr) == 0) {
		pprint("bad segaddr in brk\n");
		pexit("Suicide", 0);
		error(Esegaddr);

	}
	return 0;
	return ibrk(arg[0], LSEG);
}
*/

M power/lock.c => power/lock.c +45 -0
@@ 4,6 4,7 @@
#include "dat.h"
#include "fns.h"
#include "io.h"
#include "errno.h"

/*
 * The hardware semaphores are strange.  64 per page, replicated 16 times


@@ 23,11 24,14 @@ struct
	uchar	bmap[NSEMPG];		/* allocation map */
}semalloc;

Page lkpgheader[NSEMPG];

void
lockinit(void)
{
	memset(semalloc.bmap, 0, sizeof(semalloc.bmap));
	semalloc.bmap[0] = 1;

	semalloc.lock.sbsem = SBSEM;
	semalloc.nextsem = SBSEM+1;
	semalloc.nsem = 1;


@@ 50,6 54,32 @@ lkpgalloc(void)
	return (p-semalloc.bmap)*WD2PG + SBSEM;
}

/* Moral equivalent of newpage for pages of hardware lock */
Page*
lkpage(Orig *o, ulong va)
{
	uchar *p, *top;
	Page *pg;
	int i;

	lock(&semalloc.lock);
	top = &semalloc.bmap[NSEMPG];
	for(p = semalloc.bmap; *p && p < top; p++)
		;
	if(p == top)
		panic("lkpage");

	*p = 1;
	i = p-semalloc.bmap;
	pg = &lkpgheader[i];
	pg->pa = (ulong)((i*WD2PG) + SBSEM);
	pg->va = va;
	pg->o = o;

	unlock(&semalloc.lock);
	return pg;
}

void
lkpgfree(ulong *lpa)
{


@@ 134,3 164,18 @@ unlock(Lock *l)
	l->pc = 0;
	*l->sbsem = 0;
}

void
mklockseg(Seg *s)
{
	Orig *o;

	s->proc = u->p;
	o = neworig(LKSEGBASE, 0, OWRPERM|OPURE, 0);
	o->minca = 0;
	o->maxca = 0;
	s->o = o;
	s->minva = LKSEGBASE;
	s->maxva = LKSEGBASE;
	s->mod = 0;
}

M power/mem.h => power/mem.h +3 -0
@@ 12,12 12,14 @@
#define	BY2PG		4096			/* bytes per page */
#define	WD2PG		(BY2PG/BY2WD)		/* words per page */
#define	PGSHIFT		12			/* log(BY2PG) */
#define PGROUND(s)	(((s)+(BY2PG-1))&~(BY2PG-1))

#define	MAXMACH		4			/* max # cpus system can run */

/*
 * Time
 */
#define HZ		20
#define	MS2HZ		50			/* millisec per clock tick */
#define	TK2SEC(t)	((t)/20)		/* ticks to seconds */
#define	TK2MS(t)	((t)*MS2HZ)		/* ticks to milliseconds */


@@ 94,6 96,7 @@
#define	PTEGLOBL	(1<<8)
#define	PTEVALID	(1<<9)
#define	PTEWRITE	(1<<10)
#define PTEUNCACHE	(1<<11)
#define PTERONLY	0
#define	PTEPID(n)	((n)<<6)
#define TLBPID(n)	(((n)>>6)&0x3F)

M power/trap.c => power/trap.c +2 -2
@@ 442,7 442,7 @@ Syscall sysbind, sysbrk_, syschdir, sysclose, syscreate, sysdeath;
Syscall	sysdup, syserrstr, sysexec, sysexits, sysfork, sysforkpgrp;
Syscall	sysfstat, sysfwstat, sysgetpid, sysmount, sysnoted;
Syscall	sysnotify, sysopen, syspipe, sysr1, sysread, sysremove, sysseek;
Syscall syssleep, sysstat, syswait, syswrite, syswstat, sysalarm;
Syscall syssleep, sysstat, syswait, syswrite, syswstat, sysalarm, syslkbrk_;

Syscall *systab[]={
	[SYSR1]		sysr1,


@@ 457,7 457,7 @@ Syscall *systab[]={
	[FORK]		sysfork,
	[FORKPGRP]	sysforkpgrp,
	[FSTAT]		sysfstat,
	[___LASTERR___]	sysdeath,
	[LKBRK_]	syslkbrk_,
	[MOUNT]		sysmount,
	[OPEN]		sysopen,
	[READ]		sysread,

M ss/dat.h => ss/dat.h +35 -34
@@ 1,8 1,6 @@
typedef struct Conf	Conf;
typedef struct FFrame	FFrame;
typedef struct FPsave	FPsave;
typedef struct IOQ	IOQ;
typedef struct KIOQ	KIOQ;
typedef struct KMap	KMap;
typedef struct Lance	Lance;
typedef struct Lancemem	Lancemem;


@@ 109,38 107,6 @@ struct PMMU
#include "../port/portdat.h"

/*
 *  character based IO (mouse, keyboard, console screen)
 */
#define NQ	4096
struct IOQ
{
	Lock;
	uchar	buf[NQ];
	uchar	*in;
	uchar	*out;
	int	state;
	Rendez	r;
	union{
		void	(*puts)(IOQ*, void*, int);	/* output */
		int	(*putc)(IOQ*, int);		/* input */
	};
	void	*ptr;
};
struct KIOQ
{
	QLock;
	IOQ;
	int	repeat;
	int	c;
	int	count;
};

extern IOQ	lineq;
extern IOQ	printq;
extern IOQ	mouseq;
extern KIOQ	kbdq;

/*
 *  machine dependent definitions not used by ../port/dat.h
 */
struct KMap


@@ 246,3 212,38 @@ struct
	short	machs;
	short	exiting;
}active;

/*
 *  character based IO (mouse, keyboard, console screen)
 */
typedef struct IOQ	IOQ;
typedef struct KIOQ	KIOQ;
#define NQ	4096
struct IOQ
{
	Lock;
	uchar	buf[NQ];
	uchar	*in;
	uchar	*out;
	int	state;
	Rendez	r;
	union{
		void	(*puts)(IOQ*, void*, int);	/* output */
		int	(*putc)(IOQ*, int);		/* input */
	};
	void	*ptr;
};
struct KIOQ
{
	QLock;
	IOQ;
	int	repeat;
	int	c;
	int	count;
};

extern IOQ	lineq;
extern IOQ	printq;
extern IOQ	mouseq;
extern KIOQ	kbdq;


M ss/fns.h => ss/fns.h +31 -24
@@ 1,20 1,9 @@
#include "../port/portfns.h"

void	cacheinit(void);
int	cangetc(void*);
int	canputc(void*);
void	clearfpintr(void);
#define	clearmmucache()
void	clockinit(void);
void	duartbaud(int);
void	duartbreak(int);
void	duartdtr(int);
void	duartinit(void);
int	duartinputport(void);
void	duartintr(void);
void	duartstartrs232o(void);
void	duartstarttimer(void);
void	duartstoptimer(void);
void	evenaddr(ulong);
char*	excname(ulong);
void	faultasync(Ureg*);


@@ 27,15 16,10 @@ void	fpregrestore(char*);
void	fpregsave(char*);
void	fprestore(FPsave*);
void	fpsave(FPsave*);
int	getc(IOQ*);
int	gets(IOQ*, void*, int);
int	getb2(ulong);
int	getrs232o(void);
int	getw2(ulong);
void	initq(IOQ*);
void	intrinit(void);
void	ioinit(void);
int	kbdputc(IOQ*, int);
int	kbdstate(IOQ*, int);
void	kbdclock(void);
void	kbdrepeat(int);


@@ 49,14 33,11 @@ void	lancesetup(Lance*);
void	lancetoggle(void);
void	mmuinit(void);
void	mousebuttons(int);
int	mouseputc(IOQ*, int);
void	mouseclock(void);
void	printinit(void);
#define	procrestore(x,y)
#define	procsave(x,y)
#define	procsetup(x)	((p)->fpstate = FPinit)
int	putc(IOQ*, int);
void	puts(IOQ*, void*, int);
void	putb2(ulong, int);
void	putcontext(int);
void	putcxreg(int);


@@ 76,11 57,6 @@ void	putwE(ulong, ulong);
void	reset(void);
void	restartprint(Alarm*);
void	restfpregs(FPsave*);
void	rs232ichar(int);
void	sccintr(void);
void	sccputs(IOQ*, char*, int);
void	sccsetup(void*);
void	sccspecial(int, IOQ*, IOQ*, int);
void	screeninit(void);
void	screenputc(int);
void	spldone(void);


@@ 90,3 66,34 @@ void	trap(Ureg*);
void	trapinit(void);
#define	wbflush()	/* mips compatibility */
#define	waserror()	(u->nerrlab++, setlabel(&u->errlab[u->nerrlab-1]))

/*
 *  for queues (to go into portfns.h)
 */
int	cangetc(void*);
int	canputc(void*);
int	getc(IOQ*);
int	gets(IOQ*, void*, int);
void	initq(IOQ*);
int	putc(IOQ*, int);
void	puts(IOQ*, void*, int);

/*
 *  for the scc (to go into portfns.h)
 */
void	sccintr(void);
void	sccputs(IOQ*, char*, int);
void	sccsetup(void*);
void	sccspecial(int, IOQ*, IOQ*, int);

/*
 *  for devcons (to go into portfns.h)
 */
void	kbdclock(void);
void	kbdrepeat(int);
int	kbdputc(IOQ*, int);
int	kprint(char*, ...);
int	mouseputc(IOQ*, int);
void	printinit(void);
void	putstr(char*);
void	putstrn(char*, long);

M ss/mem.h => ss/mem.h +1 -0
@@ 12,6 12,7 @@
#define	BY2PG		4096			/* bytes per page */
#define	WD2PG		(BY2PG/BY2WD)		/* words per page */
#define	PGSHIFT		12			/* log(BY2PG) */
#define PGROUND(s)	(((s)+(BY2PG-1))&~(BY2PG-1))

#define	MAXMACH		1			/* max # cpus system can run */