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