From 9774d97e9f5d0306e41df23d20b059dfd941a7f4 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sun, 19 Sep 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-09-19 --- port/segment.c | 71 +++++++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 27 deletions(-) diff --git a/port/segment.c b/port/segment.c index d39ae9735558fb7fb03cce1256986bfebb227178..fa922ba21e6fffcb5191c5b6bd7927b362a0d5b0 100644 --- a/port/segment.c +++ b/port/segment.c @@ -458,40 +458,57 @@ found: return 0; } +void +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) + memset(p->cachectl, PG_TXTFLUSH, sizeof(p->cachectl)); + } +} + long syssegflush(ulong *arg) { Segment *s; - int i, j, len; - ulong soff; - Page *pg; - - s = seg(up, arg[0], 1); - if(s == 0) - error(Ebadarg); - - s->flushme = 1; + ulong addr, ua, l; + int chunk, ps, pe, len; + + addr = arg[0]; + len = arg[1]; + + while(len > 0) { + s = seg(u->p, addr, 1); + if(s == 0) + error(Ebadarg); + + s->flushme = 1; + + 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); - soff = arg[0]-s->base; - j = (soff&(PTEMAPMEM-1))/BY2PG; - len = arg[1]+BY2PG; + chunk = pe-ps; + len -= chunk; + addr += chunk; - for(i = soff/PTEMAPMEM; len > 0 && i < SEGMAPSIZE; i++) { - if(s->map[i] == 0) { - len -= PTEMAPMEM; - continue; - } - while(len > 0 && j < PTEPERTAB) { - pg = s->map[i]->pages[j]; - if(pg != 0) - memset(pg->cachectl, PG_TXTFLUSH, sizeof pg->cachectl); - j++; - len -= BY2PG; - } - j = 0; + qunlock(&s->lk); } - - qunlock(&s->lk); flushmmu(); return 0; }