~kris/9p

9hist

9584dbf140aab3d221ec0028d0df1e422aa63a6d — David du Colombier 35 years ago dc74f70
Plan 9 from Bell Labs 1991-06-14
M gnot/clock.c => gnot/clock.c +6 -2
@@ 35,8 35,12 @@ clock(Ureg *ur)
	kbdclock();
	mouseclock();
	if((ur->sr&SPL(7)) == 0 && p && p->state==Running){
		if(anyready())
			sched();
		if(anyready()){
			if(p->hasspin)
				p->hasspin = 0;
			else
				sched();
		}
		if(u->nnote && (ur->sr&SUPER)==0)
			notify(ur);
	}

M gnot/devduart.c => gnot/devduart.c +1 -1
@@ 747,8 747,8 @@ duartoput(Queue *q, Block *bp)
		(*cq->puts)(cq, bp->rptr, n);
		bp->rptr += n;
	}
	freeb(bp);
	poperror();
	freeb(bp);
}

/*

M gnot/lock.c => gnot/lock.c +8 -0
@@ 28,12 28,16 @@ lock(Lock *l)
    	if(ll->key >= 0){
		ll->key |= 0x80;
		ll->pc = ((ulong*)&l)[PCOFF];
		if(u && u->p)
			u->p->hasspin = 1;
		return;
	}
	for(i=0; i<10000000; i++)
    		if(ll->key >= 0){
			ll->key |= 0x80;
			ll->pc = ((ulong*)&l)[PCOFF];
			if(u && u->p)
				u->p->hasspin = 1;
			return;
		}
	ll->key = 0;


@@ 47,6 51,8 @@ canlock(Lock *l)
	if(ll->key >= 0){
		ll->key |= 0x80;
		ll->pc = ((ulong*)&l)[PCOFF];
		if(u && u->p)
			u->p->hasspin = 1;
		return 1;
	}
	return 0;


@@ 57,6 63,8 @@ unlock(Lock *l)
{
	l->pc = 0;
	l->key = 0;
	if(u && u->p)
		u->p->hasspin = 0;
}

void

M gnot/trap.c => gnot/trap.c +10 -3
@@ 250,6 250,7 @@ Syscall *systab[]={
long
syscall(Ureg *aur)
{
	int i;
	long ret;
	ulong sp;
	ulong r0;


@@ 292,11 293,17 @@ syscall(Ureg *aur)
			msg = "sys: odd stack";
			goto Bad;
		}
		if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-5*BY2WD))
			validaddr(sp, 5*BY2WD, 0);
		if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-(1+MAXSYSARG)*BY2WD))
			validaddr(sp, (1+MAXSYSARG)*BY2WD, 0);
		ret = (*systab[r0])((ulong*)(sp+BY2WD));
		poperror();
	}
	if(u->nerrlab){
		print("unbalanced error stack: %d extra\n", u->nerrlab);
		for(i = 0; i < NERR; i++)
			print("sp=%lux pc=%lux\n", u->errlab[i].sp, u->errlab[i].pc);
		panic("bad rob");
	}
	u->nerrlab = 0;
	u->p->insyscall = 0;
	if(r0 == NOTED)	/* ugly hack */
		noted(aur);	/* doesn't return */

M pc/dat.h => pc/dat.h +0 -20
@@ 27,26 27,6 @@ struct Label
{
	ulong	sp;
	ulong	pc;
	ushort	sr;
};

/*
 * floating point registers
 */
enum
{
	FPinit,
	FPactive,
	FPdirty,
};

struct	FPsave
{
	uchar	type;
	uchar	size;
	short	reserved;
	char	junk[212];	/* 68881: sizes 24, 180; 68882: 56, 212 */
	char	reg[3*4+8*12];
};

struct Conf

A pc/fns.h => pc/fns.h +2 -0
@@ 0,0 1,2 @@
void	restregs(void);
void	saveregs(void);

A pc/l.s => pc/l.s +292 -0
@@ 0,0 1,292 @@

/*
 * Boot first processor
 */
TEXT	start(SB),$0

	/* clear bss */
	CALL	main(SB)
	/* never returns */


TEXT	traptab(SB),$0

	CALL	noerrcode(SB)	/* divide */
	CALL	noerrcode(SB)	/* debug */
	CALL	noerrcode(SB)	/* non maskable interrupt */
	CALL	noerrcode(SB)	/* breakpoint */
	CALL	noerrcode(SB)	/* overflow */
	CALL	noerrcode(SB)	/* bounds check */
	CALL	noerrcode(SB)	/* invalid opcode */
	CALL	noerrcode(SB)	/* coprocessor not available */
	CALL	errcode(SB)	/* double fault */
	CALL	noerrcode(SB)	/* coprocessor segment overrun */
	CALL	errcode(SB)	/* invalid tss */
	CALL	errcode(SB)	/* segment not present */
	CALL	errcode(SB)	/* stack exception */	
	CALL	errcode(SB)	/* general protection exception */
	CALL	errcode(SB)	/* page fault */
	CALL	noerrcode(SB)	/* coprocessor error */
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)
	CALL	noerrcode(SB)

