From 8243034ea1903b264122acb8da201660c51b763f Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 8 Oct 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-10-08 --- carrera/screen.c | 2 ++ port/devlance.c | 23 +++++++++++++++++++++++ port/devmouse.c | 39 +++++++++++++++++---------------------- port/page.c | 2 +- port/swap.c | 4 ++++ power/mem.h | 3 ++- power/trap.c | 1 + 7 files changed, 50 insertions(+), 24 deletions(-) diff --git a/carrera/screen.c b/carrera/screen.c index 0da6a4a211b2787f267489fdf230611cf0bf7ba9..34494df3fb994c5790a1b703d9fc1926ac948b4d 100644 --- a/carrera/screen.c +++ b/carrera/screen.c @@ -559,6 +559,7 @@ screenload(Rectangle r, uchar *data, long n) unlock(&screenlock); error("bad tile size"); } + cursoroff(1); q = gbaddr(&gscreen, r.min); mx = 7>>gscreen.ldepth; lpart = (r.min.x & mx) << gscreen.ldepth; @@ -605,6 +606,7 @@ screenload(Rectangle r, uchar *data, long n) data += l; } mbbrect(r); + cursoron(1); screenupdate(); unlock(&screenlock); } diff --git a/port/devlance.c b/port/devlance.c index 916187942f69113696da1d0cf57296af6cde9566..8d1bc3396ed3d8f379e42187bf582dd9dfc35c41 100644 --- a/port/devlance.c +++ b/port/devlance.c @@ -430,6 +430,28 @@ isoutbuf(void *x) return l.wedged || (MPus(m->flags)&LANCEOWNER) == 0; } +static void +etherloop(Etherpkt *p, long n) +{ + int s; + ushort t; + Netfile *f, **fp; + + if(memcmp(p->d, p->s, sizeof(p->d)) && memcmp(p->d, l.bcast, sizeof(p->d))) + return; + + s = splhi(); + t = (p->type[0]<<8) | p->type[1]; + for(fp = l.f; fp < &l.f[Ntypes]; fp++) { + f = *fp; + if(f == 0) + continue; + if(f->type == t || f->type < 0) + qproduce(f->in, p->d, n); + } + splx(s); +} + long lancewrite(Chan *c, void *buf, long n, ulong offset) { @@ -452,6 +474,7 @@ lancewrite(Chan *c, void *buf, long n, ulong offset) if(!isoutbuf(m) || l.wedged) print("lance transmitter jammed\n"); else { + etherloop(buf, n); p = &l.tp[l.tc]; memmove(p->d, buf, n); if(n < 60) { diff --git a/port/devmouse.c b/port/devmouse.c index fb122674f69a0ae0c9414ff0136e38b5154e0760..ded43fd7dc83beccb4ed11ec54d3d5d8fe3f1650 100644 --- a/port/devmouse.c +++ b/port/devmouse.c @@ -251,34 +251,25 @@ mouseclose(Chan *c) long mouseread(Chan *c, void *va, long n, ulong offset) { - uchar *p; + char buf[4*12+1]; USED(offset); if(c->qid.path & CHDIR) return devdirread(c, va, n, mousedir, NMOUSE, devgen); if(c->qid.path == Qmouse){ - /* - * mouse: - * 'm' 1 - * buttons 1 - * point 8 - * msec 4 - */ - if(n < 14) - error(Eshort); while(mousechanged(0) == 0) sleep(&mouse.r, mousechanged, 0); lock(&cursor); - p = va; - p[0] = 'm'; - p[1] = mouse.buttons; - BPLONG(p+2, mouse.xy.x); - BPLONG(p+6, mouse.xy.y); - BPLONG(p+10, TK2MS(MACHP(0)->ticks)); + sprint(buf, "%11d %11d %11d %11d", + mouse.xy.x, mouse.xy.y, mouse.buttons, + TK2MS(MACHP(0)->ticks)); mouse.lastcounter = mouse.counter; unlock(&cursor); - return 14; + if(n > 4*12) + n = 4*12; + memmove(va, buf, n); + return n; } return 0; } @@ -286,7 +277,7 @@ mouseread(Chan *c, void *va, long n, ulong offset) long mousewrite(Chan *c, void *va, long n, ulong offset) { - uchar *p; + char *p; Point pt; char buf[64]; @@ -305,12 +296,16 @@ mousewrite(Chan *c, void *va, long n, ulong offset) return n; case Qmouse: - if(n != 9) + if(n > sizeof buf-1) + n = sizeof buf -1; + memmove(buf, va, n); + buf[n] = 0; + p = 0; + pt.x = strtoul(buf, &p, 0); + if(p == 0) error(Eshort); + pt.y = strtoul(p, 0, 0); qlock(&mouse); - p = va; - pt.x = BGLONG(p+1); - pt.y = BGLONG(p+5); if(ptinrect(pt, gscreen.r)){ mouse.xy = pt; mouse.redraw = 1; diff --git a/port/page.c b/port/page.c index 1928f880f26a13288b581406c8165374d4beb73c..a9baaea278ecec1ed5af3efb9dd0e8b3474c7670 100644 --- a/port/page.c +++ b/port/page.c @@ -76,7 +76,7 @@ retry: color = getpgcolor(va); hw = swapalloc.highwater; for(;;) { - if(palloc.freecol[color] > hw) + if(palloc.freecol[color] > hw/NCOLOR) break; if(up->kp && palloc.freecol[color] > 0) break; diff --git a/port/swap.c b/port/swap.c index 00a3e47ac3f7e533174db49bf607be9d10672cd3..4a1a970399a6aa623cabeeaf294034139e4c56cd 100644 --- a/port/swap.c +++ b/port/swap.c @@ -114,6 +114,10 @@ loop: if(p >= ep) p = proctab(0); + /* don't swap out programs from devroot.c */ + if(devchar[p->seg[SG_TEXT]->image->c->type] == '/') + continue; + if(p->state == Dead || p->kp) continue; diff --git a/power/mem.h b/power/mem.h index 93f3220e7835a92b7c1b2110e610f7bcc0a62f61..5b459ef89030601fe7b835d7a9d5294eb9392920 100644 --- a/power/mem.h +++ b/power/mem.h @@ -114,7 +114,8 @@ #define TLBROFF 8 /* offset of first randomly indexed entry */ #define NCOLOR 1 -#define getcolor(a) 0 +#define getpgcolor(a) 0 + /* * Address spaces */ diff --git a/power/trap.c b/power/trap.c index 80e8a61e80a036fe186c20c919b345e0289dd673..f2a8d668d49f30642bc63ec0794fc0139164b54d 100644 --- a/power/trap.c +++ b/power/trap.c @@ -416,6 +416,7 @@ notify(Ureg *ur) *(ulong*)(sp+2*BY2WD) = sp+3*BY2WD; /* arg 2 is string */ up->svr1 = ur->r1; /* save away r1 */ ur->r1 = (ulong)up->ureg; /* arg 1 is ureg* */ + *(ulong*)(sp+1*BY2WD) = (ulong)up->ureg;/* arg 1 0(FP) is ureg* (for Alef) */ *(ulong*)(sp+0*BY2WD) = 0; /* arg 0 is pc */ ur->usp = sp; ur->pc = (ulong)up->notify;