17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 50209230bSgjelinek * Common Development and Distribution License (the "License"). 60209230bSgjelinek * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 217c478bd9Sstevel@tonic-gate /* 22a98e9dbfSaguzovsk * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 237c478bd9Sstevel@tonic-gate * Use is subject to license terms. 24*9d12795fSRobert Mustacchi * Copyright (c) 2015, Joyent, Inc. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate 277c478bd9Sstevel@tonic-gate /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 287c478bd9Sstevel@tonic-gate /* All Rights Reserved */ 297c478bd9Sstevel@tonic-gate 307c478bd9Sstevel@tonic-gate /* 317c478bd9Sstevel@tonic-gate * University Copyright- Copyright (c) 1982, 1986, 1988 327c478bd9Sstevel@tonic-gate * The Regents of the University of California 337c478bd9Sstevel@tonic-gate * All Rights Reserved 347c478bd9Sstevel@tonic-gate * 357c478bd9Sstevel@tonic-gate * University Acknowledgment- Portions of this document are derived from 367c478bd9Sstevel@tonic-gate * software developed by the University of California, Berkeley, and its 377c478bd9Sstevel@tonic-gate * contributors. 387c478bd9Sstevel@tonic-gate */ 397c478bd9Sstevel@tonic-gate 407c478bd9Sstevel@tonic-gate #ifndef _VM_SEG_H 417c478bd9Sstevel@tonic-gate #define _VM_SEG_H 427c478bd9Sstevel@tonic-gate 437c478bd9Sstevel@tonic-gate #include <sys/vnode.h> 447c478bd9Sstevel@tonic-gate #include <sys/avl.h> 457c478bd9Sstevel@tonic-gate #include <vm/seg_enum.h> 467c478bd9Sstevel@tonic-gate #include <vm/faultcode.h> 477c478bd9Sstevel@tonic-gate #include <vm/hat.h> 487c478bd9Sstevel@tonic-gate 497c478bd9Sstevel@tonic-gate #ifdef __cplusplus 507c478bd9Sstevel@tonic-gate extern "C" { 517c478bd9Sstevel@tonic-gate #endif 527c478bd9Sstevel@tonic-gate 537c478bd9Sstevel@tonic-gate /* 547c478bd9Sstevel@tonic-gate * VM - Segments. 557c478bd9Sstevel@tonic-gate */ 567c478bd9Sstevel@tonic-gate 57a98e9dbfSaguzovsk struct anon_map; 58a98e9dbfSaguzovsk 597c478bd9Sstevel@tonic-gate /* 607c478bd9Sstevel@tonic-gate * kstat statistics for segment advise 617c478bd9Sstevel@tonic-gate */ 627c478bd9Sstevel@tonic-gate typedef struct { 637c478bd9Sstevel@tonic-gate kstat_named_t MADV_FREE_hit; 647c478bd9Sstevel@tonic-gate kstat_named_t MADV_FREE_miss; 657c478bd9Sstevel@tonic-gate } segadvstat_t; 667c478bd9Sstevel@tonic-gate 677c478bd9Sstevel@tonic-gate /* 687c478bd9Sstevel@tonic-gate * memory object ids 697c478bd9Sstevel@tonic-gate */ 707c478bd9Sstevel@tonic-gate typedef struct memid { u_longlong_t val[2]; } memid_t; 717c478bd9Sstevel@tonic-gate 727c478bd9Sstevel@tonic-gate /* 737c478bd9Sstevel@tonic-gate * An address space contains a set of segments, managed by drivers. 747c478bd9Sstevel@tonic-gate * Drivers support mapped devices, sharing, copy-on-write, etc. 757c478bd9Sstevel@tonic-gate * 767c478bd9Sstevel@tonic-gate * The seg structure contains a lock to prevent races, the base virtual 777c478bd9Sstevel@tonic-gate * address and size of the segment, a back pointer to the containing 787c478bd9Sstevel@tonic-gate * address space, pointers to maintain an AVL tree of segments in the 797c478bd9Sstevel@tonic-gate * same address space, and procedure and data hooks for the driver. 807c478bd9Sstevel@tonic-gate * The AVL tree of segments for the address space is sorted by 817c478bd9Sstevel@tonic-gate * ascending base addresses and overlapping segments are not allowed. 827c478bd9Sstevel@tonic-gate * 837c478bd9Sstevel@tonic-gate * After a segment is created, faults may occur on pages of the segment. 847c478bd9Sstevel@tonic-gate * When a fault occurs, the fault handling code must get the desired 857c478bd9Sstevel@tonic-gate * object and set up the hardware translation to the object. For some 867c478bd9Sstevel@tonic-gate * objects, the fault handling code also implements copy-on-write. 877c478bd9Sstevel@tonic-gate * 887c478bd9Sstevel@tonic-gate * When the hat wants to unload a translation, it can call the unload 897c478bd9Sstevel@tonic-gate * routine which is responsible for processing reference and modify bits. 907c478bd9Sstevel@tonic-gate * 917c478bd9Sstevel@tonic-gate * Each segment is protected by it's containing address space lock. To 927c478bd9Sstevel@tonic-gate * access any field in the segment structure, the "as" must be locked. 937c478bd9Sstevel@tonic-gate * If a segment field is to be modified, the address space lock must be 947c478bd9Sstevel@tonic-gate * write locked. 957c478bd9Sstevel@tonic-gate */ 967c478bd9Sstevel@tonic-gate 97a98e9dbfSaguzovsk typedef struct pcache_link { 98a98e9dbfSaguzovsk struct pcache_link *p_lnext; 99a98e9dbfSaguzovsk struct pcache_link *p_lprev; 100a98e9dbfSaguzovsk } pcache_link_t; 101a98e9dbfSaguzovsk 102a98e9dbfSaguzovsk typedef struct seg { 1037c478bd9Sstevel@tonic-gate caddr_t s_base; /* base virtual address */ 1047c478bd9Sstevel@tonic-gate size_t s_size; /* size in bytes */ 1057c478bd9Sstevel@tonic-gate uint_t s_szc; /* max page size code */ 1067c478bd9Sstevel@tonic-gate uint_t s_flags; /* flags for segment, see below */ 1077c478bd9Sstevel@tonic-gate struct as *s_as; /* containing address space */ 1087c478bd9Sstevel@tonic-gate avl_node_t s_tree; /* AVL tree links to segs in this as */ 1097c478bd9Sstevel@tonic-gate struct seg_ops *s_ops; /* ops vector: see below */ 1107c478bd9Sstevel@tonic-gate void *s_data; /* private data for instance */ 111a98e9dbfSaguzovsk kmutex_t s_pmtx; /* protects seg's pcache list */ 112a98e9dbfSaguzovsk pcache_link_t s_phead; /* head of seg's pcache list */ 113a98e9dbfSaguzovsk } seg_t; 1147c478bd9Sstevel@tonic-gate 1157c478bd9Sstevel@tonic-gate #define S_PURGE (0x01) /* seg should be purged in as_gap() */ 1167c478bd9Sstevel@tonic-gate 1177c478bd9Sstevel@tonic-gate struct seg_ops { 1187c478bd9Sstevel@tonic-gate int (*dup)(struct seg *, struct seg *); 1197c478bd9Sstevel@tonic-gate int (*unmap)(struct seg *, caddr_t, size_t); 1207c478bd9Sstevel@tonic-gate void (*free)(struct seg *); 1217c478bd9Sstevel@tonic-gate faultcode_t (*fault)(struct hat *, struct seg *, caddr_t, size_t, 1227c478bd9Sstevel@tonic-gate enum fault_type, enum seg_rw); 1237c478bd9Sstevel@tonic-gate faultcode_t (*faulta)(struct seg *, caddr_t); 1247c478bd9Sstevel@tonic-gate int (*setprot)(struct seg *, caddr_t, size_t, uint_t); 1257c478bd9Sstevel@tonic-gate int (*checkprot)(struct seg *, caddr_t, size_t, uint_t); 1267c478bd9Sstevel@tonic-gate int (*kluster)(struct seg *, caddr_t, ssize_t); 1277c478bd9Sstevel@tonic-gate size_t (*swapout)(struct seg *); 1287c478bd9Sstevel@tonic-gate int (*sync)(struct seg *, caddr_t, size_t, int, uint_t); 1297c478bd9Sstevel@tonic-gate size_t (*incore)(struct seg *, caddr_t, size_t, char *); 1307c478bd9Sstevel@tonic-gate int (*lockop)(struct seg *, caddr_t, size_t, int, int, ulong_t *, 1317c478bd9Sstevel@tonic-gate size_t); 1327c478bd9Sstevel@tonic-gate int (*getprot)(struct seg *, caddr_t, size_t, uint_t *); 1337c478bd9Sstevel@tonic-gate u_offset_t (*getoffset)(struct seg *, caddr_t); 1347c478bd9Sstevel@tonic-gate int (*gettype)(struct seg *, caddr_t); 1357c478bd9Sstevel@tonic-gate int (*getvp)(struct seg *, caddr_t, struct vnode **); 1367c478bd9Sstevel@tonic-gate int (*advise)(struct seg *, caddr_t, size_t, uint_t); 1377c478bd9Sstevel@tonic-gate void (*dump)(struct seg *); 1387c478bd9Sstevel@tonic-gate int (*pagelock)(struct seg *, caddr_t, size_t, struct page ***, 1397c478bd9Sstevel@tonic-gate enum lock_type, enum seg_rw); 1407c478bd9Sstevel@tonic-gate int (*setpagesize)(struct seg *, caddr_t, size_t, uint_t); 1417c478bd9Sstevel@tonic-gate int (*getmemid)(struct seg *, caddr_t, memid_t *); 1427c478bd9Sstevel@tonic-gate struct lgrp_mem_policy_info *(*getpolicy)(struct seg *, caddr_t); 1431bd5c35fSelowe int (*capable)(struct seg *, segcapability_t); 144*9d12795fSRobert Mustacchi int (*inherit)(struct seg *, caddr_t, size_t, uint_t); 1457c478bd9Sstevel@tonic-gate }; 1467c478bd9Sstevel@tonic-gate 1477c478bd9Sstevel@tonic-gate #ifdef _KERNEL 148a98e9dbfSaguzovsk 1497c478bd9Sstevel@tonic-gate /* 1507c478bd9Sstevel@tonic-gate * Generic segment operations 1517c478bd9Sstevel@tonic-gate */ 1527c478bd9Sstevel@tonic-gate extern void seg_init(void); 1537c478bd9Sstevel@tonic-gate extern struct seg *seg_alloc(struct as *as, caddr_t base, size_t size); 1547c478bd9Sstevel@tonic-gate extern int seg_attach(struct as *as, caddr_t base, size_t size, 1557c478bd9Sstevel@tonic-gate struct seg *seg); 1567c478bd9Sstevel@tonic-gate extern void seg_unmap(struct seg *seg); 1577c478bd9Sstevel@tonic-gate extern void seg_free(struct seg *seg); 1587c478bd9Sstevel@tonic-gate 1597c478bd9Sstevel@tonic-gate /* 1607c478bd9Sstevel@tonic-gate * functions for pagelock cache support 1617c478bd9Sstevel@tonic-gate */ 162a98e9dbfSaguzovsk typedef int (*seg_preclaim_cbfunc_t)(void *, caddr_t, size_t, 163a98e9dbfSaguzovsk struct page **, enum seg_rw, int); 164a98e9dbfSaguzovsk 165a98e9dbfSaguzovsk extern struct page **seg_plookup(struct seg *seg, struct anon_map *amp, 166a98e9dbfSaguzovsk caddr_t addr, size_t len, enum seg_rw rw, uint_t flags); 167a98e9dbfSaguzovsk extern void seg_pinactive(struct seg *seg, struct anon_map *amp, 168a98e9dbfSaguzovsk caddr_t addr, size_t len, struct page **pp, enum seg_rw rw, 169a98e9dbfSaguzovsk uint_t flags, seg_preclaim_cbfunc_t callback); 170a98e9dbfSaguzovsk 171a98e9dbfSaguzovsk extern void seg_ppurge(struct seg *seg, struct anon_map *amp, 172a98e9dbfSaguzovsk uint_t flags); 173a98e9dbfSaguzovsk extern void seg_ppurge_wiredpp(struct page **pp); 174a98e9dbfSaguzovsk 175a98e9dbfSaguzovsk extern int seg_pinsert_check(struct seg *seg, struct anon_map *amp, 176a98e9dbfSaguzovsk caddr_t addr, size_t len, uint_t flags); 177a98e9dbfSaguzovsk extern int seg_pinsert(struct seg *seg, struct anon_map *amp, 178a98e9dbfSaguzovsk caddr_t addr, size_t len, size_t wlen, struct page **pp, enum seg_rw rw, 179a98e9dbfSaguzovsk uint_t flags, seg_preclaim_cbfunc_t callback); 180a98e9dbfSaguzovsk 1817c478bd9Sstevel@tonic-gate extern void seg_pasync_thread(void); 1827c478bd9Sstevel@tonic-gate extern void seg_preap(void); 183cee1d74bSjfrank extern int seg_p_disable(void); 184cee1d74bSjfrank extern void seg_p_enable(void); 1857c478bd9Sstevel@tonic-gate 1867c478bd9Sstevel@tonic-gate extern segadvstat_t segadvstat; 187a98e9dbfSaguzovsk 1887c478bd9Sstevel@tonic-gate /* 189a98e9dbfSaguzovsk * Flags for pagelock cache support. 190a98e9dbfSaguzovsk * Flags argument is passed as uint_t to pcache routines. upper 16 bits of 191a98e9dbfSaguzovsk * the flags argument are reserved for alignment page shift when SEGP_PSHIFT 192a98e9dbfSaguzovsk * is set. 1937c478bd9Sstevel@tonic-gate */ 194a98e9dbfSaguzovsk #define SEGP_FORCE_WIRED 0x1 /* skip check against seg_pwindow */ 195a98e9dbfSaguzovsk #define SEGP_AMP 0x2 /* anon map's pcache entry */ 196a98e9dbfSaguzovsk #define SEGP_PSHIFT 0x4 /* addr pgsz shift for hash function */ 1977c478bd9Sstevel@tonic-gate 1987c478bd9Sstevel@tonic-gate /* 1997c478bd9Sstevel@tonic-gate * Return values for seg_pinsert and seg_pinsert_check functions. 2007c478bd9Sstevel@tonic-gate */ 2017c478bd9Sstevel@tonic-gate #define SEGP_SUCCESS 0 /* seg_pinsert() succeeded */ 2027c478bd9Sstevel@tonic-gate #define SEGP_FAIL 1 /* seg_pinsert() failed */ 2037c478bd9Sstevel@tonic-gate 2047c478bd9Sstevel@tonic-gate /* Page status bits for segop_incore */ 2057c478bd9Sstevel@tonic-gate #define SEG_PAGE_INCORE 0x01 /* VA has a page backing it */ 2067c478bd9Sstevel@tonic-gate #define SEG_PAGE_LOCKED 0x02 /* VA has a page that is locked */ 2077c478bd9Sstevel@tonic-gate #define SEG_PAGE_HASCOW 0x04 /* VA has a page with a copy-on-write */ 2087c478bd9Sstevel@tonic-gate #define SEG_PAGE_SOFTLOCK 0x08 /* VA has a page with softlock held */ 2097c478bd9Sstevel@tonic-gate #define SEG_PAGE_VNODEBACKED 0x10 /* Segment is backed by a vnode */ 2107c478bd9Sstevel@tonic-gate #define SEG_PAGE_ANON 0x20 /* VA has an anonymous page */ 2117c478bd9Sstevel@tonic-gate #define SEG_PAGE_VNODE 0x40 /* VA has a vnode page backing it */ 2127c478bd9Sstevel@tonic-gate 2137c478bd9Sstevel@tonic-gate #define SEGOP_DUP(s, n) (*(s)->s_ops->dup)((s), (n)) 2147c478bd9Sstevel@tonic-gate #define SEGOP_UNMAP(s, a, l) (*(s)->s_ops->unmap)((s), (a), (l)) 2157c478bd9Sstevel@tonic-gate #define SEGOP_FREE(s) (*(s)->s_ops->free)((s)) 2167c478bd9Sstevel@tonic-gate #define SEGOP_FAULT(h, s, a, l, t, rw) \ 2177c478bd9Sstevel@tonic-gate (*(s)->s_ops->fault)((h), (s), (a), (l), (t), (rw)) 2187c478bd9Sstevel@tonic-gate #define SEGOP_FAULTA(s, a) (*(s)->s_ops->faulta)((s), (a)) 2197c478bd9Sstevel@tonic-gate #define SEGOP_SETPROT(s, a, l, p) (*(s)->s_ops->setprot)((s), (a), (l), (p)) 2207c478bd9Sstevel@tonic-gate #define SEGOP_CHECKPROT(s, a, l, p) (*(s)->s_ops->checkprot)((s), (a), (l), (p)) 2217c478bd9Sstevel@tonic-gate #define SEGOP_KLUSTER(s, a, d) (*(s)->s_ops->kluster)((s), (a), (d)) 2227c478bd9Sstevel@tonic-gate #define SEGOP_SWAPOUT(s) (*(s)->s_ops->swapout)((s)) 2237c478bd9Sstevel@tonic-gate #define SEGOP_SYNC(s, a, l, atr, f) \ 2247c478bd9Sstevel@tonic-gate (*(s)->s_ops->sync)((s), (a), (l), (atr), (f)) 2257c478bd9Sstevel@tonic-gate #define SEGOP_INCORE(s, a, l, v) (*(s)->s_ops->incore)((s), (a), (l), (v)) 2267c478bd9Sstevel@tonic-gate #define SEGOP_LOCKOP(s, a, l, atr, op, b, p) \ 2277c478bd9Sstevel@tonic-gate (*(s)->s_ops->lockop)((s), (a), (l), (atr), (op), (b), (p)) 2287c478bd9Sstevel@tonic-gate #define SEGOP_GETPROT(s, a, l, p) (*(s)->s_ops->getprot)((s), (a), (l), (p)) 2297c478bd9Sstevel@tonic-gate #define SEGOP_GETOFFSET(s, a) (*(s)->s_ops->getoffset)((s), (a)) 2307c478bd9Sstevel@tonic-gate #define SEGOP_GETTYPE(s, a) (*(s)->s_ops->gettype)((s), (a)) 2317c478bd9Sstevel@tonic-gate #define SEGOP_GETVP(s, a, vpp) (*(s)->s_ops->getvp)((s), (a), (vpp)) 2327c478bd9Sstevel@tonic-gate #define SEGOP_ADVISE(s, a, l, b) (*(s)->s_ops->advise)((s), (a), (l), (b)) 2337c478bd9Sstevel@tonic-gate #define SEGOP_DUMP(s) (*(s)->s_ops->dump)((s)) 2347c478bd9Sstevel@tonic-gate #define SEGOP_PAGELOCK(s, a, l, p, t, rw) \ 2357c478bd9Sstevel@tonic-gate (*(s)->s_ops->pagelock)((s), (a), (l), (p), (t), (rw)) 2367c478bd9Sstevel@tonic-gate #define SEGOP_SETPAGESIZE(s, a, l, szc) \ 2377c478bd9Sstevel@tonic-gate (*(s)->s_ops->setpagesize)((s), (a), (l), (szc)) 2387c478bd9Sstevel@tonic-gate #define SEGOP_GETMEMID(s, a, mp) (*(s)->s_ops->getmemid)((s), (a), (mp)) 2397c478bd9Sstevel@tonic-gate #define SEGOP_GETPOLICY(s, a) (*(s)->s_ops->getpolicy)((s), (a)) 2401bd5c35fSelowe #define SEGOP_CAPABLE(s, c) (*(s)->s_ops->capable)((s), (c)) 241*9d12795fSRobert Mustacchi #define SEGOP_INHERIT(s, a, l, b) (*(s)->s_ops->inherit)((s), (a), (l), (b)) 2427c478bd9Sstevel@tonic-gate 2437c478bd9Sstevel@tonic-gate #define seg_page(seg, addr) \ 2447c478bd9Sstevel@tonic-gate (((uintptr_t)((addr) - (seg)->s_base)) >> PAGESHIFT) 2457c478bd9Sstevel@tonic-gate 2467c478bd9Sstevel@tonic-gate #define seg_pages(seg) \ 2477c478bd9Sstevel@tonic-gate (((uintptr_t)((seg)->s_size + PAGEOFFSET)) >> PAGESHIFT) 2487c478bd9Sstevel@tonic-gate 2497c478bd9Sstevel@tonic-gate #define IE_NOMEM -1 /* internal to seg layer */ 2507c478bd9Sstevel@tonic-gate #define IE_RETRY -2 /* internal to seg layer */ 2517c478bd9Sstevel@tonic-gate #define IE_REATTACH -3 /* internal to seg layer */ 2527c478bd9Sstevel@tonic-gate 253*9d12795fSRobert Mustacchi /* Values for SEGOP_INHERIT */ 254*9d12795fSRobert Mustacchi #define SEGP_INH_ZERO 0x01 255*9d12795fSRobert Mustacchi 256*9d12795fSRobert Mustacchi int seg_inherit_notsup(struct seg *, caddr_t, size_t, uint_t); 257*9d12795fSRobert Mustacchi 2587c478bd9Sstevel@tonic-gate /* Delay/retry factors for seg_p_mem_config_pre_del */ 2597c478bd9Sstevel@tonic-gate #define SEGP_PREDEL_DELAY_FACTOR 4 2607c478bd9Sstevel@tonic-gate /* 2617c478bd9Sstevel@tonic-gate * As a workaround to being unable to purge the pagelock 2627c478bd9Sstevel@tonic-gate * cache during a DR delete memory operation, we use 2637c478bd9Sstevel@tonic-gate * a stall threshold that is twice the maximum seen 2647c478bd9Sstevel@tonic-gate * during testing. This workaround will be removed 2657c478bd9Sstevel@tonic-gate * when a suitable fix is found. 2667c478bd9Sstevel@tonic-gate */ 2677c478bd9Sstevel@tonic-gate #define SEGP_STALL_SECONDS 25 2687c478bd9Sstevel@tonic-gate #define SEGP_STALL_THRESHOLD \ 2697c478bd9Sstevel@tonic-gate (SEGP_STALL_SECONDS * SEGP_PREDEL_DELAY_FACTOR) 2707c478bd9Sstevel@tonic-gate 2717c478bd9Sstevel@tonic-gate #ifdef VMDEBUG 2727c478bd9Sstevel@tonic-gate 2737c478bd9Sstevel@tonic-gate uint_t seg_page(struct seg *, caddr_t); 2747c478bd9Sstevel@tonic-gate uint_t seg_pages(struct seg *); 2757c478bd9Sstevel@tonic-gate 2767c478bd9Sstevel@tonic-gate #endif /* VMDEBUG */ 2777c478bd9Sstevel@tonic-gate 2780209230bSgjelinek boolean_t seg_can_change_zones(struct seg *); 2790209230bSgjelinek size_t seg_swresv(struct seg *); 2800209230bSgjelinek 2817c478bd9Sstevel@tonic-gate #endif /* _KERNEL */ 2827c478bd9Sstevel@tonic-gate 2837c478bd9Sstevel@tonic-gate #ifdef __cplusplus 2847c478bd9Sstevel@tonic-gate } 2857c478bd9Sstevel@tonic-gate #endif 2867c478bd9Sstevel@tonic-gate 2877c478bd9Sstevel@tonic-gate #endif /* _VM_SEG_H */ 288