tte.h revision 84182
171579Sdeischen/*- 271579Sdeischen * Copyright (c) 1997 Berkeley Software Design, Inc. All rights reserved. 371579Sdeischen * 471579Sdeischen * Redistribution and use in source and binary forms, with or without 571579Sdeischen * modification, are permitted provided that the following conditions 671579Sdeischen * are met: 771579Sdeischen * 1. Redistributions of source code must retain the above copyright 871579Sdeischen * notice, this list of conditions and the following disclaimer. 971579Sdeischen * 2. Redistributions in binary form must reproduce the above copyright 1071579Sdeischen * notice, this list of conditions and the following disclaimer in the 1171579Sdeischen * documentation and/or other materials provided with the distribution. 1271579Sdeischen * 3. Berkeley Software Design Inc's name may not be used to endorse or 1371579Sdeischen * promote products derived from this software without specific prior 1471579Sdeischen * written permission. 1571579Sdeischen * 1671579Sdeischen * THIS SOFTWARE IS PROVIDED BY BERKELEY SOFTWARE DESIGN INC ``AS IS'' AND 1771579Sdeischen * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1871579Sdeischen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1971579Sdeischen * ARE DISCLAIMED. IN NO EVENT SHALL BERKELEY SOFTWARE DESIGN INC BE LIABLE 2071579Sdeischen * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2171579Sdeischen * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2271579Sdeischen * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2371579Sdeischen * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2471579Sdeischen * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2571579Sdeischen * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2671579Sdeischen * SUCH DAMAGE. 2790039Sobrien * 2890039Sobrien * from: BSDI: pmap.v9.h,v 1.10.2.6 1999/08/23 22:18:44 cp Exp 2990039Sobrien * $FreeBSD: head/sys/sparc64/include/tte.h 84182 2001-09-30 18:55:05Z jake $ 3074462Salfred */ 3171579Sdeischen 32156319Sdeischen#ifndef _MACHINE_TTE_H_ 33227999Stheraven#define _MACHINE_TTE_H_ 3471579Sdeischen 35106866Sdeischen#include <machine/atomic.h> 36106288Sdfr 3771579Sdeischen#define TTE_SHIFT 4 3871579Sdeischen#define STTE_SHIFT 5 3971579Sdeischen 4071579Sdeischen#define TT_CTX_SHIFT (48) 4171579Sdeischen#define TT_VA_SHIFT (22) 4271579Sdeischen#define TT_VPN_SHIFT (9) 4371579Sdeischen 4471579Sdeischen#define TT_CTX_SIZE (13) 4571579Sdeischen#define TT_VA_SIZE (42) 4671579Sdeischen 4774462Salfred#define TT_CTX_MASK ((1L << TT_CTX_SIZE) - 1) 4872373Sdeischen#define TT_VA_MASK ((1L << TT_VA_SIZE) - 1) 4972373Sdeischen 5071579Sdeischen#define TT_G (1L << 63) 5172373Sdeischen#define TT_CTX(ctx) (((u_long)(ctx) & TT_CTX_MASK) << TT_CTX_SHIFT) 5272373Sdeischen#define TT_VA(va) ((u_long)(va) >> TT_VA_SHIFT) 53106866Sdeischen 54106866Sdeischen#define TD_SIZE_SHIFT (61) 55106866Sdeischen#define TD_SOFT2_SHIFT (50) 56106866Sdeischen#define TD_DIAG_SHIFT (41) 57227999Stheraven#define TD_PA_SHIFT (13) 58156319Sdeischen#define TD_SOFT_SHIFT (7) 59156319Sdeischen 6072373Sdeischen#define TD_SIZE_SIZE (2) 61106866Sdeischen#define TD_SOFT2_SIZE (9) 62106866Sdeischen#define TD_DIAG_SIZE (9) 6374462Salfred#define TD_PA_SIZE (28) 64106880Sdeischen#define TD_SOFT_SIZE (6) 65156319Sdeischen 66156319Sdeischen#define TD_SIZE_MASK (((1L << TD_SIZE_SIZE) - 1) << TD_SIZE_SHIFT) 67156319Sdeischen#define TD_SOFT2_MASK (((1L << TD_SOFT2_SIZE) - 1) << TD_SOFT2_SHIFT) 68156319Sdeischen#define TD_DIAG_MASK (((1L << TD_DIAG_SIZE) - 1) << TD_DIAG_SHIFT) 69156319Sdeischen#define TD_PA_MASK (((1L << TD_PA_SIZE) - 1) << TD_PA_SHIFT) 70156319Sdeischen#define TD_SOFT_MASK (((1L << TD_SOFT_SIZE) - 1) << TD_SOFT_SHIFT) 71156319Sdeischen 72156319Sdeischen#define TD_VA_LOW_SHIFT TD_SOFT2_SHIFT 73156319Sdeischen#define TD_VA_LOW_MASK TD_SOFT2_MASK 74156319Sdeischen 75156319Sdeischen#define TS_EXEC (1L << 4) 76156319Sdeischen#define TS_INIT (1L << 3) 77156319Sdeischen#define TS_MNG (1L << 2) 78156319Sdeischen#define TS_REF (1L << 1) 79156319Sdeischen#define TS_W (1L << 0) 80156319Sdeischen 81156319Sdeischen#define TD_V (1L << 63) 82156319Sdeischen#define TD_8K (0L << TD_SIZE_SHIFT) 83156319Sdeischen#define TD_64K (1L << TD_SIZE_SHIFT) 84156319Sdeischen#define TD_512K (2L << TD_SIZE_SHIFT) 85156319Sdeischen#define TD_4M (3L << TD_SIZE_SHIFT) 86156319Sdeischen#define TD_NFO (1L << 60) 87156319Sdeischen#define TD_IE (1L << 59) 88156319Sdeischen#define TD_VPN_LOW(vpn) ((vpn << TD_SOFT2_SHIFT) & TD_SOFT2_MASK) 89156319Sdeischen#define TD_VA_LOW(va) (TD_VPN_LOW((va) >> PAGE_SHIFT)) 90156319Sdeischen#define TD_PA(pa) ((pa) & TD_PA_MASK) 91156319Sdeischen#define TD_EXEC (TS_EXEC << TD_SOFT_SHIFT) 92156319Sdeischen#define TD_INIT (TS_INIT << TD_SOFT_SHIFT) 93156319Sdeischen#define TD_MNG (TS_MNG << TD_SOFT_SHIFT) 94156319Sdeischen#define TD_REF (TS_REF << TD_SOFT_SHIFT) 95156319Sdeischen#define TD_SW (TS_W << TD_SOFT_SHIFT) 96156319Sdeischen#define TD_L (1L << 6) 97156319Sdeischen#define TD_CP (1L << 5) 98227999Stheraven#define TD_CV (1L << 4) 99156319Sdeischen#define TD_E (1L << 3) 100156319Sdeischen#define TD_P (1L << 2) 101156319Sdeischen#define TD_W (1L << 1) 102156319Sdeischen#define TD_G (1L << 0) 103156319Sdeischen 104156319Sdeischen#define TT_GET_CTX(tag) (((tag) >> TT_CTX_SHIFT) & TT_CTX_MASK) 105156319Sdeischen 106156319Sdeischenstruct tte { 107156319Sdeischen u_long tte_tag; 108156319Sdeischen u_long tte_data; 109156319Sdeischen}; 110227999Stheraven 111156319Sdeischenstruct stte { 112156319Sdeischen struct tte st_tte; 113156319Sdeischen vm_offset_t st_next; 114156319Sdeischen vm_offset_t st_prev; 115156319Sdeischen}; 116156319Sdeischen 117156319Sdeischenstatic __inline vm_offset_t 118156319Sdeischentte_get_vpn(struct tte tte) 119156319Sdeischen{ 120156319Sdeischen return (((tte.tte_tag & TT_VA_MASK) << TT_VPN_SHIFT) | 121156319Sdeischen ((tte.tte_data & TD_VA_LOW_MASK) >> TD_VA_LOW_SHIFT)); 122156319Sdeischen} 123156319Sdeischen 124201546Sdavidxustatic __inline vm_offset_t 125201546Sdavidxutte_get_va(struct tte tte) 126213153Sdavidxu{ 127213153Sdavidxu return (tte_get_vpn(tte) << PAGE_SHIFT); 128106866Sdeischen} 129106288Sdfr 130106866Sdeischenstatic __inline void 131106866Sdeischentte_invalidate(struct tte *tp) 132106866Sdeischen{ 133106866Sdeischen atomic_clear_long(&tp->tte_data, TD_V); 13474462Salfred} 135106866Sdeischen 136106866Sdeischenstatic __inline int 137106866Sdeischentte_match(struct tte tte, vm_offset_t va) 138103576Salfred{ 139106866Sdeischen return ((tte.tte_data & TD_V) != 0 && 140152333Sdeischen ((tte.tte_tag ^ TT_VA(va)) & TT_VA_MASK) == 0 && 141152333Sdeischen ((tte.tte_data ^ TD_VA_LOW(va)) & TD_VA_LOW_MASK) == 0); 142106866Sdeischen} 143106866Sdeischen 144106866Sdeischen#endif /* !_MACHINE_TTE_H_ */ 145106866Sdeischen