180709Sjake/*- 280709Sjake * Copyright (c) 1997 Berkeley Software Design, Inc. All rights reserved. 380709Sjake * 480709Sjake * Redistribution and use in source and binary forms, with or without 580709Sjake * modification, are permitted provided that the following conditions 680709Sjake * are met: 780709Sjake * 1. Redistributions of source code must retain the above copyright 880709Sjake * notice, this list of conditions and the following disclaimer. 980709Sjake * 2. Redistributions in binary form must reproduce the above copyright 1080709Sjake * notice, this list of conditions and the following disclaimer in the 1180709Sjake * documentation and/or other materials provided with the distribution. 1280709Sjake * 3. Berkeley Software Design Inc's name may not be used to endorse or 1380709Sjake * promote products derived from this software without specific prior 1480709Sjake * written permission. 1580709Sjake * 1680709Sjake * THIS SOFTWARE IS PROVIDED BY BERKELEY SOFTWARE DESIGN INC ``AS IS'' AND 1780709Sjake * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1880709Sjake * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1980709Sjake * ARE DISCLAIMED. IN NO EVENT SHALL BERKELEY SOFTWARE DESIGN INC BE LIABLE 2080709Sjake * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2180709Sjake * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2280709Sjake * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2380709Sjake * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2480709Sjake * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2580709Sjake * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2680709Sjake * SUCH DAMAGE. 2780709Sjake * 2880709Sjake * from: BSDI: pmap.v9.h,v 1.10.2.6 1999/08/23 22:18:44 cp Exp 2980709Sjake * $FreeBSD$ 3080709Sjake */ 3180709Sjake 3280709Sjake#ifndef _MACHINE_TTE_H_ 3380709Sjake#define _MACHINE_TTE_H_ 3480709Sjake 3597446Sjake#define TTE_SHIFT (5) 3680709Sjake 3780709Sjake#define TD_SIZE_SHIFT (61) 3880709Sjake#define TD_SOFT2_SHIFT (50) 39205258Smarius#define TD_RSVD2_SHIFT (49) 40205258Smarius#define TD_SIZE2_SHIFT (48) 41182767Smarius#define TD_DIAG_SF_SHIFT (41) 42182767Smarius#define TD_RSVD_CH_SHIFT (43) 43205258Smarius#define TD_RSVD_OC_SHIFT (47) 44205258Smarius#define TD_RSVD_PT_SHIFT TD_RSVD_CH_SHIFT 45205258Smarius#define TD_RSVD_VE_SHIFT (41) 4680709Sjake#define TD_PA_SHIFT (13) 4780709Sjake#define TD_SOFT_SHIFT (7) 4880709Sjake 4997027Sjake#define TD_SIZE_BITS (2) 5097027Sjake#define TD_SOFT2_BITS (9) 51205258Smarius#define TD_RSVD2_BITS (1) /* US-IV+, SPARC64 VI, VII, VIIIfx */ 52205258Smarius#define TD_SIZE2_BITS (1) /* US-IV+, SPARC64 VI, VII, VIIIfx */ 53205258Smarius#define TD_DIAG_SF_BITS (9) /* US-I, II{,e,i} */ 54205258Smarius#define TD_RSVD_CH_BITS (7) /* US-III{,i,+}, US-IV, SPARC64 V */ 55205258Smarius#define TD_RSVD_OC_BITS (1) /* SPARC64 VI, VII */ 56205258Smarius#define TD_RSVD_PT_BITS (5) /* US-IV+, SPARC64 VI, VII */ 57205258Smarius#define TD_RSVD_VE_BITS (7) /* SPARC64 VIIIfx */ 58205258Smarius#define TD_PA_CH_BITS (30) /* US-III{,i,+}, US-IV{,+}, SPARC64 V */ 59205258Smarius#define TD_PA_OC_BITS (34) /* SPARC64 VI, VII */ 60205258Smarius#define TD_PA_SF_BITS (28) /* US-I, II{,e,i}, SPARC64 VIIIfx */ 61182767Smarius#define TD_PA_BITS TD_PA_CH_BITS 6297027Sjake#define TD_SOFT_BITS (6) 6380709Sjake 6497027Sjake#define TD_SIZE_MASK ((1UL << TD_SIZE_BITS) - 1) 6597027Sjake#define TD_SOFT2_MASK ((1UL << TD_SOFT2_BITS) - 1) 66205258Smarius#define TD_RSVD2_MASK ((1UL << TD_RSVD2_BITS) - 1) 67205258Smarius#define TD_SIZE2_MASK ((1UL << TD_SIZE2_BITS) - 1) 68182767Smarius#define TD_DIAG_SF_MASK ((1UL << TD_DIAG_SF_BITS) - 1) 69182767Smarius#define TD_RSVD_CH_MASK ((1UL << TD_RSVD_CH_BITS) - 1) 70205258Smarius#define TD_RSVD_OC_MASK ((1UL << TD_RSVD_OC_BITS) - 1) 71205258Smarius#define TD_RSVD_PT_MASK ((1UL << TD_RSVD_PT_BITS) - 1) 72205258Smarius#define TD_RSVD_VE_MASK ((1UL << TD_RSVD_VE_BITS) - 1) 73181398Smarius#define TD_PA_CH_MASK ((1UL << TD_PA_CH_BITS) - 1) 74205258Smarius#define TD_PA_OC_MASK ((1UL << TD_PA_OC_BITS) - 1) 75181398Smarius#define TD_PA_SF_MASK ((1UL << TD_PA_SF_BITS) - 1) 7697027Sjake#define TD_PA_MASK ((1UL << TD_PA_BITS) - 1) 7797027Sjake#define TD_SOFT_MASK ((1UL << TD_SOFT_BITS) - 1) 7880709Sjake 79102040Sjake#define TS_8K (0UL) 80102040Sjake#define TS_64K (1UL) 81102040Sjake#define TS_512K (2UL) 82102040Sjake#define TS_4M (3UL) 83205258Smarius#define TS_32M (4UL) /* US-IV+, SPARC64 VI, VII only */ 84205258Smarius#define TS_256M (5UL) /* US-IV+, SPARC64 VI, VII only */ 85205258Smarius#define TS_2G (6UL) /* SPARC64 VIIIfx only */ 8697027Sjake 87102040Sjake#define TS_MIN TS_8K 88102040Sjake#define TS_MAX TS_4M 8980709Sjake 9088652Sjake#define TD_V (1UL << 63) 91102040Sjake#define TD_8K (TS_8K << TD_SIZE_SHIFT) 92102040Sjake#define TD_64K (TS_64K << TD_SIZE_SHIFT) 93102040Sjake#define TD_512K (TS_512K << TD_SIZE_SHIFT) 94102040Sjake#define TD_4M (TS_4M << TD_SIZE_SHIFT) 95205258Smarius#define TD_32M \ 96205258Smarius (((TS_32M & TD_SIZE_MASK) << TD_SIZE_SHIFT) | \ 97205258Smarius (TD_SIZE2_MASK << TD_SIZE2_SHIFT)) 98205258Smarius#define TD_256M \ 99205258Smarius (((TS_256M & TD_SIZE_MASK) << TD_SIZE_SHIFT) | \ 100205258Smarius (TD_SIZE2_MASK << TD_SIZE2_SHIFT)) 101205258Smarius#define TD_2G \ 102205258Smarius (((TS_2G & TD_SIZE_MASK) << TD_SIZE_SHIFT) | \ 103205258Smarius (TD_SIZE2_MASK << TD_SIZE2_SHIFT)) 10488652Sjake#define TD_NFO (1UL << 60) 10588652Sjake#define TD_IE (1UL << 59) 10697027Sjake#define TD_PA(pa) ((pa) & (TD_PA_MASK << TD_PA_SHIFT)) 107112697Sjake/* NOTE: bit 6 of TD_SOFT will be sign-extended if used as an immediate. */ 108112697Sjake#define TD_FAKE ((1UL << 5) << TD_SOFT_SHIFT) 109102040Sjake#define TD_EXEC ((1UL << 4) << TD_SOFT_SHIFT) 110102040Sjake#define TD_REF ((1UL << 3) << TD_SOFT_SHIFT) 111102040Sjake#define TD_PV ((1UL << 2) << TD_SOFT_SHIFT) 112102040Sjake#define TD_SW ((1UL << 1) << TD_SOFT_SHIFT) 113102040Sjake#define TD_WIRED ((1UL << 0) << TD_SOFT_SHIFT) 11488652Sjake#define TD_L (1UL << 6) 11588652Sjake#define TD_CP (1UL << 5) 11688652Sjake#define TD_CV (1UL << 4) 11788652Sjake#define TD_E (1UL << 3) 11888652Sjake#define TD_P (1UL << 2) 11988652Sjake#define TD_W (1UL << 1) 12088652Sjake#define TD_G (1UL << 0) 12180709Sjake 122102040Sjake#define TV_SIZE_BITS (TD_SIZE_BITS) 123102040Sjake#define TV_VPN(va, sz) ((((va) >> TTE_PAGE_SHIFT(sz)) << TV_SIZE_BITS) | sz) 12491224Sjake 125102040Sjake#define TTE_SIZE_SPREAD (3) 126205258Smarius#define TTE_PAGE_SHIFT(sz) \ 127102040Sjake (PAGE_SHIFT + ((sz) * TTE_SIZE_SPREAD)) 128102040Sjake 129205258Smarius#define TTE_GET_SIZE(tp) \ 13097027Sjake (((tp)->tte_data >> TD_SIZE_SHIFT) & TD_SIZE_MASK) 131205258Smarius#define TTE_GET_PAGE_SHIFT(tp) \ 132102040Sjake TTE_PAGE_SHIFT(TTE_GET_SIZE(tp)) 133205258Smarius#define TTE_GET_PAGE_SIZE(tp) \ 13497027Sjake (1 << TTE_GET_PAGE_SHIFT(tp)) 135205258Smarius#define TTE_GET_PAGE_MASK(tp) \ 13697027Sjake (TTE_GET_PAGE_SIZE(tp) - 1) 13784182Sjake 138205258Smarius#define TTE_GET_PA(tp) \ 13997027Sjake ((tp)->tte_data & (TD_PA_MASK << TD_PA_SHIFT)) 140205258Smarius#define TTE_GET_VPN(tp) \ 141102040Sjake ((tp)->tte_vpn >> TV_SIZE_BITS) 142205258Smarius#define TTE_GET_VA(tp) \ 143102040Sjake (TTE_GET_VPN(tp) << TTE_GET_PAGE_SHIFT(tp)) 144205258Smarius#define TTE_GET_PMAP(tp) \ 145205258Smarius (((tp)->tte_data & TD_P) != 0 ? (kernel_pmap) : \ 146205258Smarius (PHYS_TO_VM_PAGE(pmap_kextract((vm_offset_t)(tp)))->md.pmap)) 147205258Smarius#define TTE_ZERO(tp) \ 148108386Sjake memset(tp, 0, sizeof(*tp)) 14997027Sjake 150102040Sjakestruct pmap; 151102040Sjake 15283053Sobrienstruct tte { 15391224Sjake u_long tte_vpn; 15480709Sjake u_long tte_data; 155108166Sjake TAILQ_ENTRY(tte) tte_link; 15680709Sjake}; 15780709Sjake 15891224Sjakestatic __inline int 15997027Sjakette_match(struct tte *tp, vm_offset_t va) 16080709Sjake{ 161205258Smarius 162102040Sjake return (((tp->tte_data & TD_V) != 0) && 163102040Sjake (tp->tte_vpn == TV_VPN(va, TTE_GET_SIZE(tp)))); 16480709Sjake} 16580709Sjake 16680709Sjake#endif /* !_MACHINE_TTE_H_ */ 167