Lines Matching refs:seg

63 #include <vm/seg.h>
356 struct seg *
359 struct seg *seg = as->a_seglast;
364 if (seg != NULL &&
365 seg->s_base <= addr &&
366 addr < seg->s_base + seg->s_size)
367 return (seg);
369 seg = avl_find(&as->a_segtree, &addr, &where);
370 if (seg != NULL)
371 return (as->a_seglast = seg);
373 seg = avl_nearest(&as->a_segtree, where, AVL_AFTER);
374 if (seg == NULL && tail)
375 seg = avl_last(&as->a_segtree);
376 return (as->a_seglast = seg);
386 struct seg *seg, *seglast, *p, *n;
394 for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) {
395 ASSERT(seg->s_as == as);
396 p = AS_SEGPREV(as, seg);
397 n = AS_SEGNEXT(as, seg);
399 ASSERT(p == NULL || p->s_base < seg->s_base);
400 ASSERT(n == NULL || n->s_base > seg->s_base);
401 ASSERT(n != NULL || seg == avl_last(&as->a_segtree));
402 if (seg == seglast)
417 as_addseg(struct as *as, struct seg *newseg)
419 struct seg *seg;
430 struct seg *hseg = NULL;
431 struct seg *lseg = NULL;
456 seg = avl_find(&as->a_segtree, &addr, &where);
458 if (seg == NULL)
459 seg = avl_nearest(&as->a_segtree, where, AVL_AFTER);
461 if (seg == NULL)
462 seg = avl_last(&as->a_segtree);
464 if (seg != NULL) {
465 caddr_t base = seg->s_base;
468 * If top of seg is below the requested address, then
470 * and seg points to the tail of the list. Otherwise,
471 * the insertion point is immediately before seg.
473 if (base + seg->s_size > addr) {
483 if (seg->s_ops == &segnf_ops) {
484 seg_unmap(seg);
501 struct seg *
502 as_removeseg(struct as *as, struct seg *seg)
511 if (seg == NULL)
515 if (as->a_seglast == seg)
524 (seg == as->a_lastgap || seg->s_base > as->a_lastgap->s_base))
525 as->a_lastgap = AVL_NEXT(t, seg);
528 * remove the segment from the seg tree
530 avl_remove(t, seg);
535 return (seg);
541 struct seg *
544 struct seg *seg = as->a_seglast;
548 if (seg != NULL && seg->s_base <= addr &&
549 addr < seg->s_base + seg->s_size)
550 return (seg);
552 seg = avl_find(&as->a_segtree, &addr, NULL);
553 return (seg);
590 struct seg *a = (struct seg *)x;
591 struct seg *b = (struct seg *)y;
604 avl_create(&as->a_segtree, as_segcompar, sizeof (struct seg),
605 offsetof(struct seg, s_tree));
686 struct seg *seg, *next;
706 for (seg = AS_SEGFIRST(as); seg != NULL; seg = next) {
709 next = AS_SEGNEXT(as, seg);
711 err = SEGOP_UNMAP(seg, seg->s_base, seg->s_size);
775 struct seg *seg, *newseg;
789 for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) {
791 if (seg->s_flags & S_PURGE) {
792 purgesize += seg->s_size;
796 newseg = seg_alloc(newas, seg->s_base, seg->s_size);
804 if ((error = SEGOP_DUP(seg, newseg)) != 0) {
806 * We call seg_free() on the new seg
817 newas->a_size += seg->s_size;
842 struct seg *seg;
848 struct seg *segsav;
910 seg = segkmap;
915 seg = as_segat(as, raddr);
916 if (seg == NULL) {
927 segsav = seg;
930 if (raddr >= seg->s_base + seg->s_size) {
931 seg = AS_SEGNEXT(as, seg);
932 if (seg == NULL || raddr != seg->s_base) {
937 if (raddr + rsize > seg->s_base + seg->s_size)
938 ssize = seg->s_base + seg->s_size - raddr;
942 res = SEGOP_FAULT(hat, seg, raddr, ssize, type, rw);
954 for (seg = segsav; addrsav < raddr; addrsav += ssize) {
955 if (addrsav >= seg->s_base + seg->s_size)
956 seg = AS_SEGNEXT(as, seg);
957 ASSERT(seg != NULL);
963 if (raddr > seg->s_base + seg->s_size)
964 ssize = seg->s_base + seg->s_size - addrsav;
967 (void) SEGOP_FAULT(hat, seg, addrsav, ssize,
1001 struct seg *seg;
1021 seg = as_segat(as, raddr);
1022 if (seg == NULL) {
1030 if (raddr >= seg->s_base + seg->s_size) {
1031 seg = AS_SEGNEXT(as, seg);
1032 if (seg == NULL || raddr != seg->s_base) {
1037 res = SEGOP_FAULTA(seg, raddr);
1070 struct seg *seg;
1095 * the seg list. Also the segment driver will return IE_RETRY
1107 seg = as_segat(as, raddr);
1108 if (seg == NULL) {
1115 if (raddr >= seg->s_base + seg->s_size) {
1116 seg = AS_SEGNEXT(as, seg);
1117 if (seg == NULL || raddr != seg->s_base) {
1122 if ((raddr + rsize) > (seg->s_base + seg->s_size))
1123 ssize = seg->s_base + seg->s_size - raddr;
1127 error = SEGOP_SETPROT(seg, raddr, ssize, prot);
1185 seg->s_base, seg->s_size))) {
1233 struct seg *seg;
1258 seg = as_segat(as, raddr);
1259 if (seg == NULL) {
1266 if (raddr >= seg->s_base + seg->s_size) {
1267 seg = AS_SEGNEXT(as, seg);
1268 if (seg == NULL || raddr != seg->s_base) {
1273 if ((raddr + rsize) > (seg->s_base + seg->s_size))
1274 ssize = seg->s_base + seg->s_size - raddr;
1278 error = SEGOP_CHECKPROT(seg, raddr, ssize, prot);
1290 struct seg *seg, *seg_next;
1312 for (seg = as_findseg(as, raddr, 0); seg != NULL; seg = seg_next) {
1313 if (eaddr <= seg->s_base)
1319 if (raddr < seg->s_base)
1320 raddr = seg->s_base; /* raddr was in a gap */
1322 if (eaddr > (seg->s_base + seg->s_size))
1323 ssize = seg->s_base + seg->s_size - raddr;
1328 * Save next segment pointer since seg can be
1331 seg_next = AS_SEGNEXT(as, seg);
1336 * we have to do this check here while we have seg.)
1339 if (!SEG_IS_DEVNULL_MAPPING(seg) &&
1340 !SEG_IS_PARTIAL_RESV(seg))
1344 err = SEGOP_UNMAP(seg, raddr, ssize);
1381 seg->s_base, seg->s_size))) {
1436 struct seg *seg;
1450 seg = seg_alloc(as, addr, size);
1451 if (seg == NULL) {
1455 error = (*crfp)(seg, vn_a);
1457 seg_free(seg);
1482 seg = seg_alloc(as, addr, segsize);
1483 if (seg == NULL) {
1487 error = (*crfp)(seg, vn_a);
1489 seg_free(seg);
1511 seg = seg_alloc(as, addr, segsize);
1512 if (seg == NULL) {
1516 error = (*crfp)(seg, vn_a);
1518 seg_free(seg);
1549 struct seg *seg;
1563 seg = seg_alloc(as, addr, size);
1564 if (seg == NULL) {
1568 error = (*crfp)(seg, vn_a);
1570 seg_free(seg);
1664 struct seg *seg = NULL;
1717 seg = seg_alloc(as, addr, size);
1718 if (seg == NULL) {
1723 error = (*crfp)(seg, argsp);
1725 seg_free(seg);
1766 struct seg *seg;
1767 struct seg *next_seg;
1778 seg = AS_SEGFIRST(as);
1779 while (seg != NULL) {
1780 next_seg = AS_SEGNEXT(as, seg);
1781 if (seg->s_flags & S_PURGE)
1782 SEGOP_UNMAP(seg, seg->s_base, seg->s_size);
1783 seg = next_seg;
1819 struct seg *lseg, *hseg;
2001 struct seg *seg;
2010 seg = as_findseg(as, addr, 0);
2011 if (seg != NULL)
2012 addr = MAX(seg->s_base, addr);
2015 if (seg == NULL || addr >= eaddr || eaddr <= seg->s_base) {
2020 if (seg->s_ops == &segvn_ops) {
2021 segend = seg->s_base + seg->s_size;
2029 if (seg->s_ops == &segspt_shmops) {
2030 segend = seg->s_base + spt_realsize(seg);
2035 seg = AS_SEGNEXT(as, seg);
2037 if (seg != NULL)
2038 addr = seg->s_base;
2065 struct seg *seg;
2091 for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) {
2092 struct seg_ops *ov = seg->s_ops;
2095 * We have to check to see if the seg has
2096 * an ops vector because the seg may have
2101 swpcnt += SEGOP_SWAPOUT(seg);
2115 struct seg *seg;
2131 seg = as_segat(as, raddr);
2132 if (seg == NULL) {
2138 if (raddr >= seg->s_base + seg->s_size) {
2139 seg = AS_SEGNEXT(as, seg);
2140 if (seg == NULL || raddr != seg->s_base) {
2145 if ((raddr + rsize) > (seg->s_base + seg->s_size))
2146 ssize = seg->s_base + seg->s_size - raddr;
2149 *sizep += isize = SEGOP_INCORE(seg, raddr, ssize, vec);
2161 as_segunlock(struct seg *seg, caddr_t addr, int attr,
2175 (void) SEGOP_LOCKOP(seg, range_start, size, attr, MC_UNLOCK,
2185 struct seg *seg = as_segat(as, raddr);
2189 if (raddr >= seg->s_base + seg->s_size)
2190 seg = AS_SEGNEXT(as, seg);
2192 if ((raddr + rsize) > (seg->s_base + seg->s_size))
2193 ssize = seg->s_base + seg->s_size - raddr;
2197 as_segunlock(seg, raddr, attr, mlock_map, 0, btopr(ssize));
2213 struct seg *seg; /* working segment */
2218 size_t ssize; /* size of seg */
2250 seg = AS_SEGFIRST(as);
2251 if (seg == NULL) {
2257 raddr = (caddr_t)((uintptr_t)seg->s_base &
2259 rlen += (((uintptr_t)(seg->s_base + seg->s_size) +
2261 } while ((seg = AS_SEGNEXT(as, seg)) != NULL);
2270 for (seg = AS_SEGFIRST(as); seg; seg = AS_SEGNEXT(as, seg)) {
2271 error = SEGOP_LOCKOP(seg, seg->s_base,
2272 seg->s_size, attr, MC_LOCK, mlock_map, pos);
2275 pos += seg_pages(seg);
2279 for (seg = AS_SEGFIRST(as); seg != NULL;
2280 seg = AS_SEGNEXT(as, seg)) {
2282 raddr = (caddr_t)((uintptr_t)seg->s_base &
2284 npages = seg_pages(seg);
2285 as_segunlock(seg, raddr, attr, mlock_map,
2299 for (seg = AS_SEGFIRST(as); seg; seg = AS_SEGNEXT(as, seg)) {
2300 error = SEGOP_LOCKOP(seg, seg->s_base,
2301 seg->s_size, attr, MC_UNLOCK, NULL, 0);
2325 if ((seg = as_segat(as, raddr)) == NULL) {
2350 if (raddr >= seg->s_base + seg->s_size) {
2351 seg = AS_SEGNEXT(as, seg);
2352 if (seg == NULL || raddr != seg->s_base) {
2363 if ((raddr + rsize) > (seg->s_base + seg->s_size))
2364 ssize = seg->s_base + seg->s_size - raddr;
2378 if (error = SEGOP_SYNC(seg, raddr, ssize,
2389 if (error = SEGOP_LOCKOP(seg, raddr, ssize,
2404 (void) SEGOP_LOCKOP(seg, raddr, ssize, attr, func,
2412 error = SEGOP_ADVISE(seg, raddr, ssize, (uint_t)arg);
2432 seg = as_segat(as, raddr);
2433 if (seg == NULL) {
2448 if (seg->s_ops->inherit == NULL) {
2451 error = SEGOP_INHERIT(seg, raddr, ssize,
2521 as_pagelock_segs(struct as *as, struct seg *seg, struct page ***ppp,
2526 struct seg *sv_seg = seg;
2540 ASSERT(seg != NULL);
2541 ASSERT(addr >= seg->s_base && addr < seg->s_base + seg->s_size);
2542 ASSERT(addr + size > seg->s_base + seg->s_size);
2552 if (addr >= seg->s_base + seg->s_size) {
2554 seg = AS_SEGNEXT(as, seg);
2555 if (seg == NULL || addr != seg->s_base) {
2563 if (seg->s_ops == &segvn_ops) {
2566 if (SEGOP_GETVP(seg, addr, &vp) != 0 ||
2571 } else if (seg->s_ops != &segspt_shmops) {
2577 if (addr + size > seg->s_base + seg->s_size) {
2578 ssize = seg->s_base + seg->s_size - addr;
2589 seg = sv_seg;
2592 if (addr >= seg->s_base + seg->s_size) {
2593 seg = AS_SEGNEXT(as, seg);
2594 ASSERT(seg != NULL && addr == seg->s_base);
2598 if (addr + size > seg->s_base + seg->s_size) {
2599 ssize = seg->s_base + seg->s_size - addr;
2604 error = SEGOP_PAGELOCK(seg, addr, ssize, (page_t ***)pl,
2631 seg = sv_seg;
2634 if (addr >= seg->s_base + seg->s_size) {
2635 seg = AS_SEGNEXT(as, seg);
2636 ASSERT(seg != NULL && addr == seg->s_base);
2640 if (eaddr > seg->s_base + seg->s_size) {
2641 ssize = seg->s_base + seg->s_size - addr;
2647 (void) SEGOP_PAGELOCK(seg, addr, ssize, (page_t ***)pl,
2686 struct seg *seg;
2702 seg = as_segat(as, raddr);
2703 if (seg == NULL) {
2707 ASSERT(raddr >= seg->s_base && raddr < seg->s_base + seg->s_size);
2708 if (raddr + rsize > seg->s_base + seg->s_size) {
2709 return (as_pagelock_segs(as, seg, ppp, raddr, rsize, rw));
2722 err = SEGOP_PAGELOCK(seg, raddr, rsize, ppp, L_PAGELOCK, rw);
2755 as_pageunlock_segs(struct as *as, struct seg *seg, caddr_t addr, size_t size,
2765 ASSERT(seg != NULL);
2766 ASSERT(addr >= seg->s_base && addr < seg->s_base + seg->s_size);
2767 ASSERT(addr + size > seg->s_base + seg->s_size);
2773 if (addr >= seg->s_base + seg->s_size) {
2774 seg = AS_SEGNEXT(as, seg);
2775 ASSERT(seg != NULL && addr == seg->s_base);
2778 if (eaddr > seg->s_base + seg->s_size) {
2779 ssize = seg->s_base + seg->s_size - addr;
2785 (void) SEGOP_PAGELOCK(seg, addr, ssize, (page_t ***)pl,
2802 struct seg *seg;
2823 seg = as_segat(as, raddr);
2824 ASSERT(seg != NULL);
2829 ASSERT(raddr >= seg->s_base && raddr < seg->s_base + seg->s_size);
2830 if (raddr + rsize <= seg->s_base + seg->s_size) {
2831 SEGOP_PAGELOCK(seg, raddr, rsize, &pp, L_PAGEUNLOCK, rw);
2833 as_pageunlock_segs(as, seg, raddr, rsize, pp, rw);
2844 struct seg *seg;
2864 seg = as_segat(as, raddr);
2865 if (seg == NULL) {
2872 if (raddr >= seg->s_base + seg->s_size) {
2873 seg = AS_SEGNEXT(as, seg);
2874 if (seg == NULL || raddr != seg->s_base) {
2879 if ((raddr + rsize) > (seg->s_base + seg->s_size)) {
2880 ssize = seg->s_base + seg->s_size - raddr;
2886 error = SEGOP_SETPAGESIZE(seg, raddr, ssize, szc);
2972 struct seg *seg;
2978 seg = as_segat(as, raddr);
2979 if (seg == NULL) {
2980 panic("as_iset3_default_lpsize: no seg");
2984 if (raddr >= seg->s_base + seg->s_size) {
2985 seg = AS_SEGNEXT(as, seg);
2986 if (seg == NULL || raddr != seg->s_base) {
2990 if ((raddr + rsize) > (seg->s_base + seg->s_size)) {
2991 ssize = seg->s_base + seg->s_size - raddr;
2996 if (szc > seg->s_szc) {
2997 error = SEGOP_SETPAGESIZE(seg, raddr, ssize, szc);
3001 if ((SEGOP_GETTYPE(seg, raddr) & MAP_SHARED) &&
3002 (SEGOP_GETVP(seg, raddr, &vp) != 0 ||
3058 struct seg *seg;
3067 seg = as_segat(as, raddr);
3068 if (seg == NULL) {
3069 panic("as_iset1_default_lpsize: no seg");
3071 if (seg->s_szc < szc) {
3078 if (raddr >= seg->s_base + seg->s_size) {
3079 seg = AS_SEGNEXT(as, seg);
3080 if (seg == NULL || raddr != seg->s_base) {
3083 if (seg->s_szc >= szc && set) {
3091 } else if (seg->s_szc < szc && !set) {
3097 if ((raddr + rsize) > (seg->s_base + seg->s_size)) {
3098 ssize = seg->s_base + seg->s_size - raddr;
3211 struct seg *seg;
3238 seg = as_segat(as, raddr);
3239 if (seg == NULL) {
3244 if (seg->s_ops == &segvn_ops) {
3245 rtype = SEGOP_GETTYPE(seg, addr);
3256 if (raddr >= (seg->s_base + seg->s_size)) {
3257 seg = AS_SEGNEXT(as, seg);
3258 if (seg == NULL || raddr != seg->s_base) {
3262 if (seg->s_ops == &segvn_ops) {
3263 stype = SEGOP_GETTYPE(seg, raddr);
3300 if ((raddr + rsize) > (seg->s_base + seg->s_size)) {
3301 ssize = seg->s_base + seg->s_size - raddr;
3360 struct seg *seg;
3376 (seg = as_segat(as, vaddr)) == NULL ||
3377 SEGOP_GETPROT(seg, vaddr, 0, &prot) != 0)
3388 err = SEGOP_SETPROT(seg, vaddr, PAGESIZE, prot);
3407 struct seg *seg;
3423 (seg = as_segat(as, vaddr)) == NULL)
3427 err = SEGOP_SETPROT(seg, vaddr, PAGESIZE, prot);
3449 struct seg *seg;
3476 seg = as_segat(as, vaddr);
3477 if (seg == NULL) {
3478 panic("as_setwatchprot: no seg");
3481 err = SEGOP_SETPROT(seg, vaddr, PAGESIZE, wprot);
3505 struct seg *seg;
3525 seg = as_segat(as, pwp->wp_vaddr);
3526 if (seg == NULL)
3528 err = SEGOP_SETPROT(seg, pwp->wp_vaddr,
3568 struct seg *seg;
3572 seg = as_segat(as, addr);
3573 if (seg == NULL) {
3580 if (seg->s_ops->getmemid == NULL) {
3585 sts = SEGOP_GETMEMID(seg, addr, memidp);