xref: /openbsd-src/sys/arch/arm64/include/pmap.h (revision 679d40f143d6c619326ffb297e03b220b779aa56)
1*679d40f1Skettenis /* $OpenBSD: pmap.h,v 1.26 2025/01/18 16:35:30 kettenis Exp $ */
2f24071e5Spatrick /*
3f24071e5Spatrick  * Copyright (c) 2008,2009,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	_ARM64_PMAP_H_
18f24071e5Spatrick #define	_ARM64_PMAP_H_
19f24071e5Spatrick 
20395e1e44Spatrick #ifndef _LOCORE
21cb197a0bSkettenis #include <sys/mutex.h>
22395e1e44Spatrick #include <sys/queue.h>
23cb197a0bSkettenis #include <machine/pte.h>
24395e1e44Spatrick #endif
25f24071e5Spatrick 
26f24071e5Spatrick 
27f24071e5Spatrick /* V->P mapping data */
28f24071e5Spatrick #define VP_IDX0_CNT	512
29f24071e5Spatrick #define VP_IDX0_MASK	(VP_IDX0_CNT-1)
30f24071e5Spatrick #define VP_IDX0_POS	39
31f24071e5Spatrick #define VP_IDX1_CNT	512
32f24071e5Spatrick #define VP_IDX1_MASK	(VP_IDX1_CNT-1)
33f24071e5Spatrick #define VP_IDX1_POS	30
34f24071e5Spatrick #define VP_IDX2_CNT	512
35f24071e5Spatrick #define VP_IDX2_MASK	(VP_IDX2_CNT-1)
36f24071e5Spatrick #define VP_IDX2_POS	21
37f24071e5Spatrick #define VP_IDX3_CNT	512
38f24071e5Spatrick #define VP_IDX3_MASK	(VP_IDX3_CNT-1)
39f24071e5Spatrick #define VP_IDX3_POS	12
40f24071e5Spatrick 
41f24071e5Spatrick /* cache flags */
42f24071e5Spatrick #define PMAP_CACHE_CI		(PMAP_MD0)		/* cache inhibit */
43f24071e5Spatrick #define PMAP_CACHE_WT		(PMAP_MD1)	 	/* writethru */
44f24071e5Spatrick #define PMAP_CACHE_WB		(PMAP_MD1|PMAP_MD0)	/* writeback */
45d3dca73fSkettenis #define PMAP_CACHE_DEV_NGNRNE	(PMAP_MD2)		/* device nGnRnE */
46d3dca73fSkettenis #define PMAP_CACHE_DEV_NGNRE	(PMAP_MD2|PMAP_MD0)	/* device nGnRE */
47f24071e5Spatrick #define PMAP_CACHE_BITS		(PMAP_MD0|PMAP_MD1|PMAP_MD2)
48f24071e5Spatrick 
49f24071e5Spatrick #define PTED_VA_MANAGED_M	(PMAP_MD3)
50f24071e5Spatrick #define PTED_VA_WIRED_M		(PMAP_MD3 << 1)
51f24071e5Spatrick #define PTED_VA_EXEC_M		(PMAP_MD3 << 2)
52f24071e5Spatrick 
53f24071e5Spatrick 
54395e1e44Spatrick #if defined(_KERNEL) && !defined(_LOCORE)
55f24071e5Spatrick /*
56f24071e5Spatrick  * Pmap stuff
57f24071e5Spatrick  */
58395e1e44Spatrick 
59395e1e44Spatrick typedef struct pmap *pmap_t;
60395e1e44Spatrick 
61f24071e5Spatrick struct pmap {
62cb197a0bSkettenis 	struct mutex pm_mtx;
63f24071e5Spatrick 	union {
64f24071e5Spatrick 		struct pmapvp0 *l0;	/* virtual to physical table 4 lvl */
65f24071e5Spatrick 		struct pmapvp1 *l1;	/* virtual to physical table 3 lvl */
66f24071e5Spatrick 	} pm_vp;
67f24071e5Spatrick 	uint64_t pm_pt0pa;
68c6c0d427Skettenis 	uint64_t pm_asid;
692c3273c1Skettenis 	uint64_t pm_guarded;
70f24071e5Spatrick 	int have_4_level_pt;
71f937ff16Skettenis 	int pm_privileged;
72f24071e5Spatrick 	int pm_refs;				/* ref count */
73f24071e5Spatrick 	struct pmap_statistics  pm_stats;	/* pmap statistics */
744171e492Skettenis 	uint64_t pm_apiakey[2];
754171e492Skettenis 	uint64_t pm_apdakey[2];
764171e492Skettenis 	uint64_t pm_apibkey[2];
774171e492Skettenis 	uint64_t pm_apdbkey[2];
784171e492Skettenis 	uint64_t pm_apgakey[2];
79f24071e5Spatrick };
80f24071e5Spatrick 
81395e1e44Spatrick #define PMAP_PA_MASK	~((paddr_t)PAGE_MASK) /* to remove the flags */
82395e1e44Spatrick #define PMAP_NOCACHE	0x1 /* non-cacheable memory */
83395e1e44Spatrick #define PMAP_DEVICE	0x2 /* device memory */
841c2dd718Skettenis #define PMAP_WC		PMAP_DEVICE
85395e1e44Spatrick 
86395e1e44Spatrick #define PG_PMAP_MOD		PG_PMAP0
87395e1e44Spatrick #define PG_PMAP_REF		PG_PMAP1
88395e1e44Spatrick #define PG_PMAP_EXE		PG_PMAP2
89395e1e44Spatrick 
90395e1e44Spatrick // [NCPUS]
91395e1e44Spatrick extern paddr_t zero_page;
92395e1e44Spatrick extern paddr_t copy_src_page;
93395e1e44Spatrick extern paddr_t copy_dst_page;
94395e1e44Spatrick 
95395e1e44Spatrick void pagezero_cache(vaddr_t);
96f24071e5Spatrick 
97f24071e5Spatrick extern struct pmap kernel_pmap_;
98f24071e5Spatrick #define pmap_kernel()   		(&kernel_pmap_)
99f24071e5Spatrick #define	pmap_resident_count(pmap)	((pmap)->pm_stats.resident_count)
100f24071e5Spatrick #define	pmap_wired_count(pmap)		((pmap)->pm_stats.wired_count)
101f24071e5Spatrick 
102f24071e5Spatrick vaddr_t pmap_bootstrap(long kvo, paddr_t lpt1,  long kernelstart,
103f24071e5Spatrick     long kernelend, long ram_start, long ram_end);
104551b33bfSkettenis void pmap_postinit(void);
105551b33bfSkettenis void pmap_init_percpu(void);
106551b33bfSkettenis 
107395e1e44Spatrick void pmap_kenter_cache(vaddr_t va, paddr_t pa, vm_prot_t prot, int cacheable);
108f24071e5Spatrick void pmap_page_ro(pmap_t pm, vaddr_t va, vm_prot_t prot);
109fab25f7eSmpi void pmap_page_rw(pmap_t pm, vaddr_t va);
110f24071e5Spatrick 
1114171e492Skettenis void pmap_setpauthkeys(struct pmap *);
1124171e492Skettenis 
11392b45dfeSkettenis paddr_t pmap_steal_avail(size_t size, int align, void **kva);
114ab7212f9Sjsg void pmap_avail_fixup(void);
115ab7212f9Sjsg void pmap_physload_avail(void);
116f24071e5Spatrick 
117ebdd378cSkettenis #define PMAP_GROWKERNEL
118ebdd378cSkettenis 
119f24071e5Spatrick struct pv_entry;
120f24071e5Spatrick 
121f24071e5Spatrick /* investigate */
122f24071e5Spatrick #define pmap_unuse_final(p)		do { /* nothing */ } while (0)
1235e6940faSderaadt int	pmap_fault_fixup(pmap_t, vaddr_t, vm_prot_t);
124f24071e5Spatrick 
1254180f278Skettenis #define __HAVE_PMAP_MPSAFE_ENTER_COW
126*679d40f1Skettenis #define __HAVE_PMAP_POPULATE
1274180f278Skettenis 
128395e1e44Spatrick #endif /* _KERNEL && !_LOCORE */
129f24071e5Spatrick 
130395e1e44Spatrick #ifndef _LOCORE
131f24071e5Spatrick struct vm_page_md {
132cb197a0bSkettenis 	struct mutex pv_mtx;
133f24071e5Spatrick 	LIST_HEAD(,pte_desc) pv_list;
134f24071e5Spatrick };
135f24071e5Spatrick 
136f24071e5Spatrick #define VM_MDPAGE_INIT(pg) do {			\
137cb197a0bSkettenis 	mtx_init(&(pg)->mdpage.pv_mtx, IPL_VM);	\
138f24071e5Spatrick 	LIST_INIT(&((pg)->mdpage.pv_list));	\
139f24071e5Spatrick } while (0)
140f24071e5Spatrick #endif	/* _LOCORE */
141f24071e5Spatrick 
142f24071e5Spatrick #endif	/* _ARM64_PMAP_H_ */
143