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.
front
cinap_lenrek 2020-05-10 16:54:42 +02:00
parent 0099db7b5b
commit dbfec06bf1
4 changed files with 33 additions and 43 deletions

View File

@ -438,14 +438,16 @@ checkpages(void)
if((s = *sp) == nil) if((s = *sp) == nil)
continue; continue;
qlock(s); qlock(s);
for(addr=s->base; addr<s->top; addr+=BY2PG){ if(s->mapsize > 0){
off = addr - s->base; for(addr=s->base; addr<s->top; addr+=BY2PG){
if((p = s->map[off/PTEMAPMEM]) == nil) off = addr - s->base;
continue; if((p = s->map[off/PTEMAPMEM]) == nil)
pg = p->pages[(off&(PTEMAPMEM-1))/BY2PG]; continue;
if(pagedout(pg)) pg = p->pages[(off&(PTEMAPMEM-1))/BY2PG];
continue; if(pagedout(pg))
checkmmu(addr, pg->pa); continue;
checkmmu(addr, pg->pa);
}
} }
qunlock(s); qunlock(s);
} }

View File

@ -377,21 +377,10 @@ freepte(Segment *s, Pte *p)
pg = p->first; pg = p->first;
pe = p->last; pe = p->last;
while(pg <= pe){
switch(s->type&SG_TYPE) { if(*pg != nil)
case SG_PHYSICAL: putpage(*pg);
while(pg <= pe){ pg++;
if(*pg != nil && decref(*pg) == 0)
free(*pg);
pg++;
}
break;
default:
while(pg <= pe){
if(*pg != nil)
putpage(*pg);
pg++;
}
} }
free(p); free(p);
} }

View File

@ -64,8 +64,11 @@ newseg(int type, uintptr base, ulong size)
s->sema.prev = &s->sema; s->sema.prev = &s->sema;
s->sema.next = &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; return s;
}
mapsize = ROUND(size, PTEPERTAB)/PTEPERTAB; mapsize = ROUND(size, PTEPERTAB)/PTEPERTAB;
if(mapsize > nelem(s->ssegmap)){ if(mapsize > nelem(s->ssegmap)){
@ -477,9 +480,6 @@ mcountseg(Segment *s)
Page **pg, **pe; Page **pg, **pe;
ulong pages; ulong pages;
if((s->type&SG_TYPE) == SG_PHYSICAL)
return 0;
pages = 0; pages = 0;
emap = &s->map[s->mapsize]; emap = &s->map[s->mapsize];
for(pte = s->map; pte < emap; pte++){ for(pte = s->map; pte < emap; pte++){
@ -706,26 +706,25 @@ segflush(void *va, uintptr len)
s->flushme = 1; s->flushme = 1;
more: more:
len = (s->top < to ? s->top : to) - from; len = (s->top < to ? s->top : to) - from;
off = from-s->base; if(s->mapsize > 0){
pte = s->map[off/PTEMAPMEM]; off = from-s->base;
off &= PTEMAPMEM-1; pte = s->map[off/PTEMAPMEM];
if(off+len > PTEMAPMEM) off &= PTEMAPMEM-1;
len = PTEMAPMEM-off; if(off+len > PTEMAPMEM)
len = PTEMAPMEM-off;
if(pte != nil) { if(pte != nil) {
pg = &pte->pages[off/BY2PG]; pg = &pte->pages[off/BY2PG];
pe = pg + len/BY2PG; pe = pg + len/BY2PG;
while(pg < pe) { while(pg < pe) {
if(!pagedout(*pg)) if(!pagedout(*pg))
(*pg)->txtflush = ~0; (*pg)->txtflush = ~0;
pg++; pg++;
}
} }
} }
from += len; from += len;
if(from < to && from < s->top) if(from < to && from < s->top)
goto more; goto more;
qunlock(s); qunlock(s);
} }
} }

View File

@ -54,7 +54,7 @@ proc0(void*)
kunmap(k); kunmap(k);
p->txtflush = ~0; p->txtflush = ~0;
segpage(up->seg[TSEG], p); segpage(up->seg[TSEG], p);
up->seg[TSEG]->flushme++; up->seg[TSEG]->flushme = 1;
/* /*
* Become a user process. * Become a user process.