diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-05-27 22:59:19 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-05-27 22:59:19 +0200 |
commit | 5da4f0fc0f55b43815adbdbc8f2e0e26eaac84e6 (patch) | |
tree | 1381230c9dc8060f167b2988a55052c598fdd7f5 /sys/src/9/port/segment.c | |
parent | ad7390dda820db424821b19c572a44b4cc0838e8 (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.c | 20 |
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; |