1*0Sstevel@tonic-gate /* 2*0Sstevel@tonic-gate * CDDL HEADER START 3*0Sstevel@tonic-gate * 4*0Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*0Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*0Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*0Sstevel@tonic-gate * with the License. 8*0Sstevel@tonic-gate * 9*0Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*0Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*0Sstevel@tonic-gate * See the License for the specific language governing permissions 12*0Sstevel@tonic-gate * and limitations under the License. 13*0Sstevel@tonic-gate * 14*0Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*0Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*0Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*0Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*0Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*0Sstevel@tonic-gate * 20*0Sstevel@tonic-gate * CDDL HEADER END 21*0Sstevel@tonic-gate */ 22*0Sstevel@tonic-gate /* 23*0Sstevel@tonic-gate * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24*0Sstevel@tonic-gate * Use is subject to license terms. 25*0Sstevel@tonic-gate */ 26*0Sstevel@tonic-gate 27*0Sstevel@tonic-gate #ifndef _VM_SEG_SPT_H 28*0Sstevel@tonic-gate #define _VM_SEG_SPT_H 29*0Sstevel@tonic-gate 30*0Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 31*0Sstevel@tonic-gate 32*0Sstevel@tonic-gate #ifdef __cplusplus 33*0Sstevel@tonic-gate extern "C" { 34*0Sstevel@tonic-gate #endif 35*0Sstevel@tonic-gate 36*0Sstevel@tonic-gate #ifndef _ASM 37*0Sstevel@tonic-gate 38*0Sstevel@tonic-gate #include <sys/types.h> 39*0Sstevel@tonic-gate #include <sys/t_lock.h> 40*0Sstevel@tonic-gate #include <sys/lgrp.h> 41*0Sstevel@tonic-gate 42*0Sstevel@tonic-gate /* 43*0Sstevel@tonic-gate * Passed data when creating spt segment. 44*0Sstevel@tonic-gate */ 45*0Sstevel@tonic-gate struct segspt_crargs { 46*0Sstevel@tonic-gate struct seg *seg_spt; 47*0Sstevel@tonic-gate struct anon_map *amp; 48*0Sstevel@tonic-gate uint_t prot; 49*0Sstevel@tonic-gate uint_t flags; 50*0Sstevel@tonic-gate uint_t szc; 51*0Sstevel@tonic-gate }; 52*0Sstevel@tonic-gate 53*0Sstevel@tonic-gate typedef struct spt_data { 54*0Sstevel@tonic-gate struct vnode *spt_vp; 55*0Sstevel@tonic-gate struct anon_map *spt_amp; 56*0Sstevel@tonic-gate size_t spt_realsize; 57*0Sstevel@tonic-gate struct page **spt_ppa; 58*0Sstevel@tonic-gate ushort_t *spt_ppa_lckcnt; 59*0Sstevel@tonic-gate uint_t spt_prot; 60*0Sstevel@tonic-gate kmutex_t spt_lock; 61*0Sstevel@tonic-gate size_t spt_pcachecnt; /* # of times in pcache */ 62*0Sstevel@tonic-gate uint_t spt_flags; /* Dynamic ISM or regular ISM */ 63*0Sstevel@tonic-gate /* 64*0Sstevel@tonic-gate * Initial memory allocation policy 65*0Sstevel@tonic-gate * used during pre-allocation done in shmat() 66*0Sstevel@tonic-gate */ 67*0Sstevel@tonic-gate lgrp_mem_policy_info_t spt_policy_info; 68*0Sstevel@tonic-gate } spt_data_t; 69*0Sstevel@tonic-gate 70*0Sstevel@tonic-gate /* 71*0Sstevel@tonic-gate * Private data for spt_shm segment. 72*0Sstevel@tonic-gate */ 73*0Sstevel@tonic-gate typedef struct shm_data { 74*0Sstevel@tonic-gate struct as *shm_sptas; 75*0Sstevel@tonic-gate struct anon_map *shm_amp; 76*0Sstevel@tonic-gate size_t shm_softlockcnt; /* # outstanding lock operations */ 77*0Sstevel@tonic-gate struct seg *shm_sptseg; /* pointer to spt segment */ 78*0Sstevel@tonic-gate char *shm_vpage; /* indicating locked pages */ 79*0Sstevel@tonic-gate spgcnt_t shm_lckpgs; /* # of locked pages per attached seg */ 80*0Sstevel@tonic-gate /* 81*0Sstevel@tonic-gate * Memory allocation policy after shmat() 82*0Sstevel@tonic-gate */ 83*0Sstevel@tonic-gate lgrp_mem_policy_info_t shm_policy_info; 84*0Sstevel@tonic-gate } shm_data_t; 85*0Sstevel@tonic-gate 86*0Sstevel@tonic-gate #define DISM_PG_LOCKED 0x1 /* DISM page is locked */ 87*0Sstevel@tonic-gate #define DISM_PPA_CHANGED 0x2 /* DISM new lock, need to rebuild ppa */ 88*0Sstevel@tonic-gate 89*0Sstevel@tonic-gate #define DISM_LOCK_MAX 0xfffe /* max number of locks per DISM page */ 90*0Sstevel@tonic-gate #endif 91*0Sstevel@tonic-gate 92*0Sstevel@tonic-gate #ifdef _KERNEL 93*0Sstevel@tonic-gate 94*0Sstevel@tonic-gate #ifndef _ASM 95*0Sstevel@tonic-gate 96*0Sstevel@tonic-gate /* 97*0Sstevel@tonic-gate * Functions used in shm.c to call ISM. 98*0Sstevel@tonic-gate */ 99*0Sstevel@tonic-gate int sptcreate(size_t size, struct seg **sptseg, struct anon_map *amp, 100*0Sstevel@tonic-gate uint_t prot, uint_t flags, uint_t szc); 101*0Sstevel@tonic-gate void sptdestroy(struct as *, struct anon_map *); 102*0Sstevel@tonic-gate int segspt_shmattach(struct seg *, caddr_t *); 103*0Sstevel@tonic-gate 104*0Sstevel@tonic-gate #define isspt(sp) ((sp)->shm_sptinfo ? (sp)->shm_sptinfo->sptas : NULL) 105*0Sstevel@tonic-gate #define spt_locked(a) ((a) & SHM_SHARE_MMU) 106*0Sstevel@tonic-gate #define spt_pageable(a) ((a) & SHM_PAGEABLE) 107*0Sstevel@tonic-gate #define spt_invalid(a) (spt_locked((a)) && spt_pageable((a))) 108*0Sstevel@tonic-gate 109*0Sstevel@tonic-gate /* 110*0Sstevel@tonic-gate * This can be applied to a segment with seg->s_ops == &segspt_shmops 111*0Sstevel@tonic-gate * to determine the real size of the ISM segment. 112*0Sstevel@tonic-gate */ 113*0Sstevel@tonic-gate #define spt_realsize(seg) (((struct spt_data *)(((struct shm_data *)\ 114*0Sstevel@tonic-gate ((seg)->s_data))->shm_sptseg->s_data))->spt_realsize) 115*0Sstevel@tonic-gate 116*0Sstevel@tonic-gate /* 117*0Sstevel@tonic-gate * This can be applied to a segment with seg->s_ops == &segspt_ops 118*0Sstevel@tonic-gate * to determine the flags of the {D}ISM segment. 119*0Sstevel@tonic-gate */ 120*0Sstevel@tonic-gate #define spt_flags(seg) (((struct spt_data *)((seg)->s_data))->spt_flags) 121*0Sstevel@tonic-gate 122*0Sstevel@tonic-gate /* 123*0Sstevel@tonic-gate * For large page support 124*0Sstevel@tonic-gate */ 125*0Sstevel@tonic-gate extern int segvn_anypgsz; 126*0Sstevel@tonic-gate 127*0Sstevel@tonic-gate #endif 128*0Sstevel@tonic-gate 129*0Sstevel@tonic-gate /* 130*0Sstevel@tonic-gate * In a 64-bit address space, we'll try to put ISM segments between 131*0Sstevel@tonic-gate * PREDISM_BASE and PREDISM_BOUND. The HAT may use these constants to 132*0Sstevel@tonic-gate * predict that a VA is contained by an ISM segment, which may optimize 133*0Sstevel@tonic-gate * translation. The range must _only_ be treated as advisory; ISM segments 134*0Sstevel@tonic-gate * may fall outside of the range, and non-ISM segments may be contained 135*0Sstevel@tonic-gate * within the range. 136*0Sstevel@tonic-gate * In order to avoid collision between ISM/DISM addresses with e.g. 137*0Sstevel@tonic-gate * process heap addresses we will try to put ISM/DISM segments above 138*0Sstevel@tonic-gate * PREDISM_1T_BASESHIFT (1T). 139*0Sstevel@tonic-gate * The HAT is still expecting that any VA larger than PREDISM_BASESHIFT 140*0Sstevel@tonic-gate * may belong to ISM/DISM (so on tlb miss it will probe first for 4M 141*0Sstevel@tonic-gate * translation) 142*0Sstevel@tonic-gate */ 143*0Sstevel@tonic-gate #define PREDISM_BASESHIFT 33 144*0Sstevel@tonic-gate #define PREDISM_1T_BASESHIFT 40 145*0Sstevel@tonic-gate #define PREDISM_BASE ((uintptr_t)1 << PREDISM_BASESHIFT) 146*0Sstevel@tonic-gate #define PREDISM_1T_BASE ((uintptr_t)1 << PREDISM_1T_BASESHIFT) 147*0Sstevel@tonic-gate #define PREDISM_BOUND ((uintptr_t)1 << 63) 148*0Sstevel@tonic-gate 149*0Sstevel@tonic-gate #endif /* _KERNEL */ 150*0Sstevel@tonic-gate 151*0Sstevel@tonic-gate #ifdef __cplusplus 152*0Sstevel@tonic-gate } 153*0Sstevel@tonic-gate #endif 154*0Sstevel@tonic-gate 155*0Sstevel@tonic-gate #endif /* _VM_SEG_SPT_H */ 156