pmap.h revision 320429
1139749Simp/*- 232801Sjulian * Copyright (c) 1991 Regents of the University of California. 332801Sjulian * All rights reserved. 432801Sjulian * 532801Sjulian * This code is derived from software contributed to Berkeley by 632801Sjulian * the Systems Programming Group of the University of Utah Computer 732801Sjulian * Science Department and William Jolitz of UUNET Technologies Inc. 832801Sjulian * 932801Sjulian * Redistribution and use in source and binary forms, with or without 1032801Sjulian * modification, are permitted provided that the following conditions 1132801Sjulian * are met: 1232801Sjulian * 1. Redistributions of source code must retain the above copyright 1332801Sjulian * notice, this list of conditions and the following disclaimer. 1432801Sjulian * 2. Redistributions in binary form must reproduce the above copyright 1532801Sjulian * notice, this list of conditions and the following disclaimer in the 1632801Sjulian * documentation and/or other materials provided with the distribution. 1732801Sjulian * 4. Neither the name of the University nor the names of its contributors 1832801Sjulian * may be used to endorse or promote products derived from this software 1932801Sjulian * without specific prior written permission. 2032801Sjulian * 2132801Sjulian * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2232801Sjulian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2332801Sjulian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2432801Sjulian * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2532801Sjulian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2632801Sjulian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2732801Sjulian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2832801Sjulian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2932801Sjulian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30119418Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31119418Sobrien * SUCH DAMAGE. 32119418Sobrien * 3339234Sgibbs * Derived from hp300 version by Mike Hibler, this version by William 3432801Sjulian * Jolitz uses a recursive map [a pde points to the page directory] to 3532801Sjulian * map the page tables using the pagetables themselves. This is done to 3632801Sjulian * reduce the impact on kernel virtual memory for lots of sparse address 3732801Sjulian * space, and to reduce the cost of memory to each process. 3832801Sjulian * 3932801Sjulian * from: hp300: @(#)pmap.h 7.2 (Berkeley) 12/16/90 4032801Sjulian * from: @(#)pmap.h 7.4 (Berkeley) 5/12/91 4132801Sjulian * $FreeBSD: stable/11/sys/i386/include/pmap.h 320429 2017-06-28 04:01:29Z alc $ 4232801Sjulian */ 4339234Sgibbs 4439234Sgibbs#ifndef _MACHINE_PMAP_H_ 4538115Seivind#define _MACHINE_PMAP_H_ 4632801Sjulian 4732801Sjulian/* 4832801Sjulian * Page-directory and page-table entries follow this format, with a few 4932801Sjulian * of the fields not present here and there, depending on a lot of things. 5032801Sjulian */ 5132801Sjulian /* ---- Intel Nomenclature ---- */ 52166091Smarius#define PG_V 0x001 /* P Valid */ 53166091Smarius#define PG_RW 0x002 /* R/W Read/Write */ 5432801Sjulian#define PG_U 0x004 /* U/S User/Supervisor */ 5532801Sjulian#define PG_NC_PWT 0x008 /* PWT Write through */ 56241593Sjhb#define PG_NC_PCD 0x010 /* PCD Cache disable */ 5750135Smsmith#define PG_A 0x020 /* A Accessed */ 5832801Sjulian#define PG_M 0x040 /* D Dirty */ 5932801Sjulian#define PG_PS 0x080 /* PS Page size (0=4k,1=4M) */ 6032801Sjulian#define PG_PTE_PAT 0x080 /* PAT PAT index */ 6159078Smdodd#define PG_G 0x100 /* G Global */ 6259078Smdodd#define PG_AVAIL1 0x200 /* / Available for system */ 6339234Sgibbs#define PG_AVAIL2 0x400 /* < programmers use */ 6459078Smdodd#define PG_AVAIL3 0x800 /* \ */ 65112780Smdodd#define PG_PDE_PAT 0x1000 /* PAT PAT index */ 66112780Smdodd#if defined(PAE) || defined(PAE_TABLES) 6732801Sjulian#define PG_NX (1ull<<63) /* No-execute */ 68112780Smdodd#endif 6939234Sgibbs 7039234Sgibbs 7139234Sgibbs/* Our various interpretations of the above */ 7239234Sgibbs#define PG_W PG_AVAIL1 /* "Wired" pseudoflag */ 7339234Sgibbs#define PG_MANAGED PG_AVAIL2 7439234Sgibbs#define PG_PROMOTED PG_AVAIL3 /* PDE only */ 7539234Sgibbs#if defined(PAE) || defined(PAE_TABLES) 7639234Sgibbs#define PG_FRAME (0x000ffffffffff000ull) 7732801Sjulian#define PG_PS_FRAME (0x000fffffffe00000ull) 7832801Sjulian#else 7932801Sjulian#define PG_FRAME (~PAGE_MASK) 8039234Sgibbs#define PG_PS_FRAME (0xffc00000) 8138115Seivind#endif 8239234Sgibbs#define PG_PROT (PG_RW|PG_U) /* all protection bits . */ 83112780Smdodd#define PG_N (PG_NC_PWT|PG_NC_PCD) /* Non-cacheable */ 8432801Sjulian 8539234Sgibbs/* Page level cache control fields used to determine the PAT type */ 8634480Sjulian#define PG_PDE_CACHE (PG_PDE_PAT | PG_NC_PWT | PG_NC_PCD) 8739234Sgibbs#define PG_PTE_CACHE (PG_PTE_PAT | PG_NC_PWT | PG_NC_PCD) 88241593Sjhb 8939234Sgibbs/* 90241593Sjhb * Promotion to a 2 or 4MB (PDE) page mapping requires that the corresponding 9139234Sgibbs * 4KB (PTE) page mappings have identical settings for the following fields: 92241593Sjhb */ 9339234Sgibbs#define PG_PTE_PROMOTE (PG_MANAGED | PG_W | PG_G | PG_PTE_PAT | \ 94241593Sjhb PG_M | PG_A | PG_NC_PCD | PG_NC_PWT | PG_U | PG_RW | PG_V) 9534480Sjulian 9639234Sgibbs/* 9739234Sgibbs * Page Protection Exception bits 9839234Sgibbs */ 9939234Sgibbs 10039234Sgibbs#define PGEX_P 0x01 /* Protection violation vs. not present */ 10139234Sgibbs#define PGEX_W 0x02 /* during a Write cycle */ 10232801Sjulian#define PGEX_U 0x04 /* access from User mode (UPL) */ 10339234Sgibbs#define PGEX_RSV 0x08 /* reserved PTE field is non-zero */ 10439234Sgibbs#define PGEX_I 0x10 /* during an instruction fetch */ 10539234Sgibbs 10638115Seivind/* 10739234Sgibbs * Size of Kernel address space. This is the number of page table pages 10839234Sgibbs * (4MB each) to use for the kernel. 256 pages == 1 Gigabyte. 10939234Sgibbs * This **MUST** be a multiple of 4 (eg: 252, 256, 260, etc). 110166091Smarius * For PAE, the page table page unit size is 2MB. This means that 512 pages 11152042Smdodd * is 1 Gigabyte. Double everything. It must be a multiple of 8 for PAE. 112166091Smarius */ 11339234Sgibbs#ifndef KVA_PAGES 11439234Sgibbs#if defined(PAE) || defined(PAE_TABLES) 11539234Sgibbs#define KVA_PAGES 512 11639234Sgibbs#else 11739234Sgibbs#define KVA_PAGES 256 118106527Sjhb#endif 11939234Sgibbs#endif 12032801Sjulian 12139234Sgibbs/* 12239234Sgibbs * Pte related macros 12339234Sgibbs */ 12439234Sgibbs#define VADDR(pdi, pti) ((vm_offset_t)(((pdi)<<PDRSHIFT)|((pti)<<PAGE_SHIFT))) 12539234Sgibbs 12639234Sgibbs/* 12732801Sjulian * The initial number of kernel page table pages that are constructed 12839234Sgibbs * by locore must be sufficient to map vm_page_array. That number can 12939234Sgibbs * be calculated as follows: 13039234Sgibbs * max_phys / PAGE_SIZE * sizeof(struct vm_page) / NBPDR 13132801Sjulian * PAE: max_phys 16G, sizeof(vm_page) 76, NBPDR 2M, 152 page table pages. 13239234Sgibbs * PAE_TABLES: max_phys 4G, sizeof(vm_page) 68, NBPDR 2M, 36 page table pages. 13339234Sgibbs * Non-PAE: max_phys 4G, sizeof(vm_page) 68, NBPDR 4M, 18 page table pages. 13432801Sjulian */ 13539234Sgibbs#ifndef NKPT 13632801Sjulian#if defined(PAE) 13739234Sgibbs#define NKPT 240 13839234Sgibbs#elif defined(PAE_TABLES) 13939234Sgibbs#define NKPT 60 14039234Sgibbs#else 14139234Sgibbs#define NKPT 30 14239234Sgibbs#endif 14332801Sjulian#endif 14439234Sgibbs 145241593Sjhb#ifndef NKPDE 14632801Sjulian#define NKPDE (KVA_PAGES) /* number of page tables/pde's */ 14739234Sgibbs#endif 14839234Sgibbs 14932801Sjulian/* 15039234Sgibbs * The *PTDI values control the layout of virtual memory 15132801Sjulian * 15239234Sgibbs * XXX This works for now, but I am not real happy with it, I'll fix it 15339234Sgibbs * right after I fix locore.s and the magic 28K hole 15439234Sgibbs */ 15539234Sgibbs#define KPTDI (NPDEPTD-NKPDE) /* start of kernel virtual pde's */ 15639234Sgibbs#define PTDPTDI (KPTDI-NPGPTD) /* ptd entry that points to ptd! */ 15739234Sgibbs 15839234Sgibbs/* 15939234Sgibbs * XXX doesn't really belong here I guess... 16032801Sjulian */ 16139234Sgibbs#define ISA_HOLE_START 0xa0000 16250107Smsmith#define ISA_HOLE_LENGTH (0x100000-ISA_HOLE_START) 16334480Sjulian 16439234Sgibbs#ifndef LOCORE 16539234Sgibbs 16639234Sgibbs#include <sys/queue.h> 16739234Sgibbs#include <sys/_cpuset.h> 16839234Sgibbs#include <sys/_lock.h> 16939234Sgibbs#include <sys/_mutex.h> 17039234Sgibbs 17139234Sgibbs#include <vm/_vm_radix.h> 17239234Sgibbs 17339234Sgibbs#if defined(PAE) || defined(PAE_TABLES) 17439234Sgibbs 17539234Sgibbstypedef uint64_t pdpt_entry_t; 17632801Sjuliantypedef uint64_t pd_entry_t; 17739234Sgibbstypedef uint64_t pt_entry_t; 17839234Sgibbs 17939234Sgibbs#define PTESHIFT (3) 18039234Sgibbs#define PDESHIFT (3) 18139234Sgibbs 18239234Sgibbs#else 18339234Sgibbs 18439234Sgibbstypedef uint32_t pd_entry_t; 18539234Sgibbstypedef uint32_t pt_entry_t; 18639234Sgibbs 18732801Sjulian#define PTESHIFT (2) 188166091Smarius#define PDESHIFT (2) 18939234Sgibbs 19052042Smdodd#endif 19152042Smdodd 19252042Smdodd/* 19352042Smdodd * Address of current address space page table maps and directories. 19452042Smdodd */ 19552042Smdodd#ifdef _KERNEL 19652042Smdoddextern pt_entry_t PTmap[]; 19752042Smdoddextern pd_entry_t PTD[]; 19852042Smdoddextern pd_entry_t PTDpde[]; 19952042Smdodd 20052042Smdodd#if defined(PAE) || defined(PAE_TABLES) 20152042Smdoddextern pdpt_entry_t *IdlePDPT; 20252042Smdodd#endif 20352042Smdoddextern pd_entry_t *IdlePTD; /* physical address of "Idle" state directory */ 204166091Smarius 20552042Smdodd/* 20652042Smdodd * Translate a virtual address to the kernel virtual address of its page table 20739234Sgibbs * entry (PTE). This can be used recursively. If the address of a PTE as 20839234Sgibbs * previously returned by this macro is itself given as the argument, then the 20939234Sgibbs * address of the page directory entry (PDE) that maps the PTE will be 21039234Sgibbs * returned. 21132801Sjulian * 21239234Sgibbs * This macro may be used before pmap_bootstrap() is called. 21339234Sgibbs */ 21439234Sgibbs#define vtopte(va) (PTmap + i386_btop(va)) 21539234Sgibbs 21639234Sgibbs/* 21739234Sgibbs * Translate a virtual address to its physical address. 21839234Sgibbs * 21939234Sgibbs * This macro may be used before pmap_bootstrap() is called. 22039234Sgibbs */ 22132801Sjulian#define vtophys(va) pmap_kextract((vm_offset_t)(va)) 22239234Sgibbs 22339234Sgibbs/* 22439234Sgibbs * KPTmap is a linear mapping of the kernel page table. It differs from the 22539234Sgibbs * recursive mapping in two ways: (1) it only provides access to kernel page 22632801Sjulian * table pages, and not user page table pages, and (2) it provides access to 227241593Sjhb * a kernel page table page after the corresponding virtual addresses have 228241593Sjhb * been promoted to a 2/4MB page mapping. 22939234Sgibbs * 23039234Sgibbs * KPTmap is first initialized by locore to support just NPKT page table 23139234Sgibbs * pages. Later, it is reinitialized by pmap_bootstrap() to allow for 23239234Sgibbs * expansion of the kernel page table. 23339234Sgibbs */ 23439234Sgibbsextern pt_entry_t *KPTmap; 23539234Sgibbs 236241593Sjhb/* 23739234Sgibbs * Extract from the kernel page table the physical address that is mapped by 23839234Sgibbs * the given virtual address "va". 23939234Sgibbs * 24039234Sgibbs * This function may be used before pmap_bootstrap() is called. 24139234Sgibbs */ 24239234Sgibbsstatic __inline vm_paddr_t 24339234Sgibbspmap_kextract(vm_offset_t va) 24439234Sgibbs{ 24539234Sgibbs vm_paddr_t pa; 24639234Sgibbs 24739234Sgibbs if ((pa = PTD[va >> PDRSHIFT]) & PG_PS) { 24832801Sjulian pa = (pa & PG_PS_FRAME) | (va & PDRMASK); 24932801Sjulian } else { 250241593Sjhb /* 251241593Sjhb * Beware of a concurrent promotion that changes the PDE at 25239234Sgibbs * this point! For example, vtopte() must not be used to 25339234Sgibbs * access the PTE because it would use the new PDE. It is, 25439234Sgibbs * however, safe to use the old PDE because the page table 25539234Sgibbs * page is preserved by the promotion. 25639234Sgibbs */ 25739234Sgibbs pa = KPTmap[i386_btop(va)]; 25839234Sgibbs pa = (pa & PG_FRAME) | (va & PAGE_MASK); 25939234Sgibbs } 26039234Sgibbs return (pa); 26139234Sgibbs} 26239234Sgibbs 26339234Sgibbs#if (defined(PAE) || defined(PAE_TABLES)) 26439234Sgibbs 26539234Sgibbs#define pde_cmpset(pdep, old, new) atomic_cmpset_64_i586(pdep, old, new) 266106527Sjhb#define pte_load_store(ptep, pte) atomic_swap_64_i586(ptep, pte) 26739234Sgibbs#define pte_load_clear(ptep) atomic_swap_64_i586(ptep, 0) 26832801Sjulian#define pte_store(ptep, pte) atomic_store_rel_64_i586(ptep, pte) 26939234Sgibbs 27039234Sgibbsextern pt_entry_t pg_nx; 27139234Sgibbs 27232801Sjulian#else /* !(PAE || PAE_TABLES) */ 27339234Sgibbs 274106527Sjhb#define pde_cmpset(pdep, old, new) atomic_cmpset_int(pdep, old, new) 27539234Sgibbs#define pte_load_store(ptep, pte) atomic_swap_int(ptep, pte) 27639234Sgibbs#define pte_load_clear(ptep) atomic_swap_int(ptep, 0) 27739234Sgibbs#define pte_store(ptep, pte) do { \ 27839234Sgibbs *(u_int *)(ptep) = (u_int)(pte); \ 27939234Sgibbs} while (0) 28032801Sjulian 28139234Sgibbs#endif /* !(PAE || PAE_TABLES) */ 28239234Sgibbs 28339234Sgibbs#define pte_clear(ptep) pte_store(ptep, 0) 28439234Sgibbs 28539234Sgibbs#define pde_store(pdep, pde) pte_store(pdep, pde) 28639234Sgibbs 28739234Sgibbs#endif /* _KERNEL */ 28839234Sgibbs 28939234Sgibbs/* 29039234Sgibbs * Pmap stuff 29139234Sgibbs */ 29239234Sgibbsstruct pv_entry; 29339234Sgibbsstruct pv_chunk; 29439234Sgibbs 29539234Sgibbsstruct md_page { 29639234Sgibbs TAILQ_HEAD(,pv_entry) pv_list; 29732801Sjulian int pat_mode; 29839234Sgibbs}; 29932801Sjulian 30039234Sgibbsstruct pmap { 30139234Sgibbs struct mtx pm_mtx; 30239234Sgibbs pd_entry_t *pm_pdir; /* KVA of page directory */ 30339234Sgibbs TAILQ_HEAD(,pv_chunk) pm_pvchunk; /* list of mappings in pmap */ 30432801Sjulian cpuset_t pm_active; /* active on cpus */ 30532801Sjulian struct pmap_statistics pm_stats; /* pmap statistics */ 30639234Sgibbs LIST_ENTRY(pmap) pm_list; /* List of all pmaps */ 30739234Sgibbs#if defined(PAE) || defined(PAE_TABLES) 30839234Sgibbs pdpt_entry_t *pm_pdpt; /* KVA of page directory pointer 30939234Sgibbs table */ 31032801Sjulian#endif 31139234Sgibbs struct vm_radix pm_root; /* spare page table pages */ 31239234Sgibbs}; 31339234Sgibbs 31439234Sgibbstypedef struct pmap *pmap_t; 31539234Sgibbs 31639234Sgibbs#ifdef _KERNEL 31739234Sgibbsextern struct pmap kernel_pmap_store; 31839234Sgibbs#define kernel_pmap (&kernel_pmap_store) 31939234Sgibbs 32039234Sgibbs#define PMAP_LOCK(pmap) mtx_lock(&(pmap)->pm_mtx) 32139234Sgibbs#define PMAP_LOCK_ASSERT(pmap, type) \ 32239234Sgibbs mtx_assert(&(pmap)->pm_mtx, (type)) 32342018Seivind#define PMAP_LOCK_DESTROY(pmap) mtx_destroy(&(pmap)->pm_mtx) 32442018Seivind#define PMAP_LOCK_INIT(pmap) mtx_init(&(pmap)->pm_mtx, "pmap", \ 32542018Seivind NULL, MTX_DEF | MTX_DUPOK) 32641996Seivind#define PMAP_LOCKED(pmap) mtx_owned(&(pmap)->pm_mtx) 32739234Sgibbs#define PMAP_MTX(pmap) (&(pmap)->pm_mtx) 32839234Sgibbs#define PMAP_TRYLOCK(pmap) mtx_trylock(&(pmap)->pm_mtx) 32939234Sgibbs#define PMAP_UNLOCK(pmap) mtx_unlock(&(pmap)->pm_mtx) 33039234Sgibbs#endif 33139234Sgibbs 33239234Sgibbs/* 33339234Sgibbs * For each vm_page_t, there is a list of all currently valid virtual 33439234Sgibbs * mappings of that page. An entry is a pv_entry_t, the list is pv_list. 33539234Sgibbs */ 33639234Sgibbstypedef struct pv_entry { 33732801Sjulian vm_offset_t pv_va; /* virtual address for mapping */ 33839234Sgibbs TAILQ_ENTRY(pv_entry) pv_next; 33939234Sgibbs} *pv_entry_t; 34039234Sgibbs 34139234Sgibbs/* 34239234Sgibbs * pv_entries are allocated in chunks per-process. This avoids the 34339234Sgibbs * need to track per-pmap assignments. 34432801Sjulian */ 345241593Sjhb#define _NPCM 11 346241593Sjhb#define _NPCPV 336 34739234Sgibbsstruct pv_chunk { 34839234Sgibbs pmap_t pc_pmap; 34939234Sgibbs TAILQ_ENTRY(pv_chunk) pc_list; 35039234Sgibbs uint32_t pc_map[_NPCM]; /* bitmap; 1 = free */ 35139234Sgibbs TAILQ_ENTRY(pv_chunk) pc_lru; 35239234Sgibbs struct pv_entry pc_pventry[_NPCPV]; 35339234Sgibbs}; 35439234Sgibbs 35539234Sgibbs#ifdef _KERNEL 35632801Sjulian 35739234Sgibbsextern caddr_t CADDR3; 35832801Sjulianextern pt_entry_t *CMAP3; 35939234Sgibbsextern vm_paddr_t phys_avail[]; 36039234Sgibbsextern vm_paddr_t dump_avail[]; 36139234Sgibbsextern int pseflag; 36239234Sgibbsextern int pgeflag; 36339234Sgibbsextern char *ptvmmap; /* poor name! */ 36439234Sgibbsextern vm_offset_t virtual_avail; 36539234Sgibbsextern vm_offset_t virtual_end; 36639234Sgibbs 36739234Sgibbs#define pmap_page_get_memattr(m) ((vm_memattr_t)(m)->md.pat_mode) 36839234Sgibbs#define pmap_page_is_write_mapped(m) (((m)->aflags & PGA_WRITEABLE) != 0) 36939234Sgibbs#define pmap_unmapbios(va, sz) pmap_unmapdev((va), (sz)) 37039234Sgibbs 37139234Sgibbs/* 37239234Sgibbs * Only the following functions or macros may be used before pmap_bootstrap() 37339234Sgibbs * is called: pmap_kenter(), pmap_kextract(), pmap_kremove(), vtophys(), and 374241593Sjhb * vtopte(). 37539234Sgibbs */ 37639234Sgibbsvoid pmap_bootstrap(vm_paddr_t); 37739234Sgibbsint pmap_cache_bits(int mode, boolean_t is_pde); 37839234Sgibbsint pmap_change_attr(vm_offset_t, vm_size_t, int); 37939234Sgibbsvoid pmap_init_pat(void); 38039234Sgibbsvoid pmap_kenter(vm_offset_t va, vm_paddr_t pa); 38139234Sgibbsvoid *pmap_kenter_temporary(vm_paddr_t pa, int i); 38239234Sgibbsvoid pmap_kremove(vm_offset_t); 38339234Sgibbsvoid *pmap_mapbios(vm_paddr_t, vm_size_t); 38439515Sgibbsvoid *pmap_mapdev(vm_paddr_t, vm_size_t); 38539234Sgibbsvoid *pmap_mapdev_attr(vm_paddr_t, vm_size_t, int); 38639553Sgibbsboolean_t pmap_page_is_mapped(vm_page_t m); 38739234Sgibbsvoid pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma); 38839234Sgibbsvoid pmap_unmapdev(vm_offset_t, vm_size_t); 38939234Sgibbspt_entry_t *pmap_pte(pmap_t, vm_offset_t) __pure2; 39039234Sgibbsvoid pmap_invalidate_page(pmap_t, vm_offset_t); 39139234Sgibbsvoid pmap_invalidate_range(pmap_t, vm_offset_t, vm_offset_t); 39239234Sgibbsvoid pmap_invalidate_all(pmap_t); 39332801Sjulianvoid pmap_invalidate_cache(void); 39432801Sjulianvoid pmap_invalidate_cache_pages(vm_page_t *pages, int count); 395166091Smariusvoid pmap_invalidate_cache_range(vm_offset_t sva, vm_offset_t eva, 39652042Smdodd boolean_t force); 39752042Smdodd 39852042Smdoddvoid invltlb_glob(void); 39952042Smdodd 40052042Smdodd#endif /* _KERNEL */ 40152042Smdodd 40252042Smdodd#endif /* !LOCORE */ 40352042Smdodd 40452042Smdodd#endif /* !_MACHINE_PMAP_H_ */ 40552042Smdodd