| plan 9 kernel history: overview | file list | diff list |
1998/0916/port/segment.c (diff list | history)
| 1998/0823/sys/src/9/port/segment.c:48,53 – 1998/0916/sys/src/9/port/segment.c:48,54 (short | long | prev | next) | ||
| 1991/0705 | newseg(int type, ulong base, ulong size) { Segment *s; | |
| 1998/0916 | int mapsize; | |
| 1991/0705 | if(size > (SEGMAPSIZE*PTEPERTAB)) | |
| 1992/0114 | error(Enovmem); | |
| 1998/0823/sys/src/9/port/segment.c:58,63 – 1998/0916/sys/src/9/port/segment.c:59,75 | ||
| 1992/0619 | s->base = base; s->top = base+(size*BY2PG); s->size = size; | |
| 1998/0916 | mapsize = ROUND(size, PTEPERTAB)/PTEPERTAB; if(mapsize > nelem(s->ssegmap)){ s->map = smalloc(mapsize*sizeof(Pte*)); s->mapsize = mapsize; } else{ s->map = s->ssegmap; s->mapsize = nelem(s->ssegmap); } | |
| 1992/0619 | return s; | |
| 1991/0705 | } | |
| 1998/0823/sys/src/9/port/segment.c:91,102 – 1998/0916/sys/src/9/port/segment.c:103,116 | ||
| 1993/0725 | if(i) putimage(i); | |
| 1991/1109 | ||
| 1993/0725 |
| |
| 1998/0916 | emap = &s->map[s->mapsize]; | |
| 1993/0725 | for(pp = s->map; pp < emap; pp++) if(*pp) freepte(s, *pp); | |
| 1991/0705 | ||
| 1993/0725 | qunlock(&s->lk); | |
| 1998/0916 | if(s->map != s->ssegmap) free(s->map); | |
| 1996/0303 | if(s->profile != 0) free(s->profile); | |
| 1993/0725 | free(s); | |
| 1998/0823/sys/src/9/port/segment.c:108,114 – 1998/0916/sys/src/9/port/segment.c:122,128 | ||
| 1993/0810 | Page **pg, *x; Pte *pte, **p, **endpte; | |
| 1991/0705 |
| |
| 1998/0916 | endpte = &s->map[s->mapsize]; | |
| 1992/0824 | for(p = s->map; p < endpte; p++) { | |
| 1993/0810 | if(*p == 0) continue; | |
| 1998/0823/sys/src/9/port/segment.c:123,129 – 1998/0916/sys/src/9/port/segment.c:137,143 | ||
| 1991/0705 | Segment* | |
| 1992/1104 | dupseg(Segment **seg, int segno, int share) | |
| 1991/0705 | { | |
| 1992/0824 |
| |
| 1998/0916 | int i, size; | |
| 1991/0705 | Pte *pte; | |
| 1992/1104 | Segment *n, *s; | |
| 1991/0705 | ||
| 1998/0823/sys/src/9/port/segment.c:174,180 – 1998/0916/sys/src/9/port/segment.c:188,195 | ||
| 1991/0705 | n->flen = s->flen; | |
| 1992/0824 | break; | |
| 1991/0705 | } | |
| 1992/0824 |
| |
| 1998/0916 | size = s->mapsize; for(i = 0; i < size; i++) | |
| 1992/0824 | if(pte = s->map[i]) n->map[i] = ptecpy(pte); | |
| 1991/0705 | ||
| 1998/0823/sys/src/9/port/segment.c:374,380 – 1998/0916/sys/src/9/port/segment.c:389,396 | ||
| 1991/0705 | { Segment *s, *ns; ulong newtop, newsize; | |
| 1998/0916 | int i, mapsize; Pte **map; | |
| 1991/0705 | ||
| 1993/0501 | s = up->seg[seg]; | |
| 1991/0705 | if(s == 0) | |
| 1998/0823/sys/src/9/port/segment.c:413,422 – 1998/0916/sys/src/9/port/segment.c:429,447 | ||
| 1991/0705 | } } | |
| 1992/0824 |
| |
| 1998/0916 | if(newsize > (SEGMAPSIZE*PTEPERTAB)) { | |
| 1992/0824 | qunlock(&s->lk); | |
| 1992/0912 | error(Enovmem); | |
| 1992/0824 | } | |
| 1998/0916 | mapsize = ROUND(newsize, PTEPERTAB)/PTEPERTAB; if(mapsize > s->mapsize){ map = smalloc(mapsize*sizeof(Pte*)); memmove(map, s->map, s->mapsize); if(s->map != s->ssegmap) free(s->map); s->map = map; s->mapsize = mapsize; } | |
| 1992/0824 | ||
| 1991/0705 | s->top = newtop; s->size = newsize; | |
| 1998/0823/sys/src/9/port/segment.c:430,436 – 1998/0916/sys/src/9/port/segment.c:455,461 | ||
| 1991/0705 | void mfreeseg(Segment *s, ulong start, int pages) { | |
| 1998/0916 | int i, j, size; | |
| 1991/0705 | ulong soff; Page *pg; | |
| 1998/0724 | Page *list; | |
| 1998/0823/sys/src/9/port/segment.c:438,445 – 1998/0916/sys/src/9/port/segment.c:463,471 | ||
| 1991/0705 | soff = start-s->base; j = (soff&(PTEMAPMEM-1))/BY2PG; | |
| 1998/0916 | size = s->mapsize; | |
| 1998/0724 | list = nil; | |
| 1991/0705 |
| |
| 1998/0916 | for(i = soff/PTEMAPMEM; i < size; i++) { | |
| 1998/0512 | if(pages <= 0) | |
| 1992/1206 | break; if(s->map[i] == 0) { | |
| 1998/0823/sys/src/9/port/segment.c:477,483 – 1998/0916/sys/src/9/port/segment.c:503,509 | ||
| 1991/0705 | } } | |
| 1994/0514 |
| |
| 1998/0916 | Segment* | |
| 1994/0514 | isoverlap(Proc *p, ulong va, int len) { int i; | |
| 1998/0823/sys/src/9/port/segment.c:491,499 – 1998/0916/sys/src/9/port/segment.c:517,525 | ||
| 1998/0512 | continue; | |
| 1994/0514 | if((newtop > ns->base && newtop <= ns->top) || (va >= ns->base && va < ns->top)) | |
| 1998/0916 | return ns; | |
| 1994/0514 | } | |
| 1998/0326 |
| |
| 1998/0916 | return nil; | |
| 1998/0326 | } int | |
| 1998/0823/sys/src/9/port/segment.c:526,533 – 1998/0916/sys/src/9/port/segment.c:552,559 | ||
| 1991/0705 | ulong segattach(Proc *p, ulong attr, char *name, ulong va, ulong len) { | |
| 1994/0514 |
| |
| 1998/0916 | int sno; Segment *s, *os; | |
| 1994/0514 | Physseg *ps; | |
| 1991/0705 | ||
| 1994/0514 | if(va != 0 && (va&KZERO) == KZERO) /* BUG: Only ok for now */ | |
| 1998/0823/sys/src/9/port/segment.c:537,543 – 1998/0916/sys/src/9/port/segment.c:563,569 | ||
| 1991/0705 | vmemchr(name, 0, ~0); for(sno = 0; sno < NSEG; sno++) | |
| 1994/0514 |
| |
| 1998/0916 | if(p->seg[sno] == nil && sno != ESEG) | |
| 1991/0705 | break; if(sno == NSEG) | |
| 1998/0823/sys/src/9/port/segment.c:545,562 – 1998/0916/sys/src/9/port/segment.c:571,598 | ||
| 1991/0705 | len = PGROUND(len); | |
| 1994/0514 |
| |
| 1998/0916 | /* * Find a hole in the address space. * Starting at the lowest possible stack address - len, * check for an overlapping segment, and repeat at the * base of that segment - len until either a hole is found * or the address space is exhausted. */ | |
| 1994/0514 | if(va == 0) { va = p->seg[SSEG]->base - len; | |
| 1998/0916 | for(;;) { os = isoverlap(p, va, len); if(os == nil) | |
| 1994/0514 | break; | |
| 1998/0916 | va = os->base; if(len > va) error(Enovmem); | |
| 1994/0514 | va -= len; } | |
| 1991/0705 | } | |
| 1994/0514 | va = va&~(BY2PG-1); | |
| 1998/0916 | if(isoverlap(p, va, len) != nil) | |
| 1994/0514 | error(Esoverlap); | |
| 1991/0731 | for(ps = physseg; ps->name; ps++) | |
| 1998/0823/sys/src/9/port/segment.c:568,574 – 1998/0916/sys/src/9/port/segment.c:604,610 | ||
| 1991/0705 | if(len > ps->size) | |
| 1992/0114 | error(Enovmem); | |
| 1991/0705 | ||
| 1993/0725 |
| |
| 1998/0916 | attr &= ~SG_TYPE; /* Turn off what is not allowed */ | |
| 1993/0725 | attr |= ps->attr; /* Copy in defaults */ | |
| 1991/0705 | s = newseg(attr, va, len/BY2PG); | |