diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-05-10 16:54:42 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-05-10 16:54:42 +0200 |
commit | dbfec06bf1f8de922ca3af09d14675ef44ada5d2 (patch) | |
tree | 157e0375612556991e488cdc6cef84e202dc50ea | |
parent | 0099db7b5b87adb72f1dfa69f893c41ab1c26d6e (diff) |
kernel: fix checkpages() and segflush() on SG_PHYSICAL type segments
do not touch s->map on SG_PHYSICAL type segments as they do
not have a pte map (s->mapsize == 0 && s->map == nil).
also remove the SG_PHYSICAL switch in freepte(), this is never
reached.
-rw-r--r-- | sys/src/9/port/fault.c | 18 | ||||
-rw-r--r-- | sys/src/9/port/page.c | 19 | ||||
-rw-r--r-- | sys/src/9/port/segment.c | 37 | ||||
-rw-r--r-- | sys/src/9/port/userinit.c | 2 |
4 files changed, 33 insertions, 43 deletions
diff --git a/sys/src/9/port/fault.c b/sys/src/9/port/fault.c index 4b6e12f67..9e499b722 100644 --- a/sys/src/9/port/fault.c +++ b/sys/src/9/port/fault.c @@ -438,14 +438,16 @@ checkpages(void) if((s = *sp) == nil) continue; qlock(s); - for(addr=s->base; addr<s->top; addr+=BY2PG){ - off = addr - s->base; - if((p = s->map[off/PTEMAPMEM]) == nil) - continue; - pg = p->pages[(off&(PTEMAPMEM-1))/BY2PG]; - if(pagedout(pg)) - continue; - checkmmu(addr, pg->pa); + if(s->mapsize > 0){ + for(addr=s->base; addr<s->top; addr+=BY2PG){ + off = addr - s->base; + if((p = s->map[off/PTEMAPMEM]) == nil) + continue; + pg = p->pages[(off&(PTEMAPMEM-1))/BY2PG]; + if(pagedout(pg)) + continue; + checkmmu(addr, pg->pa); + } } qunlock(s); } diff --git a/sys/src/9/port/page.c b/sys/src/9/port/page.c index da1950e25..a55242c4d 100644 --- a/sys/src/9/port/page.c +++ b/sys/src/9/port/page.c @@ -377,21 +377,10 @@ freepte(Segment *s, Pte *p) pg = p->first; pe = p->last; - - switch(s->type&SG_TYPE) { - case SG_PHYSICAL: - while(pg <= pe){ - if(*pg != nil && decref(*pg) == 0) - free(*pg); - pg++; - } - break; - default: - while(pg <= pe){ - if(*pg != nil) - putpage(*pg); - pg++; - } + while(pg <= pe){ + if(*pg != nil) + putpage(*pg); + pg++; } free(p); } diff --git a/sys/src/9/port/segment.c b/sys/src/9/port/segment.c index 1898beaeb..83b723eb8 100644 --- a/sys/src/9/port/segment.c +++ b/sys/src/9/port/segment.c @@ -64,8 +64,11 @@ newseg(int type, uintptr base, ulong size) s->sema.prev = &s->sema; s->sema.next = &s->sema; - if((type & SG_TYPE) == SG_PHYSICAL) + if((type & SG_TYPE) == SG_PHYSICAL){ + s->map = nil; + s->mapsize = 0; return s; + } mapsize = ROUND(size, PTEPERTAB)/PTEPERTAB; if(mapsize > nelem(s->ssegmap)){ @@ -477,9 +480,6 @@ mcountseg(Segment *s) Page **pg, **pe; ulong pages; - if((s->type&SG_TYPE) == SG_PHYSICAL) - return 0; - pages = 0; emap = &s->map[s->mapsize]; for(pte = s->map; pte < emap; pte++){ @@ -706,26 +706,25 @@ segflush(void *va, uintptr len) s->flushme = 1; more: len = (s->top < to ? s->top : to) - from; - off = from-s->base; - pte = s->map[off/PTEMAPMEM]; - off &= PTEMAPMEM-1; - if(off+len > PTEMAPMEM) - len = PTEMAPMEM-off; - - if(pte != nil) { - pg = &pte->pages[off/BY2PG]; - pe = pg + len/BY2PG; - while(pg < pe) { - if(!pagedout(*pg)) - (*pg)->txtflush = ~0; - pg++; + if(s->mapsize > 0){ + off = from-s->base; + pte = s->map[off/PTEMAPMEM]; + off &= PTEMAPMEM-1; + if(off+len > PTEMAPMEM) + len = PTEMAPMEM-off; + if(pte != nil) { + pg = &pte->pages[off/BY2PG]; + pe = pg + len/BY2PG; + while(pg < pe) { + if(!pagedout(*pg)) + (*pg)->txtflush = ~0; + pg++; + } } } - from += len; if(from < to && from < s->top) goto more; - qunlock(s); } } diff --git a/sys/src/9/port/userinit.c b/sys/src/9/port/userinit.c index c05210449..89a19c1c9 100644 --- a/sys/src/9/port/userinit.c +++ b/sys/src/9/port/userinit.c @@ -54,7 +54,7 @@ proc0(void*) kunmap(k); p->txtflush = ~0; segpage(up->seg[TSEG], p); - up->seg[TSEG]->flushme++; + up->seg[TSEG]->flushme = 1; /* * Become a user process. |