1*551b33bfSkettenis /* $OpenBSD: pmap.h,v 1.19 2023/12/11 22:12:53 kettenis Exp $ */ 2cc806928Skettenis 3cc806928Skettenis /* 4cc806928Skettenis * Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org> 5cc806928Skettenis * 6cc806928Skettenis * Permission to use, copy, modify, and distribute this software for any 7cc806928Skettenis * purpose with or without fee is hereby granted, provided that the above 8cc806928Skettenis * copyright notice and this permission notice appear in all copies. 9cc806928Skettenis * 10cc806928Skettenis * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11cc806928Skettenis * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12cc806928Skettenis * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13cc806928Skettenis * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14cc806928Skettenis * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15cc806928Skettenis * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16cc806928Skettenis * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17cc806928Skettenis */ 18cc806928Skettenis 1913861200Skettenis #ifndef _MACHINE_PMAP_H_ 2013861200Skettenis #define _MACHINE_PMAP_H_ 2113861200Skettenis 22e894dd1eSvisa #include <sys/mutex.h> 23e894dd1eSvisa #include <sys/queue.h> 24e894dd1eSvisa 25f589ab0eSkettenis #ifdef _KERNEL 26f589ab0eSkettenis 27c9893c80Skettenis #include <machine/pte.h> 28c9893c80Skettenis 29cc806928Skettenis /* V->P mapping data */ 30cc806928Skettenis #define VP_IDX1_CNT 256 31cc806928Skettenis #define VP_IDX1_MASK (VP_IDX1_CNT - 1) 32cc806928Skettenis #define VP_IDX1_POS 20 33cc806928Skettenis #define VP_IDX2_CNT 256 34cc806928Skettenis #define VP_IDX2_MASK (VP_IDX2_CNT - 1) 35cc806928Skettenis #define VP_IDX2_POS 12 36cc806928Skettenis 37dfe2a243Skettenis struct pmap { 38cc806928Skettenis LIST_HEAD(,slb_desc) pm_slbd; 39cc806928Skettenis int pm_refs; 40dfe2a243Skettenis struct pmap_statistics pm_stats; 41cc806928Skettenis struct mutex pm_mtx; 42dfe2a243Skettenis }; 43dfe2a243Skettenis 4413861200Skettenis typedef struct pmap *pmap_t; 4513861200Skettenis 46dfe2a243Skettenis #define PG_PMAP_MOD PG_PMAP0 47dfe2a243Skettenis #define PG_PMAP_REF PG_PMAP1 48dfe2a243Skettenis #define PG_PMAP_EXE PG_PMAP2 49dfe2a243Skettenis #define PG_PMAP_UC PG_PMAP3 50dfe2a243Skettenis 51dfe2a243Skettenis #define PMAP_CACHE_DEFAULT 0 52dfe2a243Skettenis #define PMAP_CACHE_CI 1 /* cache inhibit */ 53dfe2a243Skettenis #define PMAP_CACHE_WB 3 /* write-back cached */ 54dfe2a243Skettenis 55dfe2a243Skettenis /* 56dfe2a243Skettenis * MD flags that we use for pmap_enter (in the pa): 57dfe2a243Skettenis */ 58dfe2a243Skettenis #define PMAP_PA_MASK ~((paddr_t)PAGE_MASK) /* to remove the flags */ 59dfe2a243Skettenis #define PMAP_NOCACHE 0x1 /* map uncached */ 60dfe2a243Skettenis 61dfe2a243Skettenis extern struct pmap kernel_pmap_store; 62dfe2a243Skettenis 63dfe2a243Skettenis #define pmap_kernel() (&kernel_pmap_store) 64cc806928Skettenis #define pmap_resident_count(pm) ((pm)->pm_stats.resident_count) 65e1fd8b91Skettenis #define pmap_wired_count(pm) ((pm)->pm_stats.wired_count) 66cc806928Skettenis 67*551b33bfSkettenis #define pmap_init_percpu() do { /* nothing */ } while (0) 6813861200Skettenis #define pmap_unuse_final(p) 6913861200Skettenis #define pmap_remove_holes(vm) 7013861200Skettenis #define pmap_update(pm) 7113861200Skettenis 72dfe2a243Skettenis void pmap_bootstrap(void); 7320975c6cSkettenis void pmap_bootstrap_cpu(void); 74dfe2a243Skettenis 755e96aed0Skettenis int pmap_slbd_fault(pmap_t, vaddr_t); 762942dd66Skettenis int pmap_slbd_enter(pmap_t, vaddr_t); 77a867c16fSkettenis int pmap_set_user_slb(pmap_t, vaddr_t, vaddr_t *, vsize_t *); 78502a56d1Skettenis void pmap_clear_user_slb(void); 7945dd89a7Skettenis void pmap_unset_user_slb(void); 8045dd89a7Skettenis 81fe9bb682Sgkoehler #ifdef DDB 82fe9bb682Sgkoehler struct pte; 83fe9bb682Sgkoehler struct pte *pmap_get_kernel_pte(vaddr_t); 84fe9bb682Sgkoehler #endif 85fe9bb682Sgkoehler 86f589ab0eSkettenis #endif /* _KERNEL */ 87f589ab0eSkettenis 88f589ab0eSkettenis struct vm_page_md { 89f589ab0eSkettenis struct mutex pv_mtx; 90f589ab0eSkettenis LIST_HEAD(,pte_desc) pv_list; 91f589ab0eSkettenis }; 92f589ab0eSkettenis 93f589ab0eSkettenis #define VM_MDPAGE_INIT(pg) do { \ 94f589ab0eSkettenis mtx_init(&(pg)->mdpage.pv_mtx, IPL_VM); \ 95f589ab0eSkettenis LIST_INIT(&((pg)->mdpage.pv_list)); \ 96f589ab0eSkettenis } while (0) 97f589ab0eSkettenis 9813861200Skettenis #endif /* _MACHINE_PMAP_H_ */ 99