~kris/9p

9hist

11d346fd5edd1e50755f57130ab6b64b24713146 — David du Colombier 26 years ago 2e3c025
Plan 9 from Bell Labs 2000-03-30
6 files changed, 86 insertions(+), 90 deletions(-)

M alphapc/devvga.c
M pc/devvga.c
M pc/screen.h
M pc/vga.c
M pc/vgamach64xx.c
M port/chan.c
M alphapc/devvga.c => alphapc/devvga.c +5 -5
@@ 93,21 93,21 @@ vgaread(Chan* c, void* a, long n, vlong off)
			s = scr->dev->name;
		else
			s = "cga";
		len = snprint(p, READSTR, "type: %s\n", s);
		len = snprint(p, READSTR, "type %s\n", s);
		if(scr->gscreen)
			len += snprint(p+len, READSTR-len, "size: %dx%dx%d\n",
			len += snprint(p+len, READSTR-len, "size %dx%dx%d\n",
				scr->gscreen->r.max.x, scr->gscreen->r.max.y,
				1<<scr->gscreen->ldepth);
		if(scr->cur)
			s = scr->cur->name;
		else
			s = "off";
		len += snprint(p+len, READSTR-len, "hwgc: %s\n", s);
		len += snprint(p+len, READSTR-len, "hwgc %s\n", s);
		if(scr->pciaddr)
			snprint(p+len, READSTR-len, "addr: 0x%lux\n",
			snprint(p+len, READSTR-len, "addr 0x%lux\n",
				scr->pciaddr);
		else
			snprint(p+len, READSTR-len, "addr: 0x%lux\n",
			snprint(p+len, READSTR-len, "addr 0x%lux\n",
				scr->aperture);

		n = readstr(offset, a, n, p);

M pc/devvga.c => pc/devvga.c +20 -12
@@ 86,6 86,7 @@ vgaread(Chan* c, void* a, long n, vlong off)
	char *p, *s;
	VGAscr *scr;
	ulong offset = off;
	char chbuf[30];

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



@@ 100,22 101,29 @@ vgaread(Chan* c, void* a, long n, vlong off)
			free(p);
			nexterror();
		}

		len = 0;

		if(scr->dev)
			s = scr->dev->name;
		else
			s = "cga";
		len = snprint(p, READSTR, "type: %s\n", s);
		if(scr->gscreen)
			len += snprint(p+len, READSTR-len, "size: %dx%dx%d\n",
		len += snprint(p+len, READSTR-len, "type %s\n", s);

		if(scr->gscreen) {
			len += snprint(p+len, READSTR-len, "size %dx%dx%d %s\n",
				scr->gscreen->r.max.x, scr->gscreen->r.max.y,
				scr->gscreen->depth);
		if(scr->cur)
			s = scr->cur->name;
		else
			s = "off";
		len += snprint(p+len, READSTR-len, "hwgc: %s\n", s);
		snprint(p+len, READSTR-len, "addr: 0x%lux\n", scr->aperture);
				scr->gscreen->depth, chantostr(chbuf, scr->gscreen->chan));

			if(Dx(scr->gscreen->r) != Dx(physgscreenr) 
			|| Dy(scr->gscreen->r) != Dy(physgscreenr))
				len += snprint(p+len, READSTR-len, "actualsize %dx%d\n",
					physgscreenr.max.x, physgscreenr.max.y);
		}

		len += snprint(p+len, READSTR-len, "hwaccel %s\n", hwaccel ? "on" : "off");
		len += snprint(p+len, READSTR-len, "hwblank %s\n", hwblank ? "on" : "off");
		snprint(p+len, READSTR-len, "addr 0x%lux\n", scr->aperture);
		n = readstr(offset, a, n, p);
		poperror();
		free(p);


@@ 291,9 299,9 @@ vgactl(char* a)
	}
*/
	else if(strcmp(field[0], "blank") == 0){
		if(n < 2)
		if(n < 1)
			error(Ebadarg);
		drawblankscreen(atoi(field[1]));
		drawblankscreen(1);
		return;
	}
	else if(strcmp(field[0], "hwaccel") == 0){

M pc/screen.h => pc/screen.h +1 -0
@@ 145,3 145,4 @@ extern void	vgaimageinit(ulong);
extern ulong	vgapcilinear(VGAscr*, int*, int*, int, int);

extern void	drawblankscreen(int);
extern void	vgablank(VGAscr*, int);

M pc/vga.c => pc/vga.c +27 -0
@@ 190,3 190,30 @@ vgascreenwin(VGAscr* scr)
	screenputs = vgascreenputs;
}

/*
 * Supposedly this is the way to turn DPMS
 * monitors off using just the VGA registers.
 * Unfortunately, it seems to mess up the video mode
 * on the cards I've tried.
 */
void
vgablank(VGAscr*, int blank)
{
	uchar seq1, crtc17;

	if(blank) {
		seq1 = 0x00;
		crtc17 = 0x80;
	} else {
		seq1 = 0x20;
		crtc17 = 0x00;
	}

	outs(Seqx, 0x0100);			/* synchronous reset */
	seq1 |= vgaxi(Seqx, 1) & ~0x20;
	vgaxo(Seqx, 1, seq1);
	crtc17 |= vgaxi(Crtx, 0x17) & ~0x80;
	delay(10);
	vgaxo(Crtx, 0x17, crtc17);
	outs(Crtx, 0x0300);				/* end synchronous reset */
}

M pc/vgamach64xx.c => pc/vgamach64xx.c +18 -0
@@ 138,6 138,9 @@ enum {
	BusCntl	= 0x13,
	GenTestCntl	= 0x19,

	CrtcHsyncDis	= 0x04,
	CrtcVsyncDis	= 0x08,

	ContextMask	= 0x100,	/* not accessible via I/O */
	FifoStat,
	GuiStat,


@@ 654,6 657,20 @@ mach64hwscroll(VGAscr *scr, Rectangle r, Rectangle sr)
	return 1;
}

/*
 * This should work, but doesn't.
 */
static void
mach64blank(VGAscr *scr, int blank)
{
	ulong ctl;

	ctl = ior32(scr, CrtcGenCtl) & ~(CrtcHsyncDis|CrtcVsyncDis);
	if(blank)
		ctl |= CrtcHsyncDis|CrtcVsyncDis;
	iow32(scr, CrtcGenCtl, ctl);
}

static void
mach64xxdrawinit(VGAscr *scr)
{


@@ 662,6 679,7 @@ mach64xxdrawinit(VGAscr *scr)
		scr->fill = mach64hwfill;
		scr->scroll = mach64hwscroll;
	}
/*	scr->blank = mach64blank; */
}



