pmap_dispatch.c revision 190684
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: head/sys/powerpc/powerpc/pmap_dispatch.c 190684 2009-04-04 02:12:37Z marcel $"); 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 122175067Salcpmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t p, 123175067Salc vm_prot_t prot, boolean_t wired) 124152179Sgrehan{ 125182571Smarcel 126182571Smarcel CTR6(KTR_PMAP, "pmap_enter(%p, %#x, %#x, %p, %#x, %u)", pmap, va, 127182571Smarcel access, p, prot, wired); 128152179Sgrehan MMU_ENTER(mmu_obj, pmap, va, p, prot, wired); 129152179Sgrehan} 130152179Sgrehan 131159323Salcvoid 132159323Salcpmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end, 133159323Salc vm_page_t m_start, vm_prot_t prot) 134159323Salc{ 135182571Smarcel 136182571Smarcel CTR6(KTR_PMAP, "%s(%p, %#x, %#x, %p, %#x)", __func__, pmap, start, 137182571Smarcel end, m_start, prot); 138159323Salc MMU_ENTER_OBJECT(mmu_obj, pmap, start, end, m_start, prot); 139159323Salc} 140159323Salc 141159627Supsvoid 142159627Supspmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) 143152179Sgrehan{ 144182571Smarcel 145182571Smarcel CTR5(KTR_PMAP, "%s(%p, %#x, %p, %#x)", __func__, pmap, va, m, prot); 146159627Sups MMU_ENTER_QUICK(mmu_obj, pmap, va, m, prot); 147152179Sgrehan} 148152179Sgrehan 149152179Sgrehanvm_paddr_t 150152179Sgrehanpmap_extract(pmap_t pmap, vm_offset_t va) 151152179Sgrehan{ 152182571Smarcel 153182571Smarcel CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, pmap, va); 154152179Sgrehan return (MMU_EXTRACT(mmu_obj, pmap, va)); 155152179Sgrehan} 156152179Sgrehan 157152179Sgrehanvm_page_t 158152179Sgrehanpmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot) 159152179Sgrehan{ 160182571Smarcel 161182571Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, pmap, va, prot); 162152179Sgrehan return (MMU_EXTRACT_AND_HOLD(mmu_obj, pmap, va, prot)); 163152179Sgrehan} 164152179Sgrehan 165152179Sgrehanvoid 166152179Sgrehanpmap_growkernel(vm_offset_t va) 167152179Sgrehan{ 168182571Smarcel 169182571Smarcel CTR2(KTR_PMAP, "%s(%#x)", __func__, va); 170152179Sgrehan MMU_GROWKERNEL(mmu_obj, va); 171152179Sgrehan} 172152179Sgrehan 173152179Sgrehanvoid 174152179Sgrehanpmap_init(void) 175152179Sgrehan{ 176182571Smarcel 177182571Smarcel CTR1(KTR_PMAP, "%s()", __func__); 178152179Sgrehan MMU_INIT(mmu_obj); 179152179Sgrehan} 180152179Sgrehan 181152179Sgrehanboolean_t 182152179Sgrehanpmap_is_modified(vm_page_t m) 183152179Sgrehan{ 184182571Smarcel 185182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 186152179Sgrehan return (MMU_IS_MODIFIED(mmu_obj, m)); 187152179Sgrehan} 188152179Sgrehan 189152179Sgrehanboolean_t 190152179Sgrehanpmap_is_prefaultable(pmap_t pmap, vm_offset_t va) 191152179Sgrehan{ 192182571Smarcel 193182571Smarcel CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, pmap, va); 194152179Sgrehan return (MMU_IS_PREFAULTABLE(mmu_obj, pmap, va)); 195152179Sgrehan} 196152179Sgrehan 197152179Sgrehanboolean_t 198152179Sgrehanpmap_ts_referenced(vm_page_t m) 199152179Sgrehan{ 200182571Smarcel 201182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 202152179Sgrehan return (MMU_TS_REFERENCED(mmu_obj, m)); 203152179Sgrehan} 204152179Sgrehan 205152179Sgrehanvm_offset_t 206152179Sgrehanpmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end, int prot) 207152179Sgrehan{ 208182571Smarcel 209182571Smarcel CTR5(KTR_PMAP, "%s(%p, %#x, %#x, %#x)", __func__, virt, start, end, 210182571Smarcel prot); 211152179Sgrehan return (MMU_MAP(mmu_obj, virt, start, end, prot)); 212152179Sgrehan} 213152179Sgrehan 214152179Sgrehanvoid 215152179Sgrehanpmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object, 216152179Sgrehan vm_pindex_t pindex, vm_size_t size) 217152179Sgrehan{ 218182571Smarcel 219182571Smarcel CTR6(KTR_PMAP, "%s(%p, %#x, %p, %u, %#x)", __func__, pmap, addr, 220182571Smarcel object, pindex, size); 221152179Sgrehan MMU_OBJECT_INIT_PT(mmu_obj, pmap, addr, object, pindex, size); 222152179Sgrehan} 223152179Sgrehan 224152179Sgrehanboolean_t 225152179Sgrehanpmap_page_exists_quick(pmap_t pmap, vm_page_t m) 226152179Sgrehan{ 227182571Smarcel 228182571Smarcel CTR3(KTR_PMAP, "%s(%p, %p)", __func__, pmap, m); 229152179Sgrehan return (MMU_PAGE_EXISTS_QUICK(mmu_obj, pmap, m)); 230152179Sgrehan} 231152179Sgrehan 232152179Sgrehanvoid 233152179Sgrehanpmap_page_init(vm_page_t m) 234152179Sgrehan{ 235182571Smarcel 236182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 237152179Sgrehan MMU_PAGE_INIT(mmu_obj, m); 238152179Sgrehan} 239152179Sgrehan 240173361Skibint 241173708Salcpmap_page_wired_mappings(vm_page_t m) 242173708Salc{ 243173708Salc 244182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 245173708Salc return (MMU_PAGE_WIRED_MAPPINGS(mmu_obj, m)); 246173708Salc} 247173708Salc 248173708Salcint 249152179Sgrehanpmap_pinit(pmap_t pmap) 250152179Sgrehan{ 251182571Smarcel 252182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, pmap); 253152179Sgrehan MMU_PINIT(mmu_obj, pmap); 254173361Skib return (1); 255152179Sgrehan} 256152179Sgrehan 257152179Sgrehanvoid 258152179Sgrehanpmap_pinit0(pmap_t pmap) 259152179Sgrehan{ 260182571Smarcel 261182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, pmap); 262152179Sgrehan MMU_PINIT0(mmu_obj, pmap); 263152179Sgrehan} 264152179Sgrehan 265152179Sgrehanvoid 266152179Sgrehanpmap_protect(pmap_t pmap, vm_offset_t start, vm_offset_t end, vm_prot_t prot) 267152179Sgrehan{ 268182571Smarcel 269182571Smarcel CTR5(KTR_PMAP, "%s(%p, %#x, %#x, %#x)", __func__, pmap, start, end, 270182571Smarcel prot); 271152179Sgrehan MMU_PROTECT(mmu_obj, pmap, start, end, prot); 272152179Sgrehan} 273152179Sgrehan 274152179Sgrehanvoid 275152179Sgrehanpmap_qenter(vm_offset_t start, vm_page_t *m, int count) 276152179Sgrehan{ 277182571Smarcel 278182571Smarcel CTR4(KTR_PMAP, "%s(%#x, %p, %d)", __func__, start, m, count); 279152179Sgrehan MMU_QENTER(mmu_obj, start, m, count); 280152179Sgrehan} 281152179Sgrehan 282152179Sgrehanvoid 283152179Sgrehanpmap_qremove(vm_offset_t start, int count) 284152179Sgrehan{ 285182571Smarcel 286182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %d)", __func__, start, count); 287152179Sgrehan MMU_QREMOVE(mmu_obj, start, count); 288152179Sgrehan} 289152179Sgrehan 290152179Sgrehanvoid 291152179Sgrehanpmap_release(pmap_t pmap) 292152179Sgrehan{ 293182571Smarcel 294182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, pmap); 295152179Sgrehan MMU_RELEASE(mmu_obj, pmap); 296152179Sgrehan} 297152179Sgrehan 298152179Sgrehanvoid 299152179Sgrehanpmap_remove(pmap_t pmap, vm_offset_t start, vm_offset_t end) 300152179Sgrehan{ 301182571Smarcel 302182571Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, pmap, start, end); 303152179Sgrehan MMU_REMOVE(mmu_obj, pmap, start, end); 304152179Sgrehan} 305152179Sgrehan 306152179Sgrehanvoid 307152179Sgrehanpmap_remove_all(vm_page_t m) 308152179Sgrehan{ 309182571Smarcel 310182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 311152179Sgrehan MMU_REMOVE_ALL(mmu_obj, m); 312152179Sgrehan} 313152179Sgrehan 314152179Sgrehanvoid 315157443Speterpmap_remove_pages(pmap_t pmap) 316152179Sgrehan{ 317182571Smarcel 318182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, pmap); 319157443Speter MMU_REMOVE_PAGES(mmu_obj, pmap); 320152179Sgrehan} 321152179Sgrehan 322152179Sgrehanvoid 323160889Salcpmap_remove_write(vm_page_t m) 324160889Salc{ 325182571Smarcel 326182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 327160889Salc MMU_REMOVE_WRITE(mmu_obj, m); 328160889Salc} 329160889Salc 330160889Salcvoid 331152179Sgrehanpmap_zero_page(vm_page_t m) 332152179Sgrehan{ 333182571Smarcel 334182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 335152179Sgrehan MMU_ZERO_PAGE(mmu_obj, m); 336152179Sgrehan} 337152179Sgrehan 338152179Sgrehanvoid 339152179Sgrehanpmap_zero_page_area(vm_page_t m, int off, int size) 340152179Sgrehan{ 341182571Smarcel 342182571Smarcel CTR4(KTR_PMAP, "%s(%p, %d, %d)", __func__, m, off, size); 343152179Sgrehan MMU_ZERO_PAGE_AREA(mmu_obj, m, off, size); 344152179Sgrehan} 345152179Sgrehan 346152179Sgrehanvoid 347152179Sgrehanpmap_zero_page_idle(vm_page_t m) 348152179Sgrehan{ 349182571Smarcel 350182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 351152179Sgrehan MMU_ZERO_PAGE_IDLE(mmu_obj, m); 352152179Sgrehan} 353152179Sgrehan 354152179Sgrehanint 355152179Sgrehanpmap_mincore(pmap_t pmap, vm_offset_t addr) 356152179Sgrehan{ 357182571Smarcel 358182571Smarcel CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, pmap, addr); 359152179Sgrehan return (MMU_MINCORE(mmu_obj, pmap, addr)); 360152179Sgrehan} 361152179Sgrehan 362152179Sgrehanvoid 363152179Sgrehanpmap_activate(struct thread *td) 364152179Sgrehan{ 365182571Smarcel 366182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, td); 367152179Sgrehan MMU_ACTIVATE(mmu_obj, td); 368152179Sgrehan} 369152179Sgrehan 370152179Sgrehanvoid 371152179Sgrehanpmap_deactivate(struct thread *td) 372152179Sgrehan{ 373182571Smarcel 374182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, td); 375152179Sgrehan MMU_DEACTIVATE(mmu_obj, td); 376152179Sgrehan} 377152179Sgrehan 378178893Salc/* 379178893Salc * Increase the starting virtual address of the given mapping if a 380178893Salc * different alignment might result in more superpage mappings. 381178893Salc */ 382178893Salcvoid 383178893Salcpmap_align_superpage(vm_object_t object, vm_ooffset_t offset, 384178893Salc vm_offset_t *addr, vm_size_t size) 385178893Salc{ 386179081Salc 387182571Smarcel CTR5(KTR_PMAP, "%s(%p, %#x, %p, %#x)", __func__, object, offset, addr, 388182571Smarcel size); 389179081Salc MMU_ALIGN_SUPERPAGE(mmu_obj, object, offset, addr, size); 390178893Salc} 391152179Sgrehan 392152179Sgrehan/* 393152179Sgrehan * Routines used in machine-dependent code 394152179Sgrehan */ 395152179Sgrehanvoid 396152179Sgrehanpmap_bootstrap(vm_offset_t start, vm_offset_t end) 397152179Sgrehan{ 398152179Sgrehan mmu_obj = &mmu_kernel_obj; 399152179Sgrehan 400152179Sgrehan /* 401152179Sgrehan * Take care of compiling the selected class, and 402152179Sgrehan * then statically initialise the MMU object 403152179Sgrehan */ 404152179Sgrehan kobj_class_compile_static(mmu_def_impl, &mmu_kernel_kops); 405152179Sgrehan kobj_init((kobj_t)mmu_obj, mmu_def_impl); 406152179Sgrehan 407152179Sgrehan MMU_BOOTSTRAP(mmu_obj, start, end); 408152179Sgrehan} 409152179Sgrehan 410190681Snwhitehornvoid 411190681Snwhitehornpmap_cpu_bootstrap(int ap) 412190681Snwhitehorn{ 413190681Snwhitehorn /* 414190681Snwhitehorn * No KTR here because our console probably doesn't work yet 415190681Snwhitehorn */ 416190681Snwhitehorn 417190681Snwhitehorn return (MMU_CPU_BOOTSTRAP(mmu_obj, ap)); 418190681Snwhitehorn} 419190681Snwhitehorn 420152179Sgrehanvoid * 421152179Sgrehanpmap_mapdev(vm_offset_t pa, vm_size_t size) 422152179Sgrehan{ 423182571Smarcel 424182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, pa, size); 425152179Sgrehan return (MMU_MAPDEV(mmu_obj, pa, size)); 426152179Sgrehan} 427152179Sgrehan 428152179Sgrehanvoid 429152179Sgrehanpmap_unmapdev(vm_offset_t va, vm_size_t size) 430152179Sgrehan{ 431182571Smarcel 432182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, va, size); 433152179Sgrehan MMU_UNMAPDEV(mmu_obj, va, size); 434152179Sgrehan} 435152179Sgrehan 436152179Sgrehanvm_offset_t 437152179Sgrehanpmap_kextract(vm_offset_t va) 438152179Sgrehan{ 439182571Smarcel 440182571Smarcel CTR2(KTR_PMAP, "%s(%#x)", __func__, va); 441152179Sgrehan return (MMU_KEXTRACT(mmu_obj, va)); 442152179Sgrehan} 443152179Sgrehan 444152179Sgrehanvoid 445152179Sgrehanpmap_kenter(vm_offset_t va, vm_offset_t pa) 446152179Sgrehan{ 447182571Smarcel 448182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, va, pa); 449152179Sgrehan MMU_KENTER(mmu_obj, va, pa); 450152179Sgrehan} 451152179Sgrehan 452152179Sgrehanboolean_t 453152179Sgrehanpmap_dev_direct_mapped(vm_offset_t pa, vm_size_t size) 454152179Sgrehan{ 455182571Smarcel 456182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, pa, size); 457152179Sgrehan return (MMU_DEV_DIRECT_MAPPED(mmu_obj, pa, size)); 458152179Sgrehan} 459152179Sgrehan 460164895Sgrehanboolean_t 461164895Sgrehanpmap_page_executable(vm_page_t pg) 462164895Sgrehan{ 463182571Smarcel 464182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, pg); 465164895Sgrehan return (MMU_PAGE_EXECUTABLE(mmu_obj, pg)); 466164895Sgrehan} 467152179Sgrehan 468190684Smarcelvm_offset_t 469190684Smarcelpmap_dumpsys_map(struct pmap_md *md, vm_size_t ofs, vm_size_t *sz) 470190684Smarcel{ 471190684Smarcel 472190684Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, md, ofs, *sz); 473190684Smarcel return (MMU_DUMPSYS_MAP(mmu_obj, md, ofs, sz)); 474190684Smarcel} 475190684Smarcel 476190684Smarcelvoid 477190684Smarcelpmap_dumpsys_unmap(struct pmap_md *md, vm_size_t ofs, vm_offset_t va) 478190684Smarcel{ 479190684Smarcel 480190684Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, md, ofs, va); 481190684Smarcel return (MMU_DUMPSYS_UNMAP(mmu_obj, md, ofs, va)); 482190684Smarcel} 483190684Smarcel 484190684Smarcelstruct pmap_md * 485190684Smarcelpmap_scan_md(struct pmap_md *prev) 486190684Smarcel{ 487190684Smarcel 488190684Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, prev); 489190684Smarcel return (MMU_SCAN_MD(mmu_obj, prev)); 490190684Smarcel} 491190684Smarcel 492152179Sgrehan/* 493152179Sgrehan * MMU install routines. Highest priority wins, equal priority also 494152179Sgrehan * overrides allowing last-set to win. 495152179Sgrehan */ 496152179SgrehanSET_DECLARE(mmu_set, mmu_def_t); 497152179Sgrehan 498152179Sgrehanboolean_t 499152179Sgrehanpmap_mmu_install(char *name, int prio) 500152179Sgrehan{ 501152179Sgrehan mmu_def_t **mmupp, *mmup; 502152179Sgrehan static int curr_prio = 0; 503152179Sgrehan 504152179Sgrehan /* 505152179Sgrehan * Try and locate the MMU kobj corresponding to the name 506152179Sgrehan */ 507152179Sgrehan SET_FOREACH(mmupp, mmu_set) { 508152179Sgrehan mmup = *mmupp; 509152179Sgrehan 510152179Sgrehan if (mmup->name && 511152179Sgrehan !strcmp(mmup->name, name) && 512152179Sgrehan prio >= curr_prio) { 513152179Sgrehan curr_prio = prio; 514152179Sgrehan mmu_def_impl = mmup; 515152179Sgrehan return (TRUE); 516152179Sgrehan } 517152179Sgrehan } 518152179Sgrehan 519152179Sgrehan return (FALSE); 520152179Sgrehan} 521