xref: /openbsd-src/sys/arch/arm64/include/pte.h (revision 999a7581f82160625628ebcc08d79b3c296a7d3b)
1*999a7581Sjsg /* $OpenBSD: pte.h,v 1.10 2024/10/14 12:02:16 jsg Exp $ */
2f24071e5Spatrick /*
3f24071e5Spatrick  * Copyright (c) 2014 Dale Rahn <drahn@dalerahn.com>
4f24071e5Spatrick  *
5f24071e5Spatrick  * Permission to use, copy, modify, and distribute this software for any
6f24071e5Spatrick  * purpose with or without fee is hereby granted, provided that the above
7f24071e5Spatrick  * copyright notice and this permission notice appear in all copies.
8f24071e5Spatrick  *
9f24071e5Spatrick  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10f24071e5Spatrick  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11f24071e5Spatrick  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12f24071e5Spatrick  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13f24071e5Spatrick  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14f24071e5Spatrick  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15f24071e5Spatrick  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16f24071e5Spatrick  */
17f24071e5Spatrick #ifndef _ARM_PTE_H_
18f24071e5Spatrick #define _ARM_PTE_H_
19f24071e5Spatrick 
20f24071e5Spatrick /*  level X descriptor */
21f24071e5Spatrick #define	Lx_TYPE_MASK	(0x00000003)	/* mask of type bits */
22f24071e5Spatrick #define Lx_TYPE_S 	(0x00000001)
23f24071e5Spatrick #define Lx_TYPE_PT 	(0x00000003)
24f24071e5Spatrick // XXX need to investigate use of these
25f24071e5Spatrick #define Lx_PT_NS	(1ULL<<63)
26f24071e5Spatrick #define Lx_PT_AP00	(0ULL<<61)
27f24071e5Spatrick #define Lx_PT_AP01	(1ULL<<61)
28f24071e5Spatrick #define Lx_PT_AP10	(2ULL<<61)
29f24071e5Spatrick #define Lx_PT_AP11	(3ULL<<61)
30f24071e5Spatrick #define Lx_PT_XN	(1ULL<<60)
31f24071e5Spatrick #define Lx_PT_PXN	(1ULL<<59)
32f24071e5Spatrick #define	Lx_TABLE_ALIGN	(4096)
33f24071e5Spatrick 
34f24071e5Spatrick /* Block and Page attributes */
35f24071e5Spatrick /* TODO: Add the upper attributes */
36f24071e5Spatrick #define		ATTR_MASK_H	(0xfff0000000000000ULL)
37f24071e5Spatrick #define		ATTR_MASK_L	(0x0000000000000fffULL)
38f24071e5Spatrick #define		ATTR_MASK	(ATTR_MASK_H | ATTR_MASK_L)
39f24071e5Spatrick /* Bits 58:55 are reserved for software */
40f24071e5Spatrick #define		ATTR_SW_MANAGED	(1UL << 56)
41f24071e5Spatrick #define		ATTR_SW_WIRED	(1UL << 55)
42f24071e5Spatrick #define		ATTR_UXN	(1UL << 54)
43f24071e5Spatrick #define		ATTR_PXN	(1UL << 53)
44aa60921aSkettenis #define		ATTR_GP		(1UL << 50)
45f24071e5Spatrick #define		ATTR_nG		(1 << 11)
46f24071e5Spatrick #define		ATTR_AF		(1 << 10)
47f24071e5Spatrick #define		ATTR_SH(x)	((x) << 8)
48f24071e5Spatrick #define		ATTR_AP_RW_BIT	(1 << 7)
49f24071e5Spatrick #define		ATTR_AP(x)	((x) << 6)
50f24071e5Spatrick #define		ATTR_AP_MASK	ATTR_AP(3)
51f24071e5Spatrick #define		ATTR_NS		(1 << 5)
52f24071e5Spatrick #define		ATTR_IDX(x)	((x) << 2)
53f24071e5Spatrick #define		ATTR_IDX_MASK	(7 << 2)
54f24071e5Spatrick 
55d3dca73fSkettenis #define		PTE_ATTR_DEV_NGNRNE	0
56d3dca73fSkettenis #define		PTE_ATTR_DEV_NGNRE	1
57d3dca73fSkettenis #define		PTE_ATTR_CI		2
58d3dca73fSkettenis #define		PTE_ATTR_WB		3
59d3dca73fSkettenis #define		PTE_ATTR_WT		4
60f24071e5Spatrick 
61f8ea3ffdSpatrick #define		PTE_MEMATTR_DEV_NGNRNE	0x0
62f8ea3ffdSpatrick #define		PTE_MEMATTR_DEV_NGNRE	0x1
63f8ea3ffdSpatrick #define		PTE_MEMATTR_CI		0x5
64f8ea3ffdSpatrick #define		PTE_MEMATTR_WB		0xf
65f8ea3ffdSpatrick #define		PTE_MEMATTR_WT		0xa
66f8ea3ffdSpatrick 
67f24071e5Spatrick #define		SH_INNER	3
68f24071e5Spatrick #define		SH_OUTER	2
69f24071e5Spatrick #define		SH_NONE		0
70f24071e5Spatrick 
71f24071e5Spatrick /* Level 0 table, 512GiB per entry */
72f24071e5Spatrick #define		L0_SHIFT	39
73f24071e5Spatrick #define		L0_INVAL	0x0 /* An invalid address */
74f24071e5Spatrick #define		L0_BLOCK	0x1 /* A block */
75f24071e5Spatrick 	/* 0x2 also marks an invalid address */
76f24071e5Spatrick #define		L0_TABLE	0x3 /* A next-level table */
77f24071e5Spatrick 
78f24071e5Spatrick /* Level 1 table, 1GiB per entry */
79f24071e5Spatrick #define		L1_SHIFT	30
80f24071e5Spatrick #define		L1_SIZE		(1 << L1_SHIFT)
81f24071e5Spatrick #define		L1_OFFSET	(L1_SIZE - 1)
82f24071e5Spatrick #define		L1_INVAL	L0_INVAL
83f24071e5Spatrick #define		L1_BLOCK	L0_BLOCK
84f24071e5Spatrick #define		L1_TABLE	L0_TABLE
85f24071e5Spatrick 
86f24071e5Spatrick /* Level 2 table, 2MiB per entry */
87f24071e5Spatrick #define		L2_SHIFT	21
88f24071e5Spatrick #define		L2_SIZE		(1 << L2_SHIFT)
892a847b7eSkettenis #define		L2_OFFSET	(L2_SIZE - 1)
902a847b7eSkettenis #define		L2_INVAL	L0_INVAL
91f24071e5Spatrick #define		L2_BLOCK	L0_BLOCK
922a847b7eSkettenis #define		L2_TABLE	L0_TABLE
93f24071e5Spatrick 
942a847b7eSkettenis /* page mapping */
952a847b7eSkettenis #define		L3_P		0x3
96f24071e5Spatrick 
97f24071e5Spatrick #define		Ln_ENTRIES	(1 << 9)
98f24071e5Spatrick #define		Ln_ADDR_MASK	(Ln_ENTRIES - 1)
99f24071e5Spatrick #define		Ln_TABLE_MASK	((1 << 12) - 1)
100f24071e5Spatrick 
101f24071e5Spatrick /* physical page mask */
102f098301cSpatrick #define PTE_RPGN (((1ULL << 48) - 1) & ~PAGE_MASK)
103f24071e5Spatrick 
104f24071e5Spatrick #endif /* _ARM_PTE_H_ */
105