tte.h revision 80709
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 80709 2001-07-31 06:05:05Z 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)
5180709Sjake#define	TT_CTX(ctx)	(((u_long)(ctx) << TT_CTX_SHIFT) & TT_CTX_MASK)
5280709Sjake#define	TT_VA(va)	(((u_long)(va) >> TT_VA_SHIFT) & TT_VA_MASK)
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
7580709Sjake#define	TS_EXEC		(1L << 3)
7680709Sjake#define	TS_MOD		(1L << 2)
7780709Sjake#define	TS_REF		(1L << 1)
7880709Sjake#define	TS_TSB		(1L << 0)
7980709Sjake
8080709Sjake#define	TD_V		(1L << 63)
8180709Sjake#define	TD_8K		(0L << TD_SIZE_SHIFT)
8280709Sjake#define	TD_64K		(1L << TD_SIZE_SHIFT)
8380709Sjake#define	TD_512K		(2L << TD_SIZE_SHIFT)
8480709Sjake#define	TD_4M		(3L << TD_SIZE_SHIFT)
8580709Sjake#define	TD_NFO		(1L << 60)
8680709Sjake#define	TD_IE		(1L << 59)
8780709Sjake#define	TD_VPN_LOW(vpn)	((vpn << TD_SOFT2_SHIFT) & TD_SOFT2_MASK)
8880709Sjake#define	TD_VA_LOW(va)	(TD_VPN_LOW((va) >> PAGE_SHIFT))
8980709Sjake#define	TD_PA(pa)	((pa) & TD_PA_MASK)
9080709Sjake#define	TD_EXEC		(TS_EXEC << TD_SOFT_SHIFT)
9180709Sjake#define	TD_MOD		(TS_MOD << TD_SOFT_SHIFT)
9280709Sjake#define	TD_REF		(TS_REF << TD_SOFT_SHIFT)
9380709Sjake#define	TD_TSB		(TS_TSB << TD_SOFT_SHIFT)
9480709Sjake#define	TD_L		(1L << 6)
9580709Sjake#define	TD_CP		(1L << 5)
9680709Sjake#define	TD_CV		(1L << 4)
9780709Sjake#define	TD_E		(1L << 3)
9880709Sjake#define	TD_P		(1L << 2)
9980709Sjake#define	TD_W		(1L << 1)
10080709Sjake#define	TD_G		(1L << 0)
10180709Sjake
10280709Sjakestruct	tte {
10380709Sjake	u_long	tte_tag;
10480709Sjake	u_long	tte_data;
10580709Sjake};
10680709Sjake
10780709Sjakestruct	stte {
10880709Sjake	struct	tte st_tte;
10980709Sjake	vm_offset_t st_next;
11080709Sjake	vm_offset_t st_prev;
11180709Sjake};
11280709Sjake
11380709Sjakestatic __inline u_int
11480709Sjakette_get_ctx(struct tte tte)
11580709Sjake{
11680709Sjake	return ((tte.tte_tag & TT_CTX_MASK) >> TT_CTX_SHIFT);
11780709Sjake}
11880709Sjake
11980709Sjakestatic __inline vm_offset_t
12080709Sjakette_get_vpn(struct tte tte)
12180709Sjake{
12280709Sjake	return (((tte.tte_tag & TT_VA_MASK) << TT_VPN_SHIFT) |
12380709Sjake	    ((tte.tte_data & TD_VA_LOW_MASK) >> TD_VA_LOW_SHIFT));
12480709Sjake}
12580709Sjake
12680709Sjakestatic __inline vm_offset_t
12780709Sjakette_get_va(struct tte tte)
12880709Sjake{
12980709Sjake	return (tte_get_vpn(tte) << PAGE_SHIFT);
13080709Sjake}
13180709Sjake
13280709Sjakestatic __inline void
13380709Sjakette_invalidate(struct tte *tp)
13480709Sjake{
13580709Sjake	atomic_clear_long(&tp->tte_data, TD_V);
13680709Sjake}
13780709Sjake
13880709Sjakestatic __inline int
13980709Sjakette_match(struct tte tte, vm_offset_t va)
14080709Sjake{
14180709Sjake	return ((tte.tte_data & TD_V) != 0 &&
14280709Sjake	    ((tte.tte_tag ^ TT_VA(va)) & TT_VA_MASK) == 0 &&
14380709Sjake	    ((tte.tte_data ^ TD_VA_LOW(va)) & TD_VA_LOW_MASK) == 0);
14480709Sjake}
14580709Sjake
14680709Sjake#endif /* !_MACHINE_TTE_H_ */
147