tte.h revision 97446
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 97446 2002-05-29 05:56:05Z 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 5597027Sjake#define TD_SIZE_SPREAD (3) 5697027Sjake 5788652Sjake#define TS_EXEC (1UL << 4) 5888652Sjake#define TS_REF (1UL << 3) 5988652Sjake#define TS_PV (1UL << 2) 6088652Sjake#define TS_W (1UL << 1) 6188652Sjake#define TS_WIRED (1UL << 0) 6280709Sjake 6388652Sjake#define TD_V (1UL << 63) 6488652Sjake#define TD_8K (0UL << TD_SIZE_SHIFT) 6588652Sjake#define TD_64K (1UL << TD_SIZE_SHIFT) 6688652Sjake#define TD_512K (2UL << TD_SIZE_SHIFT) 6788652Sjake#define TD_4M (3UL << 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)) 7180709Sjake#define TD_EXEC (TS_EXEC << TD_SOFT_SHIFT) 7280709Sjake#define TD_REF (TS_REF << TD_SOFT_SHIFT) 7388652Sjake#define TD_PV (TS_PV << TD_SOFT_SHIFT) 7482903Sjake#define TD_SW (TS_W << TD_SOFT_SHIFT) 7588652Sjake#define TD_WIRED (TS_WIRED << 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 8491224Sjake#define TV_VPN(va) ((va) >> PAGE_SHIFT) 8591224Sjake 8697027Sjake#define TTE_GET_SIZE(tp) \ 8797027Sjake (((tp)->tte_data >> TD_SIZE_SHIFT) & TD_SIZE_MASK) 8897027Sjake#define TTE_GET_PAGE_SHIFT(tp) \ 8997027Sjake (PAGE_SHIFT + (TTE_GET_SIZE(tp) * TD_SIZE_SPREAD)) 9097027Sjake#define TTE_GET_PAGE_SIZE(tp) \ 9197027Sjake (1 << TTE_GET_PAGE_SHIFT(tp)) 9297027Sjake#define TTE_GET_PAGE_MASK(tp) \ 9397027Sjake (TTE_GET_PAGE_SIZE(tp) - 1) 9484182Sjake 9597027Sjake#define TTE_GET_PA(tp) \ 9697027Sjake ((tp)->tte_data & (TD_PA_MASK << TD_PA_SHIFT)) 9797027Sjake#define TTE_GET_TLB(tp) \ 9897027Sjake (((tp)->tte_data & TD_EXEC) ? (TLB_DTLB | TLB_ITLB) : TLB_DTLB) 9997027Sjake#define TTE_GET_VA(tp) \ 10097027Sjake ((tp)->tte_vpn << PAGE_SHIFT) 10197446Sjake#define TTE_GET_PMAP(tp) \ 10297446Sjake ((tp)->tte_pmap) 10397446Sjake#define TTE_ZERO(tp) \ 10497446Sjake bzero(tp, sizeof(*tp)) 10597027Sjake 10683053Sobrienstruct tte { 10791224Sjake u_long tte_vpn; 10880709Sjake u_long tte_data; 10997446Sjake STAILQ_ENTRY(tte) tte_link; 11097446Sjake struct pmap *tte_pmap; 11180709Sjake}; 11280709Sjake 11391224Sjakestatic __inline int 11497027Sjakette_match_vpn(struct tte *tp, vm_offset_t vpn) 11580709Sjake{ 11697027Sjake return ((tp->tte_data & TD_V) != 0 && tp->tte_vpn == vpn); 11780709Sjake} 11880709Sjake 11980709Sjakestatic __inline int 12097027Sjakette_match(struct tte *tp, vm_offset_t va) 12180709Sjake{ 12297027Sjake return (tte_match_vpn(tp, va >> PAGE_SHIFT)); 12380709Sjake} 12480709Sjake 12580709Sjake#endif /* !_MACHINE_TTE_H_ */ 126