TEXT	noerrcode(SB),$0
	PUSH	EAX
	/* drop through */
TEXT	errcode(SB),$0
	PUSH	EAX
	PUSH	EBX
	PUSH	ECX
	PUSH	EDX
	PUSH	EBP
	PUSH	ESI
	PUSH	EDI
	CALL	trap(SB)
	POP	EDI
	POP	ESI
	POP	EBP
	POP	EDX
	POP	ECX
	POP	EBX
	POP	EAX
	ADD	$8,ESP	/* jump over error code + return addr */
	IRET

M pc/mem.h => pc/mem.h +1 -1
@@ 37,7 37,7 @@ struct Segdesc
/*
 *  segment descriptor initializers
 */
#define	DATASEG(p) 	{ SEGG|(0xF<<16)|SEGP|SEGPL(p)|SEGDATA|SEGW, 0xFFFF }
#define	DATASEG(p) 	{ SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(p)|SEGDATA|SEGW, 0xFFFF }
#define	EXECSEG(p) 	{ SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(p)|SEGEXEC|SEGR, 0xFFFF }

/*

M pc/trap.c => pc/trap.c +20 -1
@@ 43,7 43,7 @@ enum {
};

/*
 *  exception/trap gates
 *  trap/interrupt gates
 */
Segdesc ilt[256] =
{


@@ 63,3 63,22 @@ Segdesc ilt[256] =
[Efault]	TRAPGATE(KESEL, efault, 3),
[Eco]		TRAPGATE(KESEL, eco, 3),
};

/*
 *  trap table
 */
uchar	traptab[4096];

/*
 *  set up some basic vectored interrupts
 */
trapinit(

/*
 *  j-random uncaught trap or interrupt
 */
void
trap(void)
{
	panic("unknown trap");
}

M port/devbit.c => port/devbit.c +1 -0
@@ 1017,6 1017,7 @@ bitwrite(Chan *c, void *va, long n, ulong offset)
			break;
		}

	poperror();
	if(isoff)
		cursoron(1);
	return n;

M port/devcons.c => port/devcons.c +1 -0
@@ 497,6 497,7 @@ consread(Chan *c, void *buf, long n, ulong offset)
			*cbuf++ = ch;
			--n;
		}
		poperror();
		qunlock(&kbdq);
		return i;


M port/devproc.c => port/devproc.c +3 -0
@@ 328,6 328,7 @@ procread(Chan *c, void *va, long n, ulong offset)
			n = ERRLEN;
		}
		kunmap(k);
		poperror();
		unlock(&p->debug);
		return n;



@@ 387,6 388,7 @@ procwrite(Chan *c, void *va, long n, ulong offset)
  	  		goto Died;
		}
		pgrpnote(pg, va, n, NUser);
		poperror();
		qunlock(&pg->debug);
		return n;
	}


@@ 429,6 431,7 @@ procwrite(Chan *c, void *va, long n, ulong offset)
		pprint("unknown qid in procwrite\n");
		error(Egreg);
	}
	poperror();
	unlock(&p->debug);
	return n;
}

M port/portdat.h => port/portdat.h +2 -0
@@ 400,6 400,7 @@ struct Proc
	int	kp;			/* true if a kernel process */
	Proc	*palarm;		/* Next alarm time */
	ulong	alarm;			/* Time of call */
	int	hasspin;

	/*
	 *  machine specific MMU goo


@@ 491,6 492,7 @@ enum {
	Streambhi= 32,		/* block count high water mark */
};

#define MAXSYSARG	6	/* for mount(fd, mpt, flag, arg, srv, authfd) */
#define	PRINTSIZE	256
#define	NUMSIZE	12		/* size of formatted number */


M port/qlock.c => port/qlock.c +4 -1
@@ 10,8 10,11 @@ qlock(QLock *q)
{
	Proc *p;

	if(canlock(&q->use))
	if(canlock(&q->use)){
		if(u)
			u->p->hasspin = 0;
		return;
	}
	lock(&q->queue);
	if(canlock(&q->use)){
		unlock(&q->queue);

M port/stream.c => port/stream.c +1 -0
@@ 419,6 419,7 @@ popq(Stream *s)
		(*q->info->close)(RD(q));
	s->procq->next = q->next;
	RD(q->next)->next = RD(s->procq);
	poperror();
	qunlock(s);
	freeq(q);
}

M port/sysfile.c => port/sysfile.c +7 -2
@@ 243,6 243,7 @@ sysread(ulong *arg)
	else
		n = (*devtab[c->type].read)(c, (void*)arg[1], n, c->offset);
	c->offset += n;
	poperror();
	qunlock(&c->rdl);
	return n;
}


