pmap_dispatch.c revision 248508
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 248508 2013-03-19 14:13:12Z kib $"); 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 79235689Snwhitehorn#ifdef AIM 80235689Snwhitehornint 81235689Snwhitehornpvo_vaddr_compare(struct pvo_entry *a, struct pvo_entry *b) 82235689Snwhitehorn{ 83235689Snwhitehorn if (PVO_VADDR(a) < PVO_VADDR(b)) 84235689Snwhitehorn return (-1); 85235689Snwhitehorn else if (PVO_VADDR(a) > PVO_VADDR(b)) 86235689Snwhitehorn return (1); 87235689Snwhitehorn return (0); 88235689Snwhitehorn} 89235689SnwhitehornRB_GENERATE(pvo_tree, pvo_entry, pvo_plink, pvo_vaddr_compare); 90235689Snwhitehorn#endif 91235689Snwhitehorn 92235689Snwhitehorn 93152179Sgrehanvoid 94152179Sgrehanpmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired) 95152179Sgrehan{ 96182571Smarcel 97182571Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %u)", __func__, pmap, va, wired); 98152179Sgrehan MMU_CHANGE_WIRING(mmu_obj, pmap, va, wired); 99152179Sgrehan} 100152179Sgrehan 101152179Sgrehanvoid 102152179Sgrehanpmap_clear_modify(vm_page_t m) 103152179Sgrehan{ 104182571Smarcel 105182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 106152179Sgrehan MMU_CLEAR_MODIFY(mmu_obj, m); 107152179Sgrehan} 108152179Sgrehan 109152179Sgrehanvoid 110152179Sgrehanpmap_clear_reference(vm_page_t m) 111152179Sgrehan{ 112182571Smarcel 113182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 114152179Sgrehan MMU_CLEAR_REFERENCE(mmu_obj, m); 115152179Sgrehan} 116152179Sgrehan 117152179Sgrehanvoid 118152179Sgrehanpmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, 119152179Sgrehan vm_size_t len, vm_offset_t src_addr) 120152179Sgrehan{ 121182571Smarcel 122182571Smarcel CTR6(KTR_PMAP, "%s(%p, %p, %#x, %#x, %#x)", __func__, dst_pmap, 123182571Smarcel src_pmap, dst_addr, len, src_addr); 124152179Sgrehan MMU_COPY(mmu_obj, dst_pmap, src_pmap, dst_addr, len, src_addr); 125152179Sgrehan} 126152179Sgrehan 127152179Sgrehanvoid 128152179Sgrehanpmap_copy_page(vm_page_t src, vm_page_t dst) 129152179Sgrehan{ 130182571Smarcel 131182571Smarcel CTR3(KTR_PMAP, "%s(%p, %p)", __func__, src, dst); 132152179Sgrehan MMU_COPY_PAGE(mmu_obj, src, dst); 133152179Sgrehan} 134152179Sgrehan 135152179Sgrehanvoid 136248280Skibpmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[], 137248280Skib vm_offset_t b_offset, int xfersize) 138248280Skib{ 139248280Skib 140248280Skib CTR6(KTR_PMAP, "%s(%p, %#x, %p, %#x, %#x)", __func__, ma, 141248280Skib a_offset, mb, b_offset, xfersize); 142248280Skib MMU_COPY_PAGES(mmu_obj, ma, a_offset, mb, b_offset, xfersize); 143248280Skib} 144248280Skib 145248280Skibvoid 146175067Salcpmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t p, 147175067Salc vm_prot_t prot, boolean_t wired) 148152179Sgrehan{ 149182571Smarcel 150182571Smarcel CTR6(KTR_PMAP, "pmap_enter(%p, %#x, %#x, %p, %#x, %u)", pmap, va, 151182571Smarcel access, p, prot, wired); 152152179Sgrehan MMU_ENTER(mmu_obj, pmap, va, p, prot, wired); 153152179Sgrehan} 154152179Sgrehan 155159323Salcvoid 156159323Salcpmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end, 157159323Salc vm_page_t m_start, vm_prot_t prot) 158159323Salc{ 159182571Smarcel 160182571Smarcel CTR6(KTR_PMAP, "%s(%p, %#x, %#x, %p, %#x)", __func__, pmap, start, 161182571Smarcel end, m_start, prot); 162159323Salc MMU_ENTER_OBJECT(mmu_obj, pmap, start, end, m_start, prot); 163159323Salc} 164159323Salc 165159627Supsvoid 166159627Supspmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) 167152179Sgrehan{ 168182571Smarcel 169182571Smarcel CTR5(KTR_PMAP, "%s(%p, %#x, %p, %#x)", __func__, pmap, va, m, prot); 170159627Sups MMU_ENTER_QUICK(mmu_obj, pmap, va, m, prot); 171152179Sgrehan} 172152179Sgrehan 173152179Sgrehanvm_paddr_t 174152179Sgrehanpmap_extract(pmap_t pmap, vm_offset_t va) 175152179Sgrehan{ 176182571Smarcel 177182571Smarcel CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, pmap, va); 178152179Sgrehan return (MMU_EXTRACT(mmu_obj, pmap, va)); 179152179Sgrehan} 180152179Sgrehan 181152179Sgrehanvm_page_t 182152179Sgrehanpmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot) 183152179Sgrehan{ 184182571Smarcel 185182571Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, pmap, va, prot); 186152179Sgrehan return (MMU_EXTRACT_AND_HOLD(mmu_obj, pmap, va, prot)); 187152179Sgrehan} 188152179Sgrehan 189152179Sgrehanvoid 190152179Sgrehanpmap_growkernel(vm_offset_t va) 191152179Sgrehan{ 192182571Smarcel 193182571Smarcel CTR2(KTR_PMAP, "%s(%#x)", __func__, va); 194152179Sgrehan MMU_GROWKERNEL(mmu_obj, va); 195152179Sgrehan} 196152179Sgrehan 197152179Sgrehanvoid 198152179Sgrehanpmap_init(void) 199152179Sgrehan{ 200182571Smarcel 201182571Smarcel CTR1(KTR_PMAP, "%s()", __func__); 202152179Sgrehan MMU_INIT(mmu_obj); 203152179Sgrehan} 204152179Sgrehan 205152179Sgrehanboolean_t 206152179Sgrehanpmap_is_modified(vm_page_t m) 207152179Sgrehan{ 208182571Smarcel 209182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 210152179Sgrehan return (MMU_IS_MODIFIED(mmu_obj, m)); 211152179Sgrehan} 212152179Sgrehan 213152179Sgrehanboolean_t 214152179Sgrehanpmap_is_prefaultable(pmap_t pmap, vm_offset_t va) 215152179Sgrehan{ 216182571Smarcel 217182571Smarcel CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, pmap, va); 218152179Sgrehan return (MMU_IS_PREFAULTABLE(mmu_obj, pmap, va)); 219152179Sgrehan} 220152179Sgrehan 221152179Sgrehanboolean_t 222207155Salcpmap_is_referenced(vm_page_t m) 223207155Salc{ 224207155Salc 225207155Salc CTR2(KTR_PMAP, "%s(%p)", __func__, m); 226207155Salc return (MMU_IS_REFERENCED(mmu_obj, m)); 227207155Salc} 228207155Salc 229207155Salcboolean_t 230152179Sgrehanpmap_ts_referenced(vm_page_t m) 231152179Sgrehan{ 232182571Smarcel 233182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 234152179Sgrehan return (MMU_TS_REFERENCED(mmu_obj, m)); 235152179Sgrehan} 236152179Sgrehan 237152179Sgrehanvm_offset_t 238152179Sgrehanpmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end, int prot) 239152179Sgrehan{ 240182571Smarcel 241182571Smarcel CTR5(KTR_PMAP, "%s(%p, %#x, %#x, %#x)", __func__, virt, start, end, 242182571Smarcel prot); 243152179Sgrehan return (MMU_MAP(mmu_obj, virt, start, end, prot)); 244152179Sgrehan} 245152179Sgrehan 246152179Sgrehanvoid 247152179Sgrehanpmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object, 248152179Sgrehan vm_pindex_t pindex, vm_size_t size) 249152179Sgrehan{ 250182571Smarcel 251182571Smarcel CTR6(KTR_PMAP, "%s(%p, %#x, %p, %u, %#x)", __func__, pmap, addr, 252182571Smarcel object, pindex, size); 253152179Sgrehan MMU_OBJECT_INIT_PT(mmu_obj, pmap, addr, object, pindex, size); 254152179Sgrehan} 255152179Sgrehan 256152179Sgrehanboolean_t 257152179Sgrehanpmap_page_exists_quick(pmap_t pmap, vm_page_t m) 258152179Sgrehan{ 259182571Smarcel 260182571Smarcel CTR3(KTR_PMAP, "%s(%p, %p)", __func__, pmap, m); 261152179Sgrehan return (MMU_PAGE_EXISTS_QUICK(mmu_obj, pmap, m)); 262152179Sgrehan} 263152179Sgrehan 264152179Sgrehanvoid 265152179Sgrehanpmap_page_init(vm_page_t m) 266152179Sgrehan{ 267182571Smarcel 268182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 269152179Sgrehan MMU_PAGE_INIT(mmu_obj, m); 270152179Sgrehan} 271152179Sgrehan 272173361Skibint 273173708Salcpmap_page_wired_mappings(vm_page_t m) 274173708Salc{ 275173708Salc 276182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 277173708Salc return (MMU_PAGE_WIRED_MAPPINGS(mmu_obj, m)); 278173708Salc} 279173708Salc 280173708Salcint 281152179Sgrehanpmap_pinit(pmap_t pmap) 282152179Sgrehan{ 283182571Smarcel 284182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, pmap); 285152179Sgrehan MMU_PINIT(mmu_obj, pmap); 286173361Skib return (1); 287152179Sgrehan} 288152179Sgrehan 289152179Sgrehanvoid 290152179Sgrehanpmap_pinit0(pmap_t pmap) 291152179Sgrehan{ 292182571Smarcel 293182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, pmap); 294152179Sgrehan MMU_PINIT0(mmu_obj, pmap); 295152179Sgrehan} 296152179Sgrehan 297152179Sgrehanvoid 298152179Sgrehanpmap_protect(pmap_t pmap, vm_offset_t start, vm_offset_t end, vm_prot_t prot) 299152179Sgrehan{ 300182571Smarcel 301182571Smarcel CTR5(KTR_PMAP, "%s(%p, %#x, %#x, %#x)", __func__, pmap, start, end, 302182571Smarcel prot); 303152179Sgrehan MMU_PROTECT(mmu_obj, pmap, start, end, prot); 304152179Sgrehan} 305152179Sgrehan 306152179Sgrehanvoid 307152179Sgrehanpmap_qenter(vm_offset_t start, vm_page_t *m, int count) 308152179Sgrehan{ 309182571Smarcel 310182571Smarcel CTR4(KTR_PMAP, "%s(%#x, %p, %d)", __func__, start, m, count); 311152179Sgrehan MMU_QENTER(mmu_obj, start, m, count); 312152179Sgrehan} 313152179Sgrehan 314152179Sgrehanvoid 315152179Sgrehanpmap_qremove(vm_offset_t start, int count) 316152179Sgrehan{ 317182571Smarcel 318182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %d)", __func__, start, count); 319152179Sgrehan MMU_QREMOVE(mmu_obj, start, count); 320152179Sgrehan} 321152179Sgrehan 322152179Sgrehanvoid 323152179Sgrehanpmap_release(pmap_t pmap) 324152179Sgrehan{ 325182571Smarcel 326182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, pmap); 327152179Sgrehan MMU_RELEASE(mmu_obj, pmap); 328152179Sgrehan} 329152179Sgrehan 330152179Sgrehanvoid 331152179Sgrehanpmap_remove(pmap_t pmap, vm_offset_t start, vm_offset_t end) 332152179Sgrehan{ 333182571Smarcel 334182571Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, pmap, start, end); 335152179Sgrehan MMU_REMOVE(mmu_obj, pmap, start, end); 336152179Sgrehan} 337152179Sgrehan 338152179Sgrehanvoid 339152179Sgrehanpmap_remove_all(vm_page_t m) 340152179Sgrehan{ 341182571Smarcel 342182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 343152179Sgrehan MMU_REMOVE_ALL(mmu_obj, m); 344152179Sgrehan} 345152179Sgrehan 346152179Sgrehanvoid 347157443Speterpmap_remove_pages(pmap_t pmap) 348152179Sgrehan{ 349182571Smarcel 350182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, pmap); 351157443Speter MMU_REMOVE_PAGES(mmu_obj, pmap); 352152179Sgrehan} 353152179Sgrehan 354152179Sgrehanvoid 355160889Salcpmap_remove_write(vm_page_t m) 356160889Salc{ 357182571Smarcel 358182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 359160889Salc MMU_REMOVE_WRITE(mmu_obj, m); 360160889Salc} 361160889Salc 362160889Salcvoid 363152179Sgrehanpmap_zero_page(vm_page_t m) 364152179Sgrehan{ 365182571Smarcel 366182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 367152179Sgrehan MMU_ZERO_PAGE(mmu_obj, m); 368152179Sgrehan} 369152179Sgrehan 370152179Sgrehanvoid 371152179Sgrehanpmap_zero_page_area(vm_page_t m, int off, int size) 372152179Sgrehan{ 373182571Smarcel 374182571Smarcel CTR4(KTR_PMAP, "%s(%p, %d, %d)", __func__, m, off, size); 375152179Sgrehan MMU_ZERO_PAGE_AREA(mmu_obj, m, off, size); 376152179Sgrehan} 377152179Sgrehan 378152179Sgrehanvoid 379152179Sgrehanpmap_zero_page_idle(vm_page_t m) 380152179Sgrehan{ 381182571Smarcel 382182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 383152179Sgrehan MMU_ZERO_PAGE_IDLE(mmu_obj, m); 384152179Sgrehan} 385152179Sgrehan 386152179Sgrehanint 387208504Salcpmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *locked_pa) 388152179Sgrehan{ 389182571Smarcel 390182571Smarcel CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, pmap, addr); 391208504Salc return (MMU_MINCORE(mmu_obj, pmap, addr, locked_pa)); 392152179Sgrehan} 393152179Sgrehan 394152179Sgrehanvoid 395152179Sgrehanpmap_activate(struct thread *td) 396152179Sgrehan{ 397182571Smarcel 398182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, td); 399152179Sgrehan MMU_ACTIVATE(mmu_obj, td); 400152179Sgrehan} 401152179Sgrehan 402152179Sgrehanvoid 403152179Sgrehanpmap_deactivate(struct thread *td) 404152179Sgrehan{ 405182571Smarcel 406182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, td); 407152179Sgrehan MMU_DEACTIVATE(mmu_obj, td); 408152179Sgrehan} 409152179Sgrehan 410178893Salc/* 411178893Salc * Increase the starting virtual address of the given mapping if a 412178893Salc * different alignment might result in more superpage mappings. 413178893Salc */ 414178893Salcvoid 415178893Salcpmap_align_superpage(vm_object_t object, vm_ooffset_t offset, 416178893Salc vm_offset_t *addr, vm_size_t size) 417178893Salc{ 418179081Salc 419182571Smarcel CTR5(KTR_PMAP, "%s(%p, %#x, %p, %#x)", __func__, object, offset, addr, 420182571Smarcel size); 421179081Salc MMU_ALIGN_SUPERPAGE(mmu_obj, object, offset, addr, size); 422178893Salc} 423152179Sgrehan 424152179Sgrehan/* 425152179Sgrehan * Routines used in machine-dependent code 426152179Sgrehan */ 427152179Sgrehanvoid 428152179Sgrehanpmap_bootstrap(vm_offset_t start, vm_offset_t end) 429152179Sgrehan{ 430152179Sgrehan mmu_obj = &mmu_kernel_obj; 431152179Sgrehan 432152179Sgrehan /* 433152179Sgrehan * Take care of compiling the selected class, and 434152179Sgrehan * then statically initialise the MMU object 435152179Sgrehan */ 436152179Sgrehan kobj_class_compile_static(mmu_def_impl, &mmu_kernel_kops); 437227537Smarius kobj_init_static((kobj_t)mmu_obj, mmu_def_impl); 438152179Sgrehan 439152179Sgrehan MMU_BOOTSTRAP(mmu_obj, start, end); 440152179Sgrehan} 441152179Sgrehan 442190681Snwhitehornvoid 443190681Snwhitehornpmap_cpu_bootstrap(int ap) 444190681Snwhitehorn{ 445190681Snwhitehorn /* 446190681Snwhitehorn * No KTR here because our console probably doesn't work yet 447190681Snwhitehorn */ 448190681Snwhitehorn 449190681Snwhitehorn return (MMU_CPU_BOOTSTRAP(mmu_obj, ap)); 450190681Snwhitehorn} 451190681Snwhitehorn 452152179Sgrehanvoid * 453235936Srajpmap_mapdev(vm_paddr_t pa, vm_size_t size) 454152179Sgrehan{ 455182571Smarcel 456182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, pa, size); 457152179Sgrehan return (MMU_MAPDEV(mmu_obj, pa, size)); 458152179Sgrehan} 459152179Sgrehan 460213307Snwhitehornvoid * 461213307Snwhitehornpmap_mapdev_attr(vm_offset_t pa, vm_size_t size, vm_memattr_t attr) 462213307Snwhitehorn{ 463213307Snwhitehorn 464213360Snwhitehorn CTR4(KTR_PMAP, "%s(%#x, %#x, %#x)", __func__, pa, size, attr); 465213307Snwhitehorn return (MMU_MAPDEV_ATTR(mmu_obj, pa, size, attr)); 466213307Snwhitehorn} 467213307Snwhitehorn 468152179Sgrehanvoid 469213307Snwhitehornpmap_page_set_memattr(vm_page_t m, vm_memattr_t ma) 470213307Snwhitehorn{ 471213307Snwhitehorn 472213360Snwhitehorn CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, m, ma); 473213307Snwhitehorn return (MMU_PAGE_SET_MEMATTR(mmu_obj, m, ma)); 474213307Snwhitehorn} 475213307Snwhitehorn 476213307Snwhitehornvoid 477152179Sgrehanpmap_unmapdev(vm_offset_t va, vm_size_t size) 478152179Sgrehan{ 479182571Smarcel 480182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, va, size); 481152179Sgrehan MMU_UNMAPDEV(mmu_obj, va, size); 482152179Sgrehan} 483152179Sgrehan 484235936Srajvm_paddr_t 485152179Sgrehanpmap_kextract(vm_offset_t va) 486152179Sgrehan{ 487182571Smarcel 488182571Smarcel CTR2(KTR_PMAP, "%s(%#x)", __func__, va); 489152179Sgrehan return (MMU_KEXTRACT(mmu_obj, va)); 490152179Sgrehan} 491152179Sgrehan 492152179Sgrehanvoid 493235936Srajpmap_kenter(vm_offset_t va, vm_paddr_t pa) 494152179Sgrehan{ 495182571Smarcel 496182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, va, pa); 497152179Sgrehan MMU_KENTER(mmu_obj, va, pa); 498152179Sgrehan} 499152179Sgrehan 500213307Snwhitehornvoid 501213307Snwhitehornpmap_kenter_attr(vm_offset_t va, vm_offset_t pa, vm_memattr_t ma) 502213307Snwhitehorn{ 503213307Snwhitehorn 504213360Snwhitehorn CTR4(KTR_PMAP, "%s(%#x, %#x, %#x)", __func__, va, pa, ma); 505213307Snwhitehorn MMU_KENTER_ATTR(mmu_obj, va, pa, ma); 506213307Snwhitehorn} 507213307Snwhitehorn 508152179Sgrehanboolean_t 509235936Srajpmap_dev_direct_mapped(vm_paddr_t pa, vm_size_t size) 510152179Sgrehan{ 511182571Smarcel 512182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, pa, size); 513152179Sgrehan return (MMU_DEV_DIRECT_MAPPED(mmu_obj, pa, size)); 514152179Sgrehan} 515152179Sgrehan 516198341Smarcelvoid 517198341Smarcelpmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz) 518164895Sgrehan{ 519198341Smarcel 520198341Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, pm, va, sz); 521198341Smarcel return (MMU_SYNC_ICACHE(mmu_obj, pm, va, sz)); 522164895Sgrehan} 523152179Sgrehan 524190684Smarcelvm_offset_t 525190684Smarcelpmap_dumpsys_map(struct pmap_md *md, vm_size_t ofs, vm_size_t *sz) 526190684Smarcel{ 527190684Smarcel 528190684Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, md, ofs, *sz); 529190684Smarcel return (MMU_DUMPSYS_MAP(mmu_obj, md, ofs, sz)); 530190684Smarcel} 531190684Smarcel 532190684Smarcelvoid 533190684Smarcelpmap_dumpsys_unmap(struct pmap_md *md, vm_size_t ofs, vm_offset_t va) 534190684Smarcel{ 535190684Smarcel 536190684Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, md, ofs, va); 537190684Smarcel return (MMU_DUMPSYS_UNMAP(mmu_obj, md, ofs, va)); 538190684Smarcel} 539190684Smarcel 540190684Smarcelstruct pmap_md * 541190684Smarcelpmap_scan_md(struct pmap_md *prev) 542190684Smarcel{ 543190684Smarcel 544190684Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, prev); 545190684Smarcel return (MMU_SCAN_MD(mmu_obj, prev)); 546190684Smarcel} 547190684Smarcel 548152179Sgrehan/* 549152179Sgrehan * MMU install routines. Highest priority wins, equal priority also 550152179Sgrehan * overrides allowing last-set to win. 551152179Sgrehan */ 552152179SgrehanSET_DECLARE(mmu_set, mmu_def_t); 553152179Sgrehan 554152179Sgrehanboolean_t 555152179Sgrehanpmap_mmu_install(char *name, int prio) 556152179Sgrehan{ 557152179Sgrehan mmu_def_t **mmupp, *mmup; 558152179Sgrehan static int curr_prio = 0; 559152179Sgrehan 560152179Sgrehan /* 561152179Sgrehan * Try and locate the MMU kobj corresponding to the name 562152179Sgrehan */ 563152179Sgrehan SET_FOREACH(mmupp, mmu_set) { 564152179Sgrehan mmup = *mmupp; 565152179Sgrehan 566152179Sgrehan if (mmup->name && 567152179Sgrehan !strcmp(mmup->name, name) && 568192067Snwhitehorn (prio >= curr_prio || mmu_def_impl == NULL)) { 569152179Sgrehan curr_prio = prio; 570152179Sgrehan mmu_def_impl = mmup; 571152179Sgrehan return (TRUE); 572152179Sgrehan } 573152179Sgrehan } 574152179Sgrehan 575152179Sgrehan return (FALSE); 576152179Sgrehan} 577248508Skib 578248508Skibint unmapped_buf_allowed; 579