summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/9/port/fault.c19
-rw-r--r--sys/src/9/port/page.c23
-rw-r--r--sys/src/9/port/portdat.h2
-rw-r--r--sys/src/9/port/segment.c12
-rw-r--r--sys/src/9/port/sysproc.c1
5 files changed, 23 insertions, 34 deletions
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; j<NSEG; j++){
s = p->seg[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; k<s->mapsize; 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);