~kris/9p

9hist

1b3952ecd1ca160fa66f55e43b7be629cb9c02f8 — David du Colombier 32 years ago 71c3611
Plan 9 from Bell Labs 1994-07-29
7 files changed, 128 insertions(+), 104 deletions(-)

M carrera/l.s
M pc/devvga.c
M pc/vga.h
M pc/vgabt485.c
M pc/vgatvp3020.c
M port/portdat.h
M port/proc.c
M carrera/l.s => carrera/l.s +78 -53
@@ 363,36 363,38 @@ TEXT	vector180(SB), $-4
TEXT	exception(SB), $-4
	MOVW	M(STATUS), R26
	WAIT
	AND	$KUSER, R26
	BEQ	R26, waskernel
wasuser:
	CONST	(MACHADDR, R27)		/* R27 = m-> */
	MOVW	8(R27), R26		/* R26 = m->proc */
	MOVW	8(R26), R27		/* R27 = m->proc->kstack */
	MOVW	SP, R26			/* save user sp */
	ADDU	$(KSTACK-UREGSIZE), R27, SP
	AND	$KUSER, R26, R27
	BEQ	R27, waskernel

	MOVW	R26, Ureg_sp(SP)	/* user SP */
wasuser:
	MOVW	SP, R27
	CONST	(MACHADDR, SP)		/* R27 = m-> */
	MOVW	8(SP), SP		/* R26 = m->proc */
	MOVW	8(SP), SP		/* R27 = m->proc->kstack */
	ADDU	$(KSTACK-UREGSIZE), SP
	MOVV	R31, (Ureg_r31-4)(SP)

	JAL	savereg1(SB)

	MOVV	R30, (Ureg_r30-4)(SP)
	MOVW	M(CAUSE), R26
	MOVV	R(MACH), (Ureg_r25-4)(SP)
	MOVV	R(USER), (Ureg_r24-4)(SP)
	AND	$(EXCMASK<<2), R26
	SUBU	$(CSYS<<2), R26

	JAL	saveregs(SB)

	MOVW	$setR30(SB), R30
	CONST	(MACHADDR, R1)
	MOVW	R1, R(MACH)			/* R(MACH) = m-> */
	MOVW	8(R(MACH)), R(USER)		/* up = m->proc */
	MOVW	4(SP), R1			/* first arg for syscall/trap */
	BNE	R26, notsys

	AND	$(EXCMASK<<2), R26, R1
	SUBU	$(CSYS<<2), R1
	BNE	R1, notsys

	ADDU	$Uoffset, SP, R1	/* first arg for syscall */
	JAL	syscall(SB)

sysrestore:
	JAL	restreg1(SB)

	MOVV	(Ureg_r31-4)(SP), R31
	MOVW	Ureg_status(SP), R26
	MOVV	(Ureg_r30-4)(SP), R30


@@ 404,11 406,17 @@ sysrestore:
	ERET

notsys:
	JAL	savereg2(SB)

	ADDU	$Uoffset, SP, R1	/* first arg for trap */
	JAL	trap(SB)

restore:
	JAL	restregs(SB)
	MOVV	(Ureg_r31-4)(SP), R31
	JAL	restreg1(SB)
	JAL	restreg2(SB)

	MOVV	(Ureg_r30-4)(SP), R30
	MOVV	(Ureg_r31-4)(SP), R31
	MOVV	(Ureg_r25-4)(SP), R(MACH)
	MOVV	(Ureg_r24-4)(SP), R(USER)
	MOVW	Ureg_sp(SP), SP


@@ 416,17 424,21 @@ restore:
	ERET

waskernel:
	MOVW	SP, R26
	MOVW	SP, R27
	SUBU	$UREGSIZE, SP
	OR	$7, SP
	XOR	$7, SP
	MOVW	R26, Ureg_sp(SP)
	MOVV	R31, (Ureg_r31-4)(SP)
	MOVW	$1, R26			/* not syscall */
	JAL	saveregs(SB)
	MOVW	4(SP), R1		/* first arg for trap */

	JAL	savereg1(SB)
	JAL	savereg2(SB)

	ADDU	$Uoffset, SP, R1	/* first arg for trap */
	JAL	trap(SB)
	JAL	restregs(SB)

	JAL	restreg1(SB)
	JAL	restreg2(SB)

	MOVV	(Ureg_r31-4)(SP), R31
	MOVW	Ureg_sp(SP), SP
	MOVW	R26, M(EPC)


@@ 436,31 448,43 @@ TEXT	forkret(SB), $0
	MOVW	R0, R1			/* Fake out system call return */
	JMP	sysrestore

TEXT	saveregs(SB), $-4
/*
 * save manditory registers.
 * called with old M(STATUS) in R26.
 * called with old SP in R27
 * returns with M(CAUSE) in R26
 */
