tte.h revision 81178
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 81178 2001-08-06 02:24:18Z jake $ 3080709Sjake */ 3180709Sjake 3280709Sjake#ifndef _MACHINE_TTE_H_ 3380709Sjake#define _MACHINE_TTE_H_ 3480709Sjake 3580709Sjake#include <machine/atomic.h> 3680709Sjake 3780709Sjake#define TTE_SHIFT 4 3880709Sjake#define STTE_SHIFT 5 3980709Sjake 4080709Sjake#define TT_CTX_SHIFT (48) 4180709Sjake#define TT_VA_SHIFT (22) 4280709Sjake#define TT_VPN_SHIFT (9) 4380709Sjake 4480709Sjake#define TT_CTX_SIZE (13) 4580709Sjake#define TT_VA_SIZE (42) 4680709Sjake 4780709Sjake#define TT_CTX_MASK ((1L << TT_CTX_SIZE) - 1) 4880709Sjake#define TT_VA_MASK ((1L << TT_VA_SIZE) - 1) 4980709Sjake 5080709Sjake#define TT_G (1L << 63) 5181178Sjake#define TT_CTX(ctx) (((u_long)(ctx) & TT_CTX_MASK) << TT_CTX_SHIFT) 5281178Sjake#define TT_VA(va) ((u_long)(va) >> TT_VA_SHIFT) 5380709Sjake 5480709Sjake#define TD_SIZE_SHIFT (61) 5580709Sjake#define TD_SOFT2_SHIFT (50) 5680709Sjake#define TD_DIAG_SHIFT (41) 5780709Sjake#define TD_PA_SHIFT (13) 5880709Sjake#define TD_SOFT_SHIFT (7) 5980709Sjake 6080709Sjake#define TD_SIZE_SIZE (2) 6180709Sjake#define TD_SOFT2_SIZE (9) 6280709Sjake#define TD_DIAG_SIZE (9) 6380709Sjake#define TD_PA_SIZE (28) 6480709Sjake#define TD_SOFT_SIZE (6) 6580709Sjake 6680709Sjake#define TD_SIZE_MASK (((1L << TD_SIZE_SIZE) - 1) << TD_SIZE_SHIFT) 6780709Sjake#define TD_SOFT2_MASK (((1L << TD_SOFT2_SIZE) - 1) << TD_SOFT2_SHIFT) 6880709Sjake#define TD_DIAG_MASK (((1L << TD_DIAG_SIZE) - 1) << TD_DIAG_SHIFT) 6980709Sjake#define TD_PA_MASK (((1L << TD_PA_SIZE) - 1) << TD_PA_SHIFT) 7080709Sjake#define TD_SOFT_MASK (((1L << TD_SOFT_SIZE) - 1) << TD_SOFT_SHIFT) 7180709Sjake 7280709Sjake#define TD_VA_LOW_SHIFT TD_SOFT2_SHIFT 7380709Sjake#define TD_VA_LOW_MASK TD_SOFT2_MASK 7480709Sjake 7581178Sjake#define TS_EXEC (1L << 5) 7681178Sjake#define TS_INIT (1L << 4) 7781178Sjake#define TS_MNG (1L << 3) 7880709Sjake#define TS_MOD (1L << 2) 7980709Sjake#define TS_REF (1L << 1) 8080709Sjake#define TS_TSB (1L << 0) 8180709Sjake 8280709Sjake#define TD_V (1L << 63) 8380709Sjake#define TD_8K (0L << TD_SIZE_SHIFT) 8480709Sjake#define TD_64K (1L << TD_SIZE_SHIFT) 8580709Sjake#define TD_512K (2L << TD_SIZE_SHIFT) 8680709Sjake#define TD_4M (3L << TD_SIZE_SHIFT) 8780709Sjake#define TD_NFO (1L << 60) 8880709Sjake#define TD_IE (1L << 59) 8980709Sjake#define TD_VPN_LOW(vpn) ((vpn << TD_SOFT2_SHIFT) & TD_SOFT2_MASK) 9080709Sjake#define TD_VA_LOW(va) (TD_VPN_LOW((va) >> PAGE_SHIFT)) 9180709Sjake#define TD_PA(pa) ((pa) & TD_PA_MASK) 9280709Sjake#define TD_EXEC (TS_EXEC << TD_SOFT_SHIFT) 9381178Sjake#define TD_INIT (TS_INIT << TD_SOFT_SHIFT) 9481178Sjake#define TD_MNG (TS_MNG << TD_SOFT_SHIFT) 9580709Sjake#define TD_MOD (TS_MOD << TD_SOFT_SHIFT) 9680709Sjake#define TD_REF (TS_REF << TD_SOFT_SHIFT) 9780709Sjake#define TD_TSB (TS_TSB << TD_SOFT_SHIFT) 9880709Sjake#define TD_L (1L << 6) 9980709Sjake#define TD_CP (1L << 5) 10080709Sjake#define TD_CV (1L << 4) 10180709Sjake#define TD_E (1L << 3) 10280709Sjake#define TD_P (1L << 2) 10380709Sjake#define TD_W (1L << 1) 10480709Sjake#define TD_G (1L << 0) 10580709Sjake 10680709Sjakestruct tte { 10780709Sjake u_long tte_tag; 10880709Sjake u_long tte_data; 10980709Sjake}; 11080709Sjake 11180709Sjakestruct stte { 11280709Sjake struct tte st_tte; 11380709Sjake vm_offset_t st_next; 11480709Sjake vm_offset_t st_prev; 11580709Sjake}; 11680709Sjake 11780709Sjakestatic __inline u_int 11880709Sjakette_get_ctx(struct tte tte) 11980709Sjake{ 12081178Sjake return ((tte.tte_tag >> TT_CTX_SHIFT) & TT_CTX_MASK); 12180709Sjake} 12280709Sjake 12380709Sjakestatic __inline vm_offset_t 12480709Sjakette_get_vpn(struct tte tte) 12580709Sjake{ 12680709Sjake return (((tte.tte_tag & TT_VA_MASK) << TT_VPN_SHIFT) | 12780709Sjake ((tte.tte_data & TD_VA_LOW_MASK) >> TD_VA_LOW_SHIFT)); 12880709Sjake} 12980709Sjake 13080709Sjakestatic __inline vm_offset_t 13180709Sjakette_get_va(struct tte tte) 13280709Sjake{ 13380709Sjake return (tte_get_vpn(tte) << PAGE_SHIFT); 13480709Sjake} 13580709Sjake 13680709Sjakestatic __inline void 13780709Sjakette_invalidate(struct tte *tp) 13880709Sjake{ 13980709Sjake atomic_clear_long(&tp->tte_data, TD_V); 14080709Sjake} 14180709Sjake 14280709Sjakestatic __inline int 14380709Sjakette_match(struct tte tte, vm_offset_t va) 14480709Sjake{ 14580709Sjake return ((tte.tte_data & TD_V) != 0 && 14680709Sjake ((tte.tte_tag ^ TT_VA(va)) & TT_VA_MASK) == 0 && 14780709Sjake ((tte.tte_data ^ TD_VA_LOW(va)) & TD_VA_LOW_MASK) == 0); 14880709Sjake} 14980709Sjake 15080709Sjake#endif /* !_MACHINE_TTE_H_ */ 151