@@ 265,6 266,7 @@ syswrite(ulong *arg)
		error(Eisdir);
	n = (*devtab[c->type].write)(c, (void*)arg[1], arg[2], c->offset);
	c->offset += n;
	poperror();
	qunlock(&c->wrl);
	return n;
}


@@ 305,9 307,9 @@ sysseek(ulong *arg)
		break;
	}
	off = c->offset;
	poperror();
	qunlock(&c->rdl);
	qunlock(&c->wrl);
	poperror();
	return off;
}



@@ 412,8 414,10 @@ bindmount(ulong *arg, int ismount)
	if(flag && !(c0->qid.path&CHDIR))
		error(Ebadmount);
	ret = mount(c0, c1, flag);
	close(c0);
	poperror();
	close(c1);
	poperror();
	close(c0);
	if(ismount){
		close(bogus.chan);
		fdclose(arg[0]);


@@ 465,6 469,7 @@ sysremove(ulong *arg)
	 * so fake it up.  rootclose() is known to be a nop.
	 */
	c->type = 0;
	poperror();
	close(c);
	return 0;
}

M port/sysproc.c => port/sysproc.c +4 -1
@@ 204,8 204,8 @@ sysexec(ulong *arg)
	arg[1] += BY2WD;
	file = progarg[0];
	progarg[0] = elem;
	close(tc);
	poperror();
	close(tc);
	goto Header;

    Binary:


@@ 335,6 335,7 @@ sysexec(ulong *arg)
	s->maxva = b;
	s->mod = 0;

	poperror();
	close(tc);

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


@@ 435,6 436,7 @@ sysexits(ulong *arg)
			validaddr((ulong)status, 1, 0);
			vmemchr(status, 0, ERRLEN);
		}
		poperror();
	}
	pexit(status, 1);
}


@@ 496,6 498,7 @@ sysforkpgrp(ulong *arg)
		memset(u->note, 0, sizeof(u->note));
	}

	poperror();
	closepgrp(u->p->pgrp);
	u->p->pgrp = pg;
	return pg->pgrpid;

M power/clock.c => power/clock.c +6 -2
@@ 109,8 109,12 @@ clock(Ureg *ur)
		}
		checkalarms();
		if(u && (ur->status&IEP) && u->p && u->p->state==Running){
			if(anyready())
				sched();
			if(anyready()){
				if(u->p->hasspin)
					u->p->hasspin = 0;	/* just in case */
				else
					sched();
			}
			if(u->nnote && (ur->status&KUP))
				notify(ur);
		}

M power/lock.c => power/lock.c +8 -0
@@ 135,11 135,15 @@ lock(Lock *ll)
	 */
	if((*sbsem&1) == 0){
		l->pc = ((ulong*)&ll)[PCOFF];
		if(u && u->p)
			u->p->hasspin = 1;
		return;
	}
	for(i=0; i<10000000; i++)
    		if((*sbsem&1) == 0){
			l->pc = ((ulong*)&ll)[PCOFF];
			if(u && u->p)
				u->p->hasspin = 1;
			return;
	}
	*sbsem = 0;


@@ 168,6 172,8 @@ canlock(Lock *l)
	}
	if(*sbsem & 1)
		return 0;
	if(u && u->p)
		u->p->hasspin = 1;
	return 1;
}



@@ 176,6 182,8 @@ unlock(Lock *l)
{
	l->pc = 0;
	*l->sbsem = 0;
	if(u && u->p)
		u->p->hasspin = 0;
}

void

M ss/trap.c => ss/trap.c +10 -3
@@ 309,6 309,7 @@ Syscall *systab[]={
long
syscall(Ureg *aur)
{
	int i;
	long ret;
	ulong sp;
	ulong r7;


@@ 349,13 350,19 @@ syscall(Ureg *aur)
			msg = "sys: odd stack";
			goto Bad;
		}
		if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-5*BY2WD))
			validaddr(sp, 5*BY2WD, 0);
		if(sp<(USTKTOP-BY2PG) || sp>(USTKTOP-(2+MAXSYSARG)*BY2WD))
			validaddr(sp, ((2+MAXSYSARG)*BY2WD), 0);
		ret = (*systab[r7])((ulong*)(sp+2*BY2WD));
		poperror();
	}
	ur->pc += 4;
	ur->npc = ur->pc+4;
	u->nerrlab = 0;
	if(u->nerrlab){
		print("unbalanced error stack: %d extra\n", u->nerrlab);
		for(i = 0; i < NERR; i++)
			print("sp=%lux pc=%lux\n", u->errlab[i].sp, u->errlab[i].pc);
		panic("bad rob");
	}
	u->p->insyscall = 0;
	if(r7 == NOTED)	/* ugly hack */
		noted(&aur);	/* doesn't return */