~kris/9p

9hist

49c39b160bc1b55189f276e04348957e10bf1993 — David du Colombier 34 years ago 6affaa4
Plan 9 from Bell Labs 1992-06-03
10 files changed, 49 insertions(+), 119 deletions(-)

M pc/devvga.c
M pc/vga.c
M pc/vga.h
M port/devcons.c
M port/devmnt.c
M port/devwren.c
M port/proc.c
M port/stream.c
M port/sysproc.c
M port/systab.h
M pc/devvga.c => pc/devvga.c +23 -10
@@ 6,6 6,8 @@
#include	"io.h"
#include	"../port/error.h"

#include	<libg.h>
#include	<gnot.h>
#include	"devtab.h"
#include	"vga.h"



@@ 128,16 130,15 @@ vgaread(Chan *c, void *buf, long n, ulong offset)
	case Qvgatype:
		return readstr(offset, buf, n, vgacard);
	case Qvgasize:
		sprint(obuf, "%dx%d%x%d %s",
			screeninfo.maxx, screeninfo.maxy,
			(screeninfo.packed == 0) ? 256 : 16,
			(screeninfo.interlaced != 0) ? "interlaced" : "non-interlaced");
		sprint(obuf, "%d %d",
			gscreen.r.max.x, gscreen.r.max.y);
		return readstr(offset, buf, n, obuf);
	case Qvgaport:
		if (offset + n >= 0x8000)
			error(Ebadarg);
		for (port=offset; port<offset+n; port++)
		for (port=offset; port<offset+n; port++) {
			*cp++ = inb(port);
		}
		return n;
	}
}


@@ 145,9 146,8 @@ vgaread(Chan *c, void *buf, long n, ulong offset)
long
vgawrite(Chan *c, void *buf, long n, ulong offset)
{
	uchar *cp = buf;
	void (*outfunc)(int, int);
	int port, i;
	char cbuf[20], *cp;
	int port, i, maxx, maxy;

	switch(c->qid.path&~CHDIR){
	case Qdir:


@@ 163,12 163,25 @@ vgawrite(Chan *c, void *buf, long n, ulong offset)
	case Qvgasize:
		if(offset != 0)
			error(Ebadarg);
		error(Eperm);
		if(n >= sizeof cbuf)
			n = sizeof cbuf - 1;
		memmove(cbuf, buf, n);
		cbuf[n-1] = 0;
		cp = cbuf;
		maxx = strtoul(cp, &cp, 0);
		maxy = strtoul(cp, &cp, 0);
		if (maxx == 0 || maxy == 0 ||
		    maxx > 1280 || maxy > 1024)
			error(Ebadarg);
		setscreen(maxx, maxy, 1);
		return n;
	case Qvgaport:
		cp = buf;
		if (offset + n >= 0x8000)
			error(Ebadarg);
		for (port=offset; port<offset+n; port++)
		for (port=offset; port<offset+n; port++) {
			outb(port, *cp++);
		}
		return n;
	}
}

M pc/vga.c => pc/vga.c +12 -80
@@ 26,10 26,6 @@ struct{

#define MAXX	640
#define MAXY	480
/*
#define MAXX	800
#define MAXY	600
*/

#define SCREENMEM	(0xA0000 | KZERO)



@@ 76,28 72,6 @@ VGAmode mode12 =
	0x01, 0x10, 0x0f, 0x00, 0x00,
};

/*
 *  cardinal (tseng labs) 800x600 display, 16 bit color. 
 */
VGAmode mode25 = 
{
	/* general */
	0xe3, 0x00,  /* 0x70, 0x04, these are read-only */
	/* sequence */
	0x03, 0x01, 0x0f, 0x00, 0x06,
	/* crt */
	0x5f, 0x4f, 0x50, 0x02, 0x54, 0x80, 0x0b, 0x3e,
	0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0,
	0xea, 0x8c, 0xdf, 0x28, 0x00, 0xe7, 0x04, 0xe3,
	0xff,
	/* graphics */
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f,
	0xff,
	/* attribute */
	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x3f,
	0x01, 0x10, 0x0f, 0x00, 0x00,
};

