diff --git a/sys/src/9/port/fault.c b/sys/src/9/port/fault.c index d77894641..b6f5e3894 100644 --- a/sys/src/9/port/fault.c +++ b/sys/src/9/port/fault.c @@ -200,7 +200,6 @@ fixfault(Segment *s, uintptr addr, int read, int doputmmu) Pte **p, *etp; uintptr soff, mmuphys=0; Page **pg, *old, *new; - Page *(*fn)(Segment*, uintptr); addr &= ~(BY2PG-1); soff = addr-s->base; @@ -274,19 +273,13 @@ fixfault(Segment *s, uintptr addr, int read, int doputmmu) break; case SG_PHYSICAL: - if(*pg == nil) { - fn = s->pseg->pgalloc; - if(fn) - *pg = (*fn)(s, addr); - else { - new = smalloc(sizeof(Page)); - new->va = addr; - new->pa = s->pseg->pa+(addr-s->base); - new->ref = 1; - *pg = new; - } + if(*pg == nil){ + new = smalloc(sizeof(Page)); + new->va = addr; + new->pa = s->pseg->pa+(addr-s->base); + new->ref = 1; + *pg = new; } - if (checkaddr && addr == addr2check) (*checkaddr)(addr, s, *pg); mmuphys = PPN((*pg)->pa) |PTEWRITE|PTEUNCACHED|PTEVALID; diff --git a/sys/src/9/port/page.c b/sys/src/9/port/page.c index dcd701267..0061ed658 100644 --- a/sys/src/9/port/page.c +++ b/sys/src/9/port/page.c @@ -384,23 +384,11 @@ ptealloc(void) void freepte(Segment *s, Pte *p) { - void (*fn)(Page*); - Page **pg, **ptop; + Page **pg; switch(s->type&SG_TYPE) { case SG_PHYSICAL: - fn = s->pseg->pgfree; - ptop = &p->pages[PTEPERTAB]; - if(fn != nil) { - for(pg = p->pages; pg < ptop; pg++) { - if(*pg == nil) - continue; - (*fn)(*pg); - *pg = nil; - } - break; - } - for(pg = p->pages; pg < ptop; pg++) { + for(pg = p->first; pg <= p->last; pg++) { if(*pg != nil) { if(decref(*pg) == 0) free(*pg); @@ -409,11 +397,12 @@ freepte(Segment *s, Pte *p) } break; default: - for(pg = p->first; pg <= p->last; pg++) + for(pg = p->first; pg <= p->last; pg++) { if(*pg != nil) { putpage(*pg); *pg = nil; } + } } free(p); } @@ -483,7 +472,7 @@ portcountpagerefs(ulong *ref, int print) p = proctab(i); for(j=0; jseg[j]; - if(s) + if(s != nil) s->mark = 0; } } @@ -493,6 +482,8 @@ portcountpagerefs(ulong *ref, int print) s = p->seg[j]; if(s == nil || s->mark++) continue; + if((s->type&SG_TYPE) == SG_PHYSICAL) + continue; ns++; for(k=0; kmapsize; k++){ pte = s->map[k]; diff --git a/sys/src/9/port/portdat.h b/sys/src/9/port/portdat.h index 96e823766..a85dc831b 100644 --- a/sys/src/9/port/portdat.h +++ b/sys/src/9/port/portdat.h @@ -359,8 +359,6 @@ struct Physseg char *name; /* Attach name */ uintptr pa; /* Physical address */ uintptr size; /* Maximum segment size in bytes */ - Page *(*pgalloc)(Segment*, uintptr); /* Allocation if we need it */ - void (*pgfree)(Page*); }; struct Sema diff --git a/sys/src/9/port/segment.c b/sys/src/9/port/segment.c index 5bafd0c36..c64a4efbf 100644 --- a/sys/src/9/port/segment.c +++ b/sys/src/9/port/segment.c @@ -11,9 +11,9 @@ int imagereclaim(int); * Attachable segment types */ static Physseg physseg[10] = { - { SG_SHARED, "shared", 0, SEGMAXSIZE, 0, 0 }, - { SG_BSS, "memory", 0, SEGMAXSIZE, 0, 0 }, - { 0, 0, 0, 0, 0, 0 }, + { SG_SHARED, "shared", 0, SEGMAXSIZE }, + { SG_BSS, "memory", 0, SEGMAXSIZE }, + { 0, 0, 0, 0 }, }; static Lock physseglock; @@ -459,6 +459,9 @@ mcountseg(Segment *s) int i, j; Page *pg; + if((s->type&SG_TYPE) == SG_PHYSICAL) + return 0; + pages = 0; for(i = 0; i < s->mapsize; i++){ if(s->map[i] == nil) @@ -482,6 +485,9 @@ mfreeseg(Segment *s, uintptr start, int pages) uintptr soff; Page *pg; + if((s->type&SG_TYPE) == SG_PHYSICAL) + return; + /* * We want to zero s->map[i]->page[j] and putpage(pg), * but we have to make sure other processors flush the diff --git a/sys/src/9/port/sysproc.c b/sys/src/9/port/sysproc.c index 3cee4f15a..b787a3d6a 100644 --- a/sys/src/9/port/sysproc.c +++ b/sys/src/9/port/sysproc.c @@ -745,6 +745,7 @@ syssegbrk(va_list list) case SG_TEXT: case SG_DATA: case SG_STACK: + case SG_PHYSICAL: error(Ebadarg); default: return (uintptr)ibrk(va_arg(list, uintptr), i);