TEXT	savereg1(SB), $-4
	MOVV	R1, (Ureg_r1-4)(SP)
	MOVV	R2, (Ureg_r2-4)(SP)

	MOVV	R6, (Ureg_r6-4)(SP)
	MOVV	R5, (Ureg_r5-4)(SP)
	MOVW	$(~KMODEMASK),R1	/* don't use R28 */
	AND	R26, R1
	MOVW	R1, M(STATUS)

	ADDU	$Uoffset, SP, R1
	MOVW	R1, 4(SP)		/* arg to base of regs */
	MOVW	M(STATUS), R1
	MOVW	M(EPC), R2
	WAIT
	MOVW	R1, Ureg_status(SP)
	MOVW	R2, Ureg_pc(SP)
	MOVW	R26, Ureg_status(SP)	/* status */
	MOVW	R27, Ureg_sp(SP)	/* user SP */

	MOVW	$(~KMODEMASK),R2	/* don't let him use R28 */
	AND	R2, R1
	MOVW	R1, M(STATUS)
	WAIT
	BEQ	R26, return		/* sys call, don't save */
	MOVW	M(EPC), R1
	MOVW	M(CAUSE), R26

	MOVV	R23, (Ureg_r23-4)(SP)
	MOVV	R22, (Ureg_r22-4)(SP)
	MOVV	R21, (Ureg_r21-4)(SP)
	MOVV	R20, (Ureg_r20-4)(SP)
	MOVV	R19, (Ureg_r19-4)(SP)
	MOVW	R1, Ureg_pc(SP)
	RET

/*
 * all other registers.
 * called with M(CAUSE) in R26
 */
TEXT	savereg2(SB), $-4
	MOVV	R2, (Ureg_r2-4)(SP)

	MOVW	M(CAUSE), R1
	MOVW	M(BADVADDR), R2
	NOOP
	MOVW	R1, Ureg_cause(SP)
	MOVW	R26, Ureg_cause(SP)
	MOVW	M(TLBVIRT), R1
	NOOP
	MOVW	R2, Ureg_badvaddr(SP)


@@ 473,11 497,7 @@ TEXT	saveregs(SB), $-4
	MOVV	R28, (Ureg_r28-4)(SP)
					/* R27, R26 not saved */
					/* R25, R24 missing */
	MOVV	R23, (Ureg_r23-4)(SP)
	MOVV	R22, (Ureg_r22-4)(SP)
	MOVV	R21, (Ureg_r21-4)(SP)
	MOVV	R20, (Ureg_r20-4)(SP)
	MOVV	R19, (Ureg_r19-4)(SP)
					/* R23- R19 saved in save1 */
	MOVV	R18, (Ureg_r18-4)(SP)
	MOVV	R17, (Ureg_r17-4)(SP)
	MOVV	R16, (Ureg_r16-4)(SP)


@@ 490,21 510,26 @@ TEXT	saveregs(SB), $-4
	MOVV	R9, (Ureg_r9-4)(SP)
	MOVV	R8, (Ureg_r8-4)(SP)
	MOVV	R7, (Ureg_r7-4)(SP)
	MOVV	R6, (Ureg_r6-4)(SP)
	MOVV	R5, (Ureg_r5-4)(SP)
	MOVV	R4, (Ureg_r4-4)(SP)
	MOVV	R3, (Ureg_r3-4)(SP)
return:
	RET

TEXT	restregs(SB), $-4
					/* LINK,SB,SP missing */
	MOVV	(Ureg_r28-4)(SP), R28
					/* R27, R26 not saved */
					/* R25, R24 missing */
TEXT	restreg1(SB), $-4
	MOVV	(Ureg_r23-4)(SP), R23
	MOVV	(Ureg_r22-4)(SP), R22
	MOVV	(Ureg_r21-4)(SP), R21
	MOVV	(Ureg_r20-4)(SP), R20
	MOVV	(Ureg_r19-4)(SP), R19
	RET

TEXT	restreg2(SB), $-4
					/* LINK,SB,SP missing */
	MOVV	(Ureg_r28-4)(SP), R28
					/* R27, R26 not saved */
					/* R25, R24 missing */
					/* R19- R23 restored in rest1 */
	MOVV	(Ureg_r18-4)(SP), R18
	MOVV	(Ureg_r17-4)(SP), R17
	MOVV	(Ureg_r16-4)(SP), R16

M pc/devvga.c => pc/devvga.c +9 -9
@@ 25,7 25,7 @@ Bitmap	gscreen;
/* vga screen */
static	Lock	screenlock;
static	ulong	colormap[256][3];
Lock pallettelock;
Lock palettelock;

/* cga screen */
static	int	cga = 1;		/* true if in cga mode */