void
genout(int reg, int val)


@@ 141,27 115,6 @@ crout(int reg, int val)
	outb(CR, val);
}

/*
 *  m is a bit mask of planes to be affected by CPU writes
 */
vgawrmask(int m)
{
	srout(Smmask, m&0xf);
}

/*
 *  p is the plane that will respond to CPU reads
 */
vgardplane(int p)
{
	grout(Grms, p&3);
}

vgadump(void)
{
	print("misc is 0x%ux fc is 0x%ux\n", inb(EMISCR), inb(EFCR));
}

void
setmode(VGAmode *v)
{


@@ 272,6 225,17 @@ dumpmodes(void) {
#endif

void
setscreen(int maxx, int maxy, int bpp) {
	gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, flipD[S]);
	gscreen.width = maxx/32;
	gscreen.r.max = Pt(maxx, maxy);
	gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, flipD[0]);
	out.pos.x = MINX;
	out.pos.y = 0;
	out.bwid = defont0.info[' '].width;
}

void
screeninit(void)
{
	int i, j, k;


@@ 290,11 254,7 @@ screeninit(void)
	l = defont->bits->base;
	for(i = defont->bits->width*Dy(defont->bits->r); i > 0; i--, l++)
		*l = (*l<<24) | ((*l>>8)&0x0000ff00) | ((*l<<8)&0x00ff0000) | (*l>>24);

	gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, flipD[0]);
	out.pos.x = MINX;
	out.pos.y = 0;
	out.bwid = defont0.info[' '].width;
	setscreen(MAXX, MAXY, 1);
}

void


@@ 395,34 355,6 @@ mouseclock(void)
	mouseupdate(1);
}

vgaset(char *cmd)
{
	int set;
	int reg;
	int val;

	set = *cmd++;
	cmd++;
	reg = strtoul(cmd, &cmd, 0);
	cmd++;
	val = strtoul(cmd, &cmd, 0);
	switch(set){
	case 'a':
		arout(reg, val);
		break;
	case 'g':
		grout(reg, val);
		break;
	case 'c':
		crout(reg, val);
		break;
	case 's':
		srout(reg, val);
		break;
	}
}


/*
 *  a fatter than usual cursor for the safari
 */

M pc/vga.h => pc/vga.h +3 -5
@@ 17,8 17,6 @@ enum
	ARR=		0x3C1,		/* attribute registers (reading) */
};

extern	void genout(int, int);
extern	void srout(int, int);
extern	void grout(int, int);
extern	void arout(int, int);
extern	void crout(int, int);
extern	void setscreen(int, int, int);

extern	struct GBitmap	gscreen;

M port/devcons.c => port/devcons.c +1 -1
@@ 607,7 607,7 @@ consread(Chan *c, void *buf, long n, ulong offset)
			error(Ebadarg);
		chal = u->p->pgrp->crypt->chal;
		chal[0] = RXschal;
		for(i=1; i<8; i++)
		for(i=1; i<AUTHLEN; i++)
			chal[i] = nrand(256);
		memmove(buf, chal, 8);
		encrypt(evekey, buf, 8);

M port/devmnt.c => port/devmnt.c +1 -1
@@ 242,7 242,7 @@ mntauth(Mnt *m, Mntrpc *f, char *serv, ushort fid)
	memmove(r->request.uname, u->p->user, NAMELEN);
	chal[0] = FScchal;
	for(i = 1; i < AUTHLEN; i++)
		chal[i++] = nrand(256);
		chal[i] = nrand(256);

	memmove(r->request.chal, chal, AUTHLEN);
	strncpy(r->request.chal+AUTHLEN, serv, NAMELEN);

M port/devwren.c => port/devwren.c +1 -0
@@ 191,6 191,7 @@ wrenwrite(Chan *c, char *a, long n, ulong offset)
	if(n)
		return n;
	error("end of device");
	return 0;		/* not reached */
}

