19a527560SKonstantin Belousov /*- 29a527560SKonstantin Belousov * SPDX-License-Identifier: BSD-4-Clause 39a527560SKonstantin Belousov * 49a527560SKonstantin Belousov * Copyright (c) 1991 Regents of the University of California. 59a527560SKonstantin Belousov * All rights reserved. 69a527560SKonstantin Belousov * Copyright (c) 1994 John S. Dyson 79a527560SKonstantin Belousov * All rights reserved. 89a527560SKonstantin Belousov * Copyright (c) 1994 David Greenman 99a527560SKonstantin Belousov * All rights reserved. 109a527560SKonstantin Belousov * Copyright (c) 2005-2010 Alan L. Cox <alc@cs.rice.edu> 119a527560SKonstantin Belousov * All rights reserved. 129a527560SKonstantin Belousov * 139a527560SKonstantin Belousov * This code is derived from software contributed to Berkeley by 149a527560SKonstantin Belousov * the Systems Programming Group of the University of Utah Computer 159a527560SKonstantin Belousov * Science Department and William Jolitz of UUNET Technologies Inc. 169a527560SKonstantin Belousov * 179a527560SKonstantin Belousov * Redistribution and use in source and binary forms, with or without 189a527560SKonstantin Belousov * modification, are permitted provided that the following conditions 199a527560SKonstantin Belousov * are met: 209a527560SKonstantin Belousov * 1. Redistributions of source code must retain the above copyright 219a527560SKonstantin Belousov * notice, this list of conditions and the following disclaimer. 229a527560SKonstantin Belousov * 2. Redistributions in binary form must reproduce the above copyright 239a527560SKonstantin Belousov * notice, this list of conditions and the following disclaimer in the 249a527560SKonstantin Belousov * documentation and/or other materials provided with the distribution. 259a527560SKonstantin Belousov * 3. All advertising materials mentioning features or use of this software 269a527560SKonstantin Belousov * must display the following acknowledgement: 279a527560SKonstantin Belousov * This product includes software developed by the University of 289a527560SKonstantin Belousov * California, Berkeley and its contributors. 299a527560SKonstantin Belousov * 4. Neither the name of the University nor the names of its contributors 309a527560SKonstantin Belousov * may be used to endorse or promote products derived from this software 319a527560SKonstantin Belousov * without specific prior written permission. 329a527560SKonstantin Belousov * 339a527560SKonstantin Belousov * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 349a527560SKonstantin Belousov * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 359a527560SKonstantin Belousov * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 369a527560SKonstantin Belousov * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 379a527560SKonstantin Belousov * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 389a527560SKonstantin Belousov * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 399a527560SKonstantin Belousov * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 409a527560SKonstantin Belousov * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 419a527560SKonstantin Belousov * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 429a527560SKonstantin Belousov * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 439a527560SKonstantin Belousov * SUCH DAMAGE. 449a527560SKonstantin Belousov * 459a527560SKonstantin Belousov * from: @(#)pmap.c 7.7 (Berkeley) 5/12/91 469a527560SKonstantin Belousov */ 479a527560SKonstantin Belousov /*- 489a527560SKonstantin Belousov * Copyright (c) 2003 Networks Associates Technology, Inc. 499a527560SKonstantin Belousov * All rights reserved. 509a527560SKonstantin Belousov * Copyright (c) 2018 The FreeBSD Foundation 519a527560SKonstantin Belousov * All rights reserved. 529a527560SKonstantin Belousov * 539a527560SKonstantin Belousov * This software was developed for the FreeBSD Project by Jake Burkholder, 549a527560SKonstantin Belousov * Safeport Network Services, and Network Associates Laboratories, the 559a527560SKonstantin Belousov * Security Research Division of Network Associates, Inc. under 569a527560SKonstantin Belousov * DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA 579a527560SKonstantin Belousov * CHATS research program. 589a527560SKonstantin Belousov * 599a527560SKonstantin Belousov * Portions of this software were developed by 609a527560SKonstantin Belousov * Konstantin Belousov <kib@FreeBSD.org> under sponsorship from 619a527560SKonstantin Belousov * the FreeBSD Foundation. 629a527560SKonstantin Belousov * 639a527560SKonstantin Belousov * Redistribution and use in source and binary forms, with or without 649a527560SKonstantin Belousov * modification, are permitted provided that the following conditions 659a527560SKonstantin Belousov * are met: 669a527560SKonstantin Belousov * 1. Redistributions of source code must retain the above copyright 679a527560SKonstantin Belousov * notice, this list of conditions and the following disclaimer. 689a527560SKonstantin Belousov * 2. Redistributions in binary form must reproduce the above copyright 699a527560SKonstantin Belousov * notice, this list of conditions and the following disclaimer in the 709a527560SKonstantin Belousov * documentation and/or other materials provided with the distribution. 719a527560SKonstantin Belousov * 729a527560SKonstantin Belousov * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 739a527560SKonstantin Belousov * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 749a527560SKonstantin Belousov * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 759a527560SKonstantin Belousov * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 769a527560SKonstantin Belousov * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 779a527560SKonstantin Belousov * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 789a527560SKonstantin Belousov * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 799a527560SKonstantin Belousov * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 809a527560SKonstantin Belousov * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 819a527560SKonstantin Belousov * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 829a527560SKonstantin Belousov * SUCH DAMAGE. 839a527560SKonstantin Belousov */ 849a527560SKonstantin Belousov 859a527560SKonstantin Belousov #include <sys/cdefs.h> 869a527560SKonstantin Belousov __FBSDID("$FreeBSD$"); 879a527560SKonstantin Belousov 889a527560SKonstantin Belousov #include "opt_apic.h" 899a527560SKonstantin Belousov #include "opt_cpu.h" 909a527560SKonstantin Belousov #include "opt_pmap.h" 919a527560SKonstantin Belousov #include "opt_smp.h" 929a527560SKonstantin Belousov #include "opt_vm.h" 939a527560SKonstantin Belousov 949a527560SKonstantin Belousov #include <sys/param.h> 959a527560SKonstantin Belousov #include <sys/systm.h> 969a527560SKonstantin Belousov #include <sys/kernel.h> 979a527560SKonstantin Belousov #include <sys/vmmeter.h> 989a527560SKonstantin Belousov #include <sys/sysctl.h> 992648ed92SKonstantin Belousov #include <machine/bootinfo.h> 1009a527560SKonstantin Belousov #include <machine/cpu.h> 1019a527560SKonstantin Belousov #include <machine/cputypes.h> 1029a527560SKonstantin Belousov #include <machine/md_var.h> 1039a527560SKonstantin Belousov #ifdef DEV_APIC 1049a527560SKonstantin Belousov #include <sys/bus.h> 1059a527560SKonstantin Belousov #include <machine/intr_machdep.h> 1069a527560SKonstantin Belousov #include <x86/apicvar.h> 1079a527560SKonstantin Belousov #endif 1089a527560SKonstantin Belousov #include <x86/ifunc.h> 1099a527560SKonstantin Belousov 1107029da5cSPawel Biernacki static SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, 1117029da5cSPawel Biernacki "VM/pmap parameters"); 1129a527560SKonstantin Belousov 1139a527560SKonstantin Belousov #include <machine/vmparam.h> 1149a527560SKonstantin Belousov #include <vm/vm.h> 1159a527560SKonstantin Belousov #include <vm/vm_page.h> 1169a527560SKonstantin Belousov #include <vm/pmap.h> 1179a527560SKonstantin Belousov #include <machine/pmap_base.h> 1189a527560SKonstantin Belousov 1199a527560SKonstantin Belousov vm_offset_t virtual_avail; /* VA of first avail page (after kernel bss) */ 1209a527560SKonstantin Belousov vm_offset_t virtual_end; /* VA of last avail page (end of kernel AS) */ 1219a527560SKonstantin Belousov 1229a527560SKonstantin Belousov int unmapped_buf_allowed = 1; 1239a527560SKonstantin Belousov 1249a527560SKonstantin Belousov int pti; 1259a527560SKonstantin Belousov 1269a527560SKonstantin Belousov u_long physfree; /* phys addr of next free page */ 1279a527560SKonstantin Belousov u_long vm86phystk; /* PA of vm86/bios stack */ 1289a527560SKonstantin Belousov u_long vm86paddr; /* address of vm86 region */ 1299a527560SKonstantin Belousov int vm86pa; /* phys addr of vm86 region */ 1309a527560SKonstantin Belousov u_long KERNend; /* phys addr end of kernel (just after bss) */ 1319a527560SKonstantin Belousov u_long KPTphys; /* phys addr of kernel page tables */ 1329a527560SKonstantin Belousov caddr_t ptvmmap = 0; 1339a527560SKonstantin Belousov vm_offset_t kernel_vm_end; 1349a527560SKonstantin Belousov 1359a527560SKonstantin Belousov int i386_pmap_VM_NFREEORDER; 1369a527560SKonstantin Belousov int i386_pmap_VM_LEVEL_0_ORDER; 1379a527560SKonstantin Belousov int i386_pmap_PDRSHIFT; 1389a527560SKonstantin Belousov 1399a527560SKonstantin Belousov int pat_works = 1; 1409a527560SKonstantin Belousov SYSCTL_INT(_vm_pmap, OID_AUTO, pat_works, CTLFLAG_RD, 141c7301c6bSKonstantin Belousov &pat_works, 0, 1429a527560SKonstantin Belousov "Is page attribute table fully functional?"); 1439a527560SKonstantin Belousov 1449a527560SKonstantin Belousov int pg_ps_enabled = 1; 1459a527560SKonstantin Belousov SYSCTL_INT(_vm_pmap, OID_AUTO, pg_ps_enabled, CTLFLAG_RDTUN | CTLFLAG_NOFETCH, 1469a527560SKonstantin Belousov &pg_ps_enabled, 0, 1479a527560SKonstantin Belousov "Are large page mappings enabled?"); 1489a527560SKonstantin Belousov 1499a527560SKonstantin Belousov int pv_entry_max = 0; 1509a527560SKonstantin Belousov SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_max, CTLFLAG_RD, 1519a527560SKonstantin Belousov &pv_entry_max, 0, 1529a527560SKonstantin Belousov "Max number of PV entries"); 1539a527560SKonstantin Belousov 1549a527560SKonstantin Belousov int pv_entry_count = 0; 1559a527560SKonstantin Belousov SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_count, CTLFLAG_RD, 1569a527560SKonstantin Belousov &pv_entry_count, 0, 1579a527560SKonstantin Belousov "Current number of pv entries"); 1589a527560SKonstantin Belousov 1599a527560SKonstantin Belousov #ifndef PMAP_SHPGPERPROC 1609a527560SKonstantin Belousov #define PMAP_SHPGPERPROC 200 1619a527560SKonstantin Belousov #endif 1629a527560SKonstantin Belousov 1639a527560SKonstantin Belousov int shpgperproc = PMAP_SHPGPERPROC; 1649a527560SKonstantin Belousov SYSCTL_INT(_vm_pmap, OID_AUTO, shpgperproc, CTLFLAG_RD, 1659a527560SKonstantin Belousov &shpgperproc, 0, 1669a527560SKonstantin Belousov "Page share factor per proc"); 1679a527560SKonstantin Belousov 1687029da5cSPawel Biernacki static SYSCTL_NODE(_vm_pmap, OID_AUTO, pde, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, 1699a527560SKonstantin Belousov "2/4MB page mapping counters"); 1709a527560SKonstantin Belousov 1719a527560SKonstantin Belousov u_long pmap_pde_demotions; 1729a527560SKonstantin Belousov SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, demotions, CTLFLAG_RD, 1739a527560SKonstantin Belousov &pmap_pde_demotions, 0, 1749a527560SKonstantin Belousov "2/4MB page demotions"); 1759a527560SKonstantin Belousov 1769a527560SKonstantin Belousov u_long pmap_pde_mappings; 1779a527560SKonstantin Belousov SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, mappings, CTLFLAG_RD, 1789a527560SKonstantin Belousov &pmap_pde_mappings, 0, 1799a527560SKonstantin Belousov "2/4MB page mappings"); 1809a527560SKonstantin Belousov 1819a527560SKonstantin Belousov u_long pmap_pde_p_failures; 1829a527560SKonstantin Belousov SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, p_failures, CTLFLAG_RD, 1839a527560SKonstantin Belousov &pmap_pde_p_failures, 0, 1849a527560SKonstantin Belousov "2/4MB page promotion failures"); 1859a527560SKonstantin Belousov 1869a527560SKonstantin Belousov u_long pmap_pde_promotions; 1879a527560SKonstantin Belousov SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, promotions, CTLFLAG_RD, 1889a527560SKonstantin Belousov &pmap_pde_promotions, 0, 1899a527560SKonstantin Belousov "2/4MB page promotions"); 1909a527560SKonstantin Belousov 1919a527560SKonstantin Belousov #ifdef SMP 1929a527560SKonstantin Belousov int PMAP1changedcpu; 1939a527560SKonstantin Belousov SYSCTL_INT(_debug, OID_AUTO, PMAP1changedcpu, CTLFLAG_RD, 1949a527560SKonstantin Belousov &PMAP1changedcpu, 0, 1959a527560SKonstantin Belousov "Number of times pmap_pte_quick changed CPU with same PMAP1"); 1969a527560SKonstantin Belousov #endif 1979a527560SKonstantin Belousov 1989a527560SKonstantin Belousov int PMAP1changed; 1999a527560SKonstantin Belousov SYSCTL_INT(_debug, OID_AUTO, PMAP1changed, CTLFLAG_RD, 2009a527560SKonstantin Belousov &PMAP1changed, 0, 2019a527560SKonstantin Belousov "Number of times pmap_pte_quick changed PMAP1"); 2029a527560SKonstantin Belousov int PMAP1unchanged; 2039a527560SKonstantin Belousov SYSCTL_INT(_debug, OID_AUTO, PMAP1unchanged, CTLFLAG_RD, 2049a527560SKonstantin Belousov &PMAP1unchanged, 0, 2059a527560SKonstantin Belousov "Number of times pmap_pte_quick didn't change PMAP1"); 2069a527560SKonstantin Belousov 2079a527560SKonstantin Belousov static int 2089a527560SKonstantin Belousov kvm_size(SYSCTL_HANDLER_ARGS) 2099a527560SKonstantin Belousov { 2109a527560SKonstantin Belousov unsigned long ksize; 2119a527560SKonstantin Belousov 2129a527560SKonstantin Belousov ksize = VM_MAX_KERNEL_ADDRESS - KERNBASE; 2139a527560SKonstantin Belousov return (sysctl_handle_long(oidp, &ksize, 0, req)); 2149a527560SKonstantin Belousov } 2159a527560SKonstantin Belousov SYSCTL_PROC(_vm, OID_AUTO, kvm_size, CTLTYPE_LONG | CTLFLAG_RD | CTLFLAG_MPSAFE, 2169a527560SKonstantin Belousov 0, 0, kvm_size, "IU", 2179a527560SKonstantin Belousov "Size of KVM"); 2189a527560SKonstantin Belousov 2199a527560SKonstantin Belousov static int 2209a527560SKonstantin Belousov kvm_free(SYSCTL_HANDLER_ARGS) 2219a527560SKonstantin Belousov { 2229a527560SKonstantin Belousov unsigned long kfree; 2239a527560SKonstantin Belousov 2249a527560SKonstantin Belousov kfree = VM_MAX_KERNEL_ADDRESS - kernel_vm_end; 2259a527560SKonstantin Belousov return (sysctl_handle_long(oidp, &kfree, 0, req)); 2269a527560SKonstantin Belousov } 2279a527560SKonstantin Belousov SYSCTL_PROC(_vm, OID_AUTO, kvm_free, CTLTYPE_LONG | CTLFLAG_RD | CTLFLAG_MPSAFE, 2289a527560SKonstantin Belousov 0, 0, kvm_free, "IU", 2299a527560SKonstantin Belousov "Amount of KVM free"); 2309a527560SKonstantin Belousov 2319a527560SKonstantin Belousov #ifdef PV_STATS 2329a527560SKonstantin Belousov int pc_chunk_count, pc_chunk_allocs, pc_chunk_frees, pc_chunk_tryfail; 2339a527560SKonstantin Belousov long pv_entry_frees, pv_entry_allocs; 2349a527560SKonstantin Belousov int pv_entry_spare; 2359a527560SKonstantin Belousov 2369a527560SKonstantin Belousov SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_count, CTLFLAG_RD, 2379a527560SKonstantin Belousov &pc_chunk_count, 0, 2389a527560SKonstantin Belousov "Current number of pv entry chunks"); 2399a527560SKonstantin Belousov SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_allocs, CTLFLAG_RD, 2409a527560SKonstantin Belousov &pc_chunk_allocs, 0, 2419a527560SKonstantin Belousov "Current number of pv entry chunks allocated"); 2429a527560SKonstantin Belousov SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_frees, CTLFLAG_RD, 2439a527560SKonstantin Belousov &pc_chunk_frees, 0, 2449a527560SKonstantin Belousov "Current number of pv entry chunks frees"); 2459a527560SKonstantin Belousov SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_tryfail, CTLFLAG_RD, 2469a527560SKonstantin Belousov &pc_chunk_tryfail, 0, 2479a527560SKonstantin Belousov "Number of times tried to get a chunk page but failed."); 2489a527560SKonstantin Belousov SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_frees, CTLFLAG_RD, 2499a527560SKonstantin Belousov &pv_entry_frees, 0, 2509a527560SKonstantin Belousov "Current number of pv entry frees"); 2519a527560SKonstantin Belousov SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD, 2529a527560SKonstantin Belousov &pv_entry_allocs, 0, 2539a527560SKonstantin Belousov "Current number of pv entry allocs"); 2549a527560SKonstantin Belousov SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD, 2559a527560SKonstantin Belousov &pv_entry_spare, 0, 2569a527560SKonstantin Belousov "Current number of spare pv entries"); 2579a527560SKonstantin Belousov #endif 2589a527560SKonstantin Belousov 2599a527560SKonstantin Belousov struct pmap kernel_pmap_store; 2609a527560SKonstantin Belousov static struct pmap_methods *pmap_methods_ptr; 2619a527560SKonstantin Belousov 262b223a692SKonstantin Belousov static int 263b223a692SKonstantin Belousov sysctl_kmaps(SYSCTL_HANDLER_ARGS) 264b223a692SKonstantin Belousov { 265b223a692SKonstantin Belousov return (pmap_methods_ptr->pm_sysctl_kmaps(oidp, arg1, arg2, req)); 266b223a692SKonstantin Belousov } 267b223a692SKonstantin Belousov SYSCTL_OID(_vm_pmap, OID_AUTO, kernel_maps, 268*1dce7d9eSJohn Baldwin CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE | CTLFLAG_SKIP, 269b223a692SKonstantin Belousov NULL, 0, sysctl_kmaps, "A", 270b223a692SKonstantin Belousov "Dump kernel address layout"); 271b223a692SKonstantin Belousov 2729a527560SKonstantin Belousov /* 2739a527560SKonstantin Belousov * Initialize a vm_page's machine-dependent fields. 2749a527560SKonstantin Belousov */ 2759a527560SKonstantin Belousov void 2769a527560SKonstantin Belousov pmap_page_init(vm_page_t m) 2779a527560SKonstantin Belousov { 2789a527560SKonstantin Belousov 2799a527560SKonstantin Belousov TAILQ_INIT(&m->md.pv_list); 2809a527560SKonstantin Belousov m->md.pat_mode = PAT_WRITE_BACK; 2819a527560SKonstantin Belousov } 2829a527560SKonstantin Belousov 2839a527560SKonstantin Belousov void 2849a527560SKonstantin Belousov invltlb_glob(void) 2859a527560SKonstantin Belousov { 2869a527560SKonstantin Belousov 2879a527560SKonstantin Belousov invltlb(); 2889a527560SKonstantin Belousov } 2899a527560SKonstantin Belousov 2909a527560SKonstantin Belousov static void pmap_invalidate_cache_range_selfsnoop(vm_offset_t sva, 2919a527560SKonstantin Belousov vm_offset_t eva); 2929a527560SKonstantin Belousov static void pmap_invalidate_cache_range_all(vm_offset_t sva, 2939a527560SKonstantin Belousov vm_offset_t eva); 2949a527560SKonstantin Belousov 2959a527560SKonstantin Belousov void 2969a527560SKonstantin Belousov pmap_flush_page(vm_page_t m) 2979a527560SKonstantin Belousov { 2989a527560SKonstantin Belousov 2999a527560SKonstantin Belousov pmap_methods_ptr->pm_flush_page(m); 3009a527560SKonstantin Belousov } 3019a527560SKonstantin Belousov 3027c5a46a1SKonstantin Belousov DEFINE_IFUNC(, void, pmap_invalidate_cache_range, (vm_offset_t, vm_offset_t)) 3039a527560SKonstantin Belousov { 3049a527560SKonstantin Belousov 3059a527560SKonstantin Belousov if ((cpu_feature & CPUID_SS) != 0) 3069a527560SKonstantin Belousov return (pmap_invalidate_cache_range_selfsnoop); 3079a527560SKonstantin Belousov if ((cpu_feature & CPUID_CLFSH) != 0) 3089a527560SKonstantin Belousov return (pmap_force_invalidate_cache_range); 3099a527560SKonstantin Belousov return (pmap_invalidate_cache_range_all); 3109a527560SKonstantin Belousov } 3119a527560SKonstantin Belousov 3129a527560SKonstantin Belousov #define PMAP_CLFLUSH_THRESHOLD (2 * 1024 * 1024) 3139a527560SKonstantin Belousov 3149a527560SKonstantin Belousov static void 3159a527560SKonstantin Belousov pmap_invalidate_cache_range_check_align(vm_offset_t sva, vm_offset_t eva) 3169a527560SKonstantin Belousov { 3179a527560SKonstantin Belousov 3189a527560SKonstantin Belousov KASSERT((sva & PAGE_MASK) == 0, 3199a527560SKonstantin Belousov ("pmap_invalidate_cache_range: sva not page-aligned")); 3209a527560SKonstantin Belousov KASSERT((eva & PAGE_MASK) == 0, 3219a527560SKonstantin Belousov ("pmap_invalidate_cache_range: eva not page-aligned")); 3229a527560SKonstantin Belousov } 3239a527560SKonstantin Belousov 3249a527560SKonstantin Belousov static void 3259a527560SKonstantin Belousov pmap_invalidate_cache_range_selfsnoop(vm_offset_t sva, vm_offset_t eva) 3269a527560SKonstantin Belousov { 3279a527560SKonstantin Belousov 3289a527560SKonstantin Belousov pmap_invalidate_cache_range_check_align(sva, eva); 3299a527560SKonstantin Belousov } 3309a527560SKonstantin Belousov 3319a527560SKonstantin Belousov void 3329a527560SKonstantin Belousov pmap_force_invalidate_cache_range(vm_offset_t sva, vm_offset_t eva) 3339a527560SKonstantin Belousov { 3349a527560SKonstantin Belousov 3359a527560SKonstantin Belousov sva &= ~(vm_offset_t)(cpu_clflush_line_size - 1); 3369a527560SKonstantin Belousov if (eva - sva >= PMAP_CLFLUSH_THRESHOLD) { 3379a527560SKonstantin Belousov /* 3389a527560SKonstantin Belousov * The supplied range is bigger than 2MB. 3399a527560SKonstantin Belousov * Globally invalidate cache. 3409a527560SKonstantin Belousov */ 3419a527560SKonstantin Belousov pmap_invalidate_cache(); 3429a527560SKonstantin Belousov return; 3439a527560SKonstantin Belousov } 3449a527560SKonstantin Belousov 3459a527560SKonstantin Belousov #ifdef DEV_APIC 3469a527560SKonstantin Belousov /* 3479a527560SKonstantin Belousov * XXX: Some CPUs fault, hang, or trash the local APIC 3489a527560SKonstantin Belousov * registers if we use CLFLUSH on the local APIC 3499a527560SKonstantin Belousov * range. The local APIC is always uncached, so we 3509a527560SKonstantin Belousov * don't need to flush for that range anyway. 3519a527560SKonstantin Belousov */ 3529a527560SKonstantin Belousov if (pmap_kextract(sva) == lapic_paddr) 3539a527560SKonstantin Belousov return; 3549a527560SKonstantin Belousov #endif 3559a527560SKonstantin Belousov 3569a527560SKonstantin Belousov if ((cpu_stdext_feature & CPUID_STDEXT_CLFLUSHOPT) != 0) { 3579a527560SKonstantin Belousov /* 3589a527560SKonstantin Belousov * Do per-cache line flush. Use the sfence 3599a527560SKonstantin Belousov * instruction to insure that previous stores are 3609a527560SKonstantin Belousov * included in the write-back. The processor 3619a527560SKonstantin Belousov * propagates flush to other processors in the cache 3629a527560SKonstantin Belousov * coherence domain. 3639a527560SKonstantin Belousov */ 3649a527560SKonstantin Belousov sfence(); 3659a527560SKonstantin Belousov for (; sva < eva; sva += cpu_clflush_line_size) 3669a527560SKonstantin Belousov clflushopt(sva); 3679a527560SKonstantin Belousov sfence(); 3689a527560SKonstantin Belousov } else { 3699a527560SKonstantin Belousov /* 3709a527560SKonstantin Belousov * Writes are ordered by CLFLUSH on Intel CPUs. 3719a527560SKonstantin Belousov */ 3729a527560SKonstantin Belousov if (cpu_vendor_id != CPU_VENDOR_INTEL) 3739a527560SKonstantin Belousov mfence(); 3749a527560SKonstantin Belousov for (; sva < eva; sva += cpu_clflush_line_size) 3759a527560SKonstantin Belousov clflush(sva); 3769a527560SKonstantin Belousov if (cpu_vendor_id != CPU_VENDOR_INTEL) 3779a527560SKonstantin Belousov mfence(); 3789a527560SKonstantin Belousov } 3799a527560SKonstantin Belousov } 3809a527560SKonstantin Belousov 3819a527560SKonstantin Belousov static void 3829a527560SKonstantin Belousov pmap_invalidate_cache_range_all(vm_offset_t sva, vm_offset_t eva) 3839a527560SKonstantin Belousov { 3849a527560SKonstantin Belousov 3859a527560SKonstantin Belousov pmap_invalidate_cache_range_check_align(sva, eva); 3869a527560SKonstantin Belousov pmap_invalidate_cache(); 3879a527560SKonstantin Belousov } 3889a527560SKonstantin Belousov 3899a527560SKonstantin Belousov void 3909a527560SKonstantin Belousov pmap_invalidate_cache_pages(vm_page_t *pages, int count) 3919a527560SKonstantin Belousov { 3929a527560SKonstantin Belousov int i; 3939a527560SKonstantin Belousov 3949a527560SKonstantin Belousov if (count >= PMAP_CLFLUSH_THRESHOLD / PAGE_SIZE || 3959a527560SKonstantin Belousov (cpu_feature & CPUID_CLFSH) == 0) { 3969a527560SKonstantin Belousov pmap_invalidate_cache(); 3979a527560SKonstantin Belousov } else { 3989a527560SKonstantin Belousov for (i = 0; i < count; i++) 3999a527560SKonstantin Belousov pmap_flush_page(pages[i]); 4009a527560SKonstantin Belousov } 4019a527560SKonstantin Belousov } 4029a527560SKonstantin Belousov 4039a527560SKonstantin Belousov void 4049a527560SKonstantin Belousov pmap_ksetrw(vm_offset_t va) 4059a527560SKonstantin Belousov { 4069a527560SKonstantin Belousov 4079a527560SKonstantin Belousov pmap_methods_ptr->pm_ksetrw(va); 4089a527560SKonstantin Belousov } 4099a527560SKonstantin Belousov 4109a527560SKonstantin Belousov void 4119a527560SKonstantin Belousov pmap_remap_lower(bool enable) 4129a527560SKonstantin Belousov { 4139a527560SKonstantin Belousov 4149a527560SKonstantin Belousov pmap_methods_ptr->pm_remap_lower(enable); 4159a527560SKonstantin Belousov } 4169a527560SKonstantin Belousov 4179a527560SKonstantin Belousov void 4189a527560SKonstantin Belousov pmap_remap_lowptdi(bool enable) 4199a527560SKonstantin Belousov { 4209a527560SKonstantin Belousov 4219a527560SKonstantin Belousov pmap_methods_ptr->pm_remap_lowptdi(enable); 4229a527560SKonstantin Belousov } 4239a527560SKonstantin Belousov 4249a527560SKonstantin Belousov void 4259a527560SKonstantin Belousov pmap_align_superpage(vm_object_t object, vm_ooffset_t offset, 4269a527560SKonstantin Belousov vm_offset_t *addr, vm_size_t size) 4279a527560SKonstantin Belousov { 4289a527560SKonstantin Belousov 4299a527560SKonstantin Belousov return (pmap_methods_ptr->pm_align_superpage(object, offset, 4309a527560SKonstantin Belousov addr, size)); 4319a527560SKonstantin Belousov } 4329a527560SKonstantin Belousov 4339a527560SKonstantin Belousov vm_offset_t 4349a527560SKonstantin Belousov pmap_quick_enter_page(vm_page_t m) 4359a527560SKonstantin Belousov { 4369a527560SKonstantin Belousov 4379a527560SKonstantin Belousov return (pmap_methods_ptr->pm_quick_enter_page(m)); 4389a527560SKonstantin Belousov } 4399a527560SKonstantin Belousov 4409a527560SKonstantin Belousov void 4419a527560SKonstantin Belousov pmap_quick_remove_page(vm_offset_t addr) 4429a527560SKonstantin Belousov { 4439a527560SKonstantin Belousov 4449a527560SKonstantin Belousov return (pmap_methods_ptr->pm_quick_remove_page(addr)); 4459a527560SKonstantin Belousov } 4469a527560SKonstantin Belousov 4479a527560SKonstantin Belousov void * 4489a527560SKonstantin Belousov pmap_trm_alloc(size_t size, int flags) 4499a527560SKonstantin Belousov { 4509a527560SKonstantin Belousov 4519a527560SKonstantin Belousov return (pmap_methods_ptr->pm_trm_alloc(size, flags)); 4529a527560SKonstantin Belousov } 4539a527560SKonstantin Belousov 4549a527560SKonstantin Belousov void 4559a527560SKonstantin Belousov pmap_trm_free(void *addr, size_t size) 4569a527560SKonstantin Belousov { 4579a527560SKonstantin Belousov 4589a527560SKonstantin Belousov pmap_methods_ptr->pm_trm_free(addr, size); 4599a527560SKonstantin Belousov } 4609a527560SKonstantin Belousov 4619a527560SKonstantin Belousov void 4629a527560SKonstantin Belousov pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz) 4639a527560SKonstantin Belousov { 4649a527560SKonstantin Belousov } 4659a527560SKonstantin Belousov 4669a527560SKonstantin Belousov vm_offset_t 4679a527560SKonstantin Belousov pmap_get_map_low(void) 4689a527560SKonstantin Belousov { 4699a527560SKonstantin Belousov 4709a527560SKonstantin Belousov return (pmap_methods_ptr->pm_get_map_low()); 4719a527560SKonstantin Belousov } 4729a527560SKonstantin Belousov 4739a527560SKonstantin Belousov vm_offset_t 4749a527560SKonstantin Belousov pmap_get_vm_maxuser_address(void) 4759a527560SKonstantin Belousov { 4769a527560SKonstantin Belousov 4779a527560SKonstantin Belousov return (pmap_methods_ptr->pm_get_vm_maxuser_address()); 4789a527560SKonstantin Belousov } 4799a527560SKonstantin Belousov 4809a527560SKonstantin Belousov vm_paddr_t 4819a527560SKonstantin Belousov pmap_kextract(vm_offset_t va) 4829a527560SKonstantin Belousov { 4839a527560SKonstantin Belousov 4849a527560SKonstantin Belousov return (pmap_methods_ptr->pm_kextract(va)); 4859a527560SKonstantin Belousov } 4869a527560SKonstantin Belousov 4879a527560SKonstantin Belousov vm_paddr_t 4889a527560SKonstantin Belousov pmap_pg_frame(vm_paddr_t pa) 4899a527560SKonstantin Belousov { 4909a527560SKonstantin Belousov 4919a527560SKonstantin Belousov return (pmap_methods_ptr->pm_pg_frame(pa)); 4929a527560SKonstantin Belousov } 4939a527560SKonstantin Belousov 4949a527560SKonstantin Belousov void 4959a527560SKonstantin Belousov pmap_sf_buf_map(struct sf_buf *sf) 4969a527560SKonstantin Belousov { 4979a527560SKonstantin Belousov 4989a527560SKonstantin Belousov pmap_methods_ptr->pm_sf_buf_map(sf); 4999a527560SKonstantin Belousov } 5009a527560SKonstantin Belousov 5019a527560SKonstantin Belousov void 5029a527560SKonstantin Belousov pmap_cp_slow0_map(vm_offset_t kaddr, int plen, vm_page_t *ma) 5039a527560SKonstantin Belousov { 5049a527560SKonstantin Belousov 5059a527560SKonstantin Belousov pmap_methods_ptr->pm_cp_slow0_map(kaddr, plen, ma); 5069a527560SKonstantin Belousov } 5079a527560SKonstantin Belousov 5089a527560SKonstantin Belousov u_int 5099a527560SKonstantin Belousov pmap_get_kcr3(void) 5109a527560SKonstantin Belousov { 5119a527560SKonstantin Belousov 5129a527560SKonstantin Belousov return (pmap_methods_ptr->pm_get_kcr3()); 5139a527560SKonstantin Belousov } 5149a527560SKonstantin Belousov 5159a527560SKonstantin Belousov u_int 5169a527560SKonstantin Belousov pmap_get_cr3(pmap_t pmap) 5179a527560SKonstantin Belousov { 5189a527560SKonstantin Belousov 5199a527560SKonstantin Belousov return (pmap_methods_ptr->pm_get_cr3(pmap)); 5209a527560SKonstantin Belousov } 5219a527560SKonstantin Belousov 5229a527560SKonstantin Belousov caddr_t 5239a527560SKonstantin Belousov pmap_cmap3(vm_paddr_t pa, u_int pte_flags) 5249a527560SKonstantin Belousov { 5259a527560SKonstantin Belousov 5269a527560SKonstantin Belousov return (pmap_methods_ptr->pm_cmap3(pa, pte_flags)); 5279a527560SKonstantin Belousov } 5289a527560SKonstantin Belousov 5299a527560SKonstantin Belousov void 5309a527560SKonstantin Belousov pmap_basemem_setup(u_int basemem) 5319a527560SKonstantin Belousov { 5329a527560SKonstantin Belousov 5339a527560SKonstantin Belousov pmap_methods_ptr->pm_basemem_setup(basemem); 5349a527560SKonstantin Belousov } 5359a527560SKonstantin Belousov 5369a527560SKonstantin Belousov void 5379a527560SKonstantin Belousov pmap_set_nx(void) 5389a527560SKonstantin Belousov { 5399a527560SKonstantin Belousov 5409a527560SKonstantin Belousov pmap_methods_ptr->pm_set_nx(); 5419a527560SKonstantin Belousov } 5429a527560SKonstantin Belousov 5439a527560SKonstantin Belousov void * 5449a527560SKonstantin Belousov pmap_bios16_enter(void) 5459a527560SKonstantin Belousov { 5469a527560SKonstantin Belousov 5479a527560SKonstantin Belousov return (pmap_methods_ptr->pm_bios16_enter()); 5489a527560SKonstantin Belousov } 5499a527560SKonstantin Belousov 5509a527560SKonstantin Belousov void 5519a527560SKonstantin Belousov pmap_bios16_leave(void *handle) 5529a527560SKonstantin Belousov { 5539a527560SKonstantin Belousov 5549a527560SKonstantin Belousov pmap_methods_ptr->pm_bios16_leave(handle); 5559a527560SKonstantin Belousov } 5569a527560SKonstantin Belousov 5579a527560SKonstantin Belousov void 5589a527560SKonstantin Belousov pmap_bootstrap(vm_paddr_t firstaddr) 5599a527560SKonstantin Belousov { 5609a527560SKonstantin Belousov 5619a527560SKonstantin Belousov pmap_methods_ptr->pm_bootstrap(firstaddr); 5629a527560SKonstantin Belousov } 5639a527560SKonstantin Belousov 5649a527560SKonstantin Belousov boolean_t 5659a527560SKonstantin Belousov pmap_is_valid_memattr(pmap_t pmap, vm_memattr_t mode) 5669a527560SKonstantin Belousov { 5679a527560SKonstantin Belousov 5689a527560SKonstantin Belousov return (pmap_methods_ptr->pm_is_valid_memattr(pmap, mode)); 5699a527560SKonstantin Belousov } 5709a527560SKonstantin Belousov 5719a527560SKonstantin Belousov int 5729a527560SKonstantin Belousov pmap_cache_bits(pmap_t pmap, int mode, boolean_t is_pde) 5739a527560SKonstantin Belousov { 5749a527560SKonstantin Belousov 5759a527560SKonstantin Belousov return (pmap_methods_ptr->pm_cache_bits(pmap, mode, is_pde)); 5769a527560SKonstantin Belousov } 5779a527560SKonstantin Belousov 5789a527560SKonstantin Belousov bool 5799a527560SKonstantin Belousov pmap_ps_enabled(pmap_t pmap) 5809a527560SKonstantin Belousov { 5819a527560SKonstantin Belousov 5829a527560SKonstantin Belousov return (pmap_methods_ptr->pm_ps_enabled(pmap)); 5839a527560SKonstantin Belousov } 5849a527560SKonstantin Belousov 5859a527560SKonstantin Belousov void 5869a527560SKonstantin Belousov pmap_pinit0(pmap_t pmap) 5879a527560SKonstantin Belousov { 5889a527560SKonstantin Belousov 5899a527560SKonstantin Belousov pmap_methods_ptr->pm_pinit0(pmap); 5909a527560SKonstantin Belousov } 5919a527560SKonstantin Belousov 5929a527560SKonstantin Belousov int 5939a527560SKonstantin Belousov pmap_pinit(pmap_t pmap) 5949a527560SKonstantin Belousov { 5959a527560SKonstantin Belousov 5969a527560SKonstantin Belousov return (pmap_methods_ptr->pm_pinit(pmap)); 5979a527560SKonstantin Belousov } 5989a527560SKonstantin Belousov 5999a527560SKonstantin Belousov void 6009a527560SKonstantin Belousov pmap_activate(struct thread *td) 6019a527560SKonstantin Belousov { 6029a527560SKonstantin Belousov 6039a527560SKonstantin Belousov pmap_methods_ptr->pm_activate(td); 6049a527560SKonstantin Belousov } 6059a527560SKonstantin Belousov 6069a527560SKonstantin Belousov void 6079a527560SKonstantin Belousov pmap_activate_boot(pmap_t pmap) 6089a527560SKonstantin Belousov { 6099a527560SKonstantin Belousov 6109a527560SKonstantin Belousov pmap_methods_ptr->pm_activate_boot(pmap); 6119a527560SKonstantin Belousov } 6129a527560SKonstantin Belousov 6139a527560SKonstantin Belousov void 6149a527560SKonstantin Belousov pmap_advise(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, int advice) 6159a527560SKonstantin Belousov { 6169a527560SKonstantin Belousov 6179a527560SKonstantin Belousov pmap_methods_ptr->pm_advise(pmap, sva, eva, advice); 6189a527560SKonstantin Belousov } 6199a527560SKonstantin Belousov 6209a527560SKonstantin Belousov void 6219a527560SKonstantin Belousov pmap_clear_modify(vm_page_t m) 6229a527560SKonstantin Belousov { 6239a527560SKonstantin Belousov 6249a527560SKonstantin Belousov pmap_methods_ptr->pm_clear_modify(m); 6259a527560SKonstantin Belousov } 6269a527560SKonstantin Belousov 6279a527560SKonstantin Belousov int 6289a527560SKonstantin Belousov pmap_change_attr(vm_offset_t va, vm_size_t size, int mode) 6299a527560SKonstantin Belousov { 6309a527560SKonstantin Belousov 6319a527560SKonstantin Belousov return (pmap_methods_ptr->pm_change_attr(va, size, mode)); 6329a527560SKonstantin Belousov } 6339a527560SKonstantin Belousov 6349a527560SKonstantin Belousov int 63501cef4caSMark Johnston pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *pap) 6369a527560SKonstantin Belousov { 6379a527560SKonstantin Belousov 63801cef4caSMark Johnston return (pmap_methods_ptr->pm_mincore(pmap, addr, pap)); 6399a527560SKonstantin Belousov } 6409a527560SKonstantin Belousov 6419a527560SKonstantin Belousov void 6429a527560SKonstantin Belousov pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len, 6439a527560SKonstantin Belousov vm_offset_t src_addr) 6449a527560SKonstantin Belousov { 6459a527560SKonstantin Belousov 6469a527560SKonstantin Belousov pmap_methods_ptr->pm_copy(dst_pmap, src_pmap, dst_addr, len, src_addr); 6479a527560SKonstantin Belousov } 6489a527560SKonstantin Belousov 6499a527560SKonstantin Belousov void 6509a527560SKonstantin Belousov pmap_copy_page(vm_page_t src, vm_page_t dst) 6519a527560SKonstantin Belousov { 6529a527560SKonstantin Belousov 6539a527560SKonstantin Belousov pmap_methods_ptr->pm_copy_page(src, dst); 6549a527560SKonstantin Belousov } 6559a527560SKonstantin Belousov 6569a527560SKonstantin Belousov void 6579a527560SKonstantin Belousov pmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[], 6589a527560SKonstantin Belousov vm_offset_t b_offset, int xfersize) 6599a527560SKonstantin Belousov { 6609a527560SKonstantin Belousov 6619a527560SKonstantin Belousov pmap_methods_ptr->pm_copy_pages(ma, a_offset, mb, b_offset, xfersize); 6629a527560SKonstantin Belousov } 6639a527560SKonstantin Belousov 6649a527560SKonstantin Belousov void 6659a527560SKonstantin Belousov pmap_zero_page(vm_page_t m) 6669a527560SKonstantin Belousov { 6679a527560SKonstantin Belousov 6689a527560SKonstantin Belousov pmap_methods_ptr->pm_zero_page(m); 6699a527560SKonstantin Belousov } 6709a527560SKonstantin Belousov 6719a527560SKonstantin Belousov void 6729a527560SKonstantin Belousov pmap_zero_page_area(vm_page_t m, int off, int size) 6739a527560SKonstantin Belousov { 6749a527560SKonstantin Belousov 6759a527560SKonstantin Belousov pmap_methods_ptr->pm_zero_page_area(m, off, size); 6769a527560SKonstantin Belousov } 6779a527560SKonstantin Belousov 6789a527560SKonstantin Belousov int 6799a527560SKonstantin Belousov pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, 6809a527560SKonstantin Belousov u_int flags, int8_t psind) 6819a527560SKonstantin Belousov { 6829a527560SKonstantin Belousov 6839a527560SKonstantin Belousov return (pmap_methods_ptr->pm_enter(pmap, va, m, prot, flags, psind)); 6849a527560SKonstantin Belousov } 6859a527560SKonstantin Belousov 6869a527560SKonstantin Belousov void 6879a527560SKonstantin Belousov pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end, 6889a527560SKonstantin Belousov vm_page_t m_start, vm_prot_t prot) 6899a527560SKonstantin Belousov { 6909a527560SKonstantin Belousov 6919a527560SKonstantin Belousov pmap_methods_ptr->pm_enter_object(pmap, start, end, m_start, prot); 6929a527560SKonstantin Belousov } 6939a527560SKonstantin Belousov 6949a527560SKonstantin Belousov void 6959a527560SKonstantin Belousov pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) 6969a527560SKonstantin Belousov { 6979a527560SKonstantin Belousov 6989a527560SKonstantin Belousov pmap_methods_ptr->pm_enter_quick(pmap, va, m, prot); 6999a527560SKonstantin Belousov } 7009a527560SKonstantin Belousov 7019a527560SKonstantin Belousov void * 7029a527560SKonstantin Belousov pmap_kenter_temporary(vm_paddr_t pa, int i) 7039a527560SKonstantin Belousov { 7049a527560SKonstantin Belousov 7059a527560SKonstantin Belousov return (pmap_methods_ptr->pm_kenter_temporary(pa, i)); 7069a527560SKonstantin Belousov } 7079a527560SKonstantin Belousov 7089a527560SKonstantin Belousov void 7099a527560SKonstantin Belousov pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object, 7109a527560SKonstantin Belousov vm_pindex_t pindex, vm_size_t size) 7119a527560SKonstantin Belousov { 7129a527560SKonstantin Belousov 7139a527560SKonstantin Belousov pmap_methods_ptr->pm_object_init_pt(pmap, addr, object, pindex, size); 7149a527560SKonstantin Belousov } 7159a527560SKonstantin Belousov 7169a527560SKonstantin Belousov void 7179a527560SKonstantin Belousov pmap_unwire(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) 7189a527560SKonstantin Belousov { 7199a527560SKonstantin Belousov 7209a527560SKonstantin Belousov pmap_methods_ptr->pm_unwire(pmap, sva, eva); 7219a527560SKonstantin Belousov } 7229a527560SKonstantin Belousov 7239a527560SKonstantin Belousov boolean_t 7249a527560SKonstantin Belousov pmap_page_exists_quick(pmap_t pmap, vm_page_t m) 7259a527560SKonstantin Belousov { 7269a527560SKonstantin Belousov 7279a527560SKonstantin Belousov return (pmap_methods_ptr->pm_page_exists_quick(pmap, m)); 7289a527560SKonstantin Belousov } 7299a527560SKonstantin Belousov 7309a527560SKonstantin Belousov int 7319a527560SKonstantin Belousov pmap_page_wired_mappings(vm_page_t m) 7329a527560SKonstantin Belousov { 7339a527560SKonstantin Belousov 7349a527560SKonstantin Belousov return (pmap_methods_ptr->pm_page_wired_mappings(m)); 7359a527560SKonstantin Belousov } 7369a527560SKonstantin Belousov 7379a527560SKonstantin Belousov boolean_t 7389a527560SKonstantin Belousov pmap_page_is_mapped(vm_page_t m) 7399a527560SKonstantin Belousov { 7409a527560SKonstantin Belousov 7419a527560SKonstantin Belousov return (pmap_methods_ptr->pm_page_is_mapped(m)); 7429a527560SKonstantin Belousov } 7439a527560SKonstantin Belousov 7449a527560SKonstantin Belousov void 7459a527560SKonstantin Belousov pmap_remove_pages(pmap_t pmap) 7469a527560SKonstantin Belousov { 7479a527560SKonstantin Belousov 7489a527560SKonstantin Belousov pmap_methods_ptr->pm_remove_pages(pmap); 7499a527560SKonstantin Belousov } 7509a527560SKonstantin Belousov 7519a527560SKonstantin Belousov boolean_t 7529a527560SKonstantin Belousov pmap_is_modified(vm_page_t m) 7539a527560SKonstantin Belousov { 7549a527560SKonstantin Belousov 7559a527560SKonstantin Belousov return (pmap_methods_ptr->pm_is_modified(m)); 7569a527560SKonstantin Belousov } 7579a527560SKonstantin Belousov 7589a527560SKonstantin Belousov boolean_t 7599a527560SKonstantin Belousov pmap_is_prefaultable(pmap_t pmap, vm_offset_t addr) 7609a527560SKonstantin Belousov { 7619a527560SKonstantin Belousov 7629a527560SKonstantin Belousov return (pmap_methods_ptr->pm_is_prefaultable(pmap, addr)); 7639a527560SKonstantin Belousov } 7649a527560SKonstantin Belousov 7659a527560SKonstantin Belousov boolean_t 7669a527560SKonstantin Belousov pmap_is_referenced(vm_page_t m) 7679a527560SKonstantin Belousov { 7689a527560SKonstantin Belousov 7699a527560SKonstantin Belousov return (pmap_methods_ptr->pm_is_referenced(m)); 7709a527560SKonstantin Belousov } 7719a527560SKonstantin Belousov 7729a527560SKonstantin Belousov void 7739a527560SKonstantin Belousov pmap_remove_write(vm_page_t m) 7749a527560SKonstantin Belousov { 7759a527560SKonstantin Belousov 7769a527560SKonstantin Belousov pmap_methods_ptr->pm_remove_write(m); 7779a527560SKonstantin Belousov } 7789a527560SKonstantin Belousov 7799a527560SKonstantin Belousov int 7809a527560SKonstantin Belousov pmap_ts_referenced(vm_page_t m) 7819a527560SKonstantin Belousov { 7829a527560SKonstantin Belousov 7839a527560SKonstantin Belousov return (pmap_methods_ptr->pm_ts_referenced(m)); 7849a527560SKonstantin Belousov } 7859a527560SKonstantin Belousov 7869a527560SKonstantin Belousov void * 7879a527560SKonstantin Belousov pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, int mode) 7889a527560SKonstantin Belousov { 7899a527560SKonstantin Belousov 790c45cbc7aSJohn Baldwin return (pmap_methods_ptr->pm_mapdev_attr(pa, size, mode, 791c45cbc7aSJohn Baldwin MAPDEV_SETATTR)); 7929a527560SKonstantin Belousov } 7939a527560SKonstantin Belousov 7949a527560SKonstantin Belousov void * 7959a527560SKonstantin Belousov pmap_mapdev(vm_paddr_t pa, vm_size_t size) 7969a527560SKonstantin Belousov { 7979a527560SKonstantin Belousov 798c45cbc7aSJohn Baldwin return (pmap_methods_ptr->pm_mapdev_attr(pa, size, PAT_UNCACHEABLE, 799c45cbc7aSJohn Baldwin MAPDEV_SETATTR)); 8009a527560SKonstantin Belousov } 8019a527560SKonstantin Belousov 8029a527560SKonstantin Belousov void * 8039a527560SKonstantin Belousov pmap_mapbios(vm_paddr_t pa, vm_size_t size) 8049a527560SKonstantin Belousov { 8059a527560SKonstantin Belousov 806c45cbc7aSJohn Baldwin return (pmap_methods_ptr->pm_mapdev_attr(pa, size, PAT_WRITE_BACK, 0)); 8079a527560SKonstantin Belousov } 8089a527560SKonstantin Belousov 8099a527560SKonstantin Belousov void 8109a527560SKonstantin Belousov pmap_unmapdev(vm_offset_t va, vm_size_t size) 8119a527560SKonstantin Belousov { 8129a527560SKonstantin Belousov 8139a527560SKonstantin Belousov pmap_methods_ptr->pm_unmapdev(va, size); 8149a527560SKonstantin Belousov } 8159a527560SKonstantin Belousov 8169a527560SKonstantin Belousov void 8179a527560SKonstantin Belousov pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma) 8189a527560SKonstantin Belousov { 8199a527560SKonstantin Belousov 8209a527560SKonstantin Belousov pmap_methods_ptr->pm_page_set_memattr(m, ma); 8219a527560SKonstantin Belousov } 8229a527560SKonstantin Belousov 8239a527560SKonstantin Belousov vm_paddr_t 8249a527560SKonstantin Belousov pmap_extract(pmap_t pmap, vm_offset_t va) 8259a527560SKonstantin Belousov { 8269a527560SKonstantin Belousov 8279a527560SKonstantin Belousov return (pmap_methods_ptr->pm_extract(pmap, va)); 8289a527560SKonstantin Belousov } 8299a527560SKonstantin Belousov 8309a527560SKonstantin Belousov vm_page_t 8319a527560SKonstantin Belousov pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot) 8329a527560SKonstantin Belousov { 8339a527560SKonstantin Belousov 8349a527560SKonstantin Belousov return (pmap_methods_ptr->pm_extract_and_hold(pmap, va, prot)); 8359a527560SKonstantin Belousov } 8369a527560SKonstantin Belousov 8379a527560SKonstantin Belousov vm_offset_t 8389a527560SKonstantin Belousov pmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end, int prot) 8399a527560SKonstantin Belousov { 8409a527560SKonstantin Belousov 8419a527560SKonstantin Belousov return (pmap_methods_ptr->pm_map(virt, start, end, prot)); 8429a527560SKonstantin Belousov } 8439a527560SKonstantin Belousov 8449a527560SKonstantin Belousov void 8459a527560SKonstantin Belousov pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count) 8469a527560SKonstantin Belousov { 8479a527560SKonstantin Belousov 8489a527560SKonstantin Belousov pmap_methods_ptr->pm_qenter(sva, ma, count); 8499a527560SKonstantin Belousov } 8509a527560SKonstantin Belousov 8519a527560SKonstantin Belousov void 8529a527560SKonstantin Belousov pmap_qremove(vm_offset_t sva, int count) 8539a527560SKonstantin Belousov { 8549a527560SKonstantin Belousov 8559a527560SKonstantin Belousov pmap_methods_ptr->pm_qremove(sva, count); 8569a527560SKonstantin Belousov } 8579a527560SKonstantin Belousov 8589a527560SKonstantin Belousov void 8599a527560SKonstantin Belousov pmap_release(pmap_t pmap) 8609a527560SKonstantin Belousov { 8619a527560SKonstantin Belousov 8629a527560SKonstantin Belousov pmap_methods_ptr->pm_release(pmap); 8639a527560SKonstantin Belousov } 8649a527560SKonstantin Belousov 8659a527560SKonstantin Belousov void 8669a527560SKonstantin Belousov pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) 8679a527560SKonstantin Belousov { 8689a527560SKonstantin Belousov 8699a527560SKonstantin Belousov pmap_methods_ptr->pm_remove(pmap, sva, eva); 8709a527560SKonstantin Belousov } 8719a527560SKonstantin Belousov 8729a527560SKonstantin Belousov void 8739a527560SKonstantin Belousov pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot) 8749a527560SKonstantin Belousov { 8759a527560SKonstantin Belousov 8769a527560SKonstantin Belousov pmap_methods_ptr->pm_protect(pmap, sva, eva, prot); 8779a527560SKonstantin Belousov } 8789a527560SKonstantin Belousov 8799a527560SKonstantin Belousov void 8809a527560SKonstantin Belousov pmap_remove_all(vm_page_t m) 8819a527560SKonstantin Belousov { 8829a527560SKonstantin Belousov 8839a527560SKonstantin Belousov pmap_methods_ptr->pm_remove_all(m); 8849a527560SKonstantin Belousov } 8859a527560SKonstantin Belousov 8869a527560SKonstantin Belousov void 8879a527560SKonstantin Belousov pmap_init(void) 8889a527560SKonstantin Belousov { 8899a527560SKonstantin Belousov 8909a527560SKonstantin Belousov pmap_methods_ptr->pm_init(); 8919a527560SKonstantin Belousov } 8929a527560SKonstantin Belousov 8939a527560SKonstantin Belousov void 8949a527560SKonstantin Belousov pmap_init_pat(void) 8959a527560SKonstantin Belousov { 8969a527560SKonstantin Belousov 8979a527560SKonstantin Belousov pmap_methods_ptr->pm_init_pat(); 8989a527560SKonstantin Belousov } 8999a527560SKonstantin Belousov 9009a527560SKonstantin Belousov void 9019a527560SKonstantin Belousov pmap_growkernel(vm_offset_t addr) 9029a527560SKonstantin Belousov { 9039a527560SKonstantin Belousov 9049a527560SKonstantin Belousov pmap_methods_ptr->pm_growkernel(addr); 9059a527560SKonstantin Belousov } 9069a527560SKonstantin Belousov 9079a527560SKonstantin Belousov void 9089a527560SKonstantin Belousov pmap_invalidate_page(pmap_t pmap, vm_offset_t va) 9099a527560SKonstantin Belousov { 9109a527560SKonstantin Belousov 9119a527560SKonstantin Belousov pmap_methods_ptr->pm_invalidate_page(pmap, va); 9129a527560SKonstantin Belousov } 9139a527560SKonstantin Belousov 9149a527560SKonstantin Belousov void 9159a527560SKonstantin Belousov pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) 9169a527560SKonstantin Belousov { 9179a527560SKonstantin Belousov 9189a527560SKonstantin Belousov pmap_methods_ptr->pm_invalidate_range(pmap, sva, eva); 9199a527560SKonstantin Belousov } 9209a527560SKonstantin Belousov 9219a527560SKonstantin Belousov void 9229a527560SKonstantin Belousov pmap_invalidate_all(pmap_t pmap) 9239a527560SKonstantin Belousov { 9249a527560SKonstantin Belousov 9259a527560SKonstantin Belousov pmap_methods_ptr->pm_invalidate_all(pmap); 9269a527560SKonstantin Belousov } 9279a527560SKonstantin Belousov 9289a527560SKonstantin Belousov void 9299a527560SKonstantin Belousov pmap_invalidate_cache(void) 9309a527560SKonstantin Belousov { 9319a527560SKonstantin Belousov 9329a527560SKonstantin Belousov pmap_methods_ptr->pm_invalidate_cache(); 9339a527560SKonstantin Belousov } 9349a527560SKonstantin Belousov 9359a527560SKonstantin Belousov void 9369a527560SKonstantin Belousov pmap_kenter(vm_offset_t va, vm_paddr_t pa) 9379a527560SKonstantin Belousov { 9389a527560SKonstantin Belousov 9399a527560SKonstantin Belousov pmap_methods_ptr->pm_kenter(va, pa); 9409a527560SKonstantin Belousov } 9419a527560SKonstantin Belousov 9429a527560SKonstantin Belousov void 9439a527560SKonstantin Belousov pmap_kremove(vm_offset_t va) 9449a527560SKonstantin Belousov { 9459a527560SKonstantin Belousov 9469a527560SKonstantin Belousov pmap_methods_ptr->pm_kremove(va); 9479a527560SKonstantin Belousov } 9489a527560SKonstantin Belousov 9499a527560SKonstantin Belousov extern struct pmap_methods pmap_pae_methods, pmap_nopae_methods; 9509a527560SKonstantin Belousov int pae_mode; 9512648ed92SKonstantin Belousov SYSCTL_INT(_vm_pmap, OID_AUTO, pae_mode, CTLFLAG_RDTUN | CTLFLAG_NOFETCH, 9522648ed92SKonstantin Belousov &pae_mode, 0, 9539a527560SKonstantin Belousov "PAE"); 9549a527560SKonstantin Belousov 9559a527560SKonstantin Belousov void 9569a527560SKonstantin Belousov pmap_cold(void) 9579a527560SKonstantin Belousov { 9589a527560SKonstantin Belousov 9592648ed92SKonstantin Belousov init_static_kenv((char *)bootinfo.bi_envp, 0); 9602648ed92SKonstantin Belousov pae_mode = (cpu_feature & CPUID_PAE) != 0; 9612648ed92SKonstantin Belousov if (pae_mode) 9622648ed92SKonstantin Belousov TUNABLE_INT_FETCH("vm.pmap.pae_mode", &pae_mode); 9632648ed92SKonstantin Belousov if (pae_mode) { 9649a527560SKonstantin Belousov pmap_methods_ptr = &pmap_pae_methods; 9659a527560SKonstantin Belousov pmap_pae_cold(); 9669a527560SKonstantin Belousov } else { 9679a527560SKonstantin Belousov pmap_methods_ptr = &pmap_nopae_methods; 9689a527560SKonstantin Belousov pmap_nopae_cold(); 9699a527560SKonstantin Belousov } 9709a527560SKonstantin Belousov } 971