@@ 757,7 757,7 @@ screenload(Rectangle r, uchar *data, int tl, int l, int dolock)

	if(dolock && hwgc == 0)
		cursorlock(r);
	lock(&pallettelock);
	lock(&palettelock);

	q = byteaddr(&gscreen, r.min);
	mx = 7>>gscreen.ldepth;


@@ 837,7 837,7 @@ screenload(Rectangle r, uchar *data, int tl, int l, int dolock)
			data += l;
		}

	unlock(&pallettelock);
	unlock(&palettelock);
	if(dolock && hwgc == 0)
		cursorunlock();
}


@@ 913,7 913,7 @@ screenunload(Rectangle r, uchar *data, int tl, int l, int dolock)

	if(dolock && hwgc == 0)
		cursorlock(r);
	lock(&pallettelock);
	lock(&palettelock);

	q = byteaddr(&gscreen, r.min);
	mx = 7>>gscreen.ldepth;


@@ 993,7 993,7 @@ screenunload(Rectangle r, uchar *data, int tl, int l, int dolock)
			data += l;
		}

	unlock(&pallettelock);
	unlock(&palettelock);
	if(dolock && hwgc == 0)
		cursorunlock();
}


@@ 1279,11 1279,11 @@ getcolor(ulong p, ulong *pr, ulong *pg, ulong *pb)
	}
	p &= x;
	p ^= x;
	lock(&pallettelock);
	lock(&palettelock);
	*pr = colormap[p][0];
	*pg = colormap[p][1];
	*pb = colormap[p][2];
	unlock(&pallettelock);
	unlock(&palettelock);
}

int


@@ 1301,7 1301,7 @@ setcolor(ulong p, ulong r, ulong g, ulong b)
	}
	p &= x;
	p ^= x;
	lock(&pallettelock);
	lock(&palettelock);
	colormap[p][0] = r;
	colormap[p][1] = g;
	colormap[p][2] = b;


@@ 1309,7 1309,7 @@ setcolor(ulong p, ulong r, ulong g, ulong b)
	vgao(DACData, r>>(32-6));
	vgao(DACData, g>>(32-6));
	vgao(DACData, b>>(32-6));
	unlock(&pallettelock);
	unlock(&palettelock);
	return ~0;
}


M pc/vga.h => pc/vga.h +1 -1
@@ 46,4 46,4 @@ typedef struct Hwgc {
	void	(*disable)(void);
} Hwgc;

extern Lock pallettelock;
extern Lock palettelock;

M pc/vgabt485.c => pc/vgabt485.c +8 -8
@@ 112,7 112,7 @@ load(Cursor *c)
	int x, y;


	lock(&pallettelock);
	lock(&palettelock);

	/*
	 * Turn cursor off;


@@ 161,7 161,7 @@ load(Cursor *c)
	r = (bt485i(Cmd2) & 0xFC)|0x01;
	bt485o(Cmd2, r);

	unlock(&pallettelock);
	unlock(&palettelock);
}

static void


@@ 169,7 169,7 @@ enable(void)
{
	uchar r;

	lock(&pallettelock);
	lock(&palettelock);

	/*
	 * Turn cursor off.


@@ 190,7 190,7 @@ enable(void)
	bt485o(Color, 0x00); bt485o(Color, 0x00); bt485o(Color, 0x00);
	bt485o(Color, 0x00); bt485o(Color, 0x00); bt485o(Color, 0x00);

	unlock(&pallettelock);
	unlock(&palettelock);

	/*
	 * Finally, enable


@@ 212,7 212,7 @@ move(Point p)
{
	int x, y;

	if(canlock(&pallettelock) == 0)
	if(canlock(&palettelock) == 0)
		return 1;

	x = p.x+hotpoint.x;


@@ 223,7 223,7 @@ move(Point p)
	bt485o(Cylr, y & 0xFF);
	bt485o(Cyhr, (y>>8) & 0x0F);

	unlock(&pallettelock);
	unlock(&palettelock);
	return 0;
}



@@ 238,10 238,10 @@ disable(void)
	 *	cursor control enable for Bt485 DAC;
	 *	the hardware cursor external operation mode.
	 */
	lock(&pallettelock);
	lock(&palettelock);
	r = bt485i(Cmd2) & ~0x03;
	bt485o(Cmd2, r);
	unlock(&pallettelock);
	unlock(&palettelock);

	r = vgaxi(Crtx, 0x45) & ~0x20;
	vgaxo(Crtx, 0x45, r);

M pc/vgatvp3020.c => pc/vgatvp3020.c +8 -8
@@ 59,7 59,7 @@ load(Cursor *c)
	uchar p, p0, p1;
	int x, y;

	lock(&pallettelock);
	lock(&palettelock);

	/*
	 * Make sure cursor is off by initialising the cursor


@@ 147,7 147,7 @@ load(Cursor *c)

	tvp3020xo(0x06, 0x40|0x10);			/* Cursor Control Register */

	unlock(&pallettelock);
	unlock(&palettelock);
}

