xref: /openbsd/sys/arch/sparc64/include/pte.h (revision d00b7f60)
1*d00b7f60Smiod /*	$OpenBSD: pte.h,v 1.17 2024/04/14 19:08:09 miod Exp $	*/
2f842aaf8Sart /*	$NetBSD: pte.h,v 1.7 2001/07/31 06:55:46 eeh Exp $ */
3f842aaf8Sart 
4f842aaf8Sart /*
5f842aaf8Sart  * Copyright (c) 1996-1999 Eduardo Horvath
6f842aaf8Sart  *
7f842aaf8Sart  * Redistribution and use in source and binary forms, with or without
8f842aaf8Sart  * modification, are permitted provided that the following conditions
9f842aaf8Sart  * are met:
10f842aaf8Sart  * 1. Redistributions of source code must retain the above copyright
11f842aaf8Sart  *    notice, this list of conditions and the following disclaimer.
12f842aaf8Sart  *
13f842aaf8Sart  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR  ``AS IS'' AND
14f842aaf8Sart  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15f842aaf8Sart  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16f842aaf8Sart  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR  BE LIABLE
17f842aaf8Sart  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18f842aaf8Sart  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19f842aaf8Sart  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20f842aaf8Sart  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21f842aaf8Sart  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22f842aaf8Sart  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23f842aaf8Sart  * SUCH DAMAGE.
24f842aaf8Sart  *
25f842aaf8Sart  */
26f842aaf8Sart 
2743d4f7a5Sderaadt #ifndef	_MACHINE_PTE_H_
2843d4f7a5Sderaadt #define	_MACHINE_PTE_H_
2943d4f7a5Sderaadt 
30f842aaf8Sart /* virtual address to virtual page number */
31f842aaf8Sart #define	VA_SUN4U_VPG(va)	(((int)(va) >> 13) & 31)
32f842aaf8Sart 
33f842aaf8Sart /* virtual address to offset within page */
34f842aaf8Sart #define VA_SUN4U_OFF(va)       	(((int)(va)) & 0x1FFF)
35f842aaf8Sart 
36f842aaf8Sart /* When we go to 64-bit VAs we need to handle the hole */
37f842aaf8Sart #define VA_VPG(va)	VA_SUN4U_VPG(va)
38f842aaf8Sart #define VA_OFF(va)	VA_SUN4U_OFF(va)
39f842aaf8Sart 
40f842aaf8Sart #define PG_SHIFT4U	13
41f842aaf8Sart #define MMU_PAGE_ALIGN	8192
42f842aaf8Sart 
43f842aaf8Sart /* If you know where a tte is in the tsb, how do you find its va? */
44f842aaf8Sart #define TSBVA(i)	((tsb[(i)].tag.f.tag_va<<22)|(((i)<<13)&0x3ff000))
45f842aaf8Sart 
46f842aaf8Sart #ifndef _LOCORE
47f842aaf8Sart /*
48f842aaf8Sart  *  This is the spitfire TTE.
49f842aaf8Sart  */
50e78c98cbSmiod #if 0 /* We don't use bitfields anyway. */
51f842aaf8Sart struct sun4u_tag_fields {
52f842aaf8Sart 	u_int64_t	tag_g:1,	/* global flag */
53f842aaf8Sart 		tag_ctxt:15,	/* context for mapping */
54f842aaf8Sart 		tag_unassigned:6,
55f842aaf8Sart 		tag_va:42;	/* virtual address bits<64:22> */
56f842aaf8Sart };
57f842aaf8Sart union sun4u_tag { struct sun4u_tag_fields f; int64_t tag; };
58f842aaf8Sart struct sun4u_data_fields {
59f842aaf8Sart 	u_int64_t	data_v:1,	/* valid bit */
60f842aaf8Sart 		data_size:2,	/* page size [8K*8**<SIZE>] */
61f842aaf8Sart 		data_nfo:1,	/* no-fault only */
62f842aaf8Sart 		data_ie:1,	/* invert endianness [inefficient] */
63f842aaf8Sart 		data_soft2:2,	/* reserved for S/W */
64f842aaf8Sart 		data_pa:36,	/* physical address */
65f842aaf8Sart 		data_accessed:1,/* S/W accessed bit */
66f842aaf8Sart 		data_modified:1,/* S/W modified bit */
67f842aaf8Sart 		data_realw:1,	/* S/W real writable bit (to manage modified) */
68f842aaf8Sart 		data_tsblock:1,	/* S/W TSB locked entry */
69f842aaf8Sart 		data_exec:1,	/* S/W Executable */
70f842aaf8Sart 		data_onlyexec:1,/* S/W Executable only */
71f842aaf8Sart 		data_lock:1,	/* lock into TLB */
72f842aaf8Sart 		data_cacheable:2,	/* cacheability control */
73f842aaf8Sart 		data_e:1,	/* explicit accesses only */
74f842aaf8Sart 		data_priv:1,	/* privileged page */
75f842aaf8Sart 		data_w:1,	/* writeable */
76f842aaf8Sart 		data_g:1;	/* same as tag_g */
77f842aaf8Sart };
78f842aaf8Sart union sun4u_data { struct sun4u_data_fields f; int64_t data; };
79f842aaf8Sart struct sun4u_tte {
80f842aaf8Sart 	union sun4u_tag tag;
81f842aaf8Sart 	union sun4u_data data;
82f842aaf8Sart };
83f842aaf8Sart #else
84f842aaf8Sart struct sun4u_tte {
85f842aaf8Sart 	int64_t tag;
86f842aaf8Sart 	int64_t data;
87f842aaf8Sart };
88f842aaf8Sart #endif
89f842aaf8Sart typedef struct sun4u_tte pte_t;
90f842aaf8Sart 
91f842aaf8Sart /* Assembly routine to flush a mapping */
92*d00b7f60Smiod extern void (*sp_tlb_flush_pte)(vaddr_t, uint64_t);
93*d00b7f60Smiod extern void (*sp_tlb_flush_ctx)(uint64_t);
9492e5c4ffSkettenis 
9592e5c4ffSkettenis #if defined(MULTIPROCESSOR)
96*d00b7f60Smiod void smp_tlb_flush_pte(vaddr_t, uint64_t);
97*d00b7f60Smiod void smp_tlb_flush_ctx(uint64_t);
9892e5c4ffSkettenis #define tlb_flush_pte(va,ctx)	smp_tlb_flush_pte(va, ctx)
9992e5c4ffSkettenis #define tlb_flush_ctx(ctx)	smp_tlb_flush_ctx(ctx)
10092e5c4ffSkettenis #else
101*d00b7f60Smiod #define tlb_flush_pte(va,ctx)	(*sp_tlb_flush_pte)(va, ctx)
102*d00b7f60Smiod #define tlb_flush_ctx(ctx)	(*sp_tlb_flush_ctx)(ctx)
10392e5c4ffSkettenis #endif
104f842aaf8Sart 
105f842aaf8Sart #endif /* _LOCORE */
106f842aaf8Sart 
107f842aaf8Sart /* TSB tag masks */
108f842aaf8Sart #define CTX_MASK		((1<<13)-1)
109f842aaf8Sart #define TSB_TAG_CTX_SHIFT	48
110f842aaf8Sart #define TSB_TAG_VA_SHIFT	22
111f842aaf8Sart 
112649a4de9Skettenis #define TSB_TAG_LOCKED		0x0000040000000000LL
113649a4de9Skettenis 
114649a4de9Skettenis #define TSB_TAG_G		0x8000000000000000LL
115f842aaf8Sart #define TSB_TAG_CTX(t)		((((int64_t)(t))>>TSB_TAG_CTX_SHIFT)&CTX_MASK)
116f842aaf8Sart #define TSB_TAG_VA(t)		((((int64_t)(t))<<TSB_TAG_VA_SHIFT))
117f842aaf8Sart #define TSB_TAG(g,ctx,va)	((((u_int64_t)((g)!=0))<<63)|(((u_int64_t)(ctx)&CTX_MASK)<<TSB_TAG_CTX_SHIFT)|(((u_int64_t)va)>>TSB_TAG_VA_SHIFT))
118f842aaf8Sart 
119f842aaf8Sart /* Page sizes */
120f842aaf8Sart #define	PGSZ_8K			0
121f842aaf8Sart #define	PGSZ_64K		1
122f842aaf8Sart #define	PGSZ_512K		2
123f842aaf8Sart #define	PGSZ_4M			3
124f842aaf8Sart 
125da4ba485Skettenis #define	SUN4U_PGSZ_SHIFT	61
126da4ba485Skettenis #define	SUN4U_TLB_SZ(s)		(((uint64_t)(s)) << SUN4U_PGSZ_SHIFT)
127f842aaf8Sart 
128f842aaf8Sart /* TLB data masks */
129da4ba485Skettenis #define SUN4U_TLB_V		0x8000000000000000LL
130da4ba485Skettenis #define SUN4U_TLB_8K		SUN4U_TLB_SZ(PGSZ_8K)
131da4ba485Skettenis #define SUN4U_TLB_64K		SUN4U_TLB_SZ(PGSZ_64K)
132da4ba485Skettenis #define SUN4U_TLB_512K		SUN4U_TLB_SZ(PGSZ_512K)
133da4ba485Skettenis #define SUN4U_TLB_4M		SUN4U_TLB_SZ(PGSZ_4M)
134da4ba485Skettenis #define SUN4U_TLB_SZ_MASK	0x6000000000000000LL
135da4ba485Skettenis #define SUN4U_TLB_NFO		0x1000000000000000LL
136da4ba485Skettenis #define SUN4U_TLB_IE		0x0800000000000000LL
137da4ba485Skettenis #define SUN4U_TLB_SOFT2_MASK	0x07fc000000000000LL
1387396f89dSkettenis #define SUN4U_TLB_RESERVED_MASK	0x0003800000000000LL
13948e59a2bSkettenis #define SUN4U_TLB_PA_MASK	0x00007fffffffe000LL
140da4ba485Skettenis #define SUN4U_TLB_SOFT_MASK	0x0000000000001f80LL
141f842aaf8Sart /* S/W bits */
142da4ba485Skettenis #define SUN4U_TLB_ACCESS	0x0000000000000200LL
143da4ba485Skettenis #define SUN4U_TLB_MODIFY	0x0000000000000800LL
144da4ba485Skettenis #define SUN4U_TLB_REAL_W	0x0000000000000400LL
145da4ba485Skettenis #define SUN4U_TLB_TSB_LOCK	0x0000000000001000LL
146da4ba485Skettenis #define SUN4U_TLB_EXEC		0x0000000000000100LL
147da4ba485Skettenis #define SUN4U_TLB_EXEC_ONLY	0x0000000000000080LL
148f842aaf8Sart /* H/W bits */
149da4ba485Skettenis #define SUN4U_TLB_L		0x0000000000000040LL
150da4ba485Skettenis #define SUN4U_TLB_CACHE_MASK	0x0000000000000030LL
151da4ba485Skettenis #define SUN4U_TLB_CP		0x0000000000000020LL
152da4ba485Skettenis #define SUN4U_TLB_CV		0x0000000000000010LL
153da4ba485Skettenis #define SUN4U_TLB_E		0x0000000000000008LL
154da4ba485Skettenis #define SUN4U_TLB_P		0x0000000000000004LL
155da4ba485Skettenis #define SUN4U_TLB_W		0x0000000000000002LL
156da4ba485Skettenis #define SUN4U_TLB_G		0x0000000000000001LL
157f842aaf8Sart 
158da4ba485Skettenis #define SUN4U_TSB_DATA(g,sz,pa,priv,write,cache,aliased,valid,ie) \
159da4ba485Skettenis (((valid)?SUN4U_TLB_V:0LL)|SUN4U_TLB_SZ(sz)|\
160da4ba485Skettenis (((u_int64_t)(pa))&SUN4U_TLB_PA_MASK)|\
161da4ba485Skettenis ((cache)?((aliased)?SUN4U_TLB_CP:SUN4U_TLB_CACHE_MASK):SUN4U_TLB_E)|\
162da4ba485Skettenis ((priv)?SUN4U_TLB_P:0LL)|((write)?SUN4U_TLB_W:0LL)|((g)?SUN4U_TLB_G:0LL)|\
163da4ba485Skettenis ((ie)?SUN4U_TLB_IE:0LL))
164da4ba485Skettenis 
165da4ba485Skettenis #define SUN4V_PGSZ_SHIFT	0
166da4ba485Skettenis #define	SUN4V_TLB_SZ(s)		(((uint64_t)(s))<<SUN4V_PGSZ_SHIFT)
167da4ba485Skettenis 
168da4ba485Skettenis /* TLB data masks */
169da4ba485Skettenis #define SUN4V_TLB_V		0x8000000000000000LL
170da4ba485Skettenis #define SUN4V_TLB_8K		SUN4V_TLB_SZ(PGSZ_8K)
171da4ba485Skettenis #define SUN4V_TLB_64K		SUN4V_TLB_SZ(PGSZ_64K)
172da4ba485Skettenis #define SUN4V_TLB_512K		SUN4V_TLB_SZ(PGSZ_512K)
173da4ba485Skettenis #define SUN4V_TLB_4M		SUN4V_TLB_SZ(PGSZ_4M)
174da4ba485Skettenis #define SUN4V_TLB_SZ_MASK	0x000000000000000fLL
175da4ba485Skettenis #define SUN4V_TLB_NFO		0x4000000000000000LL
176da4ba485Skettenis #define SUN4V_TLB_IE		0x0000000000001000LL
177da4ba485Skettenis #define SUN4V_TLB_SOFT2_MASK	0x3f00000000000000LL
178da4ba485Skettenis #define SUN4V_TLB_PA_MASK	0x00ffffffffffe000LL
179da4ba485Skettenis #define SUN4V_TLB_SOFT_MASK	0x0000000000000030LL
180da4ba485Skettenis /* S/W bits */
181da4ba485Skettenis #define SUN4V_TLB_ACCESS	0x0000000000000010LL
182da4ba485Skettenis #define SUN4V_TLB_MODIFY	0x0000000000000020LL
183da4ba485Skettenis #define SUN4V_TLB_REAL_W	0x2000000000000000LL
184da4ba485Skettenis #define SUN4V_TLB_TSB_LOCK	0x1000000000000000LL
185da4ba485Skettenis #define SUN4V_TLB_EXEC		SUN4V_TLB_X
186da4ba485Skettenis #define SUN4V_TLB_EXEC_ONLY	0x0200000000000000LL
187da4ba485Skettenis /* H/W bits */
188da4ba485Skettenis #define SUN4V_TLB_CACHE_MASK	0x0000000000000600LL
189da4ba485Skettenis #define SUN4V_TLB_CP		0x0000000000000400LL
190da4ba485Skettenis #define SUN4V_TLB_CV		0x0000000000000200LL
191da4ba485Skettenis #define SUN4V_TLB_E		0x0000000000000800LL
192da4ba485Skettenis #define SUN4V_TLB_P		0x0000000000000100LL
193da4ba485Skettenis #define SUN4V_TLB_X		0x0000000000000080LL
194da4ba485Skettenis #define SUN4V_TLB_W		0x0000000000000040LL
195da4ba485Skettenis #define SUN4V_TLB_G		0x0000000000000000LL
196da4ba485Skettenis 
197da4ba485Skettenis #define SUN4V_TSB_DATA(g,sz,pa,priv,write,cache,aliased,valid,ie) \
198da4ba485Skettenis (((valid)?SUN4V_TLB_V:0LL)|SUN4V_TLB_SZ(sz)|\
199da4ba485Skettenis (((u_int64_t)(pa))&SUN4V_TLB_PA_MASK)|\
200da4ba485Skettenis ((cache)?((aliased)?SUN4V_TLB_CP:SUN4V_TLB_CACHE_MASK):SUN4V_TLB_E)|\
201da4ba485Skettenis ((priv)?SUN4V_TLB_P:0LL)|((write)?SUN4V_TLB_W:0LL)|((g)?SUN4V_TLB_G:0LL)|\
202da4ba485Skettenis ((ie)?SUN4V_TLB_IE:0LL))
203da4ba485Skettenis 
20443d4f7a5Sderaadt #endif /* _MACHINE_PTE_H_ */
205