1152179Sgrehan/*- 2152179Sgrehan * Copyright (c) 2005 Peter Grehan 3152179Sgrehan * All rights reserved. 4152179Sgrehan * 5152179Sgrehan * Redistribution and use in source and binary forms, with or without 6152179Sgrehan * modification, are permitted provided that the following conditions 7152179Sgrehan * are met: 8152179Sgrehan * 1. Redistributions of source code must retain the above copyright 9152179Sgrehan * notice, this list of conditions and the following disclaimer. 10152179Sgrehan * 2. Redistributions in binary form must reproduce the above copyright 11152179Sgrehan * notice, this list of conditions and the following disclaimer in the 12152179Sgrehan * documentation and/or other materials provided with the distribution. 13152179Sgrehan * 14152179Sgrehan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15152179Sgrehan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16152179Sgrehan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17152179Sgrehan * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18152179Sgrehan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19152179Sgrehan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20152179Sgrehan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21152179Sgrehan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22152179Sgrehan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23152179Sgrehan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24152179Sgrehan * SUCH DAMAGE. 25152179Sgrehan * 26152179Sgrehan */ 27152179Sgrehan 28152179Sgrehan#include <sys/cdefs.h> 29152179Sgrehan__FBSDID("$FreeBSD$"); 30152179Sgrehan 31152179Sgrehan/* 32152179Sgrehan * Dispatch MI pmap calls to the appropriate MMU implementation 33152179Sgrehan * through a previously registered kernel object. 34152179Sgrehan * 35152179Sgrehan * Before pmap_bootstrap() can be called, a CPU module must have 36152179Sgrehan * called pmap_mmu_install(). This may be called multiple times: 37152179Sgrehan * the highest priority call will be installed as the default 38152179Sgrehan * MMU handler when pmap_bootstrap() is called. 39152179Sgrehan * 40186347Snwhitehorn * It is required that mutex_init() be called before pmap_bootstrap(), 41186347Snwhitehorn * as the PMAP layer makes extensive use of mutexes. 42152179Sgrehan */ 43152179Sgrehan 44152179Sgrehan#include <sys/param.h> 45152179Sgrehan#include <sys/kernel.h> 46152179Sgrehan#include <sys/lock.h> 47182571Smarcel#include <sys/ktr.h> 48152179Sgrehan#include <sys/mutex.h> 49152179Sgrehan#include <sys/systm.h> 50152179Sgrehan 51152179Sgrehan#include <vm/vm.h> 52152179Sgrehan#include <vm/vm_page.h> 53152179Sgrehan 54152179Sgrehan#include <machine/mmuvar.h> 55190681Snwhitehorn#include <machine/smp.h> 56152179Sgrehan 57152179Sgrehan#include "mmu_if.h" 58152179Sgrehan 59152179Sgrehanstatic mmu_def_t *mmu_def_impl; 60152179Sgrehanstatic mmu_t mmu_obj; 61152179Sgrehanstatic struct mmu_kobj mmu_kernel_obj; 62152179Sgrehanstatic struct kobj_ops mmu_kernel_kops; 63152179Sgrehan 64152179Sgrehan/* 65152179Sgrehan * pmap globals 66152179Sgrehan */ 67152179Sgrehanstruct pmap kernel_pmap_store; 68152179Sgrehan 69152179Sgrehanstruct msgbuf *msgbufp; 70152179Sgrehanvm_offset_t msgbuf_phys; 71152179Sgrehan 72152179Sgrehanvm_offset_t kernel_vm_end; 73152179Sgrehanvm_offset_t phys_avail[PHYS_AVAIL_SZ]; 74152179Sgrehanvm_offset_t virtual_avail; 75152179Sgrehanvm_offset_t virtual_end; 76152179Sgrehan 77152179Sgrehanint pmap_bootstrapped; 78152179Sgrehan 79152179Sgrehanvoid 80152179Sgrehanpmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired) 81152179Sgrehan{ 82182571Smarcel 83182571Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %u)", __func__, pmap, va, wired); 84152179Sgrehan MMU_CHANGE_WIRING(mmu_obj, pmap, va, wired); 85152179Sgrehan} 86152179Sgrehan 87152179Sgrehanvoid 88152179Sgrehanpmap_clear_modify(vm_page_t m) 89152179Sgrehan{ 90182571Smarcel 91182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 92152179Sgrehan MMU_CLEAR_MODIFY(mmu_obj, m); 93152179Sgrehan} 94152179Sgrehan 95152179Sgrehanvoid 96152179Sgrehanpmap_clear_reference(vm_page_t m) 97152179Sgrehan{ 98182571Smarcel 99182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 100152179Sgrehan MMU_CLEAR_REFERENCE(mmu_obj, m); 101152179Sgrehan} 102152179Sgrehan 103152179Sgrehanvoid 104152179Sgrehanpmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, 105152179Sgrehan vm_size_t len, vm_offset_t src_addr) 106152179Sgrehan{ 107182571Smarcel 108182571Smarcel CTR6(KTR_PMAP, "%s(%p, %p, %#x, %#x, %#x)", __func__, dst_pmap, 109182571Smarcel src_pmap, dst_addr, len, src_addr); 110152179Sgrehan MMU_COPY(mmu_obj, dst_pmap, src_pmap, dst_addr, len, src_addr); 111152179Sgrehan} 112152179Sgrehan 113152179Sgrehanvoid 114152179Sgrehanpmap_copy_page(vm_page_t src, vm_page_t dst) 115152179Sgrehan{ 116182571Smarcel 117182571Smarcel CTR3(KTR_PMAP, "%s(%p, %p)", __func__, src, dst); 118152179Sgrehan MMU_COPY_PAGE(mmu_obj, src, dst); 119152179Sgrehan} 120152179Sgrehan 121152179Sgrehanvoid 122248814Skibpmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[], 123248814Skib vm_offset_t b_offset, int xfersize) 124248814Skib{ 125248814Skib 126248814Skib CTR6(KTR_PMAP, "%s(%p, %#x, %p, %#x, %#x)", __func__, ma, 127248814Skib a_offset, mb, b_offset, xfersize); 128248814Skib MMU_COPY_PAGES(mmu_obj, ma, a_offset, mb, b_offset, xfersize); 129248814Skib} 130248814Skib 131248814Skibvoid 132175067Salcpmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t p, 133175067Salc vm_prot_t prot, boolean_t wired) 134152179Sgrehan{ 135182571Smarcel 136182571Smarcel CTR6(KTR_PMAP, "pmap_enter(%p, %#x, %#x, %p, %#x, %u)", pmap, va, 137182571Smarcel access, p, prot, wired); 138152179Sgrehan MMU_ENTER(mmu_obj, pmap, va, p, prot, wired); 139152179Sgrehan} 140152179Sgrehan 141159323Salcvoid 142159323Salcpmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end, 143159323Salc vm_page_t m_start, vm_prot_t prot) 144159323Salc{ 145182571Smarcel 146182571Smarcel CTR6(KTR_PMAP, "%s(%p, %#x, %#x, %p, %#x)", __func__, pmap, start, 147182571Smarcel end, m_start, prot); 148159323Salc MMU_ENTER_OBJECT(mmu_obj, pmap, start, end, m_start, prot); 149159323Salc} 150159323Salc 151159627Supsvoid 152159627Supspmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) 153152179Sgrehan{ 154182571Smarcel 155182571Smarcel CTR5(KTR_PMAP, "%s(%p, %#x, %p, %#x)", __func__, pmap, va, m, prot); 156159627Sups MMU_ENTER_QUICK(mmu_obj, pmap, va, m, prot); 157152179Sgrehan} 158152179Sgrehan 159152179Sgrehanvm_paddr_t 160152179Sgrehanpmap_extract(pmap_t pmap, vm_offset_t va) 161152179Sgrehan{ 162182571Smarcel 163182571Smarcel CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, pmap, va); 164152179Sgrehan return (MMU_EXTRACT(mmu_obj, pmap, va)); 165152179Sgrehan} 166152179Sgrehan 167152179Sgrehanvm_page_t 168152179Sgrehanpmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot) 169152179Sgrehan{ 170182571Smarcel 171182571Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, pmap, va, prot); 172152179Sgrehan return (MMU_EXTRACT_AND_HOLD(mmu_obj, pmap, va, prot)); 173152179Sgrehan} 174152179Sgrehan 175152179Sgrehanvoid 176152179Sgrehanpmap_growkernel(vm_offset_t va) 177152179Sgrehan{ 178182571Smarcel 179182571Smarcel CTR2(KTR_PMAP, "%s(%#x)", __func__, va); 180152179Sgrehan MMU_GROWKERNEL(mmu_obj, va); 181152179Sgrehan} 182152179Sgrehan 183152179Sgrehanvoid 184152179Sgrehanpmap_init(void) 185152179Sgrehan{ 186182571Smarcel 187182571Smarcel CTR1(KTR_PMAP, "%s()", __func__); 188152179Sgrehan MMU_INIT(mmu_obj); 189152179Sgrehan} 190152179Sgrehan 191152179Sgrehanboolean_t 192152179Sgrehanpmap_is_modified(vm_page_t m) 193152179Sgrehan{ 194182571Smarcel 195182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 196152179Sgrehan return (MMU_IS_MODIFIED(mmu_obj, m)); 197152179Sgrehan} 198152179Sgrehan 199152179Sgrehanboolean_t 200152179Sgrehanpmap_is_prefaultable(pmap_t pmap, vm_offset_t va) 201152179Sgrehan{ 202182571Smarcel 203182571Smarcel CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, pmap, va); 204152179Sgrehan return (MMU_IS_PREFAULTABLE(mmu_obj, pmap, va)); 205152179Sgrehan} 206152179Sgrehan 207152179Sgrehanboolean_t 208207155Salcpmap_is_referenced(vm_page_t m) 209207155Salc{ 210207155Salc 211207155Salc CTR2(KTR_PMAP, "%s(%p)", __func__, m); 212207155Salc return (MMU_IS_REFERENCED(mmu_obj, m)); 213207155Salc} 214207155Salc 215207155Salcboolean_t 216152179Sgrehanpmap_ts_referenced(vm_page_t m) 217152179Sgrehan{ 218182571Smarcel 219182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 220152179Sgrehan return (MMU_TS_REFERENCED(mmu_obj, m)); 221152179Sgrehan} 222152179Sgrehan 223152179Sgrehanvm_offset_t 224152179Sgrehanpmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end, int prot) 225152179Sgrehan{ 226182571Smarcel 227182571Smarcel CTR5(KTR_PMAP, "%s(%p, %#x, %#x, %#x)", __func__, virt, start, end, 228182571Smarcel prot); 229152179Sgrehan return (MMU_MAP(mmu_obj, virt, start, end, prot)); 230152179Sgrehan} 231152179Sgrehan 232152179Sgrehanvoid 233152179Sgrehanpmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object, 234152179Sgrehan vm_pindex_t pindex, vm_size_t size) 235152179Sgrehan{ 236182571Smarcel 237182571Smarcel CTR6(KTR_PMAP, "%s(%p, %#x, %p, %u, %#x)", __func__, pmap, addr, 238182571Smarcel object, pindex, size); 239152179Sgrehan MMU_OBJECT_INIT_PT(mmu_obj, pmap, addr, object, pindex, size); 240152179Sgrehan} 241152179Sgrehan 242152179Sgrehanboolean_t 243152179Sgrehanpmap_page_exists_quick(pmap_t pmap, vm_page_t m) 244152179Sgrehan{ 245182571Smarcel 246182571Smarcel CTR3(KTR_PMAP, "%s(%p, %p)", __func__, pmap, m); 247152179Sgrehan return (MMU_PAGE_EXISTS_QUICK(mmu_obj, pmap, m)); 248152179Sgrehan} 249152179Sgrehan 250152179Sgrehanvoid 251152179Sgrehanpmap_page_init(vm_page_t m) 252152179Sgrehan{ 253182571Smarcel 254182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 255152179Sgrehan MMU_PAGE_INIT(mmu_obj, m); 256152179Sgrehan} 257152179Sgrehan 258173361Skibint 259173708Salcpmap_page_wired_mappings(vm_page_t m) 260173708Salc{ 261173708Salc 262182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 263173708Salc return (MMU_PAGE_WIRED_MAPPINGS(mmu_obj, m)); 264173708Salc} 265173708Salc 266173708Salcint 267152179Sgrehanpmap_pinit(pmap_t pmap) 268152179Sgrehan{ 269182571Smarcel 270182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, pmap); 271152179Sgrehan MMU_PINIT(mmu_obj, pmap); 272173361Skib return (1); 273152179Sgrehan} 274152179Sgrehan 275152179Sgrehanvoid 276152179Sgrehanpmap_pinit0(pmap_t pmap) 277152179Sgrehan{ 278182571Smarcel 279182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, pmap); 280152179Sgrehan MMU_PINIT0(mmu_obj, pmap); 281152179Sgrehan} 282152179Sgrehan 283152179Sgrehanvoid 284152179Sgrehanpmap_protect(pmap_t pmap, vm_offset_t start, vm_offset_t end, vm_prot_t prot) 285152179Sgrehan{ 286182571Smarcel 287182571Smarcel CTR5(KTR_PMAP, "%s(%p, %#x, %#x, %#x)", __func__, pmap, start, end, 288182571Smarcel prot); 289152179Sgrehan MMU_PROTECT(mmu_obj, pmap, start, end, prot); 290152179Sgrehan} 291152179Sgrehan 292152179Sgrehanvoid 293152179Sgrehanpmap_qenter(vm_offset_t start, vm_page_t *m, int count) 294152179Sgrehan{ 295182571Smarcel 296182571Smarcel CTR4(KTR_PMAP, "%s(%#x, %p, %d)", __func__, start, m, count); 297152179Sgrehan MMU_QENTER(mmu_obj, start, m, count); 298152179Sgrehan} 299152179Sgrehan 300152179Sgrehanvoid 301152179Sgrehanpmap_qremove(vm_offset_t start, int count) 302152179Sgrehan{ 303182571Smarcel 304182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %d)", __func__, start, count); 305152179Sgrehan MMU_QREMOVE(mmu_obj, start, count); 306152179Sgrehan} 307152179Sgrehan 308152179Sgrehanvoid 309152179Sgrehanpmap_release(pmap_t pmap) 310152179Sgrehan{ 311182571Smarcel 312182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, pmap); 313152179Sgrehan MMU_RELEASE(mmu_obj, pmap); 314152179Sgrehan} 315152179Sgrehan 316152179Sgrehanvoid 317152179Sgrehanpmap_remove(pmap_t pmap, vm_offset_t start, vm_offset_t end) 318152179Sgrehan{ 319182571Smarcel 320182571Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, pmap, start, end); 321152179Sgrehan MMU_REMOVE(mmu_obj, pmap, start, end); 322152179Sgrehan} 323152179Sgrehan 324152179Sgrehanvoid 325152179Sgrehanpmap_remove_all(vm_page_t m) 326152179Sgrehan{ 327182571Smarcel 328182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 329152179Sgrehan MMU_REMOVE_ALL(mmu_obj, m); 330152179Sgrehan} 331152179Sgrehan 332152179Sgrehanvoid 333157443Speterpmap_remove_pages(pmap_t pmap) 334152179Sgrehan{ 335182571Smarcel 336182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, pmap); 337157443Speter MMU_REMOVE_PAGES(mmu_obj, pmap); 338152179Sgrehan} 339152179Sgrehan 340152179Sgrehanvoid 341160889Salcpmap_remove_write(vm_page_t m) 342160889Salc{ 343182571Smarcel 344182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 345160889Salc MMU_REMOVE_WRITE(mmu_obj, m); 346160889Salc} 347160889Salc 348160889Salcvoid 349152179Sgrehanpmap_zero_page(vm_page_t m) 350152179Sgrehan{ 351182571Smarcel 352182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 353152179Sgrehan MMU_ZERO_PAGE(mmu_obj, m); 354152179Sgrehan} 355152179Sgrehan 356152179Sgrehanvoid 357152179Sgrehanpmap_zero_page_area(vm_page_t m, int off, int size) 358152179Sgrehan{ 359182571Smarcel 360182571Smarcel CTR4(KTR_PMAP, "%s(%p, %d, %d)", __func__, m, off, size); 361152179Sgrehan MMU_ZERO_PAGE_AREA(mmu_obj, m, off, size); 362152179Sgrehan} 363152179Sgrehan 364152179Sgrehanvoid 365152179Sgrehanpmap_zero_page_idle(vm_page_t m) 366152179Sgrehan{ 367182571Smarcel 368182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 369152179Sgrehan MMU_ZERO_PAGE_IDLE(mmu_obj, m); 370152179Sgrehan} 371152179Sgrehan 372152179Sgrehanint 373208504Salcpmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *locked_pa) 374152179Sgrehan{ 375182571Smarcel 376182571Smarcel CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, pmap, addr); 377208504Salc return (MMU_MINCORE(mmu_obj, pmap, addr, locked_pa)); 378152179Sgrehan} 379152179Sgrehan 380152179Sgrehanvoid 381152179Sgrehanpmap_activate(struct thread *td) 382152179Sgrehan{ 383182571Smarcel 384182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, td); 385152179Sgrehan MMU_ACTIVATE(mmu_obj, td); 386152179Sgrehan} 387152179Sgrehan 388152179Sgrehanvoid 389152179Sgrehanpmap_deactivate(struct thread *td) 390152179Sgrehan{ 391182571Smarcel 392182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, td); 393152179Sgrehan MMU_DEACTIVATE(mmu_obj, td); 394152179Sgrehan} 395152179Sgrehan 396178893Salc/* 397178893Salc * Increase the starting virtual address of the given mapping if a 398178893Salc * different alignment might result in more superpage mappings. 399178893Salc */ 400178893Salcvoid 401178893Salcpmap_align_superpage(vm_object_t object, vm_ooffset_t offset, 402178893Salc vm_offset_t *addr, vm_size_t size) 403178893Salc{ 404179081Salc 405182571Smarcel CTR5(KTR_PMAP, "%s(%p, %#x, %p, %#x)", __func__, object, offset, addr, 406182571Smarcel size); 407179081Salc MMU_ALIGN_SUPERPAGE(mmu_obj, object, offset, addr, size); 408178893Salc} 409152179Sgrehan 410152179Sgrehan/* 411152179Sgrehan * Routines used in machine-dependent code 412152179Sgrehan */ 413152179Sgrehanvoid 414152179Sgrehanpmap_bootstrap(vm_offset_t start, vm_offset_t end) 415152179Sgrehan{ 416152179Sgrehan mmu_obj = &mmu_kernel_obj; 417152179Sgrehan 418152179Sgrehan /* 419152179Sgrehan * Take care of compiling the selected class, and 420152179Sgrehan * then statically initialise the MMU object 421152179Sgrehan */ 422152179Sgrehan kobj_class_compile_static(mmu_def_impl, &mmu_kernel_kops); 423227711Smarius kobj_init_static((kobj_t)mmu_obj, mmu_def_impl); 424152179Sgrehan 425152179Sgrehan MMU_BOOTSTRAP(mmu_obj, start, end); 426152179Sgrehan} 427152179Sgrehan 428190681Snwhitehornvoid 429190681Snwhitehornpmap_cpu_bootstrap(int ap) 430190681Snwhitehorn{ 431190681Snwhitehorn /* 432190681Snwhitehorn * No KTR here because our console probably doesn't work yet 433190681Snwhitehorn */ 434190681Snwhitehorn 435190681Snwhitehorn return (MMU_CPU_BOOTSTRAP(mmu_obj, ap)); 436190681Snwhitehorn} 437190681Snwhitehorn 438152179Sgrehanvoid * 439152179Sgrehanpmap_mapdev(vm_offset_t pa, vm_size_t size) 440152179Sgrehan{ 441182571Smarcel 442182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, pa, size); 443152179Sgrehan return (MMU_MAPDEV(mmu_obj, pa, size)); 444152179Sgrehan} 445152179Sgrehan 446213307Snwhitehornvoid * 447213307Snwhitehornpmap_mapdev_attr(vm_offset_t pa, vm_size_t size, vm_memattr_t attr) 448213307Snwhitehorn{ 449213307Snwhitehorn 450213360Snwhitehorn CTR4(KTR_PMAP, "%s(%#x, %#x, %#x)", __func__, pa, size, attr); 451213307Snwhitehorn return (MMU_MAPDEV_ATTR(mmu_obj, pa, size, attr)); 452213307Snwhitehorn} 453213307Snwhitehorn 454152179Sgrehanvoid 455213307Snwhitehornpmap_page_set_memattr(vm_page_t m, vm_memattr_t ma) 456213307Snwhitehorn{ 457213307Snwhitehorn 458213360Snwhitehorn CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, m, ma); 459213307Snwhitehorn return (MMU_PAGE_SET_MEMATTR(mmu_obj, m, ma)); 460213307Snwhitehorn} 461213307Snwhitehorn 462213307Snwhitehornvoid 463152179Sgrehanpmap_unmapdev(vm_offset_t va, vm_size_t size) 464152179Sgrehan{ 465182571Smarcel 466182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, va, size); 467152179Sgrehan MMU_UNMAPDEV(mmu_obj, va, size); 468152179Sgrehan} 469152179Sgrehan 470152179Sgrehanvm_offset_t 471152179Sgrehanpmap_kextract(vm_offset_t va) 472152179Sgrehan{ 473182571Smarcel 474182571Smarcel CTR2(KTR_PMAP, "%s(%#x)", __func__, va); 475152179Sgrehan return (MMU_KEXTRACT(mmu_obj, va)); 476152179Sgrehan} 477152179Sgrehan 478152179Sgrehanvoid 479152179Sgrehanpmap_kenter(vm_offset_t va, vm_offset_t pa) 480152179Sgrehan{ 481182571Smarcel 482182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, va, pa); 483152179Sgrehan MMU_KENTER(mmu_obj, va, pa); 484152179Sgrehan} 485152179Sgrehan 486213307Snwhitehornvoid 487213307Snwhitehornpmap_kenter_attr(vm_offset_t va, vm_offset_t pa, vm_memattr_t ma) 488213307Snwhitehorn{ 489213307Snwhitehorn 490213360Snwhitehorn CTR4(KTR_PMAP, "%s(%#x, %#x, %#x)", __func__, va, pa, ma); 491213307Snwhitehorn MMU_KENTER_ATTR(mmu_obj, va, pa, ma); 492213307Snwhitehorn} 493213307Snwhitehorn 494152179Sgrehanboolean_t 495152179Sgrehanpmap_dev_direct_mapped(vm_offset_t pa, vm_size_t size) 496152179Sgrehan{ 497182571Smarcel 498182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, pa, size); 499152179Sgrehan return (MMU_DEV_DIRECT_MAPPED(mmu_obj, pa, size)); 500152179Sgrehan} 501152179Sgrehan 502198341Smarcelvoid 503198341Smarcelpmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz) 504164895Sgrehan{ 505198341Smarcel 506198341Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, pm, va, sz); 507198341Smarcel return (MMU_SYNC_ICACHE(mmu_obj, pm, va, sz)); 508164895Sgrehan} 509152179Sgrehan 510190684Smarcelvm_offset_t 511190684Smarcelpmap_dumpsys_map(struct pmap_md *md, vm_size_t ofs, vm_size_t *sz) 512190684Smarcel{ 513190684Smarcel 514190684Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, md, ofs, *sz); 515190684Smarcel return (MMU_DUMPSYS_MAP(mmu_obj, md, ofs, sz)); 516190684Smarcel} 517190684Smarcel 518190684Smarcelvoid 519190684Smarcelpmap_dumpsys_unmap(struct pmap_md *md, vm_size_t ofs, vm_offset_t va) 520190684Smarcel{ 521190684Smarcel 522190684Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, md, ofs, va); 523190684Smarcel return (MMU_DUMPSYS_UNMAP(mmu_obj, md, ofs, va)); 524190684Smarcel} 525190684Smarcel 526190684Smarcelstruct pmap_md * 527190684Smarcelpmap_scan_md(struct pmap_md *prev) 528190684Smarcel{ 529190684Smarcel 530190684Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, prev); 531190684Smarcel return (MMU_SCAN_MD(mmu_obj, prev)); 532190684Smarcel} 533190684Smarcel 534152179Sgrehan/* 535152179Sgrehan * MMU install routines. Highest priority wins, equal priority also 536152179Sgrehan * overrides allowing last-set to win. 537152179Sgrehan */ 538152179SgrehanSET_DECLARE(mmu_set, mmu_def_t); 539152179Sgrehan 540152179Sgrehanboolean_t 541152179Sgrehanpmap_mmu_install(char *name, int prio) 542152179Sgrehan{ 543152179Sgrehan mmu_def_t **mmupp, *mmup; 544152179Sgrehan static int curr_prio = 0; 545152179Sgrehan 546152179Sgrehan /* 547152179Sgrehan * Try and locate the MMU kobj corresponding to the name 548152179Sgrehan */ 549152179Sgrehan SET_FOREACH(mmupp, mmu_set) { 550152179Sgrehan mmup = *mmupp; 551152179Sgrehan 552152179Sgrehan if (mmup->name && 553152179Sgrehan !strcmp(mmup->name, name) && 554192067Snwhitehorn (prio >= curr_prio || mmu_def_impl == NULL)) { 555152179Sgrehan curr_prio = prio; 556152179Sgrehan mmu_def_impl = mmup; 557152179Sgrehan return (TRUE); 558152179Sgrehan } 559152179Sgrehan } 560152179Sgrehan 561152179Sgrehan return (FALSE); 562152179Sgrehan} 563251897Sscottl 564251897Sscottlint unmapped_buf_allowed; 565