tte.h revision 108166
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: head/sys/sparc64/include/tte.h 108166 2002-12-21 22:43:19Z jake $ 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) 3980709Sjake#define TD_DIAG_SHIFT (41) 4080709Sjake#define TD_PA_SHIFT (13) 4180709Sjake#define TD_SOFT_SHIFT (7) 4280709Sjake 4397027Sjake#define TD_SIZE_BITS (2) 4497027Sjake#define TD_SOFT2_BITS (9) 4597027Sjake#define TD_DIAG_BITS (9) 4697027Sjake#define TD_PA_BITS (28) 4797027Sjake#define TD_SOFT_BITS (6) 4880709Sjake 4997027Sjake#define TD_SIZE_MASK ((1UL << TD_SIZE_BITS) - 1) 5097027Sjake#define TD_SOFT2_MASK ((1UL << TD_SOFT2_BITS) - 1) 5197027Sjake#define TD_DIAG_MASK ((1UL << TD_DIAG_BITS) - 1) 5297027Sjake#define TD_PA_MASK ((1UL << TD_PA_BITS) - 1) 5397027Sjake#define TD_SOFT_MASK ((1UL << TD_SOFT_BITS) - 1) 5480709Sjake 55102040Sjake#define TS_8K (0UL) 56102040Sjake#define TS_64K (1UL) 57102040Sjake#define TS_512K (2UL) 58102040Sjake#define TS_4M (3UL) 5997027Sjake 60102040Sjake#define TS_MIN TS_8K 61102040Sjake#define TS_MAX TS_4M 6280709Sjake 6388652Sjake#define TD_V (1UL << 63) 64102040Sjake#define TD_8K (TS_8K << TD_SIZE_SHIFT) 65102040Sjake#define TD_64K (TS_64K << TD_SIZE_SHIFT) 66102040Sjake#define TD_512K (TS_512K << TD_SIZE_SHIFT) 67102040Sjake#define TD_4M (TS_4M << TD_SIZE_SHIFT) 6888652Sjake#define TD_NFO (1UL << 60) 6988652Sjake#define TD_IE (1UL << 59) 7097027Sjake#define TD_PA(pa) ((pa) & (TD_PA_MASK << TD_PA_SHIFT)) 71102040Sjake#define TD_EXEC ((1UL << 4) << TD_SOFT_SHIFT) 72102040Sjake#define TD_REF ((1UL << 3) << TD_SOFT_SHIFT) 73102040Sjake#define TD_PV ((1UL << 2) << TD_SOFT_SHIFT) 74102040Sjake#define TD_SW ((1UL << 1) << TD_SOFT_SHIFT) 75102040Sjake#define TD_WIRED ((1UL << 0) << TD_SOFT_SHIFT) 7688652Sjake#define TD_L (1UL << 6) 7788652Sjake#define TD_CP (1UL << 5) 7888652Sjake#define TD_CV (1UL << 4) 7988652Sjake#define TD_E (1UL << 3) 8088652Sjake#define TD_P (1UL << 2) 8188652Sjake#define TD_W (1UL << 1) 8288652Sjake#define TD_G (1UL << 0) 8380709Sjake 84102040Sjake#define TV_SIZE_BITS (TD_SIZE_BITS) 85102040Sjake#define TV_VPN(va, sz) ((((va) >> TTE_PAGE_SHIFT(sz)) << TV_SIZE_BITS) | sz) 8691224Sjake 87102040Sjake#define TTE_SIZE_SPREAD (3) 88102040Sjake#define TTE_PAGE_SHIFT(sz) \ 89102040Sjake (PAGE_SHIFT + ((sz) * TTE_SIZE_SPREAD)) 90102040Sjake 9197027Sjake#define TTE_GET_SIZE(tp) \ 9297027Sjake (((tp)->tte_data >> TD_SIZE_SHIFT) & TD_SIZE_MASK) 9397027Sjake#define TTE_GET_PAGE_SHIFT(tp) \ 94102040Sjake TTE_PAGE_SHIFT(TTE_GET_SIZE(tp)) 9597027Sjake#define TTE_GET_PAGE_SIZE(tp) \ 9697027Sjake (1 << TTE_GET_PAGE_SHIFT(tp)) 9797027Sjake#define TTE_GET_PAGE_MASK(tp) \ 9897027Sjake (TTE_GET_PAGE_SIZE(tp) - 1) 9984182Sjake 10097027Sjake#define TTE_GET_PA(tp) \ 10197027Sjake ((tp)->tte_data & (TD_PA_MASK << TD_PA_SHIFT)) 102102040Sjake#define TTE_GET_VPN(tp) \ 103102040Sjake ((tp)->tte_vpn >> TV_SIZE_BITS) 10497027Sjake#define TTE_GET_VA(tp) \ 105102040Sjake (TTE_GET_VPN(tp) << TTE_GET_PAGE_SHIFT(tp)) 10697446Sjake#define TTE_GET_PMAP(tp) \ 107108166Sjake (((tp)->tte_data & TD_P) != 0 ? \ 108108166Sjake (kernel_pmap) : \ 109108166Sjake (PHYS_TO_VM_PAGE(pmap_kextract((vm_offset_t)(tp)))->md.pmap)) 11097446Sjake#define TTE_ZERO(tp) \ 111108166Sjake __builtin_memset(tp, 0, sizeof(*tp)) 11297027Sjake 113102040Sjakestruct pmap; 114102040Sjake 11583053Sobrienstruct tte { 11691224Sjake u_long tte_vpn; 11780709Sjake u_long tte_data; 118108166Sjake TAILQ_ENTRY(tte) tte_link; 11980709Sjake}; 12080709Sjake 12191224Sjakestatic __inline int 12297027Sjakette_match(struct tte *tp, vm_offset_t va) 12380709Sjake{ 124102040Sjake return (((tp->tte_data & TD_V) != 0) && 125102040Sjake (tp->tte_vpn == TV_VPN(va, TTE_GET_SIZE(tp)))); 12680709Sjake} 12780709Sjake 12880709Sjake#endif /* !_MACHINE_TTE_H_ */ 129