~kris/9p

9hist

2b4fb1362e000598f8cbe65b7db8d186afa38eb6 — David du Colombier 34 years ago 1d04051
Plan 9 from Bell Labs 1992-07-20
8 files changed, 86 insertions(+), 34 deletions(-)

M gnot/main.c
M port/alloc.c
M port/devbit.c
M port/devip.c
M port/sysfile.c
M port/systab.h
M ss/main.c
M ss/trap.c
M gnot/main.c => gnot/main.c +5 -2
@@ 302,7 302,7 @@ Conf	conf;
void
confinit(void)
{
	int mul;
	int mul, pcnt;
	ulong ktop;

	conf.nmach = 1;


@@ 315,7 315,10 @@ confinit(void)
	conf.npage1 = (bank[1]*MB)/BY2PG;
	conf.base1 = 16*MB;
	conf.npage = conf.npage0+conf.npage1;
	conf.upages = (conf.npage*70)/100;

	pcnt = screenbits()-1;		/* Calculate % of memory for page pool */
	pcnt = 70 - (pcnt*10);
	conf.upages = (conf.npage*pcnt)/100;

	ktop = PGROUND((ulong)end);
	ktop = PADDR(ktop);

M port/alloc.c => port/alloc.c +34 -7
@@ 21,6 21,7 @@
enum
{
	Maxpow		= 18,
	CUTOFF		= 12,
	Nhole		= 128,
	Magichole	= 0xDeadBabe,
	Magic2n		= 0xFeedBeef,


@@ 134,7 135,7 @@ xspanalloc(ulong size, int align, ulong span)
	for(i = 0; i < Spanlist; i++) {
		p = (ulong)xalloc(size+align);
		if(p == 0)
			panic("xspanalloc: size %d align %d span %lux", size, align, span);
			panic("xspanalloc: %d %d %lux", size, align, span);

		a = p+align;
		a &= ~(align-1);


@@ 256,8 257,9 @@ xhole(ulong addr, ulong size)
void*
malloc(ulong size)
{
	int pow;
	Bucket *bp;
	ulong next;
	int pow, n;
	Bucket *bp, *nbp;

	for(pow = 3; pow <= Maxpow; pow++)
		if(size <= (1<<pow))


@@ 280,12 282,37 @@ good:
		memset(bp->data, 0,  size);
		return  bp->data;
	}
	arena.nbuck[pow]++;
	unlock(&arena);

	size = sizeof(Bucket)+(1<<pow);
	bp = xalloc(size);
	if(bp == nil)
		return nil;
	size += 3;
	size &= ~3;

	if(pow < CUTOFF) {
		n = (CUTOFF-pow)+2;
		bp = xalloc(size*n);
		if(bp == nil)
			return nil;

		next = (ulong)bp+size;
		nbp = (Bucket*)next;
		lock(&arena);
		arena.btab[pow] = nbp;
		arena.nbuck[pow] += n;
		for(n -= 2; n; n--) {
			next = (ulong)nbp+size;
			nbp->next = (Bucket*)next;
			nbp->size = pow;
			nbp = nbp->next;
		}
		nbp->size = pow;
		unlock(&arena);
	}
	else {
		bp = xalloc(size);
		if(bp == nil)
			return nil;
	}

	bp->size = pow;
	bp->magic = Magic2n;

M port/devbit.c => port/devbit.c +24 -4
@@ 75,6 75,7 @@ struct
	int	nsubfont;	/* number allocated */
	Arena	*arena;		/* array */
	int	narena;		/* number allocated */
	int	mouseopen;	/* flag: mouse open */
	int	bid;		/* last allocated bitmap id */
	int	subfid;		/* last allocated subfont id */
	int	cacheid;	/* last cached subfont id */


@@ 326,10 327,22 @@ bitopen(Chan *c, int omode)
{
	GBitmap *b;

	if(c->qid.path == CHDIR){
	switch(c->qid.path){
	case CHDIR:
		if(omode != OREAD)
			error(Eperm);
	}else if(c->qid.path == Qbitblt){
		break;
	case Qmouse:
		lock(&bit);
		if(bit.mouseopen){
			unlock(&bit);
			error(Einuse);
		}
		bit.mouseopen = 1;
		bit.ref++;
		unlock(&bit);
		break;
	case Qbitblt:
		lock(&bit);
		if(bit.ref){
			unlock(&bit);


@@ 352,8 365,10 @@ bitopen(Chan *c, int omode)
		bit.ref = 1;
		Cursortocursor(&arrow);
		unlock(&bit);
	}else
		break;
	default:
		incref(&bit);
	}
	c->mode = openmode(omode);
	c->flag |= COPEN;
	c->offset = 0;


@@ 390,6 405,8 @@ bitclose(Chan *c)

	if(c->qid.path!=CHDIR && (c->flag&COPEN)){
		lock(&bit);
		if(c->qid.path == Qmouse)
			bit.mouseopen = 0;
		if(--bit.ref == 0){
			ebp = &bit.map[bit.nmap];
			for(bp = bit.map; bp<ebp; bp++){


@@ 1628,7 1645,10 @@ bitstring(GBitmap *bp, Point pt, GFont *f, uchar *p, long l, Fcode fc)
		if(!full){
			rect.min.y = c->top;
			rect.max.y = c->bottom;
		}
		}else if(c->left > 0)
			gbitblt(bp, pt, f->b,
				Rect(pt.x, pt.y, pt.x+c->left, pt.y+f->height),
				fc==S? 0 : F);
		rect.min.x = c->x;
		rect.max.x = c->xright;
		gbitblt(bp, Pt(pt.x+c->left, pt.y+rect.min.y), f->b, rect, fc);

M port/devip.c => port/devip.c +2 -1
@@ 745,7 745,8 @@ ipstatusfill(Chan *c, char *buf, int len)
			ilstate[cp->ilctl.state], cp->ilctl.rtt,
			cp->ifc ? cp->ifc->chkerrs : 0);
	else
		sprint(buf, "%s/%d %d\n", cp->ifc->protop->name, connection, cp->ref);
		sprint(buf, "%s/%d %d Datagram\n",
				cp->ifc->protop->name, connection, cp->ref);
}

int

M port/sysfile.c => port/sysfile.c +10 -10
@@ 26,7 26,7 @@ newfd(Chan *c)
		}
	unlock(f);
	exhausted("file descriptors");
	return 0;		/* not reached */
	return 0;
}

Chan*


@@ 194,10 194,11 @@ sysclose(ulong *arg)
long
unionread(Chan *c, void *va, long n)
{
	Chan *nc;
	Pgrp *pg = u->p->pgrp;
	long nr;
	Chan *nc;
	Pgrp *pg;

	pg = u->p->pgrp;
	rlock(&pg->ns);

	for(;;) {


@@ 208,17 209,17 @@ unionread(Chan *c, void *va, long n)
		nc = clone(c->mnt->to, 0);
		poperror();

		if(c->mountid != c->mnt->mountid){
		if(c->mountid != c->mnt->mountid) {
			pprint("unionread: changed underfoot?\n");
			runlock(&pg->ns);
			close(nc);
			return 0;
		}

		if(waserror()){
			runlock(&pg->ns);
		/* Error causes component of union to be skipped */
		if(waserror()) {	
			close(nc);
			nexterror();
			goto next;
		}

		nc = (*devtab[nc->type].open)(nc, OREAD);


@@ 233,9 234,8 @@ unionread(Chan *c, void *va, long n)
			runlock(&pg->ns);
			return nr;
		}
		/*
		 * Advance to next element
		 */
		/* Advance to next element */
	next:
		c->mnt = c->mnt->next;
		if(c->mnt == 0)
			break;

M port/systab.h => port/systab.h +10 -9
@@ 12,8 12,8 @@ Syscall sysdup;
Syscall sysalarm;
Syscall sysexec;
Syscall sysexits;
Syscall sysdeath;
Syscall sysdeath;
Syscall sys_x1;
Syscall sys_x2;
Syscall sysfstat;
Syscall syssegbrk;
Syscall sysmount;


@@ 26,7 26,7 @@ Syscall sysrfork;
Syscall syswrite;
Syscall syspipe;
Syscall syscreate;
Syscall sysdeath;
Syscall sys_x3;
Syscall sysbrk_;
Syscall sysremove;
Syscall syswstat;


@@ 40,6 40,7 @@ Syscall syssegflush;
Syscall sysrendezvous;
Syscall sysunmount;
Syscall syswait;
Syscall	sysdeath;

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


@@ 51,8 52,8 @@ Syscall *systab[]={
	[ALARM]		sysalarm,
	[EXEC]		sysexec,
	[EXITS]		sysexits,
	[__FORK__]	sysdeath,
	[__FORKPGRP__]	sysdeath,
	[_X1]		sysdeath,
	[_X2]		sysdeath,
	[FSTAT]		sysfstat,
	[SEGBRK]	syssegbrk,
	[MOUNT]		sysmount,


@@ 65,7 66,7 @@ Syscall *systab[]={
	[WRITE]		syswrite,
	[PIPE]		syspipe,
	[CREATE]	syscreate,
	[__RFORK__]	sysdeath,
	[_X3]		sysdeath,
	[BRK_]		sysbrk_,
	[REMOVE]	sysremove,
	[WSTAT]		syswstat,


@@ 91,8 92,8 @@ char *sysctab[]={
	[ALARM]		"Alarm",
	[EXEC]		"Exec",
	[EXITS]		"Exits",
	[__FORK__]	"__fork_",
	[__FORKPGRP__]	"__forkpgrp_",
	[_X1]		"_x1",
	[_X2]		"_x2",
	[FSTAT]		"Fstat",
	[SEGBRK]	"Segbrk",
	[MOUNT]		"Mount",


@@ 105,7 106,7 @@ char *sysctab[]={
	[WRITE]		"Write",
	[PIPE]		"Pipe",
	[CREATE]	"Create",
	[__RFORK__]	"__rfork_",
	[_X3]		"_x3",
	[BRK_]		"Brk",
	[REMOVE]	"Remove",
	[WSTAT]		"Wstat",

M ss/main.c => ss/main.c +1 -0
@@ 133,6 133,7 @@ userinit(void)
	strcpy(p->text, "*init*");
	strcpy(p->user, eve);
	savefpregs(&initfp);
/*	initfp.fsr |= 0x1E << 23;	/* trap on all but INEXACT */
	p->fpstate = FPinit;

	/*

M ss/trap.c => ss/trap.c +0 -1
@@ 346,7 346,6 @@ noted(Ureg **urp, ulong arg0)
long
syscall(Ureg *aur)
{
	int i;
	long ret;
	ulong sp;
	Ureg *ur;