tte.h revision 82903
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 82903 2001-09-03 22:55:12Z 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
7582903Sjake#define	TS_EXEC		(1L << 4)
7682903Sjake#define	TS_INIT		(1L << 3)
7782903Sjake#define	TS_MNG		(1L << 2)
7880709Sjake#define	TS_REF		(1L << 1)
7982903Sjake#define	TS_W		(1L << 0)
8080709Sjake
8180709Sjake#define	TD_V		(1L << 63)
8280709Sjake#define	TD_8K		(0L << TD_SIZE_SHIFT)
8380709Sjake#define	TD_64K		(1L << TD_SIZE_SHIFT)
8480709Sjake#define	TD_512K		(2L << TD_SIZE_SHIFT)
8580709Sjake#define	TD_4M		(3L << TD_SIZE_SHIFT)
8680709Sjake#define	TD_NFO		(1L << 60)
8780709Sjake#define	TD_IE		(1L << 59)
8880709Sjake#define	TD_VPN_LOW(vpn)	((vpn << TD_SOFT2_SHIFT) & TD_SOFT2_MASK)
8980709Sjake#define	TD_VA_LOW(va)	(TD_VPN_LOW((va) >> PAGE_SHIFT))
9080709Sjake#define	TD_PA(pa)	((pa) & TD_PA_MASK)
9180709Sjake#define	TD_EXEC		(TS_EXEC << TD_SOFT_SHIFT)
9281178Sjake#define	TD_INIT		(TS_INIT << TD_SOFT_SHIFT)
9381178Sjake#define	TD_MNG		(TS_MNG << TD_SOFT_SHIFT)
9480709Sjake#define	TD_REF		(TS_REF << TD_SOFT_SHIFT)
9582903Sjake#define	TD_SW		(TS_W << TD_SOFT_SHIFT)
9680709Sjake#define	TD_L		(1L << 6)
9780709Sjake#define	TD_CP		(1L << 5)
9880709Sjake#define	TD_CV		(1L << 4)
9980709Sjake#define	TD_E		(1L << 3)
10080709Sjake#define	TD_P		(1L << 2)
10180709Sjake#define	TD_W		(1L << 1)
10280709Sjake#define	TD_G		(1L << 0)
10380709Sjake
10480709Sjakestruct	tte {
10580709Sjake	u_long	tte_tag;
10680709Sjake	u_long	tte_data;
10780709Sjake};
10880709Sjake
10980709Sjakestruct	stte {
11080709Sjake	struct	tte st_tte;
11180709Sjake	vm_offset_t st_next;
11280709Sjake	vm_offset_t st_prev;
11380709Sjake};
11480709Sjake
11580709Sjakestatic __inline u_int
11680709Sjakette_get_ctx(struct tte tte)
11780709Sjake{
11881178Sjake	return ((tte.tte_tag >> TT_CTX_SHIFT) & TT_CTX_MASK);
11980709Sjake}
12080709Sjake
12180709Sjakestatic __inline vm_offset_t
12280709Sjakette_get_vpn(struct tte tte)
12380709Sjake{
12480709Sjake	return (((tte.tte_tag & TT_VA_MASK) << TT_VPN_SHIFT) |
12580709Sjake	    ((tte.tte_data & TD_VA_LOW_MASK) >> TD_VA_LOW_SHIFT));
12680709Sjake}
12780709Sjake
12880709Sjakestatic __inline vm_offset_t
12980709Sjakette_get_va(struct tte tte)
13080709Sjake{
13180709Sjake	return (tte_get_vpn(tte) << PAGE_SHIFT);
13280709Sjake}
13380709Sjake
13480709Sjakestatic __inline void
13580709Sjakette_invalidate(struct tte *tp)
13680709Sjake{
13780709Sjake	atomic_clear_long(&tp->tte_data, TD_V);
13880709Sjake}
13980709Sjake
14080709Sjakestatic __inline int
14180709Sjakette_match(struct tte tte, vm_offset_t va)
14280709Sjake{
14380709Sjake	return ((tte.tte_data & TD_V) != 0 &&
14480709Sjake	    ((tte.tte_tag ^ TT_VA(va)) & TT_VA_MASK) == 0 &&
14580709Sjake	    ((tte.tte_data ^ TD_VA_LOW(va)) & TD_VA_LOW_MASK) == 0);
14680709Sjake}
14780709Sjake
14880709Sjake#endif /* !_MACHINE_TTE_H_ */
149