M carrera/kbd.c => carrera/kbd.c +11 -2
@@ 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)
{
M carrera/screen.c => carrera/screen.c +1 -1
@@ 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:
M carrera/trap.c => carrera/trap.c +3 -0
@@ 305,6 305,9 @@ intr(Ureg *ur)
case 0x1C:
kbdintr();
break;
+ case 0x20:
+ mouseintr();
+ break;
}
}
cause &= ~INTR3;
M port/segment.c => port/segment.c +23 -14
@@ 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();