M port/chan.c => port/chan.c +15 -73
@@ 592,49 592,6 @@ createdir(Chan *c)
	return 0;
}

Chan*
mchan(char *id, int walkname)
{
	Chan *c;
	Pgrp *pg;
	Mount *t;
	int mdev;
	ulong mountid;
	Mhead **h, **he, *f;

	mountid = strtoul(id, 0, 0);
	mdev = devno('M', 0);

	pg = up->pgrp;
	rlock(&pg->ns);
	if(waserror()) {
		runlock(&pg->ns);
		nexterror();
	}

	he = &pg->mnthash[MNTHASH];
	for(h = pg->mnthash; h < he; h++) {
		for(f = *h; f; f = f->hash) {
			for(t = f->mount; t; t = t->next) {
				c = t->to;
				if(c->type == mdev && c->mntptr->id == mountid) {
					if(walkname == 0) {
						c = c->mntptr->c;
						incref(c);
					}
					else
						c = cclone(c, 0);
					runlock(&pg->ns);
					poperror();
					return c;
				}
			}
		}
	}
	error(Enonexist);
	return 0;
}

void
saveregisters(void)
{


@@ 710,6 667,16 @@ namec(char *name, int amode, int omode, ulong perm)
		c = cclone(up->slash, 0);
		break;
	case '#':
		cname = newcname(name);	/* save this before advancing */
		mntok = 0;
		elem[0] = 0;
		n = 0;
		while(*name && (*name != '/' || n < 2)){
			if(n >= NAMELEN-1)
				error(Efilename);
			elem[n++] = *name++;
		}
		elem[n] = '\0';
		/*
		 *  noattach is sandboxing.
		 *


@@ 721,38 688,13 @@ namec(char *name, int amode, int omode, ulong perm)
		 *	c  time and pid, but also cons and consctl
		 *	p  control of your own processes (and unfortunately
		 *	   any others left unprotected)
		 *  all are ASCII, so it's safe to use strchr to check.
		 */
		if(up->pgrp->noattach)
		if(strchr("|decp", name[1]) == 0)
			error(Enoattach);
		cname = newcname(name);	/* save this before advancing */
		mntok = 0;
		elem[0] = 0;
		n = 0;
		while(*name && (*name != '/' || n < 2)){
			if(n >= NAMELEN-1)
				error(Efilename);
			elem[n++] = *name++;
		}
		elem[n] = '\0';
		n = chartorune(&r, elem+1)+1;
		if(r == 'M') {
			if(elem[n] == 'c') {
				c = mchan(elem+n+1, 0);
				name = skipslash(name);
				if(*name)
					error(Efilename);
				poperror();
				cnameclose(cname);
				return c;
			}
			else {
				c = mchan(elem+n, 1);
				name = skipslash(name);
			}
			break;
		}
		/* actually / is caught by parsing earlier */
		if(utfrune("M", r))
			error(Enoattach);
		if(up->pgrp->noattach && utfrune("|decp", r))
			error(Enoattach);
		t = devno(r, 1);
		if(t == -1)
			error(Ebadsharp);