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