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