summaryrefslogtreecommitdiff
path: root/sys/src/9/port/segment.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2018-05-27 22:59:19 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2018-05-27 22:59:19 +0200
commit5da4f0fc0f55b43815adbdbc8f2e0e26eaac84e6 (patch)
tree1381230c9dc8060f167b2988a55052c598fdd7f5 /sys/src/9/port/segment.c
parentad7390dda820db424821b19c572a44b4cc0838e8 (diff)
sdram: experimental ramdisk driver
this driver makes regions of physical memory accessible as a disk. to use it, ramdiskinit() has to be called before confinit(), so that conf.mem[] banks can be reserved. currently, only pc and pc64 kernel use it, but otherwise the implementation is portable. ramdisks are not zeroed when allocated, so that the contents are preserved across warm reboots. to not waste memory, physical segments do not allocate Page structures or populate the segment pte's anymore. theres also a new SG_CHACHED attribute.
Diffstat (limited to 'sys/src/9/port/segment.c')
-rw-r--r--sys/src/9/port/segment.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/sys/src/9/port/segment.c b/sys/src/9/port/segment.c
index ca67c4b56..eedbb7b14 100644
--- a/sys/src/9/port/segment.c
+++ b/sys/src/9/port/segment.c
@@ -64,6 +64,9 @@ newseg(int type, uintptr base, ulong size)
s->sema.prev = &s->sema;
s->sema.next = &s->sema;
+ if((type & SG_TYPE) == SG_PHYSICAL)
+ return s;
+
mapsize = ROUND(size, PTEPERTAB)/PTEPERTAB;
if(mapsize > nelem(s->ssegmap)){
s->map = malloc(mapsize*sizeof(Pte*));
@@ -104,13 +107,16 @@ putseg(Segment *s)
} else if(decref(s) != 0)
return;
- emap = &s->map[s->mapsize];
- for(pte = s->map; pte < emap; pte++)
- if(*pte != nil)
- freepte(s, *pte);
+ if(s->mapsize > 0){
+ emap = &s->map[s->mapsize];
+ for(pte = s->map; pte < emap; pte++)
+ if(*pte != nil)
+ freepte(s, *pte);
+
+ if(s->map != s->ssegmap)
+ free(s->map);
+ }
- if(s->map != s->ssegmap)
- free(s->map);
if(s->profile != nil)
free(s->profile);
@@ -212,7 +218,7 @@ segpage(Segment *s, Page *p)
uintptr soff;
Page **pg;
- if(p->va < s->base || p->va >= s->top)
+ if(p->va < s->base || p->va >= s->top || s->mapsize == 0)
panic("segpage");
soff = p->va - s->base;