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: stable/11/sys/powerpc/powerpc/pmap_dispatch.c 310442 2016-12-23 03:19:48Z jhibbits $"); 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> 46276772Smarkj#include <sys/conf.h> 47152179Sgrehan#include <sys/lock.h> 48276772Smarkj#include <sys/kerneldump.h> 49182571Smarcel#include <sys/ktr.h> 50152179Sgrehan#include <sys/mutex.h> 51152179Sgrehan#include <sys/systm.h> 52152179Sgrehan 53152179Sgrehan#include <vm/vm.h> 54152179Sgrehan#include <vm/vm_page.h> 55152179Sgrehan 56276772Smarkj#include <machine/dump.h> 57276772Smarkj#include <machine/md_var.h> 58152179Sgrehan#include <machine/mmuvar.h> 59190681Snwhitehorn#include <machine/smp.h> 60152179Sgrehan 61152179Sgrehan#include "mmu_if.h" 62152179Sgrehan 63152179Sgrehanstatic mmu_def_t *mmu_def_impl; 64152179Sgrehanstatic mmu_t mmu_obj; 65152179Sgrehanstatic struct mmu_kobj mmu_kernel_obj; 66152179Sgrehanstatic struct kobj_ops mmu_kernel_kops; 67152179Sgrehan 68152179Sgrehan/* 69152179Sgrehan * pmap globals 70152179Sgrehan */ 71152179Sgrehanstruct pmap kernel_pmap_store; 72152179Sgrehan 73152179Sgrehanstruct msgbuf *msgbufp; 74152179Sgrehanvm_offset_t msgbuf_phys; 75152179Sgrehan 76152179Sgrehanvm_offset_t kernel_vm_end; 77292680Sjhibbitsvm_paddr_t phys_avail[PHYS_AVAIL_SZ]; 78152179Sgrehanvm_offset_t virtual_avail; 79152179Sgrehanvm_offset_t virtual_end; 80152179Sgrehan 81152179Sgrehanint pmap_bootstrapped; 82152179Sgrehan 83235689Snwhitehorn#ifdef AIM 84235689Snwhitehornint 85235689Snwhitehornpvo_vaddr_compare(struct pvo_entry *a, struct pvo_entry *b) 86235689Snwhitehorn{ 87235689Snwhitehorn if (PVO_VADDR(a) < PVO_VADDR(b)) 88235689Snwhitehorn return (-1); 89235689Snwhitehorn else if (PVO_VADDR(a) > PVO_VADDR(b)) 90235689Snwhitehorn return (1); 91235689Snwhitehorn return (0); 92235689Snwhitehorn} 93235689SnwhitehornRB_GENERATE(pvo_tree, pvo_entry, pvo_plink, pvo_vaddr_compare); 94235689Snwhitehorn#endif 95235689Snwhitehorn 96235689Snwhitehorn 97152179Sgrehanvoid 98255028Salcpmap_advise(pmap_t pmap, vm_offset_t start, vm_offset_t end, int advice) 99255028Salc{ 100255028Salc 101255028Salc CTR5(KTR_PMAP, "%s(%p, %#x, %#x, %d)", __func__, pmap, start, end, 102255028Salc advice); 103255028Salc MMU_ADVISE(mmu_obj, pmap, start, end, advice); 104255028Salc} 105255028Salc 106255028Salcvoid 107152179Sgrehanpmap_clear_modify(vm_page_t m) 108152179Sgrehan{ 109182571Smarcel 110182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 111152179Sgrehan MMU_CLEAR_MODIFY(mmu_obj, m); 112152179Sgrehan} 113152179Sgrehan 114152179Sgrehanvoid 115152179Sgrehanpmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, 116152179Sgrehan vm_size_t len, vm_offset_t src_addr) 117152179Sgrehan{ 118182571Smarcel 119182571Smarcel CTR6(KTR_PMAP, "%s(%p, %p, %#x, %#x, %#x)", __func__, dst_pmap, 120182571Smarcel src_pmap, dst_addr, len, src_addr); 121152179Sgrehan MMU_COPY(mmu_obj, dst_pmap, src_pmap, dst_addr, len, src_addr); 122152179Sgrehan} 123152179Sgrehan 124152179Sgrehanvoid 125152179Sgrehanpmap_copy_page(vm_page_t src, vm_page_t dst) 126152179Sgrehan{ 127182571Smarcel 128182571Smarcel CTR3(KTR_PMAP, "%s(%p, %p)", __func__, src, dst); 129152179Sgrehan MMU_COPY_PAGE(mmu_obj, src, dst); 130152179Sgrehan} 131152179Sgrehan 132152179Sgrehanvoid 133248280Skibpmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[], 134248280Skib vm_offset_t b_offset, int xfersize) 135248280Skib{ 136248280Skib 137248280Skib CTR6(KTR_PMAP, "%s(%p, %#x, %p, %#x, %#x)", __func__, ma, 138248280Skib a_offset, mb, b_offset, xfersize); 139248280Skib MMU_COPY_PAGES(mmu_obj, ma, a_offset, mb, b_offset, xfersize); 140248280Skib} 141248280Skib 142269728Skibint 143269728Skibpmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t p, vm_prot_t prot, 144269728Skib u_int flags, int8_t psind) 145152179Sgrehan{ 146182571Smarcel 147269728Skib CTR6(KTR_PMAP, "pmap_enter(%p, %#x, %p, %#x, %x, %d)", pmap, va, 148269728Skib p, prot, flags, psind); 149269728Skib return (MMU_ENTER(mmu_obj, pmap, va, p, prot, flags, psind)); 150152179Sgrehan} 151152179Sgrehan 152159323Salcvoid 153159323Salcpmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end, 154159323Salc vm_page_t m_start, vm_prot_t prot) 155159323Salc{ 156182571Smarcel 157182571Smarcel CTR6(KTR_PMAP, "%s(%p, %#x, %#x, %p, %#x)", __func__, pmap, start, 158182571Smarcel end, m_start, prot); 159159323Salc MMU_ENTER_OBJECT(mmu_obj, pmap, start, end, m_start, prot); 160159323Salc} 161159323Salc 162159627Supsvoid 163159627Supspmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot) 164152179Sgrehan{ 165182571Smarcel 166182571Smarcel CTR5(KTR_PMAP, "%s(%p, %#x, %p, %#x)", __func__, pmap, va, m, prot); 167159627Sups MMU_ENTER_QUICK(mmu_obj, pmap, va, m, prot); 168152179Sgrehan} 169152179Sgrehan 170152179Sgrehanvm_paddr_t 171152179Sgrehanpmap_extract(pmap_t pmap, vm_offset_t va) 172152179Sgrehan{ 173182571Smarcel 174182571Smarcel CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, pmap, va); 175152179Sgrehan return (MMU_EXTRACT(mmu_obj, pmap, va)); 176152179Sgrehan} 177152179Sgrehan 178152179Sgrehanvm_page_t 179152179Sgrehanpmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot) 180152179Sgrehan{ 181182571Smarcel 182182571Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, pmap, va, prot); 183152179Sgrehan return (MMU_EXTRACT_AND_HOLD(mmu_obj, pmap, va, prot)); 184152179Sgrehan} 185152179Sgrehan 186152179Sgrehanvoid 187152179Sgrehanpmap_growkernel(vm_offset_t va) 188152179Sgrehan{ 189182571Smarcel 190182571Smarcel CTR2(KTR_PMAP, "%s(%#x)", __func__, va); 191152179Sgrehan MMU_GROWKERNEL(mmu_obj, va); 192152179Sgrehan} 193152179Sgrehan 194152179Sgrehanvoid 195152179Sgrehanpmap_init(void) 196152179Sgrehan{ 197182571Smarcel 198182571Smarcel CTR1(KTR_PMAP, "%s()", __func__); 199152179Sgrehan MMU_INIT(mmu_obj); 200152179Sgrehan} 201152179Sgrehan 202152179Sgrehanboolean_t 203152179Sgrehanpmap_is_modified(vm_page_t m) 204152179Sgrehan{ 205182571Smarcel 206182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 207152179Sgrehan return (MMU_IS_MODIFIED(mmu_obj, m)); 208152179Sgrehan} 209152179Sgrehan 210152179Sgrehanboolean_t 211152179Sgrehanpmap_is_prefaultable(pmap_t pmap, vm_offset_t va) 212152179Sgrehan{ 213182571Smarcel 214182571Smarcel CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, pmap, va); 215152179Sgrehan return (MMU_IS_PREFAULTABLE(mmu_obj, pmap, va)); 216152179Sgrehan} 217152179Sgrehan 218152179Sgrehanboolean_t 219207155Salcpmap_is_referenced(vm_page_t m) 220207155Salc{ 221207155Salc 222207155Salc CTR2(KTR_PMAP, "%s(%p)", __func__, m); 223207155Salc return (MMU_IS_REFERENCED(mmu_obj, m)); 224207155Salc} 225207155Salc 226207155Salcboolean_t 227152179Sgrehanpmap_ts_referenced(vm_page_t m) 228152179Sgrehan{ 229182571Smarcel 230182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 231152179Sgrehan return (MMU_TS_REFERENCED(mmu_obj, m)); 232152179Sgrehan} 233152179Sgrehan 234152179Sgrehanvm_offset_t 235152179Sgrehanpmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end, int prot) 236152179Sgrehan{ 237182571Smarcel 238182571Smarcel CTR5(KTR_PMAP, "%s(%p, %#x, %#x, %#x)", __func__, virt, start, end, 239182571Smarcel prot); 240152179Sgrehan return (MMU_MAP(mmu_obj, virt, start, end, prot)); 241152179Sgrehan} 242152179Sgrehan 243152179Sgrehanvoid 244152179Sgrehanpmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object, 245152179Sgrehan vm_pindex_t pindex, vm_size_t size) 246152179Sgrehan{ 247182571Smarcel 248182571Smarcel CTR6(KTR_PMAP, "%s(%p, %#x, %p, %u, %#x)", __func__, pmap, addr, 249182571Smarcel object, pindex, size); 250152179Sgrehan MMU_OBJECT_INIT_PT(mmu_obj, pmap, addr, object, pindex, size); 251152179Sgrehan} 252152179Sgrehan 253152179Sgrehanboolean_t 254152179Sgrehanpmap_page_exists_quick(pmap_t pmap, vm_page_t m) 255152179Sgrehan{ 256182571Smarcel 257182571Smarcel CTR3(KTR_PMAP, "%s(%p, %p)", __func__, pmap, m); 258152179Sgrehan return (MMU_PAGE_EXISTS_QUICK(mmu_obj, pmap, m)); 259152179Sgrehan} 260152179Sgrehan 261152179Sgrehanvoid 262152179Sgrehanpmap_page_init(vm_page_t m) 263152179Sgrehan{ 264182571Smarcel 265182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 266152179Sgrehan MMU_PAGE_INIT(mmu_obj, m); 267152179Sgrehan} 268152179Sgrehan 269173361Skibint 270173708Salcpmap_page_wired_mappings(vm_page_t m) 271173708Salc{ 272173708Salc 273182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 274173708Salc return (MMU_PAGE_WIRED_MAPPINGS(mmu_obj, m)); 275173708Salc} 276173708Salc 277173708Salcint 278152179Sgrehanpmap_pinit(pmap_t pmap) 279152179Sgrehan{ 280182571Smarcel 281182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, pmap); 282152179Sgrehan MMU_PINIT(mmu_obj, pmap); 283173361Skib return (1); 284152179Sgrehan} 285152179Sgrehan 286152179Sgrehanvoid 287152179Sgrehanpmap_pinit0(pmap_t pmap) 288152179Sgrehan{ 289182571Smarcel 290182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, pmap); 291152179Sgrehan MMU_PINIT0(mmu_obj, pmap); 292152179Sgrehan} 293152179Sgrehan 294152179Sgrehanvoid 295152179Sgrehanpmap_protect(pmap_t pmap, vm_offset_t start, vm_offset_t end, vm_prot_t prot) 296152179Sgrehan{ 297182571Smarcel 298182571Smarcel CTR5(KTR_PMAP, "%s(%p, %#x, %#x, %#x)", __func__, pmap, start, end, 299182571Smarcel prot); 300152179Sgrehan MMU_PROTECT(mmu_obj, pmap, start, end, prot); 301152179Sgrehan} 302152179Sgrehan 303152179Sgrehanvoid 304152179Sgrehanpmap_qenter(vm_offset_t start, vm_page_t *m, int count) 305152179Sgrehan{ 306182571Smarcel 307182571Smarcel CTR4(KTR_PMAP, "%s(%#x, %p, %d)", __func__, start, m, count); 308152179Sgrehan MMU_QENTER(mmu_obj, start, m, count); 309152179Sgrehan} 310152179Sgrehan 311152179Sgrehanvoid 312152179Sgrehanpmap_qremove(vm_offset_t start, int count) 313152179Sgrehan{ 314182571Smarcel 315182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %d)", __func__, start, count); 316152179Sgrehan MMU_QREMOVE(mmu_obj, start, count); 317152179Sgrehan} 318152179Sgrehan 319152179Sgrehanvoid 320152179Sgrehanpmap_release(pmap_t pmap) 321152179Sgrehan{ 322182571Smarcel 323182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, pmap); 324152179Sgrehan MMU_RELEASE(mmu_obj, pmap); 325152179Sgrehan} 326152179Sgrehan 327152179Sgrehanvoid 328152179Sgrehanpmap_remove(pmap_t pmap, vm_offset_t start, vm_offset_t end) 329152179Sgrehan{ 330182571Smarcel 331182571Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, pmap, start, end); 332152179Sgrehan MMU_REMOVE(mmu_obj, pmap, start, end); 333152179Sgrehan} 334152179Sgrehan 335152179Sgrehanvoid 336152179Sgrehanpmap_remove_all(vm_page_t m) 337152179Sgrehan{ 338182571Smarcel 339182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 340152179Sgrehan MMU_REMOVE_ALL(mmu_obj, m); 341152179Sgrehan} 342152179Sgrehan 343152179Sgrehanvoid 344157443Speterpmap_remove_pages(pmap_t pmap) 345152179Sgrehan{ 346182571Smarcel 347182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, pmap); 348157443Speter MMU_REMOVE_PAGES(mmu_obj, pmap); 349152179Sgrehan} 350152179Sgrehan 351152179Sgrehanvoid 352160889Salcpmap_remove_write(vm_page_t m) 353160889Salc{ 354182571Smarcel 355182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 356160889Salc MMU_REMOVE_WRITE(mmu_obj, m); 357160889Salc} 358160889Salc 359160889Salcvoid 360268591Salcpmap_unwire(pmap_t pmap, vm_offset_t start, vm_offset_t end) 361268591Salc{ 362268591Salc 363268591Salc CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, pmap, start, end); 364268591Salc MMU_UNWIRE(mmu_obj, pmap, start, end); 365268591Salc} 366268591Salc 367268591Salcvoid 368152179Sgrehanpmap_zero_page(vm_page_t m) 369152179Sgrehan{ 370182571Smarcel 371182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 372152179Sgrehan MMU_ZERO_PAGE(mmu_obj, m); 373152179Sgrehan} 374152179Sgrehan 375152179Sgrehanvoid 376152179Sgrehanpmap_zero_page_area(vm_page_t m, int off, int size) 377152179Sgrehan{ 378182571Smarcel 379182571Smarcel CTR4(KTR_PMAP, "%s(%p, %d, %d)", __func__, m, off, size); 380152179Sgrehan MMU_ZERO_PAGE_AREA(mmu_obj, m, off, size); 381152179Sgrehan} 382152179Sgrehan 383152179Sgrehanvoid 384152179Sgrehanpmap_zero_page_idle(vm_page_t m) 385152179Sgrehan{ 386182571Smarcel 387182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, m); 388152179Sgrehan MMU_ZERO_PAGE_IDLE(mmu_obj, m); 389152179Sgrehan} 390152179Sgrehan 391152179Sgrehanint 392208504Salcpmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *locked_pa) 393152179Sgrehan{ 394182571Smarcel 395182571Smarcel CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, pmap, addr); 396208504Salc return (MMU_MINCORE(mmu_obj, pmap, addr, locked_pa)); 397152179Sgrehan} 398152179Sgrehan 399152179Sgrehanvoid 400152179Sgrehanpmap_activate(struct thread *td) 401152179Sgrehan{ 402182571Smarcel 403182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, td); 404152179Sgrehan MMU_ACTIVATE(mmu_obj, td); 405152179Sgrehan} 406152179Sgrehan 407152179Sgrehanvoid 408152179Sgrehanpmap_deactivate(struct thread *td) 409152179Sgrehan{ 410182571Smarcel 411182571Smarcel CTR2(KTR_PMAP, "%s(%p)", __func__, td); 412152179Sgrehan MMU_DEACTIVATE(mmu_obj, td); 413152179Sgrehan} 414152179Sgrehan 415178893Salc/* 416178893Salc * Increase the starting virtual address of the given mapping if a 417178893Salc * different alignment might result in more superpage mappings. 418178893Salc */ 419178893Salcvoid 420178893Salcpmap_align_superpage(vm_object_t object, vm_ooffset_t offset, 421178893Salc vm_offset_t *addr, vm_size_t size) 422178893Salc{ 423179081Salc 424182571Smarcel CTR5(KTR_PMAP, "%s(%p, %#x, %p, %#x)", __func__, object, offset, addr, 425182571Smarcel size); 426179081Salc MMU_ALIGN_SUPERPAGE(mmu_obj, object, offset, addr, size); 427178893Salc} 428152179Sgrehan 429152179Sgrehan/* 430152179Sgrehan * Routines used in machine-dependent code 431152179Sgrehan */ 432152179Sgrehanvoid 433152179Sgrehanpmap_bootstrap(vm_offset_t start, vm_offset_t end) 434152179Sgrehan{ 435152179Sgrehan mmu_obj = &mmu_kernel_obj; 436152179Sgrehan 437152179Sgrehan /* 438152179Sgrehan * Take care of compiling the selected class, and 439152179Sgrehan * then statically initialise the MMU object 440152179Sgrehan */ 441152179Sgrehan kobj_class_compile_static(mmu_def_impl, &mmu_kernel_kops); 442227537Smarius kobj_init_static((kobj_t)mmu_obj, mmu_def_impl); 443152179Sgrehan 444152179Sgrehan MMU_BOOTSTRAP(mmu_obj, start, end); 445152179Sgrehan} 446152179Sgrehan 447190681Snwhitehornvoid 448190681Snwhitehornpmap_cpu_bootstrap(int ap) 449190681Snwhitehorn{ 450190681Snwhitehorn /* 451190681Snwhitehorn * No KTR here because our console probably doesn't work yet 452190681Snwhitehorn */ 453190681Snwhitehorn 454190681Snwhitehorn return (MMU_CPU_BOOTSTRAP(mmu_obj, ap)); 455190681Snwhitehorn} 456190681Snwhitehorn 457152179Sgrehanvoid * 458235936Srajpmap_mapdev(vm_paddr_t pa, vm_size_t size) 459152179Sgrehan{ 460182571Smarcel 461182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, pa, size); 462152179Sgrehan return (MMU_MAPDEV(mmu_obj, pa, size)); 463152179Sgrehan} 464152179Sgrehan 465213307Snwhitehornvoid * 466287418Sjhibbitspmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, vm_memattr_t attr) 467213307Snwhitehorn{ 468213307Snwhitehorn 469213360Snwhitehorn CTR4(KTR_PMAP, "%s(%#x, %#x, %#x)", __func__, pa, size, attr); 470213307Snwhitehorn return (MMU_MAPDEV_ATTR(mmu_obj, pa, size, attr)); 471213307Snwhitehorn} 472213307Snwhitehorn 473152179Sgrehanvoid 474213307Snwhitehornpmap_page_set_memattr(vm_page_t m, vm_memattr_t ma) 475213307Snwhitehorn{ 476213307Snwhitehorn 477213360Snwhitehorn CTR3(KTR_PMAP, "%s(%p, %#x)", __func__, m, ma); 478213307Snwhitehorn return (MMU_PAGE_SET_MEMATTR(mmu_obj, m, ma)); 479213307Snwhitehorn} 480213307Snwhitehorn 481213307Snwhitehornvoid 482152179Sgrehanpmap_unmapdev(vm_offset_t va, vm_size_t size) 483152179Sgrehan{ 484182571Smarcel 485182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, va, size); 486152179Sgrehan MMU_UNMAPDEV(mmu_obj, va, size); 487152179Sgrehan} 488152179Sgrehan 489235936Srajvm_paddr_t 490152179Sgrehanpmap_kextract(vm_offset_t va) 491152179Sgrehan{ 492182571Smarcel 493182571Smarcel CTR2(KTR_PMAP, "%s(%#x)", __func__, va); 494152179Sgrehan return (MMU_KEXTRACT(mmu_obj, va)); 495152179Sgrehan} 496152179Sgrehan 497152179Sgrehanvoid 498235936Srajpmap_kenter(vm_offset_t va, vm_paddr_t pa) 499152179Sgrehan{ 500182571Smarcel 501182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, va, pa); 502152179Sgrehan MMU_KENTER(mmu_obj, va, pa); 503152179Sgrehan} 504152179Sgrehan 505213307Snwhitehornvoid 506213307Snwhitehornpmap_kenter_attr(vm_offset_t va, vm_offset_t pa, vm_memattr_t ma) 507213307Snwhitehorn{ 508213307Snwhitehorn 509213360Snwhitehorn CTR4(KTR_PMAP, "%s(%#x, %#x, %#x)", __func__, va, pa, ma); 510213307Snwhitehorn MMU_KENTER_ATTR(mmu_obj, va, pa, ma); 511213307Snwhitehorn} 512213307Snwhitehorn 513310442Sjhibbitsvoid 514310442Sjhibbitspmap_kremove(vm_offset_t va) 515310442Sjhibbits{ 516310442Sjhibbits 517310442Sjhibbits CTR2(KTR_PMAP, "%s(%#x)", __func__, va); 518310442Sjhibbits return (MMU_KREMOVE(mmu_obj, va)); 519310442Sjhibbits} 520310442Sjhibbits 521152179Sgrehanboolean_t 522235936Srajpmap_dev_direct_mapped(vm_paddr_t pa, vm_size_t size) 523152179Sgrehan{ 524182571Smarcel 525182571Smarcel CTR3(KTR_PMAP, "%s(%#x, %#x)", __func__, pa, size); 526152179Sgrehan return (MMU_DEV_DIRECT_MAPPED(mmu_obj, pa, size)); 527152179Sgrehan} 528152179Sgrehan 529198341Smarcelvoid 530198341Smarcelpmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz) 531164895Sgrehan{ 532198341Smarcel 533198341Smarcel CTR4(KTR_PMAP, "%s(%p, %#x, %#x)", __func__, pm, va, sz); 534198341Smarcel return (MMU_SYNC_ICACHE(mmu_obj, pm, va, sz)); 535164895Sgrehan} 536152179Sgrehan 537276772Smarkjvoid 538276772Smarkjdumpsys_map_chunk(vm_paddr_t pa, size_t sz, void **va) 539190684Smarcel{ 540190684Smarcel 541276772Smarkj CTR4(KTR_PMAP, "%s(%#jx, %#zx, %p)", __func__, (uintmax_t)pa, sz, va); 542276772Smarkj return (MMU_DUMPSYS_MAP(mmu_obj, pa, sz, va)); 543190684Smarcel} 544190684Smarcel 545190684Smarcelvoid 546276772Smarkjdumpsys_unmap_chunk(vm_paddr_t pa, size_t sz, void *va) 547190684Smarcel{ 548190684Smarcel 549276772Smarkj CTR4(KTR_PMAP, "%s(%#jx, %#zx, %p)", __func__, (uintmax_t)pa, sz, va); 550276772Smarkj return (MMU_DUMPSYS_UNMAP(mmu_obj, pa, sz, va)); 551190684Smarcel} 552190684Smarcel 553276772Smarkjvoid 554276772Smarkjdumpsys_pa_init(void) 555190684Smarcel{ 556190684Smarcel 557276772Smarkj CTR1(KTR_PMAP, "%s()", __func__); 558276772Smarkj return (MMU_SCAN_INIT(mmu_obj)); 559190684Smarcel} 560190684Smarcel 561286296Sjahvm_offset_t 562286296Sjahpmap_quick_enter_page(vm_page_t m) 563286296Sjah{ 564286296Sjah CTR2(KTR_PMAP, "%s(%p)", __func__, m); 565286296Sjah return (MMU_QUICK_ENTER_PAGE(mmu_obj, m)); 566286296Sjah} 567286296Sjah 568286296Sjahvoid 569286296Sjahpmap_quick_remove_page(vm_offset_t addr) 570286296Sjah{ 571286296Sjah CTR2(KTR_PMAP, "%s(%#x)", __func__, addr); 572286296Sjah MMU_QUICK_REMOVE_PAGE(mmu_obj, addr); 573286296Sjah} 574286296Sjah 575296142Sjhibbitsint 576296142Sjhibbitspmap_change_attr(vm_offset_t addr, vm_size_t size, vm_memattr_t mode) 577296142Sjhibbits{ 578296142Sjhibbits CTR4(KTR_PMAP, "%s(%#x, %#zx, %d)", __func__, addr, size, mode); 579296142Sjhibbits return (MMU_CHANGE_ATTR(mmu_obj, addr, size, mode)); 580296142Sjhibbits} 581296142Sjhibbits 582152179Sgrehan/* 583152179Sgrehan * MMU install routines. Highest priority wins, equal priority also 584152179Sgrehan * overrides allowing last-set to win. 585152179Sgrehan */ 586152179SgrehanSET_DECLARE(mmu_set, mmu_def_t); 587152179Sgrehan 588152179Sgrehanboolean_t 589152179Sgrehanpmap_mmu_install(char *name, int prio) 590152179Sgrehan{ 591152179Sgrehan mmu_def_t **mmupp, *mmup; 592152179Sgrehan static int curr_prio = 0; 593152179Sgrehan 594152179Sgrehan /* 595152179Sgrehan * Try and locate the MMU kobj corresponding to the name 596152179Sgrehan */ 597152179Sgrehan SET_FOREACH(mmupp, mmu_set) { 598152179Sgrehan mmup = *mmupp; 599152179Sgrehan 600152179Sgrehan if (mmup->name && 601152179Sgrehan !strcmp(mmup->name, name) && 602192067Snwhitehorn (prio >= curr_prio || mmu_def_impl == NULL)) { 603152179Sgrehan curr_prio = prio; 604152179Sgrehan mmu_def_impl = mmup; 605152179Sgrehan return (TRUE); 606152179Sgrehan } 607152179Sgrehan } 608152179Sgrehan 609152179Sgrehan return (FALSE); 610152179Sgrehan} 611248508Skib 612248508Skibint unmapped_buf_allowed; 613