From 27806bee8a156f30e9634a8e8356ffcb85e89f1e Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 1 Oct 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-10-01 --- carrera/kbd.c | 13 +++++++++++-- carrera/screen.c | 2 +- carrera/trap.c | 3 +++ port/segment.c | 37 +++++++++++++++++++++++-------------- 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/carrera/kbd.c b/carrera/kbd.c index c471ea6bfe88c1ee30131c9dca114e825ab29da9..e60664d346963e6030ab8ca8ebbe7f4bdba54fc0 100644 --- a/carrera/kbd.c +++ b/carrera/kbd.c @@ -166,9 +166,8 @@ kbdwait(void) int tries; for(tries = 0; tries < 2000; tries++){ - if(KBDCTL & Sobf){ + if(KBDCTL & Sobf) return 1; - } kdbdly(1); } return 0; @@ -185,6 +184,16 @@ kbdackwait(void) return 0; } +void +mouseintr(void) +{ + uchar code; + + kbdwait(); + code = KBDDAT; + print("mouse intr %d\n", code); +} + int kbdintr(void) { diff --git a/carrera/screen.c b/carrera/screen.c index 5101ad5e82a87cf4d49d1425c2940952c416bb0d..30d4d3e624a25073decc057d127c32e9bc5e3ebe 100644 --- a/carrera/screen.c +++ b/carrera/screen.c @@ -270,7 +270,7 @@ screenputc(char *buf) cursor.x += pos*w; break; case '\b': - if(cursor.x-w >= 0) + if(cursor.x-w >= window.min.x) cursor.x -= w; break; default: diff --git a/carrera/trap.c b/carrera/trap.c index d6a2bcb23131c318b6df9a8738068d0d429267aa..020dd11867751671ebc677ef230392ba2d967457 100644 --- a/carrera/trap.c +++ b/carrera/trap.c @@ -305,6 +305,9 @@ intr(Ureg *ur) case 0x1C: kbdintr(); break; + case 0x20: + mouseintr(); + break; } } cause &= ~INTR3; diff --git a/port/segment.c b/port/segment.c index 2de99627f7208b9f88ba61c32009a375854200f8..7875e2e092dd7e89eec4c782c83440bf5e1e8298 100644 --- a/port/segment.c +++ b/port/segment.c @@ -464,12 +464,9 @@ pteflush(Pte *pte, int s, int e) int i; Page *p; - if(pte == 0) - return; - for(i = s; i < e; i++) { p = pte->pages[i]; - if(p != 0) + if(pagedout(p) == 0) memset(p->cachectl, PG_TXTFLUSH, sizeof(p->cachectl)); } } @@ -478,7 +475,8 @@ long syssegflush(ulong *arg) { Segment *s; - ulong addr, ua, l; + ulong addr, l; + Pte *pte; int chunk, ps, pe, len; addr = arg[0]; @@ -490,23 +488,34 @@ syssegflush(ulong *arg) error(Ebadarg); s->flushme = 1; - + more: l = len; if(addr+l > s->top) l = s->top - addr; - ua = addr-s->base; - ps = ua&(PTEMAPMEM-1); - pe = (ua+l)&(PTEMAPMEM-1); - pe = (pe+BY2PG-1)&~(BY2PG-1); - if(pe > PTEMAPMEM) - pe = PTEMAPMEM; - - pteflush(s->map[ua/PTEMAPMEM], ps/BY2PG, pe/BY2PG); + + ps = addr-s->base; + pte = s->map[ps/PTEMAPMEM]; + ps &= PTEMAPMEM-1; + pe = PTEMAPMEM; + if(pe-ps > l){ + pe = ps + l; + pe = (pe+BY2PG-1)&~(BY2PG-1); + } + if(pe == ps) { + qunlock(&s->lk); + error(Ebadarg); + } + + if(pte) + pteflush(pte, ps/BY2PG, pe/BY2PG); chunk = pe-ps; len -= chunk; addr += chunk; + if(len > 0 && addr < s->top) + goto more; + qunlock(&s->lk); } flushmmu();