static long

M port/proc.c => port/proc.c +2 -5
@@ 106,9 106,7 @@ sched(void)
		}
		gotolabel(&m->sched);
	}
	spllo();
	p = runproc();
	splhi();
	mapstack(p);
	gotolabel(&p->sched);
}


@@ 147,7 145,7 @@ ready(Proc *p)
}

/*
 * Always called spllo
 * Always called splhi
 */
Proc*
runproc(void)


@@ 157,6 155,7 @@ runproc(void)
	int i;

loop:
	spllo();
	while(runhiq.head==0 && runloq.head==0)
		for(i=0; i<10; i++)	/* keep out of shared memory for a while */
			;


@@ 170,7 169,6 @@ loop:
	p = rq->head;
	if(p==0 || p->mach){	/* p->mach==0 only when process state is saved */
		unlock(&runhiq);
		spllo();
		goto loop;
	}
	if(p->rnext == 0)


@@ 181,7 179,6 @@ loop:
		print("runproc %s %d %s\n", p->text, p->pid, statename[p->state]);
	unlock(&runhiq);
	p->state = Scheding;
	spllo();
	return p;
}


M port/stream.c => port/stream.c +2 -13
@@ 171,14 171,6 @@ newblock(Bclass *bcp)
/*
 *  allocate a block
 */
static int
isblock(void *arg)
{
	Bclass *bcp;

	bcp = (Bclass *)arg;
	return bcp->first!=0;
}
Block *
allocb(ulong size)
{


@@ 217,10 209,6 @@ allocb(ulong size)
	bp->next = 0;
	bp->list = 0;
	bp->type = M_DATA;
	bp->flags &= S_CLASS;
	if(bp->lim-bp->rptr<size && size<4096)
		panic("allocb %lux %lux %d %ux %d", bp->lim, bp->rptr,
			size, bp->flags, bcp-bclass);
	return bp;
}



@@ 237,11 225,12 @@ freeb(Block *bp)
	int x;
	ulong pc;

#ifdef asdf
	pc = getcallerpc(((uchar*)&bp) - sizeof(bp));
	if((bp->flags&S_CLASS) >= Nclass)		/* Check for double free */
		panic("freeb class last(%lux) this(%lux)", bp->pc, pc);
	bp->pc = pc;

#endif asdf
	for(; bp; bp = nbp){
		bcp = &bclass[bp->flags & S_CLASS];
		bp->flags = bp->flags|S_CLASS;		/* Check for double free */

M port/sysproc.c => port/sysproc.c +1 -1
@@ 571,7 571,7 @@ syserrstr(ulong *arg)
}

long
sysforkpgrp(ulong *arg)
sys__forkpgrp__(ulong *arg)
{
	int mask;
	Pgrp *pg;

M port/systab.h => port/systab.h +3 -3
@@ 13,7 13,7 @@ Syscall sysalarm;
Syscall sysexec;
Syscall sysexits;
Syscall sys__fork__;
Syscall sysforkpgrp;
Syscall sys__forkpgrp__;
Syscall sysfstat;
Syscall syssegbrk;
Syscall sysmount;


@@ 52,7 52,7 @@ Syscall *systab[]={
	[EXEC]		sysexec,
	[EXITS]		sysexits,
	[__FORK__]	sys__fork__,
	[FORKPGRP]	sysforkpgrp,
	[__FORKPGRP__]	sys__forkpgrp__,
	[FSTAT]		sysfstat,
	[SEGBRK]	syssegbrk,
	[MOUNT]		sysmount,


@@ 92,7 92,7 @@ char *sysctab[]={
	[EXEC]		"Exec",
	[EXITS]		"Exits",
	[__FORK__]	"__fork_",
	[FORKPGRP]	"Forkpgrp",
	[__FORKPGRP__]	"__forkpgrp_",
	[FSTAT]		"Fstat",
	[SEGBRK]	"Segbrk",
	[MOUNT]		"Mount",