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