From f4322fa8bc0a34b2fb3f63c84ab1ad4fb1647c4e Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 25 Feb 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-02-25 --- gnot/screen.h | 3 ++- pc/screen.h | 3 ++- pc/trap.c | 2 +- port/devbit.c | 13 ++++--------- power/trap.c | 3 ++- ss/screen.h | 3 ++- ss/trap.c | 1 + 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/gnot/screen.h b/gnot/screen.h index f7c92d1c1306c0819fc85c7ab4006538f645beea..ca23d47e4206e948453ca0795685c18068114cfe 100644 --- a/gnot/screen.h +++ b/gnot/screen.h @@ -9,7 +9,8 @@ struct Mouseinfo{ int dy; int track; /* update cursor on screen */ Mouse; - int changed; /* mouse structure changed since last read */ + ulong counter; /* increments every update */ + ulong lastcounter; /* value when /dev/mouse read */ Rendez r; int newbuttons; /* interrupt time access only */ int clock; /* check mouse.track on RTE */ diff --git a/pc/screen.h b/pc/screen.h index 8a58efe952162df5f165aa48efa4bb6d6fd0de46..82777234e53787dc21d125fc0f795464d7ab98cd 100644 --- a/pc/screen.h +++ b/pc/screen.h @@ -9,7 +9,8 @@ struct Mouseinfo{ int dy; int track; /* update cursor on screen */ Mouse; - int changed; /* mouse structure changed since last read */ + ulong counter; /* increments every update */ + ulong lastcounter; /* value when /dev/mouse read */ Rendez r; int newbuttons; /* interrupt time access only */ int clock; /* check mouse.track on RTE */ diff --git a/pc/trap.c b/pc/trap.c index 0ab10cec82f870caf41130f5633c93eb9314fa45..dff6cfb9059a016274397dffe5d45df445f97275 100644 --- a/pc/trap.c +++ b/pc/trap.c @@ -242,9 +242,9 @@ trap(Ureg *ur) */ c = v&~0x7; if(c==Int0vec || c==Int1vec){ + outb(Int0ctl, EOI); if(c == Int1vec) outb(Int1ctl, EOI); - outb(Int0ctl, EOI); } if(v>=256 || (h = halloc.ivec[v]) == 0){ diff --git a/port/devbit.c b/port/devbit.c index 600494713ff1295d331f0d5de52154c9a2355c1f..6a4c143836b64613ae29420830c4286cf7dffeeb 100644 --- a/port/devbit.c +++ b/port/devbit.c @@ -524,21 +524,16 @@ bitread(Chan *c, void *va, long n, ulong offset) */ if(n < 14) error(Ebadblt); - Again: - while(mouse.changed == 0) + while(mousechanged(0) == 0) sleep(&mouse.r, mousechanged, 0); lock(&cursor); - if(mouse.changed == 0){ - unlock(&cursor); - goto Again; - } 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)); - mouse.changed = 0; + mouse.lastcounter = mouse.counter; unlock(&cursor); return 14; } @@ -2081,7 +2076,7 @@ mouseupdate(int dolock) mouse.clock = 0; mouse.track = 0; mouse.buttons = mouse.newbuttons; - mouse.changed = 1; + mouse.counter++; if(dolock){ unlock(&cursor); @@ -2167,7 +2162,7 @@ int mousechanged(void *m) { USED(m); - return mouse.changed; + return mouse.lastcounter != mouse.counter; } /* diff --git a/power/trap.c b/power/trap.c index ebf6523a17e0c48a1678c7413711d1fc711b9039..933e2d4e895cab52c4a547a07b3da197d2480ac7 100644 --- a/power/trap.c +++ b/power/trap.c @@ -423,7 +423,8 @@ notify(Ureg *ur) sp -= 3*BY2WD; *(ulong*)(sp+2*BY2WD) = sp+3*BY2WD; /* arg 2 is string */ u->svr1 = ur->r1; /* save away r1 */ - ur->r1 = (ulong)u->ureg; /* arg 1 is ureg* */ + ur->r1 = (ulong)u->ureg; /* arg 1 (R1) is ureg* */ + *(ulong*)(sp+1*BY2WD) = (ulong)u->ureg; /* arg 1 0(FP) is ureg* */ *(ulong*)(sp+0*BY2WD) = 0; /* arg 0 is pc */ ur->usp = sp; ur->pc = (ulong)u->notify; diff --git a/ss/screen.h b/ss/screen.h index f7c92d1c1306c0819fc85c7ab4006538f645beea..ca23d47e4206e948453ca0795685c18068114cfe 100644 --- a/ss/screen.h +++ b/ss/screen.h @@ -9,7 +9,8 @@ struct Mouseinfo{ int dy; int track; /* update cursor on screen */ Mouse; - int changed; /* mouse structure changed since last read */ + ulong counter; /* increments every update */ + ulong lastcounter; /* value when /dev/mouse read */ Rendez r; int newbuttons; /* interrupt time access only */ int clock; /* check mouse.track on RTE */ diff --git a/ss/trap.c b/ss/trap.c index 5d581619d05a0613ab201aaf2a1e07cfec9e7374..e26af4f64860b34e682c6e953842415cb10b3ccf 100644 --- a/ss/trap.c +++ b/ss/trap.c @@ -454,6 +454,7 @@ notify(Ureg *ur) *(ulong*)(sp+1*BY2WD) = (ulong)u->ureg; /* arg 1 is ureg* (compat) */ u->svr7 = ur->r7; /* save away r7 */ ur->r7 = (ulong)u->ureg; /* arg 1 is ureg* */ + *(ulong*)(sp+1*BY2WD) = (ulong)u->ureg; /* arg 1 0(FP) is ureg* */ *(ulong*)(sp+0*BY2WD) = 0; /* arg 0 is pc */ ur->usp = sp; ur->pc = (ulong)u->notify;