Lines Matching refs:seg

64 #include <vm/seg.h>
357 struct seg *
360 struct seg *seg = as->a_seglast;
365 if (seg != NULL &&
366 seg->s_base <= addr &&
367 addr < seg->s_base + seg->s_size)
368 return (seg);
370 seg = avl_find(&as->a_segtree, &addr, &where);
371 if (seg != NULL)
372 return (as->a_seglast = seg);
374 seg = avl_nearest(&as->a_segtree, where, AVL_AFTER);
375 if (seg == NULL && tail)
376 seg = avl_last(&as->a_segtree);
377 return (as->a_seglast = seg);
387 struct seg *seg, *seglast, *p, *n;
395 for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) {
396 ASSERT(seg->s_as == as);
397 p = AS_SEGPREV(as, seg);
398 n = AS_SEGNEXT(as, seg);
400 ASSERT(p == NULL || p->s_base < seg->s_base);
401 ASSERT(n == NULL || n->s_base > seg->s_base);
402 ASSERT(n != NULL || seg == avl_last(&as->a_segtree));
403 if (seg == seglast)
418 as_addseg(struct as *as, struct seg *newseg)
420 struct seg *seg;
431 struct seg *hseg = NULL;
432 struct seg *lseg = NULL;
457 seg = avl_find(&as->a_segtree, &addr, &where);
459 if (seg == NULL)
460 seg = avl_nearest(&as->a_segtree, where, AVL_AFTER);
462 if (seg == NULL)
463 seg = avl_last(&as->a_segtree);
465 if (seg != NULL) {
466 caddr_t base = seg->s_base;
469 * If top of seg is below the requested address, then
471 * and seg points to the tail of the list. Otherwise,
472 * the insertion point is immediately before seg.
474 if (base + seg->s_size > addr) {
484 if (seg->s_ops == &segnf_ops) {
485 seg_unmap(seg);
502 struct seg *
503 as_removeseg(struct as *as, struct seg *seg)
512 if (seg == NULL)
516 if (as->a_seglast == seg)
525 (seg == as->a_lastgap || seg->s_base > as->a_lastgap->s_base))
526 as->a_lastgap = AVL_NEXT(t, seg);
529 * remove the segment from the seg tree
531 avl_remove(t, seg);
536 return (seg);
542 struct seg *
545 struct seg *seg = as->a_seglast;
549 if (seg != NULL && seg->s_base <= addr &&
550 addr < seg->s_base + seg->s_size)
551 return (seg);
553 seg = avl_find(&as->a_segtree, &addr, NULL);
554 return (seg);
591 struct seg *a = (struct seg *)x;
592 struct seg *b = (struct seg *)y;
605 avl_create(&as->a_segtree, as_segcompar, sizeof (struct seg),
606 offsetof(struct seg, s_tree));
688 struct seg *seg, *next;
708 for (seg = AS_SEGFIRST(as); seg != NULL; seg = next) {
711 next = AS_SEGNEXT(as, seg);
713 err = SEGOP_UNMAP(seg, seg->s_base, seg->s_size);
777 struct seg *seg, *newseg;
791 for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) {
793 if (seg->s_flags & S_PURGE) {
794 purgesize += seg->s_size;
798 newseg = seg_alloc(newas, seg->s_base, seg->s_size);
806 if ((error = SEGOP_DUP(seg, newseg)) != 0) {
808 * We call seg_free() on the new seg
819 newas->a_size += seg->s_size;
844 struct seg *seg;
850 struct seg *segsav;
912 seg = segkmap;
917 seg = as_segat(as, raddr);
918 if (seg == NULL) {
929 segsav = seg;
932 if (raddr >= seg->s_base + seg->s_size) {
933 seg = AS_SEGNEXT(as, seg);
934 if (seg == NULL || raddr != seg->s_base) {
939 if (raddr + rsize > seg->s_base + seg->s_size)
940 ssize = seg->s_base + seg->s_size - raddr;
944 res = SEGOP_FAULT(hat, seg, raddr, ssize, type, rw);
956 for (seg = segsav; addrsav < raddr; addrsav += ssize) {
957 if (addrsav >= seg->s_base + seg->s_size)
958 seg = AS_SEGNEXT(as, seg);
959 ASSERT(seg != NULL);
965 if (raddr > seg->s_base + seg->s_size)
966 ssize = seg->s_base + seg->s_size - addrsav;
969 (void) SEGOP_FAULT(hat, seg, addrsav, ssize,
1003 struct seg *seg;
1023 seg = as_segat(as, raddr);
1024 if (seg == NULL) {
1032 if (raddr >= seg->s_base + seg->s_size) {
1033 seg = AS_SEGNEXT(as, seg);
1034 if (seg == NULL || raddr != seg->s_base) {
1039 res = SEGOP_FAULTA(seg, raddr);
1072 struct seg *seg;
1097 * the seg list. Also the segment driver will return IE_RETRY
1109 seg = as_segat(as, raddr);
1110 if (seg == NULL) {
1117 if (raddr >= seg->s_base + seg->s_size) {
1118 seg = AS_SEGNEXT(as, seg);
1119 if (seg == NULL || raddr != seg->s_base) {
1124 if ((raddr + rsize) > (seg->s_base + seg->s_size))
1125 ssize = seg->s_base + seg->s_size - raddr;
1129 error = SEGOP_SETPROT(seg, raddr, ssize, prot);
1187 seg->s_base, seg->s_size))) {
1235 struct seg *seg;
1260 seg = as_segat(as, raddr);
1261 if (seg == NULL) {
1268 if (raddr >= seg->s_base + seg->s_size) {
1269 seg = AS_SEGNEXT(as, seg);
1270 if (seg == NULL || raddr != seg->s_base) {
1275 if ((raddr + rsize) > (seg->s_base + seg->s_size))
1276 ssize = seg->s_base + seg->s_size - raddr;
1280 error = SEGOP_CHECKPROT(seg, raddr, ssize, prot);
1292 struct seg *seg, *seg_next;
1314 for (seg = as_findseg(as, raddr, 0); seg != NULL; seg = seg_next) {
1315 if (eaddr <= seg->s_base)
1321 if (raddr < seg->s_base)
1322 raddr = seg->s_base; /* raddr was in a gap */
1324 if (eaddr > (seg->s_base + seg->s_size))
1325 ssize = seg->s_base + seg->s_size - raddr;
1330 * Save next segment pointer since seg can be
1333 seg_next = AS_SEGNEXT(as, seg);
1338 * we have to do this check here while we have seg.)
1341 if (!SEG_IS_DEVNULL_MAPPING(seg) &&
1342 !SEG_IS_PARTIAL_RESV(seg))
1346 err = SEGOP_UNMAP(seg, raddr, ssize);
1383 seg->s_base, seg->s_size))) {
1438 struct seg *seg;
1452 seg = seg_alloc(as, addr, size);
1453 if (seg == NULL) {
1457 error = (*crfp)(seg, vn_a);
1459 seg_free(seg);
1484 seg = seg_alloc(as, addr, segsize);
1485 if (seg == NULL) {
1489 error = (*crfp)(seg, vn_a);
1491 seg_free(seg);
1513 seg = seg_alloc(as, addr, segsize);
1514 if (seg == NULL) {
1518 error = (*crfp)(seg, vn_a);
1520 seg_free(seg);
1551 struct seg *seg;
1565 seg = seg_alloc(as, addr, size);
1566 if (seg == NULL) {
1570 error = (*crfp)(seg, vn_a);
1572 seg_free(seg);
1666 struct seg *seg = NULL;
1726 seg = seg_alloc(as, addr, size);
1727 if (seg == NULL) {
1732 error = (*crfp)(seg, argsp);
1734 seg_free(seg);
1775 struct seg *seg;
1776 struct seg *next_seg;
1787 seg = AS_SEGFIRST(as);
1788 while (seg != NULL) {
1789 next_seg = AS_SEGNEXT(as, seg);
1790 if (seg->s_flags & S_PURGE)
1791 SEGOP_UNMAP(seg, seg->s_base, seg->s_size);
1792 seg = next_seg;
1828 struct seg *lseg, *hseg;
2010 struct seg *seg;
2019 seg = as_findseg(as, addr, 0);
2020 if (seg != NULL)
2021 addr = MAX(seg->s_base, addr);
2024 if (seg == NULL || addr >= eaddr || eaddr <= seg->s_base) {
2029 if (seg->s_ops == &segvn_ops) {
2030 segend = seg->s_base + seg->s_size;
2038 if (seg->s_ops == &segspt_shmops) {
2039 segend = seg->s_base + spt_realsize(seg);
2044 seg = AS_SEGNEXT(as, seg);
2046 if (seg != NULL)
2047 addr = seg->s_base;
2074 struct seg *seg;
2100 for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) {
2101 struct seg_ops *ov = seg->s_ops;
2104 * We have to check to see if the seg has
2105 * an ops vector because the seg may have
2110 swpcnt += SEGOP_SWAPOUT(seg);
2124 struct seg *seg;
2140 seg = as_segat(as, raddr);
2141 if (seg == NULL) {
2147 if (raddr >= seg->s_base + seg->s_size) {
2148 seg = AS_SEGNEXT(as, seg);
2149 if (seg == NULL || raddr != seg->s_base) {
2154 if ((raddr + rsize) > (seg->s_base + seg->s_size))
2155 ssize = seg->s_base + seg->s_size - raddr;
2158 *sizep += isize = SEGOP_INCORE(seg, raddr, ssize, vec);
2170 as_segunlock(struct seg *seg, caddr_t addr, int attr,
2184 (void) SEGOP_LOCKOP(seg, range_start, size, attr, MC_UNLOCK,
2194 struct seg *seg = as_segat(as, raddr);
2198 if (raddr >= seg->s_base + seg->s_size)
2199 seg = AS_SEGNEXT(as, seg);
2201 if ((raddr + rsize) > (seg->s_base + seg->s_size))
2202 ssize = seg->s_base + seg->s_size - raddr;
2206 as_segunlock(seg, raddr, attr, mlock_map, 0, btopr(ssize));
2222 struct seg *seg; /* working segment */
2227 size_t ssize; /* size of seg */
2259 seg = AS_SEGFIRST(as);
2260 if (seg == NULL) {
2266 raddr = (caddr_t)((uintptr_t)seg->s_base &
2268 rlen += (((uintptr_t)(seg->s_base + seg->s_size) +
2270 } while ((seg = AS_SEGNEXT(as, seg)) != NULL);
2279 for (seg = AS_SEGFIRST(as); seg; seg = AS_SEGNEXT(as, seg)) {
2280 error = SEGOP_LOCKOP(seg, seg->s_base,
2281 seg->s_size, attr, MC_LOCK, mlock_map, pos);
2284 pos += seg_pages(seg);
2288 for (seg = AS_SEGFIRST(as); seg != NULL;
2289 seg = AS_SEGNEXT(as, seg)) {
2291 raddr = (caddr_t)((uintptr_t)seg->s_base &
2293 npages = seg_pages(seg);
2294 as_segunlock(seg, raddr, attr, mlock_map,
2308 for (seg = AS_SEGFIRST(as); seg; seg = AS_SEGNEXT(as, seg)) {
2309 error = SEGOP_LOCKOP(seg, seg->s_base,
2310 seg->s_size, attr, MC_UNLOCK, NULL, 0);
2334 if ((seg = as_segat(as, raddr)) == NULL) {
2359 if (raddr >= seg->s_base + seg->s_size) {
2360 seg = AS_SEGNEXT(as, seg);
2361 if (seg == NULL || raddr != seg->s_base) {
2372 if ((raddr + rsize) > (seg->s_base + seg->s_size))
2373 ssize = seg->s_base + seg->s_size - raddr;
2387 if (error = SEGOP_SYNC(seg, raddr, ssize,
2398 if (error = SEGOP_LOCKOP(seg, raddr, ssize,
2413 (void) SEGOP_LOCKOP(seg, raddr, ssize, attr, func,
2421 error = SEGOP_ADVISE(seg, raddr, ssize, (uint_t)arg);
2441 seg = as_segat(as, raddr);
2442 if (seg == NULL) {
2457 if (seg->s_ops->inherit == NULL) {
2460 error = SEGOP_INHERIT(seg, raddr, ssize,
2530 as_pagelock_segs(struct as *as, struct seg *seg, struct page ***ppp,
2535 struct seg *sv_seg = seg;
2549 ASSERT(seg != NULL);
2550 ASSERT(addr >= seg->s_base && addr < seg->s_base + seg->s_size);
2551 ASSERT(addr + size > seg->s_base + seg->s_size);
2561 if (addr >= seg->s_base + seg->s_size) {
2563 seg = AS_SEGNEXT(as, seg);
2564 if (seg == NULL || addr != seg->s_base) {
2572 if (seg->s_ops == &segvn_ops) {
2575 if (SEGOP_GETVP(seg, addr, &vp) != 0 ||
2580 } else if (seg->s_ops != &segspt_shmops) {
2586 if (addr + size > seg->s_base + seg->s_size) {
2587 ssize = seg->s_base + seg->s_size - addr;
2598 seg = sv_seg;
2601 if (addr >= seg->s_base + seg->s_size) {
2602 seg = AS_SEGNEXT(as, seg);
2603 ASSERT(seg != NULL && addr == seg->s_base);
2607 if (addr + size > seg->s_base + seg->s_size) {
2608 ssize = seg->s_base + seg->s_size - addr;
2613 error = SEGOP_PAGELOCK(seg, addr, ssize, (page_t ***)pl,
2640 seg = sv_seg;
2643 if (addr >= seg->s_base + seg->s_size) {
2644 seg = AS_SEGNEXT(as, seg);
2645 ASSERT(seg != NULL && addr == seg->s_base);
2649 if (eaddr > seg->s_base + seg->s_size) {
2650 ssize = seg->s_base + seg->s_size - addr;
2656 (void) SEGOP_PAGELOCK(seg, addr, ssize, (page_t ***)pl,
2695 struct seg *seg;
2711 seg = as_segat(as, raddr);
2712 if (seg == NULL) {
2716 ASSERT(raddr >= seg->s_base && raddr < seg->s_base + seg->s_size);
2717 if (raddr + rsize > seg->s_base + seg->s_size) {
2718 return (as_pagelock_segs(as, seg, ppp, raddr, rsize, rw));
2731 err = SEGOP_PAGELOCK(seg, raddr, rsize, ppp, L_PAGELOCK, rw);
2764 as_pageunlock_segs(struct as *as, struct seg *seg, caddr_t addr, size_t size,
2774 ASSERT(seg != NULL);
2775 ASSERT(addr >= seg->s_base && addr < seg->s_base + seg->s_size);
2776 ASSERT(addr + size > seg->s_base + seg->s_size);
2782 if (addr >= seg->s_base + seg->s_size) {
2783 seg = AS_SEGNEXT(as, seg);
2784 ASSERT(seg != NULL && addr == seg->s_base);
2787 if (eaddr > seg->s_base + seg->s_size) {
2788 ssize = seg->s_base + seg->s_size - addr;
2794 (void) SEGOP_PAGELOCK(seg, addr, ssize, (page_t ***)pl,
2811 struct seg *seg;
2832 seg = as_segat(as, raddr);
2833 ASSERT(seg != NULL);
2838 ASSERT(raddr >= seg->s_base && raddr < seg->s_base + seg->s_size);
2839 if (raddr + rsize <= seg->s_base + seg->s_size) {
2840 SEGOP_PAGELOCK(seg, raddr, rsize, &pp, L_PAGEUNLOCK, rw);
2842 as_pageunlock_segs(as, seg, raddr, rsize, pp, rw);
2853 struct seg *seg;
2873 seg = as_segat(as, raddr);
2874 if (seg == NULL) {
2881 if (raddr >= seg->s_base + seg->s_size) {
2882 seg = AS_SEGNEXT(as, seg);
2883 if (seg == NULL || raddr != seg->s_base) {
2888 if ((raddr + rsize) > (seg->s_base + seg->s_size)) {
2889 ssize = seg->s_base + seg->s_size - raddr;
2895 error = SEGOP_SETPAGESIZE(seg, raddr, ssize, szc);
2981 struct seg *seg;
2987 seg = as_segat(as, raddr);
2988 if (seg == NULL) {
2989 panic("as_iset3_default_lpsize: no seg");
2993 if (raddr >= seg->s_base + seg->s_size) {
2994 seg = AS_SEGNEXT(as, seg);
2995 if (seg == NULL || raddr != seg->s_base) {
2999 if ((raddr + rsize) > (seg->s_base + seg->s_size)) {
3000 ssize = seg->s_base + seg->s_size - raddr;
3005 if (szc > seg->s_szc) {
3006 error = SEGOP_SETPAGESIZE(seg, raddr, ssize, szc);
3010 if ((SEGOP_GETTYPE(seg, raddr) & MAP_SHARED) &&
3011 (SEGOP_GETVP(seg, raddr, &vp) != 0 ||
3067 struct seg *seg;
3076 seg = as_segat(as, raddr);
3077 if (seg == NULL) {
3078 panic("as_iset1_default_lpsize: no seg");
3080 if (seg->s_szc < szc) {
3087 if (raddr >= seg->s_base + seg->s_size) {
3088 seg = AS_SEGNEXT(as, seg);
3089 if (seg == NULL || raddr != seg->s_base) {
3092 if (seg->s_szc >= szc && set) {
3100 } else if (seg->s_szc < szc && !set) {
3106 if ((raddr + rsize) > (seg->s_base + seg->s_size)) {
3107 ssize = seg->s_base + seg->s_size - raddr;
3220 struct seg *seg;
3247 seg = as_segat(as, raddr);
3248 if (seg == NULL) {
3253 if (seg->s_ops == &segvn_ops) {
3254 rtype = SEGOP_GETTYPE(seg, addr);
3265 if (raddr >= (seg->s_base + seg->s_size)) {
3266 seg = AS_SEGNEXT(as, seg);
3267 if (seg == NULL || raddr != seg->s_base) {
3271 if (seg->s_ops == &segvn_ops) {
3272 stype = SEGOP_GETTYPE(seg, raddr);
3309 if ((raddr + rsize) > (seg->s_base + seg->s_size)) {
3310 ssize = seg->s_base + seg->s_size - raddr;
3369 struct seg *seg;
3385 (seg = as_segat(as, vaddr)) == NULL ||
3386 SEGOP_GETPROT(seg, vaddr, 0, &prot) != 0)
3397 err = SEGOP_SETPROT(seg, vaddr, PAGESIZE, prot);
3416 struct seg *seg;
3432 (seg = as_segat(as, vaddr)) == NULL)
3436 err = SEGOP_SETPROT(seg, vaddr, PAGESIZE, prot);
3458 struct seg *seg;
3485 seg = as_segat(as, vaddr);
3486 if (seg == NULL) {
3487 panic("as_setwatchprot: no seg");
3490 err = SEGOP_SETPROT(seg, vaddr, PAGESIZE, wprot);
3514 struct seg *seg;
3534 seg = as_segat(as, pwp->wp_vaddr);
3535 if (seg == NULL)
3537 err = SEGOP_SETPROT(seg, pwp->wp_vaddr,
3577 struct seg *seg;
3581 seg = as_segat(as, addr);
3582 if (seg == NULL) {
3589 if (seg->s_ops->getmemid == NULL) {
3594 sts = SEGOP_GETMEMID(seg, addr, memidp);