From b357cee460ab3ee389bb298a68a459a66c80a8c9 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 30 Nov 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-11-30 --- bitsy/devpenmouse.c | 21 +++++++++++---------- "bitsy/dev\302\265c.c" | 10 ++++++++-- bitsy/screen.c | 31 ++++++++++++++++++++----------- boot/bootauth.c | 3 --- pc/apic.c | 2 +- pc/devarch.c | 2 +- pc/devether.c | 7 ++++--- pc/devusb.c | 7 ++++++- pc/fns.h | 1 + pc/i8253.c | 4 ++-- pc/l.s | 10 +++++++++- pc/screen.c | 8 ++++++-- pc/trap.c | 6 ++++++ pc/vgasavage.c | 16 ++++++++++++++-- port/chan.c | 4 ++-- 15 files changed, 91 insertions(+), 41 deletions(-) diff --git a/bitsy/devpenmouse.c b/bitsy/devpenmouse.c index 366654a1e393ad77b56fa07a987d57be060a542d..b2db6451667d0868efbbaaac9a9f67cdcf868dcf 100644 --- a/bitsy/devpenmouse.c +++ b/bitsy/devpenmouse.c @@ -123,6 +123,7 @@ penbutton(int up, int b) { void pentrackxy(int x, int y) { + if (x == -1) { /* pen up. associate with button 1 through 5 up */ mouse.buttons &= ~0x1f; @@ -339,8 +340,8 @@ penmousewrite(Chan *c, void *va, long n, vlong) Point pt; Cmdbuf *cb; Cmdtab *ct; - char buf[64], *field[5]; - int nf, b; + char buf[64]; + int b; p = va; switch((ulong)c->qid.path){ @@ -369,15 +370,15 @@ penmousewrite(Chan *c, void *va, long n, vlong) calibration.transx = 0; calibration.transy = 0; } else if (cb->nf == 5) { - if ((!isdigit(*field[1]) && *field[1] != '-') - || (!isdigit(*field[2]) && *field[2] != '-') - || (!isdigit(*field[3]) && *field[3] != '-') - || (!isdigit(*field[4]) && *field[4] != '-')) + if ((!isdigit(*cb->f[1]) && *cb->f[1] != '-') + || (!isdigit(*cb->f[2]) && *cb->f[2] != '-') + || (!isdigit(*cb->f[3]) && *cb->f[3] != '-') + || (!isdigit(*cb->f[4]) && *cb->f[4] != '-')) error("bad syntax in control file message"); - calibration.scalex = strtol(field[1], nil, 0); - calibration.scaley = strtol(field[2], nil, 0); - calibration.transx = strtol(field[3], nil, 0); - calibration.transy = strtol(field[4], nil, 0); + calibration.scalex = strtol(cb->f[1], nil, 0); + calibration.scaley = strtol(cb->f[2], nil, 0); + calibration.transx = strtol(cb->f[3], nil, 0); + calibration.transy = strtol(cb->f[4], nil, 0); } else cmderror(cb, Ecmdargs); break; diff --git "a/bitsy/dev\302\265c.c" "b/bitsy/dev\302\265c.c" index 7d58d3894966f0b56059085fab6a47ee74e2db4e..5eb70b65f929f782a6f95f1c5292796d0d140f7a 100644 --- "a/bitsy/dev\302\265c.c" +++ "b/bitsy/dev\302\265c.c" @@ -88,6 +88,8 @@ Rune bmap[4] = Kup, Kright, Kleft, Kdown }; +extern int landscape; + int µcputc(Queue*, int ch) { @@ -162,8 +164,12 @@ int break; touching = 1; if(len == 4) { - if (samseq++ > 10) - pentrackxy((p[2]<<8)|p[3], (p[0]<<8)|p[1]); + if (samseq++ > 10){ + if (landscape) + pentrackxy((p[0]<<8)|p[1], (p[2]<<8)|p[3]); + else + pentrackxy((p[2]<<8)|p[3], (p[0]<<8)|p[1]); + } } else { samseq = 0; pentrackxy(-1, -1); diff --git a/bitsy/screen.c b/bitsy/screen.c index 6a1fb6aca10a646f1bb6214789eb3355dad258b5..25244aa85956aef05efd2be61295fc4eca0efefb 100644 --- a/bitsy/screen.c +++ b/bitsy/screen.c @@ -16,7 +16,7 @@ #define MINX 8 -int landscape = 0; /* orientation of the screen, default is 0: portait */ +int landscape = 1; /* orientation of the screen, default is 0: portait */ enum { Wid = 240, @@ -116,17 +116,17 @@ static Memdata xgdata; static Memimage xgscreen = { - { 0, 0, Wid, Ht }, /* r */ - { 0, 0, Wid, Ht }, /* clipr */ - 16, /* depth */ - 3, /* nchan */ - RGB16, /* chan */ + { 0, 0, Wid, Ht }, /* r */ + { 0, 0, Wid, Ht }, /* clipr */ + 16, /* depth */ + 3, /* nchan */ + RGB16, /* chan */ nil, /* cmap */ &xgdata, /* data */ - 0, /* zero */ - Wid/2, /* width */ - 0, /* layer */ - 0, /* flags */ + 0, /* zero */ + Wid/2, /* width */ + 0, /* layer */ + 0, /* flags */ }; struct{ @@ -180,10 +180,12 @@ flipscreen(int ls) { if (ls) { gscreen->r = Rect(0, 0, Ht, Wid); gscreen->clipr = gscreen->r; + gscreen->width = Ht/2; xgdata.bdata = (uchar *)framebuf->pixel; } else { gscreen->r = Rect(0, 0, Wid, Ht); gscreen->clipr = gscreen->r; + gscreen->width = Wid/2; xgdata.bdata = (uchar *)vscreen; } landscape = ls; @@ -228,14 +230,21 @@ screeninit(void) lcdinit(); gscreen = &xgscreen; + xgdata.ref = 1; i = 0; if (landscape) { + gscreen->r = Rect(0, 0, Ht, Wid); + gscreen->clipr = gscreen->r; + gscreen->width = Ht/2; xgdata.bdata = (uchar *)framebuf->pixel; while (i < Wid*Ht*1/3) framebuf->pixel[i++] = 0xf800; /* red */ - while (i < Wid*Ht*2/3) framebuf->pixel[i++] = 0xffff; /* white */ + while (i < Wid*Ht*2/3) framebuf->pixel[i++] = 0xffff; /* white */ while (i < Wid*Ht*3/3) framebuf->pixel[i++] = 0x001f; /* blue */ } else { + gscreen->r = Rect(0, 0, Wid, Ht); + gscreen->clipr = gscreen->r; + gscreen->width = Wid/2; xgdata.bdata = (uchar *)vscreen; while (i < Wid*Ht*1/3) vscreen[i++] = 0xf800; /* red */ while (i < Wid*Ht*2/3) vscreen[i++] = 0xffff; /* white */ diff --git a/boot/bootauth.c b/boot/bootauth.c index c27248a36a4bcaf9f7a18905e6c3a4f780b11bb2..bc387327b12d211c5f5f2f256c908f906f6dced6 100644 --- a/boot/bootauth.c +++ b/boot/bootauth.c @@ -12,9 +12,6 @@ authentication(int cpuflag) char *argv[16], **av; int ac; - /* make capabilities available to factotum */ - bind("#¤", "/dev", MAFTER); - /* start agent */ ac = 0; av = argv; diff --git a/pc/apic.c b/pc/apic.c index 6c4d715b36053f612a0bff52ad290bb5e6b95cb8..0889d5b696ef7e2df6cdb61b145549a65a5558e5 100644 --- a/pc/apic.c +++ b/pc/apic.c @@ -134,7 +134,7 @@ lapictimerinit(void) wrmsr(0x10, 0); do{ - rdmsr(0x10, &tsc); + rdtsc(&tsc); lo = (ulong)tsc; }while(lo < v); diff --git a/pc/devarch.c b/pc/devarch.c index 084826efd67dc2a8789d70a97d7d9a9339c6d22e..997c78ef825b56eadf8de3c26e6d357b8cee19c6 100644 --- a/pc/devarch.c +++ b/pc/devarch.c @@ -746,7 +746,7 @@ cycletimer(uvlong *hz) if(hz != nil) *hz = fasthz; - rdmsr(0x10, (vlong*)&tsc); + rdtsc((vlong*)&tsc); m->fastclock = tsc; return tsc; } diff --git a/pc/devether.c b/pc/devether.c index a522dc8d14ac2503a2f7a38c28bc5c937c2c2f86..75ad714eadef88f2b8b889e8bd6642270d794643 100644 --- a/pc/devether.c +++ b/pc/devether.c @@ -386,10 +386,11 @@ etherreset(void) ether->irq = 9; snprint(name, sizeof(name), "ether%d", ctlrno); - /* If ether->irq is less than 0, it is a hack to indicate no interrupt - * used for the second logical ethernet for the wavelan card + /* + * If ether->irq is 0, it is a hack to indicate no interrupt + * used by ethersink. */ - if(ether->irq >= 0) + if(ether->irq > 0) intrenable(ether->irq, ether->interrupt, ether, ether->tbdf, name); i = sprint(buf, "#l%d: %s: %dMbps port 0x%luX irq %lud", diff --git a/pc/devusb.c b/pc/devusb.c index 2827ada237ba95ad3b8bb11f0bff7afd0d677722..a3d3af8f287c5a5b2a015a7ca172da4cbdccb5a7 100644 --- a/pc/devusb.c +++ b/pc/devusb.c @@ -1149,7 +1149,7 @@ cleaniso(Endpt *e, int frnum) if ((td->flags & IsoClean) == 0){ e->buffered -= n; if (e->buffered < 0){ - iprint("e->buffered %d?\n", e->buffered); + print("e->buffered %d?\n", e->buffered); e->buffered = 0; } } @@ -1682,6 +1682,10 @@ usbclose(Chan *c) if(c->qid.type == QTDIR || QID(c->qid) < Q3rd) return; qlock(&usbstate); + if(waserror()){ + qunlock(&usbstate); + return; + } d = usbdevice(c); if(QID(c->qid) == Qctl) d->busy = 0; @@ -1689,6 +1693,7 @@ usbclose(Chan *c) XPRINT("usbclose: freedev 0x%p\n", d); freedev(d); } + poperror(); qunlock(&usbstate); } diff --git a/pc/fns.h b/pc/fns.h index 5886deff8eea6463a634ca1f51e345fc7994b815..08403a57eae518a517bcf084254d0296a3688df5 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -120,6 +120,7 @@ void procsetup(Proc*); void putcr3(ulong); void putcr4(ulong); void rdmsr(int, vlong*); +void rdtsc(vlong*); void screeninit(void); int screenprint(char*, ...); /* debugging */ void (*screenputs)(char*, int); diff --git a/pc/i8253.c b/pc/i8253.c index 805fc75e0dbd3430e7e83c4ea8636afab30da8d9..7d6f478af37a150040ccddd51901062bbb54a00b 100644 --- a/pc/i8253.c +++ b/pc/i8253.c @@ -120,13 +120,13 @@ i8253init(int aalcycles, int havecycleclock) */ outb(Tmode, Latch0); if(havecycleclock) - rdmsr(0x10, &a); + rdtsc(&a); x = inb(T0cntr); x |= inb(T0cntr)<<8; aamloop(loops); outb(Tmode, Latch0); if(havecycleclock) - rdmsr(0x10, &b); + rdtsc(&b); y = inb(T0cntr); y |= inb(T0cntr)<<8; x -= y; diff --git a/pc/l.s b/pc/l.s index e80e7dcaf9a2b474d374951e0735494992e89489..b359ec68dea5595fa701b195fe5c80d0e786968a 100644 --- a/pc/l.s +++ b/pc/l.s @@ -11,6 +11,7 @@ #define CPUID BYTE $0x0F; BYTE $0xA2 /* CPUID, argument in AX */ #define WRMSR BYTE $0x0F; BYTE $0x30 /* WRMSR, argument in AX/DX (lo/hi) */ #define RDMSR BYTE $0x0F; BYTE $0x32 /* RDMSR, result in AX/DX (lo/hi) */ +#define RDTSC BYTE $0x0F; BYTE $0x31 #define WBINVD BYTE $0x0F; BYTE $0x09 #define HLT BYTE $0xF4 @@ -283,11 +284,18 @@ TEXT putcr4(SB), $0 MOVL AX, CR4 RET +TEXT rdtsc(SB), $0 /* time stamp counter; cycles since power up */ + RDTSC + MOVL vlong+0(FP), CX /* &vlong */ + MOVL AX, 0(CX) /* lo */ + MOVL DX, 4(CX) /* hi */ + RET + TEXT rdmsr(SB), $0 /* model-specific register */ MOVL index+0(FP), CX RDMSR MOVL vlong+4(FP), CX /* &vlong */ - MOVL AX, (CX) /* lo */ + MOVL AX, 0(CX) /* lo */ MOVL DX, 4(CX) /* hi */ RET diff --git a/pc/screen.c b/pc/screen.c index 3cdd0480878e6bdf2b75f9aa43887130c1704bdb..b987f6fb07ae1393e9191685b2d51bde23cb2875 100644 --- a/pc/screen.c +++ b/pc/screen.c @@ -378,6 +378,10 @@ blankscreen(int blank) VGAscr *scr; scr = &vgascreen[0]; - if(hwblank && scr->blank) - scr->blank(scr, blank); + if(hwblank){ + if(scr->blank) + scr->blank(scr, blank); + else + vgablank(scr, blank); + } } diff --git a/pc/trap.c b/pc/trap.c index 14aa28d4708097ec70752f7f2ca96fabdc92bf7f..efd336d0e2fb8aa70f011dcf4a9ce3da24612adc 100644 --- a/pc/trap.c +++ b/pc/trap.c @@ -21,6 +21,12 @@ intrenable(int irq, void (*f)(Ureg*, void*), void* a, int tbdf, char *name) int vno; Vctl *v; + if(f == nil){ + print("intrenable: nil handler for %d, tbdf 0x%uX for %s\n", + irq, tbdf, name); + return; + } + v = xalloc(sizeof(Vctl)); v->isintr = 1; v->irq = irq; diff --git a/pc/vgasavage.c b/pc/vgasavage.c index cc0c4c2b6565f6f29f59cbe3434d46d3028b2148..c811e79cd2dbb376ed8013cc0dd086e74dba965d 100644 --- a/pc/vgasavage.c +++ b/pc/vgasavage.c @@ -371,8 +371,8 @@ savagewaitidle(VGAscr *scr) /* case SAVAGEMX: ? */ /* case SAVAGEIX: ? */ case SUPERSAVAGEIXC16: - case SAVAGEMXMV: case SAVAGEIXMV: + case SAVAGEMXMV: /* wait for engine idle and FIFO empty */ statw = (ulong*)((uchar*)scr->mmio+XStatus0); mask = CBEMaskA | Ge2IdleA; @@ -461,12 +461,23 @@ savageblank(VGAscr*, int blank) { uchar seqD; + /* + * Will handle DPMS to monitor + */ vgaxo(Seqx, 8, vgaxi(Seqx,8)|0x06); seqD = vgaxi(Seqx, 0xD); seqD &= 0x03; if(blank) seqD |= 0x50; vgaxo(Seqx, 0xD, seqD); + + /* + * Will handle LCD + */ + if(blank) + vgaxo(Seqx, 0x31, vgaxi(Seqx, 0x31) & ~0x10); + else + vgaxo(Seqx, 0x31, vgaxi(Seqx, 0x31) | 0x10); } @@ -479,9 +490,9 @@ savageinit(VGAscr *scr) /* if you add chip IDs here be sure to update savagewaitidle */ switch(scr->id){ case SAVAGE4: - case SAVAGEMXMV: case SAVAGEIXMV: case SUPERSAVAGEIXC16: + case SAVAGEMXMV: break; default: print("unknown savage %.4lux\n", scr->id); @@ -547,5 +558,6 @@ savageinit(VGAscr *scr) scr->fill = savagefill; scr->scroll = savagescroll; scr->blank = savageblank; + hwblank = 1; } diff --git a/port/chan.c b/port/chan.c index a1fda70d5d7fe1c4526b037a9b23d9d41f89a480..0b2159de8b342617db8d765d66bb03c559f8c01e 100644 --- a/port/chan.c +++ b/port/chan.c @@ -353,8 +353,8 @@ cclose(Chan *c) return; if(waserror()){ -// print("cclose error: type %C; error %s\n", devtab[c->type]->dc, up!=nil? up->errstr : "no user"); - chanfree(c); + print("cclose error: type %C; error %s\n", devtab[c->type]->dc, up!=nil? up->errstr : "no user"); + /* don't chanfree: better leak than leave a dangling pointer */ return; }