From 11d346fd5edd1e50755f57130ab6b64b24713146 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 30 Mar 2000 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2000-03-30 --- alphapc/devvga.c | 10 +++--- pc/devvga.c | 32 +++++++++++------- pc/screen.h | 1 + pc/vga.c | 27 +++++++++++++++ pc/vgamach64xx.c | 18 ++++++++++ port/chan.c | 88 +++++++++--------------------------------------- 6 files changed, 86 insertions(+), 90 deletions(-) diff --git a/alphapc/devvga.c b/alphapc/devvga.c index 0256f44dbdecfb00e37c7bf075857477eafeca93..fad3287ca5c5610ed20fc62d114bc2c57fb0c4d9 100644 --- a/alphapc/devvga.c +++ b/alphapc/devvga.c @@ -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<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); diff --git a/pc/devvga.c b/pc/devvga.c index 76e9566cf56582c6e965e50065eacb6068c70dd9..e5e2054acc8662ba341d1387eda4182fbecb1aa1 100644 --- a/pc/devvga.c +++ b/pc/devvga.c @@ -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){ diff --git a/pc/screen.h b/pc/screen.h index 8837a921da1ad76559df4d9d5c4b21b185b53465..97791ae8b4984a16fa6aed1d4a012a27584f64b3 100644 --- a/pc/screen.h +++ b/pc/screen.h @@ -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); diff --git a/pc/vga.c b/pc/vga.c index 4a7274aa252904e97ceb23e39ea6420ba1a8f386..2e32518c1c771cd2d531534d974038bdfd859a39 100644 --- a/pc/vga.c +++ b/pc/vga.c @@ -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 */ +} diff --git a/pc/vgamach64xx.c b/pc/vgamach64xx.c index cd0f95674312f83398eb099beda45ea188aeafe5..c8035142209eed4b2bd0195ead3946c3c5313c44 100644 --- a/pc/vgamach64xx.c +++ b/pc/vgamach64xx.c @@ -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; */ } diff --git a/port/chan.c b/port/chan.c index 54e32948af05b7c56cb5fce0c4f975b374f6c6e2..28038652b2729f91b9d4831a2838dee733197cdd 100644 --- a/port/chan.c +++ b/port/chan.c @@ -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);