]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/powerpc/aim/mmu_oea64.c
Move the pmap-specific code in copyinout.c that gets pointers to userland
[FreeBSD/FreeBSD.git] / sys / powerpc / aim / mmu_oea64.c
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2008-2015 Nathan Whitehorn
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #include <sys/cdefs.h>
30 __FBSDID("$FreeBSD$");
31
32 /*
33  * Manages physical address maps.
34  *
35  * Since the information managed by this module is also stored by the
36  * logical address mapping module, this module may throw away valid virtual
37  * to physical mappings at almost any time.  However, invalidations of
38  * mappings must be done as requested.
39  *
40  * In order to cope with hardware architectures which make virtual to
41  * physical map invalidates expensive, this module may delay invalidate
42  * reduced protection operations until such time as they are actually
43  * necessary.  This module is given full information as to which processors
44  * are currently using which maps, and to when physical maps must be made
45  * correct.
46  */
47
48 #include "opt_compat.h"
49 #include "opt_kstack_pages.h"
50
51 #include <sys/param.h>
52 #include <sys/kernel.h>
53 #include <sys/conf.h>
54 #include <sys/queue.h>
55 #include <sys/cpuset.h>
56 #include <sys/kerneldump.h>
57 #include <sys/ktr.h>
58 #include <sys/lock.h>
59 #include <sys/msgbuf.h>
60 #include <sys/malloc.h>
61 #include <sys/mutex.h>
62 #include <sys/proc.h>
63 #include <sys/rwlock.h>
64 #include <sys/sched.h>
65 #include <sys/sysctl.h>
66 #include <sys/systm.h>
67 #include <sys/vmmeter.h>
68 #include <sys/smp.h>
69
70 #include <sys/kdb.h>
71
72 #include <dev/ofw/openfirm.h>
73
74 #include <vm/vm.h>
75 #include <vm/vm_param.h>
76 #include <vm/vm_kern.h>
77 #include <vm/vm_page.h>
78 #include <vm/vm_map.h>
79 #include <vm/vm_object.h>
80 #include <vm/vm_extern.h>
81 #include <vm/vm_pageout.h>
82 #include <vm/uma.h>
83
84 #include <machine/_inttypes.h>
85 #include <machine/cpu.h>
86 #include <machine/platform.h>
87 #include <machine/frame.h>
88 #include <machine/md_var.h>
89 #include <machine/psl.h>
90 #include <machine/bat.h>
91 #include <machine/hid.h>
92 #include <machine/pte.h>
93 #include <machine/sr.h>
94 #include <machine/trap.h>
95 #include <machine/mmuvar.h>
96
97 #include "mmu_oea64.h"
98 #include "mmu_if.h"
99 #include "moea64_if.h"
100
101 void moea64_release_vsid(uint64_t vsid);
102 uintptr_t moea64_get_unique_vsid(void); 
103
104 #define DISABLE_TRANS(msr)      msr = mfmsr(); mtmsr(msr & ~PSL_DR)
105 #define ENABLE_TRANS(msr)       mtmsr(msr)
106
107 #define VSID_MAKE(sr, hash)     ((sr) | (((hash) & 0xfffff) << 4))
108 #define VSID_TO_HASH(vsid)      (((vsid) >> 4) & 0xfffff)
109 #define VSID_HASH_MASK          0x0000007fffffffffULL
110
111 /*
112  * Locking semantics:
113  * 
114  * There are two locks of interest: the page locks and the pmap locks, which
115  * protect their individual PVO lists and are locked in that order. The contents
116  * of all PVO entries are protected by the locks of their respective pmaps.
117  * The pmap of any PVO is guaranteed not to change so long as the PVO is linked
118  * into any list.
119  *
120  */
121
122 #define PV_LOCK_COUNT   PA_LOCK_COUNT*3
123 static struct mtx_padalign pv_lock[PV_LOCK_COUNT];
124  
125 #define PV_LOCKPTR(pa)  ((struct mtx *)(&pv_lock[pa_index(pa) % PV_LOCK_COUNT]))
126 #define PV_LOCK(pa)             mtx_lock(PV_LOCKPTR(pa))
127 #define PV_UNLOCK(pa)           mtx_unlock(PV_LOCKPTR(pa))
128 #define PV_LOCKASSERT(pa)       mtx_assert(PV_LOCKPTR(pa), MA_OWNED)
129 #define PV_PAGE_LOCK(m)         PV_LOCK(VM_PAGE_TO_PHYS(m))
130 #define PV_PAGE_UNLOCK(m)       PV_UNLOCK(VM_PAGE_TO_PHYS(m))
131 #define PV_PAGE_LOCKASSERT(m)   PV_LOCKASSERT(VM_PAGE_TO_PHYS(m))
132
133 struct ofw_map {
134         cell_t  om_va;
135         cell_t  om_len;
136         uint64_t om_pa;
137         cell_t  om_mode;
138 };
139
140 extern unsigned char _etext[];
141 extern unsigned char _end[];
142
143 /*
144  * Map of physical memory regions.
145  */
146 static struct   mem_region *regions;
147 static struct   mem_region *pregions;
148 static u_int    phys_avail_count;
149 static int      regions_sz, pregions_sz;
150
151 extern void bs_remap_earlyboot(void);
152
153 /*
154  * Lock for the SLB tables.
155  */
156 struct mtx      moea64_slb_mutex;
157
158 /*
159  * PTEG data.
160  */
161 u_int           moea64_pteg_count;
162 u_int           moea64_pteg_mask;
163
164 /*
165  * PVO data.
166  */
167
168 uma_zone_t      moea64_pvo_zone; /* zone for pvo entries */
169
170 static struct   pvo_entry *moea64_bpvo_pool;
171 static int      moea64_bpvo_pool_index = 0;
172 static int      moea64_bpvo_pool_size = 327680;
173 TUNABLE_INT("machdep.moea64_bpvo_pool_size", &moea64_bpvo_pool_size);
174 SYSCTL_INT(_machdep, OID_AUTO, moea64_allocated_bpvo_entries, CTLFLAG_RD, 
175     &moea64_bpvo_pool_index, 0, "");
176
177 #define VSID_NBPW       (sizeof(u_int32_t) * 8)
178 #ifdef __powerpc64__
179 #define NVSIDS          (NPMAPS * 16)
180 #define VSID_HASHMASK   0xffffffffUL
181 #else
182 #define NVSIDS          NPMAPS
183 #define VSID_HASHMASK   0xfffffUL
184 #endif
185 static u_int    moea64_vsid_bitmap[NVSIDS / VSID_NBPW];
186
187 static boolean_t moea64_initialized = FALSE;
188
189 /*
190  * Statistics.
191  */
192 u_int   moea64_pte_valid = 0;
193 u_int   moea64_pte_overflow = 0;
194 u_int   moea64_pvo_entries = 0;
195 u_int   moea64_pvo_enter_calls = 0;
196 u_int   moea64_pvo_remove_calls = 0;
197 SYSCTL_INT(_machdep, OID_AUTO, moea64_pte_valid, CTLFLAG_RD, 
198     &moea64_pte_valid, 0, "");
199 SYSCTL_INT(_machdep, OID_AUTO, moea64_pte_overflow, CTLFLAG_RD,
200     &moea64_pte_overflow, 0, "");
201 SYSCTL_INT(_machdep, OID_AUTO, moea64_pvo_entries, CTLFLAG_RD, 
202     &moea64_pvo_entries, 0, "");
203 SYSCTL_INT(_machdep, OID_AUTO, moea64_pvo_enter_calls, CTLFLAG_RD,
204     &moea64_pvo_enter_calls, 0, "");
205 SYSCTL_INT(_machdep, OID_AUTO, moea64_pvo_remove_calls, CTLFLAG_RD,
206     &moea64_pvo_remove_calls, 0, "");
207
208 vm_offset_t     moea64_scratchpage_va[2];
209 struct pvo_entry *moea64_scratchpage_pvo[2];
210 struct  mtx     moea64_scratchpage_mtx;
211
212 uint64_t        moea64_large_page_mask = 0;
213 uint64_t        moea64_large_page_size = 0;
214 int             moea64_large_page_shift = 0;
215
216 /*
217  * PVO calls.
218  */
219 static int      moea64_pvo_enter(mmu_t mmu, struct pvo_entry *pvo,
220                     struct pvo_head *pvo_head);
221 static void     moea64_pvo_remove_from_pmap(mmu_t mmu, struct pvo_entry *pvo);
222 static void     moea64_pvo_remove_from_page(mmu_t mmu, struct pvo_entry *pvo);
223 static struct   pvo_entry *moea64_pvo_find_va(pmap_t, vm_offset_t);
224
225 /*
226  * Utility routines.
227  */
228 static boolean_t        moea64_query_bit(mmu_t, vm_page_t, uint64_t);
229 static u_int            moea64_clear_bit(mmu_t, vm_page_t, uint64_t);
230 static void             moea64_kremove(mmu_t, vm_offset_t);
231 static void             moea64_syncicache(mmu_t, pmap_t pmap, vm_offset_t va, 
232                             vm_paddr_t pa, vm_size_t sz);
233 static void             moea64_pmap_init_qpages(void);
234
235 /*
236  * Kernel MMU interface
237  */
238 void moea64_clear_modify(mmu_t, vm_page_t);
239 void moea64_copy_page(mmu_t, vm_page_t, vm_page_t);
240 void moea64_copy_pages(mmu_t mmu, vm_page_t *ma, vm_offset_t a_offset,
241     vm_page_t *mb, vm_offset_t b_offset, int xfersize);
242 int moea64_enter(mmu_t, pmap_t, vm_offset_t, vm_page_t, vm_prot_t,
243     u_int flags, int8_t psind);
244 void moea64_enter_object(mmu_t, pmap_t, vm_offset_t, vm_offset_t, vm_page_t,
245     vm_prot_t);
246 void moea64_enter_quick(mmu_t, pmap_t, vm_offset_t, vm_page_t, vm_prot_t);
247 vm_paddr_t moea64_extract(mmu_t, pmap_t, vm_offset_t);
248 vm_page_t moea64_extract_and_hold(mmu_t, pmap_t, vm_offset_t, vm_prot_t);
249 void moea64_init(mmu_t);
250 boolean_t moea64_is_modified(mmu_t, vm_page_t);
251 boolean_t moea64_is_prefaultable(mmu_t, pmap_t, vm_offset_t);
252 boolean_t moea64_is_referenced(mmu_t, vm_page_t);
253 int moea64_ts_referenced(mmu_t, vm_page_t);
254 vm_offset_t moea64_map(mmu_t, vm_offset_t *, vm_paddr_t, vm_paddr_t, int);
255 boolean_t moea64_page_exists_quick(mmu_t, pmap_t, vm_page_t);
256 void moea64_page_init(mmu_t, vm_page_t);
257 int moea64_page_wired_mappings(mmu_t, vm_page_t);
258 void moea64_pinit(mmu_t, pmap_t);
259 void moea64_pinit0(mmu_t, pmap_t);
260 void moea64_protect(mmu_t, pmap_t, vm_offset_t, vm_offset_t, vm_prot_t);
261 void moea64_qenter(mmu_t, vm_offset_t, vm_page_t *, int);
262 void moea64_qremove(mmu_t, vm_offset_t, int);
263 void moea64_release(mmu_t, pmap_t);
264 void moea64_remove(mmu_t, pmap_t, vm_offset_t, vm_offset_t);
265 void moea64_remove_pages(mmu_t, pmap_t);
266 void moea64_remove_all(mmu_t, vm_page_t);
267 void moea64_remove_write(mmu_t, vm_page_t);
268 void moea64_unwire(mmu_t, pmap_t, vm_offset_t, vm_offset_t);
269 void moea64_zero_page(mmu_t, vm_page_t);
270 void moea64_zero_page_area(mmu_t, vm_page_t, int, int);
271 void moea64_activate(mmu_t, struct thread *);
272 void moea64_deactivate(mmu_t, struct thread *);
273 void *moea64_mapdev(mmu_t, vm_paddr_t, vm_size_t);
274 void *moea64_mapdev_attr(mmu_t, vm_paddr_t, vm_size_t, vm_memattr_t);
275 void moea64_unmapdev(mmu_t, vm_offset_t, vm_size_t);
276 vm_paddr_t moea64_kextract(mmu_t, vm_offset_t);
277 void moea64_page_set_memattr(mmu_t, vm_page_t m, vm_memattr_t ma);
278 void moea64_kenter_attr(mmu_t, vm_offset_t, vm_paddr_t, vm_memattr_t ma);
279 void moea64_kenter(mmu_t, vm_offset_t, vm_paddr_t);
280 boolean_t moea64_dev_direct_mapped(mmu_t, vm_paddr_t, vm_size_t);
281 static void moea64_sync_icache(mmu_t, pmap_t, vm_offset_t, vm_size_t);
282 void moea64_dumpsys_map(mmu_t mmu, vm_paddr_t pa, size_t sz,
283     void **va);
284 void moea64_scan_init(mmu_t mmu);
285 vm_offset_t moea64_quick_enter_page(mmu_t mmu, vm_page_t m);
286 void moea64_quick_remove_page(mmu_t mmu, vm_offset_t addr);
287 static int moea64_map_user_ptr(mmu_t mmu, pmap_t pm,
288     volatile const void *uaddr, void **kaddr, size_t ulen, size_t *klen);
289
290
291 static mmu_method_t moea64_methods[] = {
292         MMUMETHOD(mmu_clear_modify,     moea64_clear_modify),
293         MMUMETHOD(mmu_copy_page,        moea64_copy_page),
294         MMUMETHOD(mmu_copy_pages,       moea64_copy_pages),
295         MMUMETHOD(mmu_enter,            moea64_enter),
296         MMUMETHOD(mmu_enter_object,     moea64_enter_object),
297         MMUMETHOD(mmu_enter_quick,      moea64_enter_quick),
298         MMUMETHOD(mmu_extract,          moea64_extract),
299         MMUMETHOD(mmu_extract_and_hold, moea64_extract_and_hold),
300         MMUMETHOD(mmu_init,             moea64_init),
301         MMUMETHOD(mmu_is_modified,      moea64_is_modified),
302         MMUMETHOD(mmu_is_prefaultable,  moea64_is_prefaultable),
303         MMUMETHOD(mmu_is_referenced,    moea64_is_referenced),
304         MMUMETHOD(mmu_ts_referenced,    moea64_ts_referenced),
305         MMUMETHOD(mmu_map,              moea64_map),
306         MMUMETHOD(mmu_page_exists_quick,moea64_page_exists_quick),
307         MMUMETHOD(mmu_page_init,        moea64_page_init),
308         MMUMETHOD(mmu_page_wired_mappings,moea64_page_wired_mappings),
309         MMUMETHOD(mmu_pinit,            moea64_pinit),
310         MMUMETHOD(mmu_pinit0,           moea64_pinit0),
311         MMUMETHOD(mmu_protect,          moea64_protect),
312         MMUMETHOD(mmu_qenter,           moea64_qenter),
313         MMUMETHOD(mmu_qremove,          moea64_qremove),
314         MMUMETHOD(mmu_release,          moea64_release),
315         MMUMETHOD(mmu_remove,           moea64_remove),
316         MMUMETHOD(mmu_remove_pages,     moea64_remove_pages),
317         MMUMETHOD(mmu_remove_all,       moea64_remove_all),
318         MMUMETHOD(mmu_remove_write,     moea64_remove_write),
319         MMUMETHOD(mmu_sync_icache,      moea64_sync_icache),
320         MMUMETHOD(mmu_unwire,           moea64_unwire),
321         MMUMETHOD(mmu_zero_page,        moea64_zero_page),
322         MMUMETHOD(mmu_zero_page_area,   moea64_zero_page_area),
323         MMUMETHOD(mmu_activate,         moea64_activate),
324         MMUMETHOD(mmu_deactivate,       moea64_deactivate),
325         MMUMETHOD(mmu_page_set_memattr, moea64_page_set_memattr),
326         MMUMETHOD(mmu_quick_enter_page, moea64_quick_enter_page),
327         MMUMETHOD(mmu_quick_remove_page, moea64_quick_remove_page),
328
329         /* Internal interfaces */
330         MMUMETHOD(mmu_mapdev,           moea64_mapdev),
331         MMUMETHOD(mmu_mapdev_attr,      moea64_mapdev_attr),
332         MMUMETHOD(mmu_unmapdev,         moea64_unmapdev),
333         MMUMETHOD(mmu_kextract,         moea64_kextract),
334         MMUMETHOD(mmu_kenter,           moea64_kenter),
335         MMUMETHOD(mmu_kenter_attr,      moea64_kenter_attr),
336         MMUMETHOD(mmu_dev_direct_mapped,moea64_dev_direct_mapped),
337         MMUMETHOD(mmu_scan_init,        moea64_scan_init),
338         MMUMETHOD(mmu_dumpsys_map,      moea64_dumpsys_map),
339         MMUMETHOD(mmu_map_user_ptr,     moea64_map_user_ptr),
340
341         { 0, 0 }
342 };
343
344 MMU_DEF(oea64_mmu, "mmu_oea64_base", moea64_methods, 0);
345
346 static struct pvo_head *
347 vm_page_to_pvoh(vm_page_t m)
348 {
349
350         mtx_assert(PV_LOCKPTR(VM_PAGE_TO_PHYS(m)), MA_OWNED);
351         return (&m->md.mdpg_pvoh);
352 }
353
354 static struct pvo_entry *
355 alloc_pvo_entry(int bootstrap)
356 {
357         struct pvo_entry *pvo;
358
359         if (!moea64_initialized || bootstrap) {
360                 if (moea64_bpvo_pool_index >= moea64_bpvo_pool_size) {
361                         panic("moea64_enter: bpvo pool exhausted, %d, %d, %zd",
362                               moea64_bpvo_pool_index, moea64_bpvo_pool_size, 
363                               moea64_bpvo_pool_size * sizeof(struct pvo_entry));
364                 }
365                 pvo = &moea64_bpvo_pool[
366                     atomic_fetchadd_int(&moea64_bpvo_pool_index, 1)];
367                 bzero(pvo, sizeof(*pvo));
368                 pvo->pvo_vaddr = PVO_BOOTSTRAP;
369         } else {
370                 pvo = uma_zalloc(moea64_pvo_zone, M_NOWAIT);
371                 bzero(pvo, sizeof(*pvo));
372         }
373
374         return (pvo);
375 }
376
377
378 static void
379 init_pvo_entry(struct pvo_entry *pvo, pmap_t pmap, vm_offset_t va)
380 {
381         uint64_t vsid;
382         uint64_t hash;
383         int shift;
384
385         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
386
387         pvo->pvo_pmap = pmap;
388         va &= ~ADDR_POFF;
389         pvo->pvo_vaddr |= va;
390         vsid = va_to_vsid(pmap, va);
391         pvo->pvo_vpn = (uint64_t)((va & ADDR_PIDX) >> ADDR_PIDX_SHFT)
392             | (vsid << 16);
393
394         shift = (pvo->pvo_vaddr & PVO_LARGE) ? moea64_large_page_shift :
395             ADDR_PIDX_SHFT;
396         hash = (vsid & VSID_HASH_MASK) ^ (((uint64_t)va & ADDR_PIDX) >> shift);
397         pvo->pvo_pte.slot = (hash & moea64_pteg_mask) << 3;
398 }
399
400 static void
401 free_pvo_entry(struct pvo_entry *pvo)
402 {
403
404         if (!(pvo->pvo_vaddr & PVO_BOOTSTRAP))
405                 uma_zfree(moea64_pvo_zone, pvo);
406 }
407
408 void
409 moea64_pte_from_pvo(const struct pvo_entry *pvo, struct lpte *lpte)
410 {
411
412         lpte->pte_hi = (pvo->pvo_vpn >> (ADDR_API_SHFT64 - ADDR_PIDX_SHFT)) &
413             LPTE_AVPN_MASK;
414         lpte->pte_hi |= LPTE_VALID;
415         
416         if (pvo->pvo_vaddr & PVO_LARGE)
417                 lpte->pte_hi |= LPTE_BIG;
418         if (pvo->pvo_vaddr & PVO_WIRED)
419                 lpte->pte_hi |= LPTE_WIRED;
420         if (pvo->pvo_vaddr & PVO_HID)
421                 lpte->pte_hi |= LPTE_HID;
422
423         lpte->pte_lo = pvo->pvo_pte.pa; /* Includes WIMG bits */
424         if (pvo->pvo_pte.prot & VM_PROT_WRITE)
425                 lpte->pte_lo |= LPTE_BW;
426         else
427                 lpte->pte_lo |= LPTE_BR;
428
429         if (!(pvo->pvo_pte.prot & VM_PROT_EXECUTE))
430                 lpte->pte_lo |= LPTE_NOEXEC;
431 }
432
433 static __inline uint64_t
434 moea64_calc_wimg(vm_paddr_t pa, vm_memattr_t ma)
435 {
436         uint64_t pte_lo;
437         int i;
438
439         if (ma != VM_MEMATTR_DEFAULT) {
440                 switch (ma) {
441                 case VM_MEMATTR_UNCACHEABLE:
442                         return (LPTE_I | LPTE_G);
443                 case VM_MEMATTR_CACHEABLE:
444                         return (LPTE_M);
445                 case VM_MEMATTR_WRITE_COMBINING:
446                 case VM_MEMATTR_WRITE_BACK:
447                 case VM_MEMATTR_PREFETCHABLE:
448                         return (LPTE_I);
449                 case VM_MEMATTR_WRITE_THROUGH:
450                         return (LPTE_W | LPTE_M);
451                 }
452         }
453
454         /*
455          * Assume the page is cache inhibited and access is guarded unless
456          * it's in our available memory array.
457          */
458         pte_lo = LPTE_I | LPTE_G;
459         for (i = 0; i < pregions_sz; i++) {
460                 if ((pa >= pregions[i].mr_start) &&
461                     (pa < (pregions[i].mr_start + pregions[i].mr_size))) {
462                         pte_lo &= ~(LPTE_I | LPTE_G);
463                         pte_lo |= LPTE_M;
464                         break;
465                 }
466         }
467
468         return pte_lo;
469 }
470
471 /*
472  * Quick sort callout for comparing memory regions.
473  */
474 static int      om_cmp(const void *a, const void *b);
475
476 static int
477 om_cmp(const void *a, const void *b)
478 {
479         const struct    ofw_map *mapa;
480         const struct    ofw_map *mapb;
481
482         mapa = a;
483         mapb = b;
484         if (mapa->om_pa < mapb->om_pa)
485                 return (-1);
486         else if (mapa->om_pa > mapb->om_pa)
487                 return (1);
488         else
489                 return (0);
490 }
491
492 static void
493 moea64_add_ofw_mappings(mmu_t mmup, phandle_t mmu, size_t sz)
494 {
495         struct ofw_map  translations[sz/(4*sizeof(cell_t))]; /*>= 4 cells per */
496         pcell_t         acells, trans_cells[sz/sizeof(cell_t)];
497         struct pvo_entry *pvo;
498         register_t      msr;
499         vm_offset_t     off;
500         vm_paddr_t      pa_base;
501         int             i, j;
502
503         bzero(translations, sz);
504         OF_getencprop(OF_finddevice("/"), "#address-cells", &acells,
505             sizeof(acells));
506         if (OF_getencprop(mmu, "translations", trans_cells, sz) == -1)
507                 panic("moea64_bootstrap: can't get ofw translations");
508
509         CTR0(KTR_PMAP, "moea64_add_ofw_mappings: translations");
510         sz /= sizeof(cell_t);
511         for (i = 0, j = 0; i < sz; j++) {
512                 translations[j].om_va = trans_cells[i++];
513                 translations[j].om_len = trans_cells[i++];
514                 translations[j].om_pa = trans_cells[i++];
515                 if (acells == 2) {
516                         translations[j].om_pa <<= 32;
517                         translations[j].om_pa |= trans_cells[i++];
518                 }
519                 translations[j].om_mode = trans_cells[i++];
520         }
521         KASSERT(i == sz, ("Translations map has incorrect cell count (%d/%zd)",
522             i, sz));
523
524         sz = j;
525         qsort(translations, sz, sizeof (*translations), om_cmp);
526
527         for (i = 0; i < sz; i++) {
528                 pa_base = translations[i].om_pa;
529               #ifndef __powerpc64__
530                 if ((translations[i].om_pa >> 32) != 0)
531                         panic("OFW translations above 32-bit boundary!");
532               #endif
533
534                 if (pa_base % PAGE_SIZE)
535                         panic("OFW translation not page-aligned (phys)!");
536                 if (translations[i].om_va % PAGE_SIZE)
537                         panic("OFW translation not page-aligned (virt)!");
538
539                 CTR3(KTR_PMAP, "translation: pa=%#zx va=%#x len=%#x",
540                     pa_base, translations[i].om_va, translations[i].om_len);
541
542                 /* Now enter the pages for this mapping */
543
544                 DISABLE_TRANS(msr);
545                 for (off = 0; off < translations[i].om_len; off += PAGE_SIZE) {
546                         /* If this address is direct-mapped, skip remapping */
547                         if (hw_direct_map &&
548                             translations[i].om_va == PHYS_TO_DMAP(pa_base) &&
549                             moea64_calc_wimg(pa_base + off, VM_MEMATTR_DEFAULT)                             == LPTE_M)
550                                 continue;
551
552                         PMAP_LOCK(kernel_pmap);
553                         pvo = moea64_pvo_find_va(kernel_pmap,
554                             translations[i].om_va + off);
555                         PMAP_UNLOCK(kernel_pmap);
556                         if (pvo != NULL)
557                                 continue;
558
559                         moea64_kenter(mmup, translations[i].om_va + off,
560                             pa_base + off);
561                 }
562                 ENABLE_TRANS(msr);
563         }
564 }
565
566 #ifdef __powerpc64__
567 static void
568 moea64_probe_large_page(void)
569 {
570         uint16_t pvr = mfpvr() >> 16;
571
572         switch (pvr) {
573         case IBM970:
574         case IBM970FX:
575         case IBM970MP:
576                 powerpc_sync(); isync();
577                 mtspr(SPR_HID4, mfspr(SPR_HID4) & ~HID4_970_DISABLE_LG_PG);
578                 powerpc_sync(); isync();
579                 
580                 /* FALLTHROUGH */
581         default:
582                 if (moea64_large_page_size == 0) {
583                         moea64_large_page_size = 0x1000000; /* 16 MB */
584                         moea64_large_page_shift = 24;
585                 }
586         }
587
588         moea64_large_page_mask = moea64_large_page_size - 1;
589 }
590
591 static void
592 moea64_bootstrap_slb_prefault(vm_offset_t va, int large)
593 {
594         struct slb *cache;
595         struct slb entry;
596         uint64_t esid, slbe;
597         uint64_t i;
598
599         cache = PCPU_GET(slb);
600         esid = va >> ADDR_SR_SHFT;
601         slbe = (esid << SLBE_ESID_SHIFT) | SLBE_VALID;
602
603         for (i = 0; i < 64; i++) {
604                 if (cache[i].slbe == (slbe | i))
605                         return;
606         }
607
608         entry.slbe = slbe;
609         entry.slbv = KERNEL_VSID(esid) << SLBV_VSID_SHIFT;
610         if (large)
611                 entry.slbv |= SLBV_L;
612
613         slb_insert_kernel(entry.slbe, entry.slbv);
614 }
615 #endif
616
617 static void
618 moea64_setup_direct_map(mmu_t mmup, vm_offset_t kernelstart,
619     vm_offset_t kernelend)
620 {
621         struct pvo_entry *pvo;
622         register_t msr;
623         vm_paddr_t pa;
624         vm_offset_t size, off;
625         uint64_t pte_lo;
626         int i;
627
628         if (moea64_large_page_size == 0) 
629                 hw_direct_map = 0;
630
631         DISABLE_TRANS(msr);
632         if (hw_direct_map) {
633                 PMAP_LOCK(kernel_pmap);
634                 for (i = 0; i < pregions_sz; i++) {
635                   for (pa = pregions[i].mr_start; pa < pregions[i].mr_start +
636                      pregions[i].mr_size; pa += moea64_large_page_size) {
637                         pte_lo = LPTE_M;
638
639                         pvo = alloc_pvo_entry(1 /* bootstrap */);
640                         pvo->pvo_vaddr |= PVO_WIRED | PVO_LARGE;
641                         init_pvo_entry(pvo, kernel_pmap, PHYS_TO_DMAP(pa));
642
643                         /*
644                          * Set memory access as guarded if prefetch within
645                          * the page could exit the available physmem area.
646                          */
647                         if (pa & moea64_large_page_mask) {
648                                 pa &= moea64_large_page_mask;
649                                 pte_lo |= LPTE_G;
650                         }
651                         if (pa + moea64_large_page_size >
652                             pregions[i].mr_start + pregions[i].mr_size)
653                                 pte_lo |= LPTE_G;
654
655                         pvo->pvo_pte.prot = VM_PROT_READ | VM_PROT_WRITE |
656                             VM_PROT_EXECUTE;
657                         pvo->pvo_pte.pa = pa | pte_lo;
658                         moea64_pvo_enter(mmup, pvo, NULL);
659                   }
660                 }
661                 PMAP_UNLOCK(kernel_pmap);
662         } else {
663                 size = moea64_bpvo_pool_size*sizeof(struct pvo_entry);
664                 off = (vm_offset_t)(moea64_bpvo_pool);
665                 for (pa = off; pa < off + size; pa += PAGE_SIZE) 
666                 moea64_kenter(mmup, pa, pa);
667
668                 /*
669                  * Map certain important things, like ourselves.
670                  *
671                  * NOTE: We do not map the exception vector space. That code is
672                  * used only in real mode, and leaving it unmapped allows us to
673                  * catch NULL pointer deferences, instead of making NULL a valid
674                  * address.
675                  */
676
677                 for (pa = kernelstart & ~PAGE_MASK; pa < kernelend;
678                     pa += PAGE_SIZE) 
679                         moea64_kenter(mmup, pa, pa);
680         }
681         ENABLE_TRANS(msr);
682
683         /*
684          * Allow user to override unmapped_buf_allowed for testing.
685          * XXXKIB Only direct map implementation was tested.
686          */
687         if (!TUNABLE_INT_FETCH("vfs.unmapped_buf_allowed",
688             &unmapped_buf_allowed))
689                 unmapped_buf_allowed = hw_direct_map;
690 }
691
692 void
693 moea64_early_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend)
694 {
695         int             i, j;
696         vm_size_t       physsz, hwphyssz;
697
698 #ifndef __powerpc64__
699         /* We don't have a direct map since there is no BAT */
700         hw_direct_map = 0;
701
702         /* Make sure battable is zero, since we have no BAT */
703         for (i = 0; i < 16; i++) {
704                 battable[i].batu = 0;
705                 battable[i].batl = 0;
706         }
707 #else
708         moea64_probe_large_page();
709
710         /* Use a direct map if we have large page support */
711         if (moea64_large_page_size > 0)
712                 hw_direct_map = 1;
713         else
714                 hw_direct_map = 0;
715 #endif
716
717         /* Get physical memory regions from firmware */
718         mem_regions(&pregions, &pregions_sz, &regions, &regions_sz);
719         CTR0(KTR_PMAP, "moea64_bootstrap: physical memory");
720
721         if (sizeof(phys_avail)/sizeof(phys_avail[0]) < regions_sz)
722                 panic("moea64_bootstrap: phys_avail too small");
723
724         phys_avail_count = 0;
725         physsz = 0;
726         hwphyssz = 0;
727         TUNABLE_ULONG_FETCH("hw.physmem", (u_long *) &hwphyssz);
728         for (i = 0, j = 0; i < regions_sz; i++, j += 2) {
729                 CTR3(KTR_PMAP, "region: %#zx - %#zx (%#zx)",
730                     regions[i].mr_start, regions[i].mr_start +
731                     regions[i].mr_size, regions[i].mr_size);
732                 if (hwphyssz != 0 &&
733                     (physsz + regions[i].mr_size) >= hwphyssz) {
734                         if (physsz < hwphyssz) {
735                                 phys_avail[j] = regions[i].mr_start;
736                                 phys_avail[j + 1] = regions[i].mr_start +
737                                     hwphyssz - physsz;
738                                 physsz = hwphyssz;
739                                 phys_avail_count++;
740                         }
741                         break;
742                 }
743                 phys_avail[j] = regions[i].mr_start;
744                 phys_avail[j + 1] = regions[i].mr_start + regions[i].mr_size;
745                 phys_avail_count++;
746                 physsz += regions[i].mr_size;
747         }
748
749         /* Check for overlap with the kernel and exception vectors */
750         for (j = 0; j < 2*phys_avail_count; j+=2) {
751                 if (phys_avail[j] < EXC_LAST)
752                         phys_avail[j] += EXC_LAST;
753
754                 if (kernelstart >= phys_avail[j] &&
755                     kernelstart < phys_avail[j+1]) {
756                         if (kernelend < phys_avail[j+1]) {
757                                 phys_avail[2*phys_avail_count] =
758                                     (kernelend & ~PAGE_MASK) + PAGE_SIZE;
759                                 phys_avail[2*phys_avail_count + 1] =
760                                     phys_avail[j+1];
761                                 phys_avail_count++;
762                         }
763
764                         phys_avail[j+1] = kernelstart & ~PAGE_MASK;
765                 }
766
767                 if (kernelend >= phys_avail[j] &&
768                     kernelend < phys_avail[j+1]) {
769                         if (kernelstart > phys_avail[j]) {
770                                 phys_avail[2*phys_avail_count] = phys_avail[j];
771                                 phys_avail[2*phys_avail_count + 1] =
772                                     kernelstart & ~PAGE_MASK;
773                                 phys_avail_count++;
774                         }
775
776                         phys_avail[j] = (kernelend & ~PAGE_MASK) + PAGE_SIZE;
777                 }
778         }
779
780         physmem = btoc(physsz);
781
782 #ifdef PTEGCOUNT
783         moea64_pteg_count = PTEGCOUNT;
784 #else
785         moea64_pteg_count = 0x1000;
786
787         while (moea64_pteg_count < physmem)
788                 moea64_pteg_count <<= 1;
789
790         moea64_pteg_count >>= 1;
791 #endif /* PTEGCOUNT */
792 }
793
794 void
795 moea64_mid_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend)
796 {
797         int             i;
798
799         /*
800          * Set PTEG mask
801          */
802         moea64_pteg_mask = moea64_pteg_count - 1;
803
804         /*
805          * Initialize SLB table lock and page locks
806          */
807         mtx_init(&moea64_slb_mutex, "SLB table", NULL, MTX_DEF);
808         for (i = 0; i < PV_LOCK_COUNT; i++)
809                 mtx_init(&pv_lock[i], "page pv", NULL, MTX_DEF);
810
811         /*
812          * Initialise the bootstrap pvo pool.
813          */
814         moea64_bpvo_pool = (struct pvo_entry *)moea64_bootstrap_alloc(
815                 moea64_bpvo_pool_size*sizeof(struct pvo_entry), 0);
816         moea64_bpvo_pool_index = 0;
817
818         /*
819          * Make sure kernel vsid is allocated as well as VSID 0.
820          */
821         #ifndef __powerpc64__
822         moea64_vsid_bitmap[(KERNEL_VSIDBITS & (NVSIDS - 1)) / VSID_NBPW]
823                 |= 1 << (KERNEL_VSIDBITS % VSID_NBPW);
824         moea64_vsid_bitmap[0] |= 1;
825         #endif
826
827         /*
828          * Initialize the kernel pmap (which is statically allocated).
829          */
830         #ifdef __powerpc64__
831         for (i = 0; i < 64; i++) {
832                 pcpup->pc_slb[i].slbv = 0;
833                 pcpup->pc_slb[i].slbe = 0;
834         }
835         #else
836         for (i = 0; i < 16; i++) 
837                 kernel_pmap->pm_sr[i] = EMPTY_SEGMENT + i;
838         #endif
839
840         kernel_pmap->pmap_phys = kernel_pmap;
841         CPU_FILL(&kernel_pmap->pm_active);
842         RB_INIT(&kernel_pmap->pmap_pvo);
843
844         PMAP_LOCK_INIT(kernel_pmap);
845
846         /*
847          * Now map in all the other buffers we allocated earlier
848          */
849
850         moea64_setup_direct_map(mmup, kernelstart, kernelend);
851 }
852
853 void
854 moea64_late_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend)
855 {
856         ihandle_t       mmui;
857         phandle_t       chosen;
858         phandle_t       mmu;
859         ssize_t         sz;
860         int             i;
861         vm_offset_t     pa, va;
862         void            *dpcpu;
863
864         /*
865          * Set up the Open Firmware pmap and add its mappings if not in real
866          * mode.
867          */
868
869         chosen = OF_finddevice("/chosen");
870         if (chosen != -1 && OF_getencprop(chosen, "mmu", &mmui, 4) != -1) {
871                 mmu = OF_instance_to_package(mmui);
872                 if (mmu == -1 ||
873                     (sz = OF_getproplen(mmu, "translations")) == -1)
874                         sz = 0;
875                 if (sz > 6144 /* tmpstksz - 2 KB headroom */)
876                         panic("moea64_bootstrap: too many ofw translations");
877
878                 if (sz > 0)
879                         moea64_add_ofw_mappings(mmup, mmu, sz);
880         }
881
882         /*
883          * Calculate the last available physical address.
884          */
885         Maxmem = 0;
886         for (i = 0; phys_avail[i + 2] != 0; i += 2)
887                 Maxmem = max(Maxmem, powerpc_btop(phys_avail[i + 1]));
888
889         /*
890          * Initialize MMU and remap early physical mappings
891          */
892         MMU_CPU_BOOTSTRAP(mmup,0);
893         mtmsr(mfmsr() | PSL_DR | PSL_IR);
894         pmap_bootstrapped++;
895         bs_remap_earlyboot();
896
897         /*
898          * Set the start and end of kva.
899          */
900         virtual_avail = VM_MIN_KERNEL_ADDRESS;
901         virtual_end = VM_MAX_SAFE_KERNEL_ADDRESS; 
902
903         /*
904          * Map the entire KVA range into the SLB. We must not fault there.
905          */
906         #ifdef __powerpc64__
907         for (va = virtual_avail; va < virtual_end; va += SEGMENT_LENGTH)
908                 moea64_bootstrap_slb_prefault(va, 0);
909         #endif
910
911         /*
912          * Figure out how far we can extend virtual_end into segment 16
913          * without running into existing mappings. Segment 16 is guaranteed
914          * to contain neither RAM nor devices (at least on Apple hardware),
915          * but will generally contain some OFW mappings we should not
916          * step on.
917          */
918
919         #ifndef __powerpc64__   /* KVA is in high memory on PPC64 */
920         PMAP_LOCK(kernel_pmap);
921         while (virtual_end < VM_MAX_KERNEL_ADDRESS &&
922             moea64_pvo_find_va(kernel_pmap, virtual_end+1) == NULL)
923                 virtual_end += PAGE_SIZE;
924         PMAP_UNLOCK(kernel_pmap);
925         #endif
926
927         /*
928          * Allocate a kernel stack with a guard page for thread0 and map it
929          * into the kernel page map.
930          */
931         pa = moea64_bootstrap_alloc(kstack_pages * PAGE_SIZE, PAGE_SIZE);
932         va = virtual_avail + KSTACK_GUARD_PAGES * PAGE_SIZE;
933         virtual_avail = va + kstack_pages * PAGE_SIZE;
934         CTR2(KTR_PMAP, "moea64_bootstrap: kstack0 at %#x (%#x)", pa, va);
935         thread0.td_kstack = va;
936         thread0.td_kstack_pages = kstack_pages;
937         for (i = 0; i < kstack_pages; i++) {
938                 moea64_kenter(mmup, va, pa);
939                 pa += PAGE_SIZE;
940                 va += PAGE_SIZE;
941         }
942
943         /*
944          * Allocate virtual address space for the message buffer.
945          */
946         pa = msgbuf_phys = moea64_bootstrap_alloc(msgbufsize, PAGE_SIZE);
947         msgbufp = (struct msgbuf *)virtual_avail;
948         va = virtual_avail;
949         virtual_avail += round_page(msgbufsize);
950         while (va < virtual_avail) {
951                 moea64_kenter(mmup, va, pa);
952                 pa += PAGE_SIZE;
953                 va += PAGE_SIZE;
954         }
955
956         /*
957          * Allocate virtual address space for the dynamic percpu area.
958          */
959         pa = moea64_bootstrap_alloc(DPCPU_SIZE, PAGE_SIZE);
960         dpcpu = (void *)virtual_avail;
961         va = virtual_avail;
962         virtual_avail += DPCPU_SIZE;
963         while (va < virtual_avail) {
964                 moea64_kenter(mmup, va, pa);
965                 pa += PAGE_SIZE;
966                 va += PAGE_SIZE;
967         }
968         dpcpu_init(dpcpu, curcpu);
969
970         /*
971          * Allocate some things for page zeroing. We put this directly
972          * in the page table and use MOEA64_PTE_REPLACE to avoid any
973          * of the PVO book-keeping or other parts of the VM system
974          * from even knowing that this hack exists.
975          */
976
977         if (!hw_direct_map) {
978                 mtx_init(&moea64_scratchpage_mtx, "pvo zero page", NULL,
979                     MTX_DEF);
980                 for (i = 0; i < 2; i++) {
981                         moea64_scratchpage_va[i] = (virtual_end+1) - PAGE_SIZE;
982                         virtual_end -= PAGE_SIZE;
983
984                         moea64_kenter(mmup, moea64_scratchpage_va[i], 0);
985
986                         PMAP_LOCK(kernel_pmap);
987                         moea64_scratchpage_pvo[i] = moea64_pvo_find_va(
988                             kernel_pmap, (vm_offset_t)moea64_scratchpage_va[i]);
989                         PMAP_UNLOCK(kernel_pmap);
990                 }
991         }
992 }
993
994 static void
995 moea64_pmap_init_qpages(void)
996 {
997         struct pcpu *pc;
998         int i;
999
1000         if (hw_direct_map)
1001                 return;
1002
1003         CPU_FOREACH(i) {
1004                 pc = pcpu_find(i);
1005                 pc->pc_qmap_addr = kva_alloc(PAGE_SIZE);
1006                 if (pc->pc_qmap_addr == 0)
1007                         panic("pmap_init_qpages: unable to allocate KVA");
1008                 PMAP_LOCK(kernel_pmap);
1009                 pc->pc_qmap_pvo = moea64_pvo_find_va(kernel_pmap, pc->pc_qmap_addr);
1010                 PMAP_UNLOCK(kernel_pmap);
1011                 mtx_init(&pc->pc_qmap_lock, "qmap lock", NULL, MTX_DEF);
1012         }
1013 }
1014
1015 SYSINIT(qpages_init, SI_SUB_CPU, SI_ORDER_ANY, moea64_pmap_init_qpages, NULL);
1016
1017 /*
1018  * Activate a user pmap.  This mostly involves setting some non-CPU
1019  * state.
1020  */
1021 void
1022 moea64_activate(mmu_t mmu, struct thread *td)
1023 {
1024         pmap_t  pm;
1025
1026         pm = &td->td_proc->p_vmspace->vm_pmap;
1027         CPU_SET(PCPU_GET(cpuid), &pm->pm_active);
1028
1029         #ifdef __powerpc64__
1030         PCPU_SET(userslb, pm->pm_slb);
1031         __asm __volatile("slbmte %0, %1; isync" ::
1032             "r"(td->td_pcb->pcb_cpu.aim.usr_vsid), "r"(USER_SLB_SLBE));
1033         #else
1034         PCPU_SET(curpmap, pm->pmap_phys);
1035         mtsrin(USER_SR << ADDR_SR_SHFT, td->td_pcb->pcb_cpu.aim.usr_vsid);
1036         #endif
1037 }
1038
1039 void
1040 moea64_deactivate(mmu_t mmu, struct thread *td)
1041 {
1042         pmap_t  pm;
1043
1044         __asm __volatile("isync; slbie %0" :: "r"(USER_ADDR));
1045
1046         pm = &td->td_proc->p_vmspace->vm_pmap;
1047         CPU_CLR(PCPU_GET(cpuid), &pm->pm_active);
1048         #ifdef __powerpc64__
1049         PCPU_SET(userslb, NULL);
1050         #else
1051         PCPU_SET(curpmap, NULL);
1052         #endif
1053 }
1054
1055 void
1056 moea64_unwire(mmu_t mmu, pmap_t pm, vm_offset_t sva, vm_offset_t eva)
1057 {
1058         struct  pvo_entry key, *pvo;
1059         vm_page_t m;
1060         int64_t refchg;
1061
1062         key.pvo_vaddr = sva;
1063         PMAP_LOCK(pm);
1064         for (pvo = RB_NFIND(pvo_tree, &pm->pmap_pvo, &key);
1065             pvo != NULL && PVO_VADDR(pvo) < eva;
1066             pvo = RB_NEXT(pvo_tree, &pm->pmap_pvo, pvo)) {
1067                 if ((pvo->pvo_vaddr & PVO_WIRED) == 0)
1068                         panic("moea64_unwire: pvo %p is missing PVO_WIRED",
1069                             pvo);
1070                 pvo->pvo_vaddr &= ~PVO_WIRED;
1071                 refchg = MOEA64_PTE_REPLACE(mmu, pvo, 0 /* No invalidation */);
1072                 if ((pvo->pvo_vaddr & PVO_MANAGED) &&
1073                     (pvo->pvo_pte.prot & VM_PROT_WRITE)) {
1074                         if (refchg < 0)
1075                                 refchg = LPTE_CHG;
1076                         m = PHYS_TO_VM_PAGE(pvo->pvo_pte.pa & LPTE_RPGN);
1077
1078                         refchg |= atomic_readandclear_32(&m->md.mdpg_attrs);
1079                         if (refchg & LPTE_CHG)
1080                                 vm_page_dirty(m);
1081                         if (refchg & LPTE_REF)
1082                                 vm_page_aflag_set(m, PGA_REFERENCED);
1083                 }
1084                 pm->pm_stats.wired_count--;
1085         }
1086         PMAP_UNLOCK(pm);
1087 }
1088
1089 /*
1090  * This goes through and sets the physical address of our
1091  * special scratch PTE to the PA we want to zero or copy. Because
1092  * of locking issues (this can get called in pvo_enter() by
1093  * the UMA allocator), we can't use most other utility functions here
1094  */
1095
1096 static __inline
1097 void moea64_set_scratchpage_pa(mmu_t mmup, int which, vm_paddr_t pa) {
1098
1099         KASSERT(!hw_direct_map, ("Using OEA64 scratchpage with a direct map!"));
1100         mtx_assert(&moea64_scratchpage_mtx, MA_OWNED);
1101
1102         moea64_scratchpage_pvo[which]->pvo_pte.pa =
1103             moea64_calc_wimg(pa, VM_MEMATTR_DEFAULT) | (uint64_t)pa;
1104         MOEA64_PTE_REPLACE(mmup, moea64_scratchpage_pvo[which],
1105             MOEA64_PTE_INVALIDATE);
1106         isync();
1107 }
1108
1109 void
1110 moea64_copy_page(mmu_t mmu, vm_page_t msrc, vm_page_t mdst)
1111 {
1112         vm_offset_t     dst;
1113         vm_offset_t     src;
1114
1115         dst = VM_PAGE_TO_PHYS(mdst);
1116         src = VM_PAGE_TO_PHYS(msrc);
1117
1118         if (hw_direct_map) {
1119                 bcopy((void *)PHYS_TO_DMAP(src), (void *)PHYS_TO_DMAP(dst),
1120                     PAGE_SIZE);
1121         } else {
1122                 mtx_lock(&moea64_scratchpage_mtx);
1123
1124                 moea64_set_scratchpage_pa(mmu, 0, src);
1125                 moea64_set_scratchpage_pa(mmu, 1, dst);
1126
1127                 bcopy((void *)moea64_scratchpage_va[0], 
1128                     (void *)moea64_scratchpage_va[1], PAGE_SIZE);
1129
1130                 mtx_unlock(&moea64_scratchpage_mtx);
1131         }
1132 }
1133
1134 static inline void
1135 moea64_copy_pages_dmap(mmu_t mmu, vm_page_t *ma, vm_offset_t a_offset,
1136     vm_page_t *mb, vm_offset_t b_offset, int xfersize)
1137 {
1138         void *a_cp, *b_cp;
1139         vm_offset_t a_pg_offset, b_pg_offset;
1140         int cnt;
1141
1142         while (xfersize > 0) {
1143                 a_pg_offset = a_offset & PAGE_MASK;
1144                 cnt = min(xfersize, PAGE_SIZE - a_pg_offset);
1145                 a_cp = (char *)PHYS_TO_DMAP(
1146                     VM_PAGE_TO_PHYS(ma[a_offset >> PAGE_SHIFT])) +
1147                     a_pg_offset;
1148                 b_pg_offset = b_offset & PAGE_MASK;
1149                 cnt = min(cnt, PAGE_SIZE - b_pg_offset);
1150                 b_cp = (char *)PHYS_TO_DMAP(
1151                     VM_PAGE_TO_PHYS(mb[b_offset >> PAGE_SHIFT])) +
1152                     b_pg_offset;
1153                 bcopy(a_cp, b_cp, cnt);
1154                 a_offset += cnt;
1155                 b_offset += cnt;
1156                 xfersize -= cnt;
1157         }
1158 }
1159
1160 static inline void
1161 moea64_copy_pages_nodmap(mmu_t mmu, vm_page_t *ma, vm_offset_t a_offset,
1162     vm_page_t *mb, vm_offset_t b_offset, int xfersize)
1163 {
1164         void *a_cp, *b_cp;
1165         vm_offset_t a_pg_offset, b_pg_offset;
1166         int cnt;
1167
1168         mtx_lock(&moea64_scratchpage_mtx);
1169         while (xfersize > 0) {
1170                 a_pg_offset = a_offset & PAGE_MASK;
1171                 cnt = min(xfersize, PAGE_SIZE - a_pg_offset);
1172                 moea64_set_scratchpage_pa(mmu, 0,
1173                     VM_PAGE_TO_PHYS(ma[a_offset >> PAGE_SHIFT]));
1174                 a_cp = (char *)moea64_scratchpage_va[0] + a_pg_offset;
1175                 b_pg_offset = b_offset & PAGE_MASK;
1176                 cnt = min(cnt, PAGE_SIZE - b_pg_offset);
1177                 moea64_set_scratchpage_pa(mmu, 1,
1178                     VM_PAGE_TO_PHYS(mb[b_offset >> PAGE_SHIFT]));
1179                 b_cp = (char *)moea64_scratchpage_va[1] + b_pg_offset;
1180                 bcopy(a_cp, b_cp, cnt);
1181                 a_offset += cnt;
1182                 b_offset += cnt;
1183                 xfersize -= cnt;
1184         }
1185         mtx_unlock(&moea64_scratchpage_mtx);
1186 }
1187
1188 void
1189 moea64_copy_pages(mmu_t mmu, vm_page_t *ma, vm_offset_t a_offset,
1190     vm_page_t *mb, vm_offset_t b_offset, int xfersize)
1191 {
1192
1193         if (hw_direct_map) {
1194                 moea64_copy_pages_dmap(mmu, ma, a_offset, mb, b_offset,
1195                     xfersize);
1196         } else {
1197                 moea64_copy_pages_nodmap(mmu, ma, a_offset, mb, b_offset,
1198                     xfersize);
1199         }
1200 }
1201
1202 void
1203 moea64_zero_page_area(mmu_t mmu, vm_page_t m, int off, int size)
1204 {
1205         vm_paddr_t pa = VM_PAGE_TO_PHYS(m);
1206
1207         if (size + off > PAGE_SIZE)
1208                 panic("moea64_zero_page: size + off > PAGE_SIZE");
1209
1210         if (hw_direct_map) {
1211                 bzero((caddr_t)PHYS_TO_DMAP(pa) + off, size);
1212         } else {
1213                 mtx_lock(&moea64_scratchpage_mtx);
1214                 moea64_set_scratchpage_pa(mmu, 0, pa);
1215                 bzero((caddr_t)moea64_scratchpage_va[0] + off, size);
1216                 mtx_unlock(&moea64_scratchpage_mtx);
1217         }
1218 }
1219
1220 /*
1221  * Zero a page of physical memory by temporarily mapping it
1222  */
1223 void
1224 moea64_zero_page(mmu_t mmu, vm_page_t m)
1225 {
1226         vm_paddr_t pa = VM_PAGE_TO_PHYS(m);
1227         vm_offset_t va, off;
1228
1229         if (!hw_direct_map) {
1230                 mtx_lock(&moea64_scratchpage_mtx);
1231
1232                 moea64_set_scratchpage_pa(mmu, 0, pa);
1233                 va = moea64_scratchpage_va[0];
1234         } else {
1235                 va = PHYS_TO_DMAP(pa);
1236         }
1237
1238         for (off = 0; off < PAGE_SIZE; off += cacheline_size)
1239                 __asm __volatile("dcbz 0,%0" :: "r"(va + off));
1240
1241         if (!hw_direct_map)
1242                 mtx_unlock(&moea64_scratchpage_mtx);
1243 }
1244
1245 vm_offset_t
1246 moea64_quick_enter_page(mmu_t mmu, vm_page_t m)
1247 {
1248         struct pvo_entry *pvo;
1249         vm_paddr_t pa = VM_PAGE_TO_PHYS(m);
1250
1251         if (hw_direct_map)
1252                 return (PHYS_TO_DMAP(pa));
1253
1254         /*
1255          * MOEA64_PTE_REPLACE does some locking, so we can't just grab
1256          * a critical section and access the PCPU data like on i386.
1257          * Instead, pin the thread and grab the PCPU lock to prevent
1258          * a preempting thread from using the same PCPU data.
1259          */
1260         sched_pin();
1261
1262         mtx_assert(PCPU_PTR(qmap_lock), MA_NOTOWNED);
1263         pvo = PCPU_GET(qmap_pvo);
1264
1265         mtx_lock(PCPU_PTR(qmap_lock));
1266         pvo->pvo_pte.pa = moea64_calc_wimg(pa, pmap_page_get_memattr(m)) |
1267             (uint64_t)pa;
1268         MOEA64_PTE_REPLACE(mmu, pvo, MOEA64_PTE_INVALIDATE);
1269         isync();
1270
1271         return (PCPU_GET(qmap_addr));
1272 }
1273
1274 void
1275 moea64_quick_remove_page(mmu_t mmu, vm_offset_t addr)
1276 {
1277         if (hw_direct_map)
1278                 return;
1279
1280         mtx_assert(PCPU_PTR(qmap_lock), MA_OWNED);
1281         KASSERT(PCPU_GET(qmap_addr) == addr,
1282             ("moea64_quick_remove_page: invalid address"));
1283         mtx_unlock(PCPU_PTR(qmap_lock));
1284         sched_unpin();  
1285 }
1286
1287 /*
1288  * Map the given physical page at the specified virtual address in the
1289  * target pmap with the protection requested.  If specified the page
1290  * will be wired down.
1291  */
1292
1293 int
1294 moea64_enter(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_page_t m, 
1295     vm_prot_t prot, u_int flags, int8_t psind)
1296 {
1297         struct          pvo_entry *pvo, *oldpvo;
1298         struct          pvo_head *pvo_head;
1299         uint64_t        pte_lo;
1300         int             error;
1301
1302         if ((m->oflags & VPO_UNMANAGED) == 0 && !vm_page_xbusied(m))
1303                 VM_OBJECT_ASSERT_LOCKED(m->object);
1304
1305         pvo = alloc_pvo_entry(0);
1306         pvo->pvo_pmap = NULL; /* to be filled in later */
1307         pvo->pvo_pte.prot = prot;
1308
1309         pte_lo = moea64_calc_wimg(VM_PAGE_TO_PHYS(m), pmap_page_get_memattr(m));
1310         pvo->pvo_pte.pa = VM_PAGE_TO_PHYS(m) | pte_lo;
1311
1312         if ((flags & PMAP_ENTER_WIRED) != 0)
1313                 pvo->pvo_vaddr |= PVO_WIRED;
1314
1315         if ((m->oflags & VPO_UNMANAGED) != 0 || !moea64_initialized) {
1316                 pvo_head = NULL;
1317         } else {
1318                 pvo_head = &m->md.mdpg_pvoh;
1319                 pvo->pvo_vaddr |= PVO_MANAGED;
1320         }
1321         
1322         for (;;) {
1323                 PV_PAGE_LOCK(m);
1324                 PMAP_LOCK(pmap);
1325                 if (pvo->pvo_pmap == NULL)
1326                         init_pvo_entry(pvo, pmap, va);
1327                 if (prot & VM_PROT_WRITE)
1328                         if (pmap_bootstrapped &&
1329                             (m->oflags & VPO_UNMANAGED) == 0)
1330                                 vm_page_aflag_set(m, PGA_WRITEABLE);
1331
1332                 oldpvo = moea64_pvo_find_va(pmap, va);
1333                 if (oldpvo != NULL) {
1334                         if (oldpvo->pvo_vaddr == pvo->pvo_vaddr &&
1335                             oldpvo->pvo_pte.pa == pvo->pvo_pte.pa &&
1336                             oldpvo->pvo_pte.prot == prot) {
1337                                 /* Identical mapping already exists */
1338                                 error = 0;
1339
1340                                 /* If not in page table, reinsert it */
1341                                 if (MOEA64_PTE_SYNCH(mmu, oldpvo) < 0) {
1342                                         moea64_pte_overflow--;
1343                                         MOEA64_PTE_INSERT(mmu, oldpvo);
1344                                 }
1345
1346                                 /* Then just clean up and go home */
1347                                 PV_PAGE_UNLOCK(m);
1348                                 PMAP_UNLOCK(pmap);
1349                                 free_pvo_entry(pvo);
1350                                 break;
1351                         }
1352
1353                         /* Otherwise, need to kill it first */
1354                         KASSERT(oldpvo->pvo_pmap == pmap, ("pmap of old "
1355                             "mapping does not match new mapping"));
1356                         moea64_pvo_remove_from_pmap(mmu, oldpvo);
1357                 }
1358                 error = moea64_pvo_enter(mmu, pvo, pvo_head);
1359                 PV_PAGE_UNLOCK(m);
1360                 PMAP_UNLOCK(pmap);
1361
1362                 /* Free any dead pages */
1363                 if (oldpvo != NULL) {
1364                         PV_LOCK(oldpvo->pvo_pte.pa & LPTE_RPGN);
1365                         moea64_pvo_remove_from_page(mmu, oldpvo);
1366                         PV_UNLOCK(oldpvo->pvo_pte.pa & LPTE_RPGN);
1367                         free_pvo_entry(oldpvo);
1368                 }
1369
1370                 if (error != ENOMEM)
1371                         break;
1372                 if ((flags & PMAP_ENTER_NOSLEEP) != 0)
1373                         return (KERN_RESOURCE_SHORTAGE);
1374                 VM_OBJECT_ASSERT_UNLOCKED(m->object);
1375                 VM_WAIT;
1376         }
1377
1378         /*
1379          * Flush the page from the instruction cache if this page is
1380          * mapped executable and cacheable.
1381          */
1382         if (pmap != kernel_pmap && !(m->aflags & PGA_EXECUTABLE) &&
1383             (pte_lo & (LPTE_I | LPTE_G | LPTE_NOEXEC)) == 0) {
1384                 vm_page_aflag_set(m, PGA_EXECUTABLE);
1385                 moea64_syncicache(mmu, pmap, va, VM_PAGE_TO_PHYS(m), PAGE_SIZE);
1386         }
1387         return (KERN_SUCCESS);
1388 }
1389
1390 static void
1391 moea64_syncicache(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
1392     vm_size_t sz)
1393 {
1394
1395         /*
1396          * This is much trickier than on older systems because
1397          * we can't sync the icache on physical addresses directly
1398          * without a direct map. Instead we check a couple of cases
1399          * where the memory is already mapped in and, failing that,
1400          * use the same trick we use for page zeroing to create
1401          * a temporary mapping for this physical address.
1402          */
1403
1404         if (!pmap_bootstrapped) {
1405                 /*
1406                  * If PMAP is not bootstrapped, we are likely to be
1407                  * in real mode.
1408                  */
1409                 __syncicache((void *)pa, sz);
1410         } else if (pmap == kernel_pmap) {
1411                 __syncicache((void *)va, sz);
1412         } else if (hw_direct_map) {
1413                 __syncicache((void *)PHYS_TO_DMAP(pa), sz);
1414         } else {
1415                 /* Use the scratch page to set up a temp mapping */
1416
1417                 mtx_lock(&moea64_scratchpage_mtx);
1418
1419                 moea64_set_scratchpage_pa(mmu, 1, pa & ~ADDR_POFF);
1420                 __syncicache((void *)(moea64_scratchpage_va[1] + 
1421                     (va & ADDR_POFF)), sz);
1422
1423                 mtx_unlock(&moea64_scratchpage_mtx);
1424         }
1425 }
1426
1427 /*
1428  * Maps a sequence of resident pages belonging to the same object.
1429  * The sequence begins with the given page m_start.  This page is
1430  * mapped at the given virtual address start.  Each subsequent page is
1431  * mapped at a virtual address that is offset from start by the same
1432  * amount as the page is offset from m_start within the object.  The
1433  * last page in the sequence is the page with the largest offset from
1434  * m_start that can be mapped at a virtual address less than the given
1435  * virtual address end.  Not every virtual page between start and end
1436  * is mapped; only those for which a resident page exists with the
1437  * corresponding offset from m_start are mapped.
1438  */
1439 void
1440 moea64_enter_object(mmu_t mmu, pmap_t pm, vm_offset_t start, vm_offset_t end,
1441     vm_page_t m_start, vm_prot_t prot)
1442 {
1443         vm_page_t m;
1444         vm_pindex_t diff, psize;
1445
1446         VM_OBJECT_ASSERT_LOCKED(m_start->object);
1447
1448         psize = atop(end - start);
1449         m = m_start;
1450         while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
1451                 moea64_enter(mmu, pm, start + ptoa(diff), m, prot &
1452                     (VM_PROT_READ | VM_PROT_EXECUTE), PMAP_ENTER_NOSLEEP, 0);
1453                 m = TAILQ_NEXT(m, listq);
1454         }
1455 }
1456
1457 void
1458 moea64_enter_quick(mmu_t mmu, pmap_t pm, vm_offset_t va, vm_page_t m,
1459     vm_prot_t prot)
1460 {
1461
1462         moea64_enter(mmu, pm, va, m, prot & (VM_PROT_READ | VM_PROT_EXECUTE),
1463             PMAP_ENTER_NOSLEEP, 0);
1464 }
1465
1466 vm_paddr_t
1467 moea64_extract(mmu_t mmu, pmap_t pm, vm_offset_t va)
1468 {
1469         struct  pvo_entry *pvo;
1470         vm_paddr_t pa;
1471
1472         PMAP_LOCK(pm);
1473         pvo = moea64_pvo_find_va(pm, va);
1474         if (pvo == NULL)
1475                 pa = 0;
1476         else
1477                 pa = (pvo->pvo_pte.pa & LPTE_RPGN) | (va - PVO_VADDR(pvo));
1478         PMAP_UNLOCK(pm);
1479
1480         return (pa);
1481 }
1482
1483 /*
1484  * Atomically extract and hold the physical page with the given
1485  * pmap and virtual address pair if that mapping permits the given
1486  * protection.
1487  */
1488 vm_page_t
1489 moea64_extract_and_hold(mmu_t mmu, pmap_t pmap, vm_offset_t va, vm_prot_t prot)
1490 {
1491         struct  pvo_entry *pvo;
1492         vm_page_t m;
1493         vm_paddr_t pa;
1494         
1495         m = NULL;
1496         pa = 0;
1497         PMAP_LOCK(pmap);
1498 retry:
1499         pvo = moea64_pvo_find_va(pmap, va & ~ADDR_POFF);
1500         if (pvo != NULL && (pvo->pvo_pte.prot & prot) == prot) {
1501                 if (vm_page_pa_tryrelock(pmap,
1502                     pvo->pvo_pte.pa & LPTE_RPGN, &pa))
1503                         goto retry;
1504                 m = PHYS_TO_VM_PAGE(pvo->pvo_pte.pa & LPTE_RPGN);
1505                 vm_page_hold(m);
1506         }
1507         PA_UNLOCK_COND(pa);
1508         PMAP_UNLOCK(pmap);
1509         return (m);
1510 }
1511
1512 static mmu_t installed_mmu;
1513
1514 static void *
1515 moea64_uma_page_alloc(uma_zone_t zone, vm_size_t bytes, int domain,
1516     uint8_t *flags, int wait)
1517 {
1518         struct pvo_entry *pvo;
1519         vm_offset_t va;
1520         vm_page_t m;
1521         int needed_lock;
1522
1523         /*
1524          * This entire routine is a horrible hack to avoid bothering kmem
1525          * for new KVA addresses. Because this can get called from inside
1526          * kmem allocation routines, calling kmem for a new address here
1527          * can lead to multiply locking non-recursive mutexes.
1528          */
1529
1530         *flags = UMA_SLAB_PRIV;
1531         needed_lock = !PMAP_LOCKED(kernel_pmap);
1532
1533         m = vm_page_alloc_domain(NULL, 0, domain,
1534             malloc2vm_flags(wait) | VM_ALLOC_WIRED | VM_ALLOC_NOOBJ);
1535         if (m == NULL)
1536                 return (NULL);
1537
1538         va = VM_PAGE_TO_PHYS(m);
1539
1540         pvo = alloc_pvo_entry(1 /* bootstrap */);
1541
1542         pvo->pvo_pte.prot = VM_PROT_READ | VM_PROT_WRITE;
1543         pvo->pvo_pte.pa = VM_PAGE_TO_PHYS(m) | LPTE_M;
1544
1545         if (needed_lock)
1546                 PMAP_LOCK(kernel_pmap);
1547
1548         init_pvo_entry(pvo, kernel_pmap, va);
1549         pvo->pvo_vaddr |= PVO_WIRED;
1550
1551         moea64_pvo_enter(installed_mmu, pvo, NULL);
1552
1553         if (needed_lock)
1554                 PMAP_UNLOCK(kernel_pmap);
1555         
1556         if ((wait & M_ZERO) && (m->flags & PG_ZERO) == 0)
1557                 bzero((void *)va, PAGE_SIZE);
1558
1559         return (void *)va;
1560 }
1561
1562 extern int elf32_nxstack;
1563
1564 void
1565 moea64_init(mmu_t mmu)
1566 {
1567
1568         CTR0(KTR_PMAP, "moea64_init");
1569
1570         moea64_pvo_zone = uma_zcreate("UPVO entry", sizeof (struct pvo_entry),
1571             NULL, NULL, NULL, NULL, UMA_ALIGN_PTR,
1572             UMA_ZONE_VM | UMA_ZONE_NOFREE);
1573
1574         if (!hw_direct_map) {
1575                 installed_mmu = mmu;
1576                 uma_zone_set_allocf(moea64_pvo_zone, moea64_uma_page_alloc);
1577         }
1578
1579 #ifdef COMPAT_FREEBSD32
1580         elf32_nxstack = 1;
1581 #endif
1582
1583         moea64_initialized = TRUE;
1584 }
1585
1586 boolean_t
1587 moea64_is_referenced(mmu_t mmu, vm_page_t m)
1588 {
1589
1590         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
1591             ("moea64_is_referenced: page %p is not managed", m));
1592
1593         return (moea64_query_bit(mmu, m, LPTE_REF));
1594 }
1595
1596 boolean_t
1597 moea64_is_modified(mmu_t mmu, vm_page_t m)
1598 {
1599
1600         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
1601             ("moea64_is_modified: page %p is not managed", m));
1602
1603         /*
1604          * If the page is not exclusive busied, then PGA_WRITEABLE cannot be
1605          * concurrently set while the object is locked.  Thus, if PGA_WRITEABLE
1606          * is clear, no PTEs can have LPTE_CHG set.
1607          */
1608         VM_OBJECT_ASSERT_LOCKED(m->object);
1609         if (!vm_page_xbusied(m) && (m->aflags & PGA_WRITEABLE) == 0)
1610                 return (FALSE);
1611         return (moea64_query_bit(mmu, m, LPTE_CHG));
1612 }
1613
1614 boolean_t
1615 moea64_is_prefaultable(mmu_t mmu, pmap_t pmap, vm_offset_t va)
1616 {
1617         struct pvo_entry *pvo;
1618         boolean_t rv = TRUE;
1619
1620         PMAP_LOCK(pmap);
1621         pvo = moea64_pvo_find_va(pmap, va & ~ADDR_POFF);
1622         if (pvo != NULL)
1623                 rv = FALSE;
1624         PMAP_UNLOCK(pmap);
1625         return (rv);
1626 }
1627
1628 void
1629 moea64_clear_modify(mmu_t mmu, vm_page_t m)
1630 {
1631
1632         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
1633             ("moea64_clear_modify: page %p is not managed", m));
1634         VM_OBJECT_ASSERT_WLOCKED(m->object);
1635         KASSERT(!vm_page_xbusied(m),
1636             ("moea64_clear_modify: page %p is exclusive busied", m));
1637
1638         /*
1639          * If the page is not PGA_WRITEABLE, then no PTEs can have LPTE_CHG
1640          * set.  If the object containing the page is locked and the page is
1641          * not exclusive busied, then PGA_WRITEABLE cannot be concurrently set.
1642          */
1643         if ((m->aflags & PGA_WRITEABLE) == 0)
1644                 return;
1645         moea64_clear_bit(mmu, m, LPTE_CHG);
1646 }
1647
1648 /*
1649  * Clear the write and modified bits in each of the given page's mappings.
1650  */
1651 void
1652 moea64_remove_write(mmu_t mmu, vm_page_t m)
1653 {
1654         struct  pvo_entry *pvo;
1655         int64_t refchg, ret;
1656         pmap_t  pmap;
1657
1658         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
1659             ("moea64_remove_write: page %p is not managed", m));
1660
1661         /*
1662          * If the page is not exclusive busied, then PGA_WRITEABLE cannot be
1663          * set by another thread while the object is locked.  Thus,
1664          * if PGA_WRITEABLE is clear, no page table entries need updating.
1665          */
1666         VM_OBJECT_ASSERT_WLOCKED(m->object);
1667         if (!vm_page_xbusied(m) && (m->aflags & PGA_WRITEABLE) == 0)
1668                 return;
1669         powerpc_sync();
1670         PV_PAGE_LOCK(m);
1671         refchg = 0;
1672         LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) {
1673                 pmap = pvo->pvo_pmap;
1674                 PMAP_LOCK(pmap);
1675                 if (!(pvo->pvo_vaddr & PVO_DEAD) &&
1676                     (pvo->pvo_pte.prot & VM_PROT_WRITE)) {
1677                         pvo->pvo_pte.prot &= ~VM_PROT_WRITE;
1678                         ret = MOEA64_PTE_REPLACE(mmu, pvo,
1679                             MOEA64_PTE_PROT_UPDATE);
1680                         if (ret < 0)
1681                                 ret = LPTE_CHG;
1682                         refchg |= ret;
1683                         if (pvo->pvo_pmap == kernel_pmap)
1684                                 isync();
1685                 }
1686                 PMAP_UNLOCK(pmap);
1687         }
1688         if ((refchg | atomic_readandclear_32(&m->md.mdpg_attrs)) & LPTE_CHG)
1689                 vm_page_dirty(m);
1690         vm_page_aflag_clear(m, PGA_WRITEABLE);
1691         PV_PAGE_UNLOCK(m);
1692 }
1693
1694 /*
1695  *      moea64_ts_referenced:
1696  *
1697  *      Return a count of reference bits for a page, clearing those bits.
1698  *      It is not necessary for every reference bit to be cleared, but it
1699  *      is necessary that 0 only be returned when there are truly no
1700  *      reference bits set.
1701  *
1702  *      XXX: The exact number of bits to check and clear is a matter that
1703  *      should be tested and standardized at some point in the future for
1704  *      optimal aging of shared pages.
1705  */
1706 int
1707 moea64_ts_referenced(mmu_t mmu, vm_page_t m)
1708 {
1709
1710         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
1711             ("moea64_ts_referenced: page %p is not managed", m));
1712         return (moea64_clear_bit(mmu, m, LPTE_REF));
1713 }
1714
1715 /*
1716  * Modify the WIMG settings of all mappings for a page.
1717  */
1718 void
1719 moea64_page_set_memattr(mmu_t mmu, vm_page_t m, vm_memattr_t ma)
1720 {
1721         struct  pvo_entry *pvo;
1722         int64_t refchg;
1723         pmap_t  pmap;
1724         uint64_t lo;
1725
1726         if ((m->oflags & VPO_UNMANAGED) != 0) {
1727                 m->md.mdpg_cache_attrs = ma;
1728                 return;
1729         }
1730
1731         lo = moea64_calc_wimg(VM_PAGE_TO_PHYS(m), ma);
1732
1733         PV_PAGE_LOCK(m);
1734         LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) {
1735                 pmap = pvo->pvo_pmap;
1736                 PMAP_LOCK(pmap);
1737                 if (!(pvo->pvo_vaddr & PVO_DEAD)) {
1738                         pvo->pvo_pte.pa &= ~LPTE_WIMG;
1739                         pvo->pvo_pte.pa |= lo;
1740                         refchg = MOEA64_PTE_REPLACE(mmu, pvo,
1741                             MOEA64_PTE_INVALIDATE);
1742                         if (refchg < 0)
1743                                 refchg = (pvo->pvo_pte.prot & VM_PROT_WRITE) ?
1744                                     LPTE_CHG : 0;
1745                         if ((pvo->pvo_vaddr & PVO_MANAGED) &&
1746                             (pvo->pvo_pte.prot & VM_PROT_WRITE)) {
1747                                 refchg |=
1748                                     atomic_readandclear_32(&m->md.mdpg_attrs);
1749                                 if (refchg & LPTE_CHG)
1750                                         vm_page_dirty(m);
1751                                 if (refchg & LPTE_REF)
1752                                         vm_page_aflag_set(m, PGA_REFERENCED);
1753                         }
1754                         if (pvo->pvo_pmap == kernel_pmap)
1755                                 isync();
1756                 }
1757                 PMAP_UNLOCK(pmap);
1758         }
1759         m->md.mdpg_cache_attrs = ma;
1760         PV_PAGE_UNLOCK(m);
1761 }
1762
1763 /*
1764  * Map a wired page into kernel virtual address space.
1765  */
1766 void
1767 moea64_kenter_attr(mmu_t mmu, vm_offset_t va, vm_paddr_t pa, vm_memattr_t ma)
1768 {
1769         int             error;  
1770         struct pvo_entry *pvo, *oldpvo;
1771
1772         pvo = alloc_pvo_entry(0);
1773         pvo->pvo_pte.prot = VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE;
1774         pvo->pvo_pte.pa = (pa & ~ADDR_POFF) | moea64_calc_wimg(pa, ma);
1775         pvo->pvo_vaddr |= PVO_WIRED;
1776
1777         PMAP_LOCK(kernel_pmap);
1778         oldpvo = moea64_pvo_find_va(kernel_pmap, va);
1779         if (oldpvo != NULL)
1780                 moea64_pvo_remove_from_pmap(mmu, oldpvo);
1781         init_pvo_entry(pvo, kernel_pmap, va);
1782         error = moea64_pvo_enter(mmu, pvo, NULL);
1783         PMAP_UNLOCK(kernel_pmap);
1784
1785         /* Free any dead pages */
1786         if (oldpvo != NULL) {
1787                 PV_LOCK(oldpvo->pvo_pte.pa & LPTE_RPGN);
1788                 moea64_pvo_remove_from_page(mmu, oldpvo);
1789                 PV_UNLOCK(oldpvo->pvo_pte.pa & LPTE_RPGN);
1790                 free_pvo_entry(oldpvo);
1791         }
1792
1793         if (error != 0 && error != ENOENT)
1794                 panic("moea64_kenter: failed to enter va %#zx pa %#zx: %d", va,
1795                     pa, error);
1796 }
1797
1798 void
1799 moea64_kenter(mmu_t mmu, vm_offset_t va, vm_paddr_t pa)
1800 {
1801
1802         moea64_kenter_attr(mmu, va, pa, VM_MEMATTR_DEFAULT);
1803 }
1804
1805 /*
1806  * Extract the physical page address associated with the given kernel virtual
1807  * address.
1808  */
1809 vm_paddr_t
1810 moea64_kextract(mmu_t mmu, vm_offset_t va)
1811 {
1812         struct          pvo_entry *pvo;
1813         vm_paddr_t pa;
1814
1815         /*
1816          * Shortcut the direct-mapped case when applicable.  We never put
1817          * anything but 1:1 mappings below VM_MIN_KERNEL_ADDRESS.
1818          */
1819         if (va < VM_MIN_KERNEL_ADDRESS)
1820                 return (va);
1821
1822         PMAP_LOCK(kernel_pmap);
1823         pvo = moea64_pvo_find_va(kernel_pmap, va);
1824         KASSERT(pvo != NULL, ("moea64_kextract: no addr found for %#" PRIxPTR,
1825             va));
1826         pa = (pvo->pvo_pte.pa & LPTE_RPGN) | (va - PVO_VADDR(pvo));
1827         PMAP_UNLOCK(kernel_pmap);
1828         return (pa);
1829 }
1830
1831 /*
1832  * Remove a wired page from kernel virtual address space.
1833  */
1834 void
1835 moea64_kremove(mmu_t mmu, vm_offset_t va)
1836 {
1837         moea64_remove(mmu, kernel_pmap, va, va + PAGE_SIZE);
1838 }
1839
1840 /*
1841  * Provide a kernel pointer corresponding to a given userland pointer.
1842  * The returned pointer is valid until the next time this function is
1843  * called in this thread. This is used internally in copyin/copyout.
1844  */
1845 static int
1846 moea64_map_user_ptr(mmu_t mmu, pmap_t pm, volatile const void *uaddr,
1847     void **kaddr, size_t ulen, size_t *klen)
1848 {
1849         size_t l;
1850 #ifdef __powerpc64__
1851         struct slb *slb;
1852 #endif
1853         register_t slbv;
1854
1855         *kaddr = (char *)USER_ADDR + ((uintptr_t)uaddr & ~SEGMENT_MASK);
1856         l = ((char *)USER_ADDR + SEGMENT_LENGTH) - (char *)(*kaddr);
1857         if (l > ulen)
1858                 l = ulen;
1859         if (klen)
1860                 *klen = l;
1861         else if (l != ulen)
1862                 return (EFAULT);
1863
1864 #ifdef __powerpc64__
1865         /* Try lockless look-up first */
1866         slb = user_va_to_slb_entry(pm, (vm_offset_t)uaddr);
1867
1868         if (slb == NULL) {
1869                 /* If it isn't there, we need to pre-fault the VSID */
1870                 PMAP_LOCK(pm);
1871                 slbv = va_to_vsid(pm, (vm_offset_t)uaddr) << SLBV_VSID_SHIFT;
1872                 PMAP_UNLOCK(pm);
1873         } else {
1874                 slbv = slb->slbv;
1875         }
1876
1877         /* Mark segment no-execute */
1878         slbv |= SLBV_N;
1879 #else
1880         slbv = va_to_vsid(pm, (vm_offset_t)uaddr);
1881
1882         /* Mark segment no-execute */
1883         slbv |= SR_N;
1884 #endif
1885
1886         /* If we have already set this VSID, we can just return */
1887         if (curthread->td_pcb->pcb_cpu.aim.usr_vsid == slbv)
1888                 return (0);
1889   
1890         __asm __volatile("isync");
1891         curthread->td_pcb->pcb_cpu.aim.usr_segm =
1892             (uintptr_t)uaddr >> ADDR_SR_SHFT;
1893         curthread->td_pcb->pcb_cpu.aim.usr_vsid = slbv;
1894 #ifdef __powerpc64__
1895         __asm __volatile ("slbie %0; slbmte %1, %2; isync" ::
1896             "r"(USER_ADDR), "r"(slbv), "r"(USER_SLB_SLBE));
1897 #else
1898         __asm __volatile("mtsr %0,%1; isync" :: "n"(USER_SR), "r"(slbv));
1899 #endif
1900
1901         return (0);
1902 }
1903
1904 /*
1905  * Map a range of physical addresses into kernel virtual address space.
1906  *
1907  * The value passed in *virt is a suggested virtual address for the mapping.
1908  * Architectures which can support a direct-mapped physical to virtual region
1909  * can return the appropriate address within that region, leaving '*virt'
1910  * unchanged.  Other architectures should map the pages starting at '*virt' and
1911  * update '*virt' with the first usable address after the mapped region.
1912  */
1913 vm_offset_t
1914 moea64_map(mmu_t mmu, vm_offset_t *virt, vm_paddr_t pa_start,
1915     vm_paddr_t pa_end, int prot)
1916 {
1917         vm_offset_t     sva, va;
1918
1919         if (hw_direct_map) {
1920                 /*
1921                  * Check if every page in the region is covered by the direct
1922                  * map. The direct map covers all of physical memory. Use
1923                  * moea64_calc_wimg() as a shortcut to see if the page is in
1924                  * physical memory as a way to see if the direct map covers it.
1925                  */
1926                 for (va = pa_start; va < pa_end; va += PAGE_SIZE)
1927                         if (moea64_calc_wimg(va, VM_MEMATTR_DEFAULT) != LPTE_M)
1928                                 break;
1929                 if (va == pa_end)
1930                         return (PHYS_TO_DMAP(pa_start));
1931         }
1932         sva = *virt;
1933         va = sva;
1934         /* XXX respect prot argument */
1935         for (; pa_start < pa_end; pa_start += PAGE_SIZE, va += PAGE_SIZE)
1936                 moea64_kenter(mmu, va, pa_start);
1937         *virt = va;
1938
1939         return (sva);
1940 }
1941
1942 /*
1943  * Returns true if the pmap's pv is one of the first
1944  * 16 pvs linked to from this page.  This count may
1945  * be changed upwards or downwards in the future; it
1946  * is only necessary that true be returned for a small
1947  * subset of pmaps for proper page aging.
1948  */
1949 boolean_t
1950 moea64_page_exists_quick(mmu_t mmu, pmap_t pmap, vm_page_t m)
1951 {
1952         int loops;
1953         struct pvo_entry *pvo;
1954         boolean_t rv;
1955
1956         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
1957             ("moea64_page_exists_quick: page %p is not managed", m));
1958         loops = 0;
1959         rv = FALSE;
1960         PV_PAGE_LOCK(m);
1961         LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) {
1962                 if (!(pvo->pvo_vaddr & PVO_DEAD) && pvo->pvo_pmap == pmap) {
1963                         rv = TRUE;
1964                         break;
1965                 }
1966                 if (++loops >= 16)
1967                         break;
1968         }
1969         PV_PAGE_UNLOCK(m);
1970         return (rv);
1971 }
1972
1973 void
1974 moea64_page_init(mmu_t mmu __unused, vm_page_t m)
1975 {
1976
1977         m->md.mdpg_attrs = 0;
1978         m->md.mdpg_cache_attrs = VM_MEMATTR_DEFAULT;
1979         LIST_INIT(&m->md.mdpg_pvoh);
1980 }
1981
1982 /*
1983  * Return the number of managed mappings to the given physical page
1984  * that are wired.
1985  */
1986 int
1987 moea64_page_wired_mappings(mmu_t mmu, vm_page_t m)
1988 {
1989         struct pvo_entry *pvo;
1990         int count;
1991
1992         count = 0;
1993         if ((m->oflags & VPO_UNMANAGED) != 0)
1994                 return (count);
1995         PV_PAGE_LOCK(m);
1996         LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink)
1997                 if ((pvo->pvo_vaddr & (PVO_DEAD | PVO_WIRED)) == PVO_WIRED)
1998                         count++;
1999         PV_PAGE_UNLOCK(m);
2000         return (count);
2001 }
2002
2003 static uintptr_t        moea64_vsidcontext;
2004
2005 uintptr_t
2006 moea64_get_unique_vsid(void) {
2007         u_int entropy;
2008         register_t hash;
2009         uint32_t mask;
2010         int i;
2011
2012         entropy = 0;
2013         __asm __volatile("mftb %0" : "=r"(entropy));
2014
2015         mtx_lock(&moea64_slb_mutex);
2016         for (i = 0; i < NVSIDS; i += VSID_NBPW) {
2017                 u_int   n;
2018
2019                 /*
2020                  * Create a new value by mutiplying by a prime and adding in
2021                  * entropy from the timebase register.  This is to make the
2022                  * VSID more random so that the PT hash function collides
2023                  * less often.  (Note that the prime casues gcc to do shifts
2024                  * instead of a multiply.)
2025                  */
2026                 moea64_vsidcontext = (moea64_vsidcontext * 0x1105) + entropy;
2027                 hash = moea64_vsidcontext & (NVSIDS - 1);
2028                 if (hash == 0)          /* 0 is special, avoid it */
2029                         continue;
2030                 n = hash >> 5;
2031                 mask = 1 << (hash & (VSID_NBPW - 1));
2032                 hash = (moea64_vsidcontext & VSID_HASHMASK);
2033                 if (moea64_vsid_bitmap[n] & mask) {     /* collision? */
2034                         /* anything free in this bucket? */
2035                         if (moea64_vsid_bitmap[n] == 0xffffffff) {
2036                                 entropy = (moea64_vsidcontext >> 20);
2037                                 continue;
2038                         }
2039                         i = ffs(~moea64_vsid_bitmap[n]) - 1;
2040                         mask = 1 << i;
2041                         hash &= rounddown2(VSID_HASHMASK, VSID_NBPW);
2042                         hash |= i;
2043                 }
2044                 if (hash == VSID_VRMA)  /* also special, avoid this too */
2045                         continue;
2046                 KASSERT(!(moea64_vsid_bitmap[n] & mask),
2047                     ("Allocating in-use VSID %#zx\n", hash));
2048                 moea64_vsid_bitmap[n] |= mask;
2049                 mtx_unlock(&moea64_slb_mutex);
2050                 return (hash);
2051         }
2052
2053         mtx_unlock(&moea64_slb_mutex);
2054         panic("%s: out of segments",__func__);
2055 }
2056
2057 #ifdef __powerpc64__
2058 void
2059 moea64_pinit(mmu_t mmu, pmap_t pmap)
2060 {
2061
2062         RB_INIT(&pmap->pmap_pvo);
2063
2064         pmap->pm_slb_tree_root = slb_alloc_tree();
2065         pmap->pm_slb = slb_alloc_user_cache();
2066         pmap->pm_slb_len = 0;
2067 }
2068 #else
2069 void
2070 moea64_pinit(mmu_t mmu, pmap_t pmap)
2071 {
2072         int     i;
2073         uint32_t hash;
2074
2075         RB_INIT(&pmap->pmap_pvo);
2076
2077         if (pmap_bootstrapped)
2078                 pmap->pmap_phys = (pmap_t)moea64_kextract(mmu,
2079                     (vm_offset_t)pmap);
2080         else
2081                 pmap->pmap_phys = pmap;
2082
2083         /*
2084          * Allocate some segment registers for this pmap.
2085          */
2086         hash = moea64_get_unique_vsid();
2087
2088         for (i = 0; i < 16; i++) 
2089                 pmap->pm_sr[i] = VSID_MAKE(i, hash);
2090
2091         KASSERT(pmap->pm_sr[0] != 0, ("moea64_pinit: pm_sr[0] = 0"));
2092 }
2093 #endif
2094
2095 /*
2096  * Initialize the pmap associated with process 0.
2097  */
2098 void
2099 moea64_pinit0(mmu_t mmu, pmap_t pm)
2100 {
2101
2102         PMAP_LOCK_INIT(pm);
2103         moea64_pinit(mmu, pm);
2104         bzero(&pm->pm_stats, sizeof(pm->pm_stats));
2105 }
2106
2107 /*
2108  * Set the physical protection on the specified range of this map as requested.
2109  */
2110 static void
2111 moea64_pvo_protect(mmu_t mmu,  pmap_t pm, struct pvo_entry *pvo, vm_prot_t prot)
2112 {
2113         struct vm_page *pg;
2114         vm_prot_t oldprot;
2115         int32_t refchg;
2116
2117         PMAP_LOCK_ASSERT(pm, MA_OWNED);
2118
2119         /*
2120          * Change the protection of the page.
2121          */
2122         oldprot = pvo->pvo_pte.prot;
2123         pvo->pvo_pte.prot = prot;
2124         pg = PHYS_TO_VM_PAGE(pvo->pvo_pte.pa & LPTE_RPGN);
2125
2126         /*
2127          * If the PVO is in the page table, update mapping
2128          */
2129         refchg = MOEA64_PTE_REPLACE(mmu, pvo, MOEA64_PTE_PROT_UPDATE);
2130         if (refchg < 0)
2131                 refchg = (oldprot & VM_PROT_WRITE) ? LPTE_CHG : 0;
2132
2133         if (pm != kernel_pmap && pg != NULL && !(pg->aflags & PGA_EXECUTABLE) &&
2134             (pvo->pvo_pte.pa & (LPTE_I | LPTE_G | LPTE_NOEXEC)) == 0) {
2135                 if ((pg->oflags & VPO_UNMANAGED) == 0)
2136                         vm_page_aflag_set(pg, PGA_EXECUTABLE);
2137                 moea64_syncicache(mmu, pm, PVO_VADDR(pvo),
2138                     pvo->pvo_pte.pa & LPTE_RPGN, PAGE_SIZE);
2139         }
2140
2141         /*
2142          * Update vm about the REF/CHG bits if the page is managed and we have
2143          * removed write access.
2144          */
2145         if (pg != NULL && (pvo->pvo_vaddr & PVO_MANAGED) &&
2146             (oldprot & VM_PROT_WRITE)) {
2147                 refchg |= atomic_readandclear_32(&pg->md.mdpg_attrs);
2148                 if (refchg & LPTE_CHG)
2149                         vm_page_dirty(pg);
2150                 if (refchg & LPTE_REF)
2151                         vm_page_aflag_set(pg, PGA_REFERENCED);
2152         }
2153 }
2154
2155 void
2156 moea64_protect(mmu_t mmu, pmap_t pm, vm_offset_t sva, vm_offset_t eva,
2157     vm_prot_t prot)
2158 {
2159         struct  pvo_entry *pvo, *tpvo, key;
2160
2161         CTR4(KTR_PMAP, "moea64_protect: pm=%p sva=%#x eva=%#x prot=%#x", pm,
2162             sva, eva, prot);
2163
2164         KASSERT(pm == &curproc->p_vmspace->vm_pmap || pm == kernel_pmap,
2165             ("moea64_protect: non current pmap"));
2166
2167         if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
2168                 moea64_remove(mmu, pm, sva, eva);
2169                 return;
2170         }
2171
2172         PMAP_LOCK(pm);
2173         key.pvo_vaddr = sva;
2174         for (pvo = RB_NFIND(pvo_tree, &pm->pmap_pvo, &key);
2175             pvo != NULL && PVO_VADDR(pvo) < eva; pvo = tpvo) {
2176                 tpvo = RB_NEXT(pvo_tree, &pm->pmap_pvo, pvo);
2177                 moea64_pvo_protect(mmu, pm, pvo, prot);
2178         }
2179         PMAP_UNLOCK(pm);
2180 }
2181
2182 /*
2183  * Map a list of wired pages into kernel virtual address space.  This is
2184  * intended for temporary mappings which do not need page modification or
2185  * references recorded.  Existing mappings in the region are overwritten.
2186  */
2187 void
2188 moea64_qenter(mmu_t mmu, vm_offset_t va, vm_page_t *m, int count)
2189 {
2190         while (count-- > 0) {
2191                 moea64_kenter(mmu, va, VM_PAGE_TO_PHYS(*m));
2192                 va += PAGE_SIZE;
2193                 m++;
2194         }
2195 }
2196
2197 /*
2198  * Remove page mappings from kernel virtual address space.  Intended for
2199  * temporary mappings entered by moea64_qenter.
2200  */
2201 void
2202 moea64_qremove(mmu_t mmu, vm_offset_t va, int count)
2203 {
2204         while (count-- > 0) {
2205                 moea64_kremove(mmu, va);
2206                 va += PAGE_SIZE;
2207         }
2208 }
2209
2210 void
2211 moea64_release_vsid(uint64_t vsid)
2212 {
2213         int idx, mask;
2214
2215         mtx_lock(&moea64_slb_mutex);
2216         idx = vsid & (NVSIDS-1);
2217         mask = 1 << (idx % VSID_NBPW);
2218         idx /= VSID_NBPW;
2219         KASSERT(moea64_vsid_bitmap[idx] & mask,
2220             ("Freeing unallocated VSID %#jx", vsid));
2221         moea64_vsid_bitmap[idx] &= ~mask;
2222         mtx_unlock(&moea64_slb_mutex);
2223 }
2224         
2225
2226 void
2227 moea64_release(mmu_t mmu, pmap_t pmap)
2228 {
2229         
2230         /*
2231          * Free segment registers' VSIDs
2232          */
2233     #ifdef __powerpc64__
2234         slb_free_tree(pmap);
2235         slb_free_user_cache(pmap->pm_slb);
2236     #else
2237         KASSERT(pmap->pm_sr[0] != 0, ("moea64_release: pm_sr[0] = 0"));
2238
2239         moea64_release_vsid(VSID_TO_HASH(pmap->pm_sr[0]));
2240     #endif
2241 }
2242
2243 /*
2244  * Remove all pages mapped by the specified pmap
2245  */
2246 void
2247 moea64_remove_pages(mmu_t mmu, pmap_t pm)
2248 {
2249         struct pvo_entry *pvo, *tpvo;
2250         struct pvo_tree tofree;
2251
2252         RB_INIT(&tofree);
2253
2254         PMAP_LOCK(pm);
2255         RB_FOREACH_SAFE(pvo, pvo_tree, &pm->pmap_pvo, tpvo) {
2256                 if (pvo->pvo_vaddr & PVO_WIRED)
2257                         continue;
2258
2259                 /*
2260                  * For locking reasons, remove this from the page table and
2261                  * pmap, but save delinking from the vm_page for a second
2262                  * pass
2263                  */
2264                 moea64_pvo_remove_from_pmap(mmu, pvo);
2265                 RB_INSERT(pvo_tree, &tofree, pvo);
2266         }
2267         PMAP_UNLOCK(pm);
2268
2269         RB_FOREACH_SAFE(pvo, pvo_tree, &tofree, tpvo) {
2270                 PV_LOCK(pvo->pvo_pte.pa & LPTE_RPGN);
2271                 moea64_pvo_remove_from_page(mmu, pvo);
2272                 PV_UNLOCK(pvo->pvo_pte.pa & LPTE_RPGN);
2273                 RB_REMOVE(pvo_tree, &tofree, pvo);
2274                 free_pvo_entry(pvo);
2275         }
2276 }
2277
2278 /*
2279  * Remove the given range of addresses from the specified map.
2280  */
2281 void
2282 moea64_remove(mmu_t mmu, pmap_t pm, vm_offset_t sva, vm_offset_t eva)
2283 {
2284         struct  pvo_entry *pvo, *tpvo, key;
2285         struct pvo_tree tofree;
2286
2287         /*
2288          * Perform an unsynchronized read.  This is, however, safe.
2289          */
2290         if (pm->pm_stats.resident_count == 0)
2291                 return;
2292
2293         key.pvo_vaddr = sva;
2294
2295         RB_INIT(&tofree);
2296
2297         PMAP_LOCK(pm);
2298         for (pvo = RB_NFIND(pvo_tree, &pm->pmap_pvo, &key);
2299             pvo != NULL && PVO_VADDR(pvo) < eva; pvo = tpvo) {
2300                 tpvo = RB_NEXT(pvo_tree, &pm->pmap_pvo, pvo);
2301
2302                 /*
2303                  * For locking reasons, remove this from the page table and
2304                  * pmap, but save delinking from the vm_page for a second
2305                  * pass
2306                  */
2307                 moea64_pvo_remove_from_pmap(mmu, pvo);
2308                 RB_INSERT(pvo_tree, &tofree, pvo);
2309         }
2310         PMAP_UNLOCK(pm);
2311
2312         RB_FOREACH_SAFE(pvo, pvo_tree, &tofree, tpvo) {
2313                 PV_LOCK(pvo->pvo_pte.pa & LPTE_RPGN);
2314                 moea64_pvo_remove_from_page(mmu, pvo);
2315                 PV_UNLOCK(pvo->pvo_pte.pa & LPTE_RPGN);
2316                 RB_REMOVE(pvo_tree, &tofree, pvo);
2317                 free_pvo_entry(pvo);
2318         }
2319 }
2320
2321 /*
2322  * Remove physical page from all pmaps in which it resides. moea64_pvo_remove()
2323  * will reflect changes in pte's back to the vm_page.
2324  */
2325 void
2326 moea64_remove_all(mmu_t mmu, vm_page_t m)
2327 {
2328         struct  pvo_entry *pvo, *next_pvo;
2329         struct  pvo_head freequeue;
2330         int     wasdead;
2331         pmap_t  pmap;
2332
2333         LIST_INIT(&freequeue);
2334
2335         PV_PAGE_LOCK(m);
2336         LIST_FOREACH_SAFE(pvo, vm_page_to_pvoh(m), pvo_vlink, next_pvo) {
2337                 pmap = pvo->pvo_pmap;
2338                 PMAP_LOCK(pmap);
2339                 wasdead = (pvo->pvo_vaddr & PVO_DEAD);
2340                 if (!wasdead)
2341                         moea64_pvo_remove_from_pmap(mmu, pvo);
2342                 moea64_pvo_remove_from_page(mmu, pvo);
2343                 if (!wasdead)
2344                         LIST_INSERT_HEAD(&freequeue, pvo, pvo_vlink);
2345                 PMAP_UNLOCK(pmap);
2346                 
2347         }
2348         KASSERT(!pmap_page_is_mapped(m), ("Page still has mappings"));
2349         KASSERT(!(m->aflags & PGA_WRITEABLE), ("Page still writable"));
2350         PV_PAGE_UNLOCK(m);
2351
2352         /* Clean up UMA allocations */
2353         LIST_FOREACH_SAFE(pvo, &freequeue, pvo_vlink, next_pvo)
2354                 free_pvo_entry(pvo);
2355 }
2356
2357 /*
2358  * Allocate a physical page of memory directly from the phys_avail map.
2359  * Can only be called from moea64_bootstrap before avail start and end are
2360  * calculated.
2361  */
2362 vm_offset_t
2363 moea64_bootstrap_alloc(vm_size_t size, u_int align)
2364 {
2365         vm_offset_t     s, e;
2366         int             i, j;
2367
2368         size = round_page(size);
2369         for (i = 0; phys_avail[i + 1] != 0; i += 2) {
2370                 if (align != 0)
2371                         s = roundup2(phys_avail[i], align);
2372                 else
2373                         s = phys_avail[i];
2374                 e = s + size;
2375
2376                 if (s < phys_avail[i] || e > phys_avail[i + 1])
2377                         continue;
2378
2379                 if (s + size > platform_real_maxaddr())
2380                         continue;
2381
2382                 if (s == phys_avail[i]) {
2383                         phys_avail[i] += size;
2384                 } else if (e == phys_avail[i + 1]) {
2385                         phys_avail[i + 1] -= size;
2386                 } else {
2387                         for (j = phys_avail_count * 2; j > i; j -= 2) {
2388                                 phys_avail[j] = phys_avail[j - 2];
2389                                 phys_avail[j + 1] = phys_avail[j - 1];
2390                         }
2391
2392                         phys_avail[i + 3] = phys_avail[i + 1];
2393                         phys_avail[i + 1] = s;
2394                         phys_avail[i + 2] = e;
2395                         phys_avail_count++;
2396                 }
2397
2398                 return (s);
2399         }
2400         panic("moea64_bootstrap_alloc: could not allocate memory");
2401 }
2402
2403 static int
2404 moea64_pvo_enter(mmu_t mmu, struct pvo_entry *pvo, struct pvo_head *pvo_head)
2405 {
2406         int first, err;
2407
2408         PMAP_LOCK_ASSERT(pvo->pvo_pmap, MA_OWNED);
2409         KASSERT(moea64_pvo_find_va(pvo->pvo_pmap, PVO_VADDR(pvo)) == NULL,
2410             ("Existing mapping for VA %#jx", (uintmax_t)PVO_VADDR(pvo)));
2411
2412         moea64_pvo_enter_calls++;
2413
2414         /*
2415          * Add to pmap list
2416          */
2417         RB_INSERT(pvo_tree, &pvo->pvo_pmap->pmap_pvo, pvo);
2418
2419         /*
2420          * Remember if the list was empty and therefore will be the first
2421          * item.
2422          */
2423         if (pvo_head != NULL) {
2424                 if (LIST_FIRST(pvo_head) == NULL)
2425                         first = 1;
2426                 LIST_INSERT_HEAD(pvo_head, pvo, pvo_vlink);
2427         }
2428
2429         if (pvo->pvo_vaddr & PVO_WIRED)
2430                 pvo->pvo_pmap->pm_stats.wired_count++;
2431         pvo->pvo_pmap->pm_stats.resident_count++;
2432
2433         /*
2434          * Insert it into the hardware page table
2435          */
2436         err = MOEA64_PTE_INSERT(mmu, pvo);
2437         if (err != 0) {
2438                 panic("moea64_pvo_enter: overflow");
2439         }
2440
2441         moea64_pvo_entries++;
2442
2443         if (pvo->pvo_pmap == kernel_pmap)
2444                 isync();
2445
2446 #ifdef __powerpc64__
2447         /*
2448          * Make sure all our bootstrap mappings are in the SLB as soon
2449          * as virtual memory is switched on.
2450          */
2451         if (!pmap_bootstrapped)
2452                 moea64_bootstrap_slb_prefault(PVO_VADDR(pvo),
2453                     pvo->pvo_vaddr & PVO_LARGE);
2454 #endif
2455
2456         return (first ? ENOENT : 0);
2457 }
2458
2459 static void
2460 moea64_pvo_remove_from_pmap(mmu_t mmu, struct pvo_entry *pvo)
2461 {
2462         struct  vm_page *pg;
2463         int32_t refchg;
2464
2465         KASSERT(pvo->pvo_pmap != NULL, ("Trying to remove PVO with no pmap"));
2466         PMAP_LOCK_ASSERT(pvo->pvo_pmap, MA_OWNED);
2467         KASSERT(!(pvo->pvo_vaddr & PVO_DEAD), ("Trying to remove dead PVO"));
2468
2469         /*
2470          * If there is an active pte entry, we need to deactivate it
2471          */
2472         refchg = MOEA64_PTE_UNSET(mmu, pvo);
2473         if (refchg < 0) {
2474                 /*
2475                  * If it was evicted from the page table, be pessimistic and
2476                  * dirty the page.
2477                  */
2478                 if (pvo->pvo_pte.prot & VM_PROT_WRITE)
2479                         refchg = LPTE_CHG;
2480                 else
2481                         refchg = 0;
2482         }
2483
2484         /*
2485          * Update our statistics.
2486          */
2487         pvo->pvo_pmap->pm_stats.resident_count--;
2488         if (pvo->pvo_vaddr & PVO_WIRED)
2489                 pvo->pvo_pmap->pm_stats.wired_count--;
2490
2491         /*
2492          * Remove this PVO from the pmap list.
2493          */
2494         RB_REMOVE(pvo_tree, &pvo->pvo_pmap->pmap_pvo, pvo);
2495
2496         /*
2497          * Mark this for the next sweep
2498          */
2499         pvo->pvo_vaddr |= PVO_DEAD;
2500
2501         /* Send RC bits to VM */
2502         if ((pvo->pvo_vaddr & PVO_MANAGED) &&
2503             (pvo->pvo_pte.prot & VM_PROT_WRITE)) {
2504                 pg = PHYS_TO_VM_PAGE(pvo->pvo_pte.pa & LPTE_RPGN);
2505                 if (pg != NULL) {
2506                         refchg |= atomic_readandclear_32(&pg->md.mdpg_attrs);
2507                         if (refchg & LPTE_CHG)
2508                                 vm_page_dirty(pg);
2509                         if (refchg & LPTE_REF)
2510                                 vm_page_aflag_set(pg, PGA_REFERENCED);
2511                 }
2512         }
2513 }
2514
2515 static void
2516 moea64_pvo_remove_from_page(mmu_t mmu, struct pvo_entry *pvo)
2517 {
2518         struct  vm_page *pg;
2519
2520         KASSERT(pvo->pvo_vaddr & PVO_DEAD, ("Trying to delink live page"));
2521
2522         /* Use NULL pmaps as a sentinel for races in page deletion */
2523         if (pvo->pvo_pmap == NULL)
2524                 return;
2525         pvo->pvo_pmap = NULL;
2526
2527         /*
2528          * Update vm about page writeability/executability if managed
2529          */
2530         PV_LOCKASSERT(pvo->pvo_pte.pa & LPTE_RPGN);
2531         pg = PHYS_TO_VM_PAGE(pvo->pvo_pte.pa & LPTE_RPGN);
2532
2533         if ((pvo->pvo_vaddr & PVO_MANAGED) && pg != NULL) {
2534                 LIST_REMOVE(pvo, pvo_vlink);
2535                 if (LIST_EMPTY(vm_page_to_pvoh(pg)))
2536                         vm_page_aflag_clear(pg, PGA_WRITEABLE | PGA_EXECUTABLE);
2537         }
2538
2539         moea64_pvo_entries--;
2540         moea64_pvo_remove_calls++;
2541 }
2542
2543 static struct pvo_entry *
2544 moea64_pvo_find_va(pmap_t pm, vm_offset_t va)
2545 {
2546         struct pvo_entry key;
2547
2548         PMAP_LOCK_ASSERT(pm, MA_OWNED);
2549
2550         key.pvo_vaddr = va & ~ADDR_POFF;
2551         return (RB_FIND(pvo_tree, &pm->pmap_pvo, &key));
2552 }
2553
2554 static boolean_t
2555 moea64_query_bit(mmu_t mmu, vm_page_t m, uint64_t ptebit)
2556 {
2557         struct  pvo_entry *pvo;
2558         int64_t ret;
2559         boolean_t rv;
2560
2561         /*
2562          * See if this bit is stored in the page already.
2563          */
2564         if (m->md.mdpg_attrs & ptebit)
2565                 return (TRUE);
2566
2567         /*
2568          * Examine each PTE.  Sync so that any pending REF/CHG bits are
2569          * flushed to the PTEs.
2570          */
2571         rv = FALSE;
2572         powerpc_sync();
2573         PV_PAGE_LOCK(m);
2574         LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) {
2575                 ret = 0;
2576
2577                 /*
2578                  * See if this pvo has a valid PTE.  if so, fetch the
2579                  * REF/CHG bits from the valid PTE.  If the appropriate
2580                  * ptebit is set, return success.
2581                  */
2582                 PMAP_LOCK(pvo->pvo_pmap);
2583                 if (!(pvo->pvo_vaddr & PVO_DEAD))
2584                         ret = MOEA64_PTE_SYNCH(mmu, pvo);
2585                 PMAP_UNLOCK(pvo->pvo_pmap);
2586
2587                 if (ret > 0) {
2588                         atomic_set_32(&m->md.mdpg_attrs,
2589                             ret & (LPTE_CHG | LPTE_REF));
2590                         if (ret & ptebit) {
2591                                 rv = TRUE;
2592                                 break;
2593                         }
2594                 }
2595         }
2596         PV_PAGE_UNLOCK(m);
2597
2598         return (rv);
2599 }
2600
2601 static u_int
2602 moea64_clear_bit(mmu_t mmu, vm_page_t m, u_int64_t ptebit)
2603 {
2604         u_int   count;
2605         struct  pvo_entry *pvo;
2606         int64_t ret;
2607
2608         /*
2609          * Sync so that any pending REF/CHG bits are flushed to the PTEs (so
2610          * we can reset the right ones).
2611          */
2612         powerpc_sync();
2613
2614         /*
2615          * For each pvo entry, clear the pte's ptebit.
2616          */
2617         count = 0;
2618         PV_PAGE_LOCK(m);
2619         LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) {
2620                 ret = 0;
2621
2622                 PMAP_LOCK(pvo->pvo_pmap);
2623                 if (!(pvo->pvo_vaddr & PVO_DEAD))
2624                         ret = MOEA64_PTE_CLEAR(mmu, pvo, ptebit);
2625                 PMAP_UNLOCK(pvo->pvo_pmap);
2626
2627                 if (ret > 0 && (ret & ptebit))
2628                         count++;
2629         }
2630         atomic_clear_32(&m->md.mdpg_attrs, ptebit);
2631         PV_PAGE_UNLOCK(m);
2632
2633         return (count);
2634 }
2635
2636 boolean_t
2637 moea64_dev_direct_mapped(mmu_t mmu, vm_paddr_t pa, vm_size_t size)
2638 {
2639         struct pvo_entry *pvo, key;
2640         vm_offset_t ppa;
2641         int error = 0;
2642
2643         PMAP_LOCK(kernel_pmap);
2644         key.pvo_vaddr = ppa = pa & ~ADDR_POFF;
2645         for (pvo = RB_FIND(pvo_tree, &kernel_pmap->pmap_pvo, &key);
2646             ppa < pa + size; ppa += PAGE_SIZE,
2647             pvo = RB_NEXT(pvo_tree, &kernel_pmap->pmap_pvo, pvo)) {
2648                 if (pvo == NULL || (pvo->pvo_pte.pa & LPTE_RPGN) != ppa) {
2649                         error = EFAULT;
2650                         break;
2651                 }
2652         }
2653         PMAP_UNLOCK(kernel_pmap);
2654
2655         return (error);
2656 }
2657
2658 /*
2659  * Map a set of physical memory pages into the kernel virtual
2660  * address space. Return a pointer to where it is mapped. This
2661  * routine is intended to be used for mapping device memory,
2662  * NOT real memory.
2663  */
2664 void *
2665 moea64_mapdev_attr(mmu_t mmu, vm_paddr_t pa, vm_size_t size, vm_memattr_t ma)
2666 {
2667         vm_offset_t va, tmpva, ppa, offset;
2668
2669         ppa = trunc_page(pa);
2670         offset = pa & PAGE_MASK;
2671         size = roundup2(offset + size, PAGE_SIZE);
2672
2673         va = kva_alloc(size);
2674
2675         if (!va)
2676                 panic("moea64_mapdev: Couldn't alloc kernel virtual memory");
2677
2678         for (tmpva = va; size > 0;) {
2679                 moea64_kenter_attr(mmu, tmpva, ppa, ma);
2680                 size -= PAGE_SIZE;
2681                 tmpva += PAGE_SIZE;
2682                 ppa += PAGE_SIZE;
2683         }
2684
2685         return ((void *)(va + offset));
2686 }
2687
2688 void *
2689 moea64_mapdev(mmu_t mmu, vm_paddr_t pa, vm_size_t size)
2690 {
2691
2692         return moea64_mapdev_attr(mmu, pa, size, VM_MEMATTR_DEFAULT);
2693 }
2694
2695 void
2696 moea64_unmapdev(mmu_t mmu, vm_offset_t va, vm_size_t size)
2697 {
2698         vm_offset_t base, offset;
2699
2700         base = trunc_page(va);
2701         offset = va & PAGE_MASK;
2702         size = roundup2(offset + size, PAGE_SIZE);
2703
2704         kva_free(base, size);
2705 }
2706
2707 void
2708 moea64_sync_icache(mmu_t mmu, pmap_t pm, vm_offset_t va, vm_size_t sz)
2709 {
2710         struct pvo_entry *pvo;
2711         vm_offset_t lim;
2712         vm_paddr_t pa;
2713         vm_size_t len;
2714
2715         PMAP_LOCK(pm);
2716         while (sz > 0) {
2717                 lim = round_page(va);
2718                 len = MIN(lim - va, sz);
2719                 pvo = moea64_pvo_find_va(pm, va & ~ADDR_POFF);
2720                 if (pvo != NULL && !(pvo->pvo_pte.pa & LPTE_I)) {
2721                         pa = (pvo->pvo_pte.pa & LPTE_RPGN) | (va & ADDR_POFF);
2722                         moea64_syncicache(mmu, pm, va, pa, len);
2723                 }
2724                 va += len;
2725                 sz -= len;
2726         }
2727         PMAP_UNLOCK(pm);
2728 }
2729
2730 void
2731 moea64_dumpsys_map(mmu_t mmu, vm_paddr_t pa, size_t sz, void **va)
2732 {
2733
2734         *va = (void *)pa;
2735 }
2736
2737 extern struct dump_pa dump_map[PHYS_AVAIL_SZ + 1];
2738
2739 void
2740 moea64_scan_init(mmu_t mmu)
2741 {
2742         struct pvo_entry *pvo;
2743         vm_offset_t va;
2744         int i;
2745
2746         if (!do_minidump) {
2747                 /* Initialize phys. segments for dumpsys(). */
2748                 memset(&dump_map, 0, sizeof(dump_map));
2749                 mem_regions(&pregions, &pregions_sz, &regions, &regions_sz);
2750                 for (i = 0; i < pregions_sz; i++) {
2751                         dump_map[i].pa_start = pregions[i].mr_start;
2752                         dump_map[i].pa_size = pregions[i].mr_size;
2753                 }
2754                 return;
2755         }
2756
2757         /* Virtual segments for minidumps: */
2758         memset(&dump_map, 0, sizeof(dump_map));
2759
2760         /* 1st: kernel .data and .bss. */
2761         dump_map[0].pa_start = trunc_page((uintptr_t)_etext);
2762         dump_map[0].pa_size = round_page((uintptr_t)_end) -
2763             dump_map[0].pa_start;
2764
2765         /* 2nd: msgbuf and tables (see pmap_bootstrap()). */
2766         dump_map[1].pa_start = (vm_paddr_t)msgbufp->msg_ptr;
2767         dump_map[1].pa_size = round_page(msgbufp->msg_size);
2768
2769         /* 3rd: kernel VM. */
2770         va = dump_map[1].pa_start + dump_map[1].pa_size;
2771         /* Find start of next chunk (from va). */
2772         while (va < virtual_end) {
2773                 /* Don't dump the buffer cache. */
2774                 if (va >= kmi.buffer_sva && va < kmi.buffer_eva) {
2775                         va = kmi.buffer_eva;
2776                         continue;
2777                 }
2778                 pvo = moea64_pvo_find_va(kernel_pmap, va & ~ADDR_POFF);
2779                 if (pvo != NULL && !(pvo->pvo_vaddr & PVO_DEAD))
2780                         break;
2781                 va += PAGE_SIZE;
2782         }
2783         if (va < virtual_end) {
2784                 dump_map[2].pa_start = va;
2785                 va += PAGE_SIZE;
2786                 /* Find last page in chunk. */
2787                 while (va < virtual_end) {
2788                         /* Don't run into the buffer cache. */
2789                         if (va == kmi.buffer_sva)
2790                                 break;
2791                         pvo = moea64_pvo_find_va(kernel_pmap, va & ~ADDR_POFF);
2792                         if (pvo != NULL && !(pvo->pvo_vaddr & PVO_DEAD))
2793                                 break;
2794                         va += PAGE_SIZE;
2795                 }
2796                 dump_map[2].pa_size = va - dump_map[2].pa_start;
2797         }
2798 }
2799