static void


@@ 155,7 155,7 @@ enable(void)
{
	uchar r;

	lock(&pallettelock);
	lock(&palettelock);

	/*
	 * Make sure cursor is off by initialising the cursor


@@ 172,7 172,7 @@ enable(void)
	tvp3020xo(0x23, 0xFF); tvp3020xo(0x24, 0xFF); tvp3020xo(0x25, 0xFF);
	tvp3020xo(0x26, 0x00); tvp3020xo(0x27, 0x00); tvp3020xo(0x28, 0x00);

	unlock(&pallettelock);
	unlock(&palettelock);

	/*
	 * Finally, enable


@@ 189,7 189,7 @@ enable(void)
static int
move(Point p)
{
	if(canlock(&pallettelock) == 0)
	if(canlock(&palettelock) == 0)
		return 1;

	tvp3020xo(0x00, p.x & 0xFF);			/* Cursor Position X LSB */


@@ 197,7 197,7 @@ move(Point p)
	tvp3020xo(0x02, p.y & 0xFF);			/* Cursor Position Y LSB */
	tvp3020xo(0x03, (p.y>>8) & 0x0F);		/* Cursor Position Y MSB */

	unlock(&pallettelock);
	unlock(&palettelock);
	return 0;
}



@@ 212,9 212,9 @@ disable(void)
	 *	cursor control enable for Bt485 DAC (!);
	 *	the hardware cursor external operation mode.
	 */
	lock(&pallettelock);
	lock(&palettelock);
	tvp3020xo(0x06, 0x10);				/* Cursor Control Register */
	unlock(&pallettelock);
	unlock(&palettelock);

	r = vgaxi(Crtx, 0x45) & ~0x20;
	vgaxo(Crtx, 0x45, r);

M port/portdat.h => port/portdat.h +2 -1
@@ 577,7 577,8 @@ struct Proc
	int	(*notify)(void*, char*);

	Mach	*mp;		/* machine this process last ran on */
	ulong	priority;
	ulong	priority;	/* priority level 0 is highest */
	ulong	movetime;	/* last time process switched processors */

	void	*ureg;		/* User registers for notes */
	void	*dbgreg;	/* User registers for devproc */

M port/proc.c => port/proc.c +22 -24
@@ 108,13 108,7 @@ sched(void)
int
anyready(void)
{
	Schedq *rq;

	for(rq = runq; rq < &runq[Nrq]; rq++)
		if(rq->head)
			return 1;

	return 0;
	return nrdy;
}

void


@@ 132,7 126,6 @@ ready(Proc *p)
		} else
			p->priority = 1;
	}
if(p->priority < 0 || p->priority >= Nrq) panic("ready");
	rq = &runq[p->priority];

	lock(runq);


@@ 158,32 151,34 @@ runproc(void)
loop:

	/*
	 *  find highest priority queue with runnable process
	 *  find a process at level 0 (programs from '/' file system),
	 *  one that last ran on this processor (affinity),
	 *  or one that hasn't moved in a while (load balancing).
	 */
	spllo();
	for(rq = runq; rq < &runq[Nrq]; rq++)
		if(rq->head)
			break;
	if(rq == &runq[Nrq])
		goto loop;
	splhi();
	for(;;){
		for(rq = runq; rq < &runq[Nrq]; rq++){
			if(rq->head == 0)
				continue;
			for(p = rq->head; p; p = p->rnext){
				if(rq == runq || p->mp == m || 
				   m->ticks - p->movetime > HZ/2)
					goto found;
			}
		}
	}


found:
	splhi();
	lock(runq);

	/*
	 *  affinity: look for a process last run on this processor,
	 *	otherwise, take first in list.
	 */
	l = 0;
	for(p = rq->head; p; p = p->rnext){
		if(p->mp == m)
		if(rq == runq || p->mp == m || m->ticks - p->movetime > HZ/2)
			break;
		l = p;
	}
	if(p == 0){
		l = 0;
		p = rq->head;
	}

	/*
	 *  p->mach==0 only when process state is saved


@@ 205,6 200,8 @@ loop:
	unlock(runq);

	p->state = Scheding;
	if(p->mp != m)
		p->movetime = m->ticks;
	p->mp = m;
	return p;
}


@@ 261,6 258,7 @@ newproc(void)
	p->procctl = 0;
	p->notepending = 0;
	p->mp = 0;
	p->movetime = 0;
	memset(p->seg, 0, sizeof p->seg);
	p->pid = incref(&pidalloc);
	p->noteid = incref(&noteidalloc);