]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/mips/mips/pmap.c
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / sys / mips / mips / pmap.c
1 /*-
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  * Copyright (c) 1991 Regents of the University of California.
5  * All rights reserved.
6  * Copyright (c) 1994 John S. Dyson
7  * All rights reserved.
8  * Copyright (c) 1994 David Greenman
9  * All rights reserved.
10  *
11  * This code is derived from software contributed to Berkeley by
12  * the Systems Programming Group of the University of Utah Computer
13  * Science Department and William Jolitz of UUNET Technologies Inc.
14  *
15  * Redistribution and use in source and binary forms, with or without
16  * modification, are permitted provided that the following conditions
17  * are met:
18  * 1. Redistributions of source code must retain the above copyright
19  *    notice, this list of conditions and the following disclaimer.
20  * 2. Redistributions in binary form must reproduce the above copyright
21  *    notice, this list of conditions and the following disclaimer in the
22  *    documentation and/or other materials provided with the distribution.
23  * 3. Neither the name of the University nor the names of its contributors
24  *    may be used to endorse or promote products derived from this software
25  *    without specific prior written permission.
26  *
27  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
28  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
31  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37  * SUCH DAMAGE.
38  *
39  *      from:   @(#)pmap.c      7.7 (Berkeley)  5/12/91
40  *      from: src/sys/i386/i386/pmap.c,v 1.250.2.8 2000/11/21 00:09:14 ps
41  *      JNPR: pmap.c,v 1.11.2.1 2007/08/16 11:51:06 girish
42  */
43
44 /*
45  *      Manages physical address maps.
46  *
47  *      Since the information managed by this module is
48  *      also stored by the logical address mapping module,
49  *      this module may throw away valid virtual-to-physical
50  *      mappings at almost any time.  However, invalidations
51  *      of virtual-to-physical mappings must be done as
52  *      requested.
53  *
54  *      In order to cope with hardware architectures which
55  *      make virtual-to-physical map invalidates expensive,
56  *      this module may delay invalidate or reduced protection
57  *      operations until such time as they are actually
58  *      necessary.  This module is given full information as
59  *      to which processors are currently using which maps,
60  *      and to when physical maps must be made correct.
61  */
62
63 #include <sys/cdefs.h>
64 __FBSDID("$FreeBSD$");
65
66 #include "opt_ddb.h"
67 #include "opt_pmap.h"
68
69 #include <sys/param.h>
70 #include <sys/systm.h>
71 #include <sys/kernel.h>
72 #include <sys/lock.h>
73 #include <sys/mman.h>
74 #include <sys/msgbuf.h>
75 #include <sys/mutex.h>
76 #include <sys/pcpu.h>
77 #include <sys/proc.h>
78 #include <sys/rwlock.h>
79 #include <sys/sched.h>
80 #include <sys/smp.h>
81 #include <sys/sysctl.h>
82 #include <sys/vmmeter.h>
83
84 #ifdef DDB
85 #include <ddb/ddb.h>
86 #endif
87
88 #include <vm/vm.h>
89 #include <vm/vm_param.h>
90 #include <vm/vm_kern.h>
91 #include <vm/vm_page.h>
92 #include <vm/vm_phys.h>
93 #include <vm/vm_map.h>
94 #include <vm/vm_object.h>
95 #include <vm/vm_extern.h>
96 #include <vm/vm_pageout.h>
97 #include <vm/vm_pager.h>
98 #include <vm/uma.h>
99
100 #include <machine/cache.h>
101 #include <machine/md_var.h>
102 #include <machine/tlb.h>
103
104 #undef PMAP_DEBUG
105
106 #if !defined(DIAGNOSTIC)
107 #define PMAP_INLINE __inline
108 #else
109 #define PMAP_INLINE
110 #endif
111
112 #ifdef PV_STATS
113 #define PV_STAT(x)      do { x ; } while (0)
114 #else
115 #define PV_STAT(x)      do { } while (0)
116 #endif
117
118 /*
119  * Get PDEs and PTEs for user/kernel address space
120  */
121 #define pmap_seg_index(v)       (((v) >> SEGSHIFT) & (NPDEPG - 1))
122 #define pmap_pde_index(v)       (((v) >> PDRSHIFT) & (NPDEPG - 1))
123 #define pmap_pte_index(v)       (((v) >> PAGE_SHIFT) & (NPTEPG - 1))
124 #define pmap_pde_pindex(v)      ((v) >> PDRSHIFT)
125
126 #ifdef __mips_n64
127 #define NUPDE                   (NPDEPG * NPDEPG)
128 #define NUSERPGTBLS             (NUPDE + NPDEPG)
129 #else
130 #define NUPDE                   (NPDEPG)
131 #define NUSERPGTBLS             (NUPDE)
132 #endif
133
134 #define is_kernel_pmap(x)       ((x) == kernel_pmap)
135
136 struct pmap kernel_pmap_store;
137 pd_entry_t *kernel_segmap;
138
139 vm_offset_t virtual_avail;      /* VA of first avail page (after kernel bss) */
140 vm_offset_t virtual_end;        /* VA of last avail page (end of kernel AS) */
141
142 static int need_local_mappings;
143
144 static int nkpt;
145 unsigned pmap_max_asid;         /* max ASID supported by the system */
146
147 #define PMAP_ASID_RESERVED      0
148
149 vm_offset_t kernel_vm_end = VM_MIN_KERNEL_ADDRESS;
150
151 static void pmap_asid_alloc(pmap_t pmap);
152
153 static struct rwlock_padalign pvh_global_lock;
154
155 /*
156  * Data for the pv entry allocation mechanism
157  */
158 static TAILQ_HEAD(pch, pv_chunk) pv_chunks = TAILQ_HEAD_INITIALIZER(pv_chunks);
159 static int pv_entry_count;
160
161 static void free_pv_chunk(struct pv_chunk *pc);
162 static void free_pv_entry(pmap_t pmap, pv_entry_t pv);
163 static pv_entry_t get_pv_entry(pmap_t pmap, boolean_t try);
164 static vm_page_t pmap_pv_reclaim(pmap_t locked_pmap);
165 static void pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va);
166 static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap,
167     vm_offset_t va);
168 static vm_page_t pmap_alloc_direct_page(unsigned int index, int req);
169 static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va,
170     vm_page_t m, vm_prot_t prot, vm_page_t mpte);
171 static void pmap_grow_direct_page(int req);
172 static int pmap_remove_pte(struct pmap *pmap, pt_entry_t *ptq, vm_offset_t va,
173     pd_entry_t pde);
174 static void pmap_remove_page(struct pmap *pmap, vm_offset_t va);
175 static void pmap_remove_entry(struct pmap *pmap, vm_page_t m, vm_offset_t va);
176 static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_page_t mpte,
177     vm_offset_t va, vm_page_t m);
178 static void pmap_update_page(pmap_t pmap, vm_offset_t va, pt_entry_t pte);
179 static void pmap_invalidate_all(pmap_t pmap);
180 static void pmap_invalidate_page(pmap_t pmap, vm_offset_t va);
181 static void _pmap_unwire_ptp(pmap_t pmap, vm_offset_t va, vm_page_t m);
182
183 static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, u_int flags);
184 static vm_page_t _pmap_allocpte(pmap_t pmap, unsigned ptepindex, u_int flags);
185 static int pmap_unuse_pt(pmap_t, vm_offset_t, pd_entry_t);
186 static pt_entry_t init_pte_prot(vm_page_t m, vm_prot_t access, vm_prot_t prot);
187
188 static void pmap_invalidate_page_action(void *arg);
189 static void pmap_invalidate_range_action(void *arg);
190 static void pmap_update_page_action(void *arg);
191
192 #ifndef __mips_n64
193
194 static vm_offset_t crashdumpva;
195
196 /*
197  * These functions are for high memory (memory above 512Meg in 32 bit) support.
198  * The highmem area does not have a KSEG0 mapping, and we need a mechanism to
199  * do temporary per-CPU mappings for pmap_zero_page, pmap_copy_page etc.
200  *
201  * At bootup, we reserve 2 virtual pages per CPU for mapping highmem pages. To
202  * access a highmem physical address on a CPU, we map the physical address to
203  * the reserved virtual address for the CPU in the kernel pagetable.
204  */
205
206 static void
207 pmap_init_reserved_pages(void)
208 {
209         struct pcpu *pc;
210         vm_offset_t pages;
211         int i;
212  
213         if (need_local_mappings == 0)
214                 return;
215
216         CPU_FOREACH(i) {
217                 pc = pcpu_find(i);
218                 /*
219                  * Skip if the mapping has already been initialized,
220                  * i.e. this is the BSP.
221                  */
222                 if (pc->pc_cmap1_addr != 0)
223                         continue;
224                 pages =  kva_alloc(PAGE_SIZE * 3);
225                 if (pages == 0)
226                         panic("%s: unable to allocate KVA", __func__);
227                 pc->pc_cmap1_ptep = pmap_pte(kernel_pmap, pages);
228                 pc->pc_cmap2_ptep = pmap_pte(kernel_pmap, pages + PAGE_SIZE);
229                 pc->pc_qmap_ptep =
230                     pmap_pte(kernel_pmap, pages + (PAGE_SIZE * 2));
231                 pc->pc_cmap1_addr = pages;
232                 pc->pc_cmap2_addr = pages + PAGE_SIZE;
233                 pc->pc_qmap_addr = pages + (PAGE_SIZE * 2);
234         }
235 }
236 SYSINIT(rpages_init, SI_SUB_CPU, SI_ORDER_ANY, pmap_init_reserved_pages, NULL);
237
238 static __inline void
239 pmap_alloc_lmem_map(void)
240 {
241         PCPU_SET(cmap1_addr, virtual_avail);
242         PCPU_SET(cmap2_addr, virtual_avail + PAGE_SIZE);
243         PCPU_SET(cmap1_ptep, pmap_pte(kernel_pmap, virtual_avail));
244         PCPU_SET(cmap2_ptep, pmap_pte(kernel_pmap, virtual_avail + PAGE_SIZE));
245         PCPU_SET(qmap_addr, virtual_avail + (2 * PAGE_SIZE));
246         PCPU_SET(qmap_ptep, pmap_pte(kernel_pmap, virtual_avail + (2 * PAGE_SIZE)));
247         crashdumpva = virtual_avail + (3 * PAGE_SIZE);
248         virtual_avail += PAGE_SIZE * 4;
249 }
250
251 static __inline vm_offset_t
252 pmap_lmem_map1(vm_paddr_t phys)
253 {
254         critical_enter();
255         *PCPU_GET(cmap1_ptep) =
256             TLBLO_PA_TO_PFN(phys) | PTE_C_CACHE | PTE_D | PTE_V | PTE_G;
257         return (PCPU_GET(cmap1_addr));
258 }
259
260 static __inline vm_offset_t
261 pmap_lmem_map2(vm_paddr_t phys1, vm_paddr_t phys2)
262 {
263         critical_enter();
264         *PCPU_GET(cmap1_ptep) =
265             TLBLO_PA_TO_PFN(phys1) | PTE_C_CACHE | PTE_D | PTE_V | PTE_G;
266         *PCPU_GET(cmap2_ptep) =
267             TLBLO_PA_TO_PFN(phys2) | PTE_C_CACHE | PTE_D | PTE_V | PTE_G;
268         return (PCPU_GET(cmap1_addr));
269 }
270
271 static __inline void
272 pmap_lmem_unmap(void)
273 {
274          *PCPU_GET(cmap1_ptep) = PTE_G;
275         tlb_invalidate_address(kernel_pmap, PCPU_GET(cmap1_addr));
276         if (*PCPU_GET(cmap2_ptep) != PTE_G) {
277                 *PCPU_GET(cmap2_ptep) = PTE_G;
278                 tlb_invalidate_address(kernel_pmap, PCPU_GET(cmap2_addr));
279         }
280         critical_exit();
281 }
282
283 #else  /* __mips_n64 */
284
285 static __inline void
286 pmap_alloc_lmem_map(void)
287 {
288 }
289
290 static __inline vm_offset_t
291 pmap_lmem_map1(vm_paddr_t phys)
292 {
293
294         return (0);
295 }
296
297 static __inline vm_offset_t
298 pmap_lmem_map2(vm_paddr_t phys1, vm_paddr_t phys2)
299 {
300
301         return (0);
302 }
303
304 static __inline vm_offset_t
305 pmap_lmem_unmap(void)
306 {
307
308         return (0);
309 }
310 #endif /* !__mips_n64 */
311
312 static __inline int
313 pmap_pte_cache_bits(vm_paddr_t pa, vm_page_t m)
314 {
315         vm_memattr_t ma;
316
317         ma = pmap_page_get_memattr(m);
318         if (ma == VM_MEMATTR_WRITE_BACK && !is_cacheable_mem(pa))
319                 ma = VM_MEMATTR_UNCACHEABLE;
320         return PTE_C(ma);
321 }
322 #define PMAP_PTE_SET_CACHE_BITS(pte, pa, m) {   \
323         pte &= ~PTE_C_MASK;                     \
324         pte |= pmap_pte_cache_bits(pa, m);      \
325 }
326
327 /*
328  * Page table entry lookup routines.
329  */
330 static __inline pd_entry_t *
331 pmap_segmap(pmap_t pmap, vm_offset_t va)
332 {
333
334         return (&pmap->pm_segtab[pmap_seg_index(va)]);
335 }
336
337 #ifdef __mips_n64
338 static __inline pd_entry_t *
339 pmap_pdpe_to_pde(pd_entry_t *pdpe, vm_offset_t va)
340 {
341         pd_entry_t *pde;
342
343         pde = (pd_entry_t *)*pdpe;
344         return (&pde[pmap_pde_index(va)]);
345 }
346
347 static __inline pd_entry_t *
348 pmap_pde(pmap_t pmap, vm_offset_t va)
349 {
350         pd_entry_t *pdpe;
351
352         pdpe = pmap_segmap(pmap, va);
353         if (*pdpe == NULL)
354                 return (NULL);
355
356         return (pmap_pdpe_to_pde(pdpe, va));
357 }
358 #else
359 static __inline pd_entry_t *
360 pmap_pdpe_to_pde(pd_entry_t *pdpe, vm_offset_t va)
361 {
362
363         return (pdpe);
364 }
365
366 static __inline
367 pd_entry_t *pmap_pde(pmap_t pmap, vm_offset_t va)
368 {
369
370         return (pmap_segmap(pmap, va));
371 }
372 #endif
373
374 static __inline pt_entry_t *
375 pmap_pde_to_pte(pd_entry_t *pde, vm_offset_t va)
376 {
377         pt_entry_t *pte;
378
379         pte = (pt_entry_t *)*pde;
380         return (&pte[pmap_pte_index(va)]);
381 }
382
383 pt_entry_t *
384 pmap_pte(pmap_t pmap, vm_offset_t va)
385 {
386         pd_entry_t *pde;
387
388         pde = pmap_pde(pmap, va);
389         if (pde == NULL || *pde == NULL)
390                 return (NULL);
391
392         return (pmap_pde_to_pte(pde, va));
393 }
394
395 vm_offset_t
396 pmap_steal_memory(vm_size_t size)
397 {
398         vm_paddr_t bank_size, pa;
399         vm_offset_t va;
400
401         size = round_page(size);
402         bank_size = phys_avail[1] - phys_avail[0];
403         while (size > bank_size) {
404                 int i;
405
406                 for (i = 0; phys_avail[i + 2]; i += 2) {
407                         phys_avail[i] = phys_avail[i + 2];
408                         phys_avail[i + 1] = phys_avail[i + 3];
409                 }
410                 phys_avail[i] = 0;
411                 phys_avail[i + 1] = 0;
412                 if (!phys_avail[0])
413                         panic("pmap_steal_memory: out of memory");
414                 bank_size = phys_avail[1] - phys_avail[0];
415         }
416
417         pa = phys_avail[0];
418         phys_avail[0] += size;
419         if (MIPS_DIRECT_MAPPABLE(pa) == 0)
420                 panic("Out of memory below 512Meg?");
421         va = MIPS_PHYS_TO_DIRECT(pa);
422         bzero((caddr_t)va, size);
423         return (va);
424 }
425
426 /*
427  * Bootstrap the system enough to run with virtual memory.  This
428  * assumes that the phys_avail array has been initialized.
429  */
430 static void
431 pmap_create_kernel_pagetable(void)
432 {
433         int i, j;
434         vm_offset_t ptaddr;
435         pt_entry_t *pte;
436 #ifdef __mips_n64
437         pd_entry_t *pde;
438         vm_offset_t pdaddr;
439         int npt, npde;
440 #endif
441
442         /*
443          * Allocate segment table for the kernel
444          */
445         kernel_segmap = (pd_entry_t *)pmap_steal_memory(PAGE_SIZE);
446
447         /*
448          * Allocate second level page tables for the kernel
449          */
450 #ifdef __mips_n64
451         npde = howmany(NKPT, NPDEPG);
452         pdaddr = pmap_steal_memory(PAGE_SIZE * npde);
453 #endif
454         nkpt = NKPT;
455         ptaddr = pmap_steal_memory(PAGE_SIZE * nkpt);
456
457         /*
458          * The R[4-7]?00 stores only one copy of the Global bit in the
459          * translation lookaside buffer for each 2 page entry. Thus invalid
460          * entrys must have the Global bit set so when Entry LO and Entry HI
461          * G bits are anded together they will produce a global bit to store
462          * in the tlb.
463          */
464         for (i = 0, pte = (pt_entry_t *)ptaddr; i < (nkpt * NPTEPG); i++, pte++)
465                 *pte = PTE_G;
466
467 #ifdef __mips_n64
468         for (i = 0,  npt = nkpt; npt > 0; i++) {
469                 kernel_segmap[i] = (pd_entry_t)(pdaddr + i * PAGE_SIZE);
470                 pde = (pd_entry_t *)kernel_segmap[i];
471
472                 for (j = 0; j < NPDEPG && npt > 0; j++, npt--)
473                         pde[j] = (pd_entry_t)(ptaddr + (i * NPDEPG + j) * PAGE_SIZE);
474         }
475 #else
476         for (i = 0, j = pmap_seg_index(VM_MIN_KERNEL_ADDRESS); i < nkpt; i++, j++)
477                 kernel_segmap[j] = (pd_entry_t)(ptaddr + (i * PAGE_SIZE));
478 #endif
479
480         PMAP_LOCK_INIT(kernel_pmap);
481         kernel_pmap->pm_segtab = kernel_segmap;
482         CPU_FILL(&kernel_pmap->pm_active);
483         TAILQ_INIT(&kernel_pmap->pm_pvchunk);
484         kernel_pmap->pm_asid[0].asid = PMAP_ASID_RESERVED;
485         kernel_pmap->pm_asid[0].gen = 0;
486         kernel_vm_end += nkpt * NPTEPG * PAGE_SIZE;
487 }
488
489 void
490 pmap_bootstrap(void)
491 {
492         int i;
493
494         /* Sort. */
495 again:
496         for (i = 0; phys_avail[i + 1] != 0; i += 2) {
497                 /*
498                  * Keep the memory aligned on page boundary.
499                  */
500                 phys_avail[i] = round_page(phys_avail[i]);
501                 phys_avail[i + 1] = trunc_page(phys_avail[i + 1]);
502
503                 if (i < 2)
504                         continue;
505                 if (phys_avail[i - 2] > phys_avail[i]) {
506                         vm_paddr_t ptemp[2];
507
508                         ptemp[0] = phys_avail[i + 0];
509                         ptemp[1] = phys_avail[i + 1];
510
511                         phys_avail[i + 0] = phys_avail[i - 2];
512                         phys_avail[i + 1] = phys_avail[i - 1];
513
514                         phys_avail[i - 2] = ptemp[0];
515                         phys_avail[i - 1] = ptemp[1];
516                         goto again;
517                 }
518         }
519
520         /*
521          * In 32 bit, we may have memory which cannot be mapped directly.
522          * This memory will need temporary mapping before it can be
523          * accessed.
524          */
525         if (!MIPS_DIRECT_MAPPABLE(phys_avail[i - 1] - 1))
526                 need_local_mappings = 1;
527
528         /*
529          * Copy the phys_avail[] array before we start stealing memory from it.
530          */
531         for (i = 0; phys_avail[i + 1] != 0; i += 2) {
532                 physmem_desc[i] = phys_avail[i];
533                 physmem_desc[i + 1] = phys_avail[i + 1];
534         }
535
536         Maxmem = atop(phys_avail[i - 1]);
537
538         if (bootverbose) {
539                 printf("Physical memory chunk(s):\n");
540                 for (i = 0; phys_avail[i + 1] != 0; i += 2) {
541                         vm_paddr_t size;
542
543                         size = phys_avail[i + 1] - phys_avail[i];
544                         printf("%#08jx - %#08jx, %ju bytes (%ju pages)\n",
545                             (uintmax_t) phys_avail[i],
546                             (uintmax_t) phys_avail[i + 1] - 1,
547                             (uintmax_t) size, (uintmax_t) size / PAGE_SIZE);
548                 }
549                 printf("Maxmem is 0x%0jx\n", ptoa((uintmax_t)Maxmem));
550         }
551         /*
552          * Steal the message buffer from the beginning of memory.
553          */
554         msgbufp = (struct msgbuf *)pmap_steal_memory(msgbufsize);
555         msgbufinit(msgbufp, msgbufsize);
556
557         /*
558          * Steal thread0 kstack.
559          */
560         kstack0 = pmap_steal_memory(KSTACK_PAGES << PAGE_SHIFT);
561
562         virtual_avail = VM_MIN_KERNEL_ADDRESS;
563         virtual_end = VM_MAX_KERNEL_ADDRESS;
564
565 #ifdef SMP
566         /*
567          * Steal some virtual address space to map the pcpu area.
568          */
569         virtual_avail = roundup2(virtual_avail, PAGE_SIZE * 2);
570         pcpup = (struct pcpu *)virtual_avail;
571         virtual_avail += PAGE_SIZE * 2;
572
573         /*
574          * Initialize the wired TLB entry mapping the pcpu region for
575          * the BSP at 'pcpup'. Up until this point we were operating
576          * with the 'pcpup' for the BSP pointing to a virtual address
577          * in KSEG0 so there was no need for a TLB mapping.
578          */
579         mips_pcpu_tlb_init(PCPU_ADDR(0));
580
581         if (bootverbose)
582                 printf("pcpu is available at virtual address %p.\n", pcpup);
583 #endif
584
585         pmap_create_kernel_pagetable();
586         if (need_local_mappings)
587                 pmap_alloc_lmem_map();
588         pmap_max_asid = VMNUM_PIDS;
589         mips_wr_entryhi(0);
590         mips_wr_pagemask(0);
591
592         /*
593          * Initialize the global pv list lock.
594          */
595         rw_init(&pvh_global_lock, "pmap pv global");
596 }
597
598 /*
599  * Initialize a vm_page's machine-dependent fields.
600  */
601 void
602 pmap_page_init(vm_page_t m)
603 {
604
605         TAILQ_INIT(&m->md.pv_list);
606         m->md.pv_flags = VM_MEMATTR_DEFAULT << PV_MEMATTR_SHIFT;
607 }
608
609 /*
610  *      Initialize the pmap module.
611  *      Called by vm_init, to initialize any structures that the pmap
612  *      system needs to map virtual memory.
613  */
614 void
615 pmap_init(void)
616 {
617 }
618
619 /***************************************************
620  * Low level helper routines.....
621  ***************************************************/
622
623 #ifdef  SMP
624 static __inline void
625 pmap_call_on_active_cpus(pmap_t pmap, void (*fn)(void *), void *arg)
626 {
627         int     cpuid, cpu, self;
628         cpuset_t active_cpus;
629
630         sched_pin();
631         if (is_kernel_pmap(pmap)) {
632                 smp_rendezvous(NULL, fn, NULL, arg);
633                 goto out;
634         }
635         /* Force ASID update on inactive CPUs */
636         CPU_FOREACH(cpu) {
637                 if (!CPU_ISSET(cpu, &pmap->pm_active))
638                         pmap->pm_asid[cpu].gen = 0;
639         }
640         cpuid = PCPU_GET(cpuid);
641         /*
642          * XXX: barrier/locking for active?
643          *
644          * Take a snapshot of active here, any further changes are ignored.
645          * tlb update/invalidate should be harmless on inactive CPUs
646          */
647         active_cpus = pmap->pm_active;
648         self = CPU_ISSET(cpuid, &active_cpus);
649         CPU_CLR(cpuid, &active_cpus);
650         /* Optimize for the case where this cpu is the only active one */
651         if (CPU_EMPTY(&active_cpus)) {
652                 if (self)
653                         fn(arg);
654         } else {
655                 if (self)
656                         CPU_SET(cpuid, &active_cpus);
657                 smp_rendezvous_cpus(active_cpus, NULL, fn, NULL, arg);
658         }
659 out:
660         sched_unpin();
661 }
662 #else /* !SMP */
663 static __inline void
664 pmap_call_on_active_cpus(pmap_t pmap, void (*fn)(void *), void *arg)
665 {
666         int     cpuid;
667
668         if (is_kernel_pmap(pmap)) {
669                 fn(arg);
670                 return;
671         }
672         cpuid = PCPU_GET(cpuid);
673         if (!CPU_ISSET(cpuid, &pmap->pm_active))
674                 pmap->pm_asid[cpuid].gen = 0;
675         else
676                 fn(arg);
677 }
678 #endif /* SMP */
679
680 static void
681 pmap_invalidate_all(pmap_t pmap)
682 {
683
684         pmap_call_on_active_cpus(pmap,
685             (void (*)(void *))tlb_invalidate_all_user, pmap);
686 }
687
688 struct pmap_invalidate_page_arg {
689         pmap_t pmap;
690         vm_offset_t va;
691 };
692
693 static void
694 pmap_invalidate_page_action(void *arg)
695 {
696         struct pmap_invalidate_page_arg *p = arg;
697
698         tlb_invalidate_address(p->pmap, p->va);
699 }
700
701 static void
702 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
703 {
704         struct pmap_invalidate_page_arg arg;
705
706         arg.pmap = pmap;
707         arg.va = va;
708         pmap_call_on_active_cpus(pmap, pmap_invalidate_page_action, &arg);
709 }
710
711 struct pmap_invalidate_range_arg {
712         pmap_t pmap;
713         vm_offset_t sva;
714         vm_offset_t eva;
715 };
716
717 static void
718 pmap_invalidate_range_action(void *arg)
719 {
720         struct pmap_invalidate_range_arg *p = arg;
721
722         tlb_invalidate_range(p->pmap, p->sva, p->eva);
723 }
724
725 static void
726 pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
727 {
728         struct pmap_invalidate_range_arg arg;
729
730         arg.pmap = pmap;
731         arg.sva = sva;
732         arg.eva = eva;
733         pmap_call_on_active_cpus(pmap, pmap_invalidate_range_action, &arg);
734 }
735
736 struct pmap_update_page_arg {
737         pmap_t pmap;
738         vm_offset_t va;
739         pt_entry_t pte;
740 };
741
742 static void
743 pmap_update_page_action(void *arg)
744 {
745         struct pmap_update_page_arg *p = arg;
746
747         tlb_update(p->pmap, p->va, p->pte);
748 }
749
750 static void
751 pmap_update_page(pmap_t pmap, vm_offset_t va, pt_entry_t pte)
752 {
753         struct pmap_update_page_arg arg;
754
755         arg.pmap = pmap;
756         arg.va = va;
757         arg.pte = pte;
758         pmap_call_on_active_cpus(pmap, pmap_update_page_action, &arg);
759 }
760
761 /*
762  *      Routine:        pmap_extract
763  *      Function:
764  *              Extract the physical page address associated
765  *              with the given map/virtual_address pair.
766  */
767 vm_paddr_t
768 pmap_extract(pmap_t pmap, vm_offset_t va)
769 {
770         pt_entry_t *pte;
771         vm_offset_t retval = 0;
772
773         PMAP_LOCK(pmap);
774         pte = pmap_pte(pmap, va);
775         if (pte) {
776                 retval = TLBLO_PTE_TO_PA(*pte) | (va & PAGE_MASK);
777         }
778         PMAP_UNLOCK(pmap);
779         return (retval);
780 }
781
782 /*
783  *      Routine:        pmap_extract_and_hold
784  *      Function:
785  *              Atomically extract and hold the physical page
786  *              with the given pmap and virtual address pair
787  *              if that mapping permits the given protection.
788  */
789 vm_page_t
790 pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
791 {
792         pt_entry_t pte, *ptep;
793         vm_paddr_t pa;
794         vm_page_t m;
795
796         m = NULL;
797         PMAP_LOCK(pmap);
798         ptep = pmap_pte(pmap, va);
799         if (ptep != NULL) {
800                 pte = *ptep;
801                 if (pte_test(&pte, PTE_V) && (!pte_test(&pte, PTE_RO) ||
802                     (prot & VM_PROT_WRITE) == 0)) {
803                         pa = TLBLO_PTE_TO_PA(pte);
804                         m = PHYS_TO_VM_PAGE(pa);
805                         if (!vm_page_wire_mapped(m))
806                                 m = NULL;
807                 }
808         }
809         PMAP_UNLOCK(pmap);
810         return (m);
811 }
812
813 /***************************************************
814  * Low level mapping routines.....
815  ***************************************************/
816
817 /*
818  * add a wired page to the kva
819  */
820 void
821 pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, vm_memattr_t ma)
822 {
823         pt_entry_t *pte;
824         pt_entry_t opte, npte;
825
826 #ifdef PMAP_DEBUG
827         printf("pmap_kenter:  va: %p -> pa: %p\n", (void *)va, (void *)pa);
828 #endif
829
830         pte = pmap_pte(kernel_pmap, va);
831         opte = *pte;
832         npte = TLBLO_PA_TO_PFN(pa) | PTE_C(ma) | PTE_D | PTE_V | PTE_G;
833         *pte = npte;
834         if (pte_test(&opte, PTE_V) && opte != npte)
835                 pmap_update_page(kernel_pmap, va, npte);
836 }
837
838 void
839 pmap_kenter(vm_offset_t va, vm_paddr_t pa)
840 {
841
842         KASSERT(is_cacheable_mem(pa),
843                 ("pmap_kenter: memory at 0x%lx is not cacheable", (u_long)pa));
844
845         pmap_kenter_attr(va, pa, VM_MEMATTR_DEFAULT);
846 }
847
848 void
849 pmap_kenter_device(vm_offset_t va, vm_size_t size, vm_paddr_t pa)
850 {
851
852         KASSERT((size & PAGE_MASK) == 0,
853             ("%s: device mapping not page-sized", __func__));
854
855         for (; size > 0; size -= PAGE_SIZE) {
856                 /*
857                  * XXXCEM: this is somewhat inefficient on SMP systems in that
858                  * every single page is individually TLB-invalidated via
859                  * rendezvous (pmap_update_page()), instead of invalidating the
860                  * entire range via a single rendezvous.
861                  */
862                 pmap_kenter_attr(va, pa, VM_MEMATTR_UNCACHEABLE);
863                 va += PAGE_SIZE;
864                 pa += PAGE_SIZE;
865         }
866 }
867
868 void
869 pmap_kremove_device(vm_offset_t va, vm_size_t size)
870 {
871
872         KASSERT((size & PAGE_MASK) == 0,
873             ("%s: device mapping not page-sized", __func__));
874
875         /*
876          * XXXCEM: Similar to pmap_kenter_device, this is inefficient on SMP,
877          * in that pages are invalidated individually instead of a single range
878          * rendezvous.
879          */
880         for (; size > 0; size -= PAGE_SIZE) {
881                 pmap_kremove(va);
882                 va += PAGE_SIZE;
883         }
884 }
885
886 /*
887  * remove a page from the kernel pagetables
888  */
889  /* PMAP_INLINE */ void
890 pmap_kremove(vm_offset_t va)
891 {
892         pt_entry_t *pte;
893
894         /*
895          * Write back all caches from the page being destroyed
896          */
897         mips_dcache_wbinv_range_index(va, PAGE_SIZE);
898
899         pte = pmap_pte(kernel_pmap, va);
900         *pte = PTE_G;
901         pmap_invalidate_page(kernel_pmap, va);
902 }
903
904 /*
905  *      Used to map a range of physical addresses into kernel
906  *      virtual address space.
907  *
908  *      The value passed in '*virt' is a suggested virtual address for
909  *      the mapping. Architectures which can support a direct-mapped
910  *      physical to virtual region can return the appropriate address
911  *      within that region, leaving '*virt' unchanged. Other
912  *      architectures should map the pages starting at '*virt' and
913  *      update '*virt' with the first usable address after the mapped
914  *      region.
915  *
916  *      Use XKPHYS for 64 bit, and KSEG0 where possible for 32 bit.
917  */
918 vm_offset_t
919 pmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end, int prot)
920 {
921         vm_offset_t va, sva;
922
923         if (MIPS_DIRECT_MAPPABLE(end - 1))
924                 return (MIPS_PHYS_TO_DIRECT(start));
925
926         va = sva = *virt;
927         while (start < end) {
928                 pmap_kenter(va, start);
929                 va += PAGE_SIZE;
930                 start += PAGE_SIZE;
931         }
932         *virt = va;
933         return (sva);
934 }
935
936 /*
937  * Add a list of wired pages to the kva
938  * this routine is only used for temporary
939  * kernel mappings that do not need to have
940  * page modification or references recorded.
941  * Note that old mappings are simply written
942  * over.  The page *must* be wired.
943  */
944 void
945 pmap_qenter(vm_offset_t va, vm_page_t *m, int count)
946 {
947         int i;
948         vm_offset_t origva = va;
949
950         for (i = 0; i < count; i++) {
951                 pmap_flush_pvcache(m[i]);
952                 pmap_kenter(va, VM_PAGE_TO_PHYS(m[i]));
953                 va += PAGE_SIZE;
954         }
955
956         mips_dcache_wbinv_range_index(origva, PAGE_SIZE*count);
957 }
958
959 /*
960  * this routine jerks page mappings from the
961  * kernel -- it is meant only for temporary mappings.
962  */
963 void
964 pmap_qremove(vm_offset_t va, int count)
965 {
966         pt_entry_t *pte;
967         vm_offset_t origva;
968
969         if (count < 1)
970                 return;
971         mips_dcache_wbinv_range_index(va, PAGE_SIZE * count);
972         origva = va;
973         do {
974                 pte = pmap_pte(kernel_pmap, va);
975                 *pte = PTE_G;
976                 va += PAGE_SIZE;
977         } while (--count > 0);
978         pmap_invalidate_range(kernel_pmap, origva, va);
979 }
980
981 /***************************************************
982  * Page table page management routines.....
983  ***************************************************/
984
985 /*
986  * Decrements a page table page's reference count, which is used to record the
987  * number of valid page table entries within the page.  If the reference count
988  * drops to zero, then the page table page is unmapped.  Returns TRUE if the
989  * page table page was unmapped and FALSE otherwise.
990  */
991 static PMAP_INLINE boolean_t
992 pmap_unwire_ptp(pmap_t pmap, vm_offset_t va, vm_page_t m)
993 {
994
995         --m->ref_count;
996         if (m->ref_count == 0) {
997                 _pmap_unwire_ptp(pmap, va, m);
998                 return (TRUE);
999         } else
1000                 return (FALSE);
1001 }
1002
1003 static void
1004 _pmap_unwire_ptp(pmap_t pmap, vm_offset_t va, vm_page_t m)
1005 {
1006         pd_entry_t *pde;
1007         vm_offset_t sva, eva;
1008
1009         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1010         /*
1011          * unmap the page table page
1012          */
1013 #ifdef __mips_n64
1014         if (m->pindex < NUPDE) {
1015                 pde = pmap_pde(pmap, va);
1016                 sva = va & ~PDRMASK;
1017                 eva = sva + NBPDR;
1018         } else {
1019                 pde = pmap_segmap(pmap, va);
1020                 sva = va & ~SEGMASK;
1021                 eva = sva + NBSEG;
1022         }
1023 #else
1024         pde = pmap_pde(pmap, va);
1025         sva = va & ~SEGMASK;
1026         eva = sva + NBSEG;
1027 #endif
1028         *pde = 0;
1029         pmap->pm_stats.resident_count--;
1030
1031 #ifdef __mips_n64
1032         if (m->pindex < NUPDE) {
1033                 pd_entry_t *pdp;
1034                 vm_page_t pdpg;
1035
1036                 /*
1037                  * Recursively decrement next level pagetable refcount.
1038                  * Either that shoots down a larger range from TLBs (below)
1039                  * or we're to shoot down just the page in question.
1040                  */
1041                 pdp = (pd_entry_t *)*pmap_segmap(pmap, va);
1042                 pdpg = PHYS_TO_VM_PAGE(MIPS_DIRECT_TO_PHYS(pdp));
1043                 if (!pmap_unwire_ptp(pmap, va, pdpg)) {
1044                         pmap_invalidate_range(pmap, sva, eva);
1045                 }
1046         } else {
1047                 /* Segmap entry shootdown */
1048                 pmap_invalidate_range(pmap, sva, eva);
1049         }
1050 #else
1051         /* Segmap entry shootdown */
1052         pmap_invalidate_range(pmap, sva, eva);
1053 #endif
1054
1055         /*
1056          * If the page is finally unwired, simply free it.
1057          */
1058         vm_page_free_zero(m);
1059         vm_wire_sub(1);
1060 }
1061
1062 /*
1063  * After removing a page table entry, this routine is used to
1064  * conditionally free the page, and manage the reference count.
1065  */
1066 static int
1067 pmap_unuse_pt(pmap_t pmap, vm_offset_t va, pd_entry_t pde)
1068 {
1069         vm_page_t mpte;
1070
1071         if (va >= VM_MAXUSER_ADDRESS)
1072                 return (0);
1073         KASSERT(pde != 0, ("pmap_unuse_pt: pde != 0"));
1074         mpte = PHYS_TO_VM_PAGE(MIPS_DIRECT_TO_PHYS(pde));
1075         return (pmap_unwire_ptp(pmap, va, mpte));
1076 }
1077
1078 void
1079 pmap_pinit0(pmap_t pmap)
1080 {
1081         int i;
1082
1083         PMAP_LOCK_INIT(pmap);
1084         pmap->pm_segtab = kernel_segmap;
1085         CPU_ZERO(&pmap->pm_active);
1086         for (i = 0; i < MAXCPU; i++) {
1087                 pmap->pm_asid[i].asid = PMAP_ASID_RESERVED;
1088                 pmap->pm_asid[i].gen = 0;
1089         }
1090         PCPU_SET(curpmap, pmap);
1091         TAILQ_INIT(&pmap->pm_pvchunk);
1092         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
1093 }
1094
1095 static void
1096 pmap_grow_direct_page(int req)
1097 {
1098
1099 #ifdef __mips_n64
1100         vm_wait(NULL);
1101 #else
1102         if (!vm_page_reclaim_contig(req, 1, 0, MIPS_KSEG0_LARGEST_PHYS,
1103             PAGE_SIZE, 0))
1104                 vm_wait(NULL);
1105 #endif
1106 }
1107
1108 static vm_page_t
1109 pmap_alloc_direct_page(unsigned int index, int req)
1110 {
1111         vm_page_t m;
1112
1113         m = vm_page_alloc_freelist(VM_FREELIST_DIRECT, req | VM_ALLOC_WIRED |
1114             VM_ALLOC_ZERO);
1115         if (m == NULL)
1116                 return (NULL);
1117
1118         if ((m->flags & PG_ZERO) == 0)
1119                 pmap_zero_page(m);
1120
1121         m->pindex = index;
1122         return (m);
1123 }
1124
1125 /*
1126  * Initialize a preallocated and zeroed pmap structure,
1127  * such as one in a vmspace structure.
1128  */
1129 int
1130 pmap_pinit(pmap_t pmap)
1131 {
1132         vm_offset_t ptdva;
1133         vm_page_t ptdpg;
1134         int i, req_class;
1135
1136         /*
1137          * allocate the page directory page
1138          */
1139         req_class = VM_ALLOC_NORMAL;
1140         while ((ptdpg = pmap_alloc_direct_page(NUSERPGTBLS, req_class)) ==
1141             NULL)
1142                 pmap_grow_direct_page(req_class);
1143
1144         ptdva = MIPS_PHYS_TO_DIRECT(VM_PAGE_TO_PHYS(ptdpg));
1145         pmap->pm_segtab = (pd_entry_t *)ptdva;
1146         CPU_ZERO(&pmap->pm_active);
1147         for (i = 0; i < MAXCPU; i++) {
1148                 pmap->pm_asid[i].asid = PMAP_ASID_RESERVED;
1149                 pmap->pm_asid[i].gen = 0;
1150         }
1151         TAILQ_INIT(&pmap->pm_pvchunk);
1152         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
1153
1154         return (1);
1155 }
1156
1157 /*
1158  * this routine is called if the page table page is not
1159  * mapped correctly.
1160  */
1161 static vm_page_t
1162 _pmap_allocpte(pmap_t pmap, unsigned ptepindex, u_int flags)
1163 {
1164         vm_offset_t pageva;
1165         vm_page_t m;
1166         int req_class;
1167
1168         /*
1169          * Find or fabricate a new pagetable page
1170          */
1171         req_class = VM_ALLOC_NORMAL;
1172         if ((m = pmap_alloc_direct_page(ptepindex, req_class)) == NULL) {
1173                 if ((flags & PMAP_ENTER_NOSLEEP) == 0) {
1174                         PMAP_UNLOCK(pmap);
1175                         rw_wunlock(&pvh_global_lock);
1176                         pmap_grow_direct_page(req_class);
1177                         rw_wlock(&pvh_global_lock);
1178                         PMAP_LOCK(pmap);
1179                 }
1180
1181                 /*
1182                  * Indicate the need to retry.  While waiting, the page
1183                  * table page may have been allocated.
1184                  */
1185                 return (NULL);
1186         }
1187
1188         /*
1189          * Map the pagetable page into the process address space, if it
1190          * isn't already there.
1191          */
1192         pageva = MIPS_PHYS_TO_DIRECT(VM_PAGE_TO_PHYS(m));
1193
1194 #ifdef __mips_n64
1195         if (ptepindex >= NUPDE) {
1196                 pmap->pm_segtab[ptepindex - NUPDE] = (pd_entry_t)pageva;
1197         } else {
1198                 pd_entry_t *pdep, *pde;
1199                 int segindex = ptepindex >> (SEGSHIFT - PDRSHIFT);
1200                 int pdeindex = ptepindex & (NPDEPG - 1);
1201                 vm_page_t pg;
1202
1203                 pdep = &pmap->pm_segtab[segindex];
1204                 if (*pdep == NULL) {
1205                         /* recurse for allocating page dir */
1206                         if (_pmap_allocpte(pmap, NUPDE + segindex,
1207                             flags) == NULL) {
1208                                 /* alloc failed, release current */
1209                                 vm_page_unwire_noq(m);
1210                                 vm_page_free_zero(m);
1211                                 return (NULL);
1212                         }
1213                 } else {
1214                         pg = PHYS_TO_VM_PAGE(MIPS_DIRECT_TO_PHYS(*pdep));
1215                         pg->ref_count++;
1216                 }
1217                 /* Next level entry */
1218                 pde = (pd_entry_t *)*pdep;
1219                 pde[pdeindex] = (pd_entry_t)pageva;
1220         }
1221 #else
1222         pmap->pm_segtab[ptepindex] = (pd_entry_t)pageva;
1223 #endif
1224         pmap->pm_stats.resident_count++;
1225         return (m);
1226 }
1227
1228 static vm_page_t
1229 pmap_allocpte(pmap_t pmap, vm_offset_t va, u_int flags)
1230 {
1231         unsigned ptepindex;
1232         pd_entry_t *pde;
1233         vm_page_t m;
1234
1235         /*
1236          * Calculate pagetable page index
1237          */
1238         ptepindex = pmap_pde_pindex(va);
1239 retry:
1240         /*
1241          * Get the page directory entry
1242          */
1243         pde = pmap_pde(pmap, va);
1244
1245         /*
1246          * If the page table page is mapped, we just increment the hold
1247          * count, and activate it.
1248          */
1249         if (pde != NULL && *pde != NULL) {
1250                 m = PHYS_TO_VM_PAGE(MIPS_DIRECT_TO_PHYS(*pde));
1251                 m->ref_count++;
1252         } else {
1253                 /*
1254                  * Here if the pte page isn't mapped, or if it has been
1255                  * deallocated.
1256                  */
1257                 m = _pmap_allocpte(pmap, ptepindex, flags);
1258                 if (m == NULL && (flags & PMAP_ENTER_NOSLEEP) == 0)
1259                         goto retry;
1260         }
1261         return (m);
1262 }
1263
1264
1265 /***************************************************
1266  * Pmap allocation/deallocation routines.
1267  ***************************************************/
1268
1269 /*
1270  * Release any resources held by the given physical map.
1271  * Called when a pmap initialized by pmap_pinit is being released.
1272  * Should only be called if the map contains no valid mappings.
1273  */
1274 void
1275 pmap_release(pmap_t pmap)
1276 {
1277         vm_offset_t ptdva;
1278         vm_page_t ptdpg;
1279
1280         KASSERT(pmap->pm_stats.resident_count == 0,
1281             ("pmap_release: pmap resident count %ld != 0",
1282             pmap->pm_stats.resident_count));
1283
1284         ptdva = (vm_offset_t)pmap->pm_segtab;
1285         ptdpg = PHYS_TO_VM_PAGE(MIPS_DIRECT_TO_PHYS(ptdva));
1286
1287         vm_page_unwire_noq(ptdpg);
1288         vm_page_free_zero(ptdpg);
1289 }
1290
1291 /*
1292  * grow the number of kernel page table entries, if needed
1293  */
1294 void
1295 pmap_growkernel(vm_offset_t addr)
1296 {
1297         vm_page_t nkpg;
1298         pd_entry_t *pde, *pdpe;
1299         pt_entry_t *pte;
1300         int i, req_class;
1301
1302         mtx_assert(&kernel_map->system_mtx, MA_OWNED);
1303         req_class = VM_ALLOC_INTERRUPT;
1304         addr = roundup2(addr, NBSEG);
1305         if (addr - 1 >= vm_map_max(kernel_map))
1306                 addr = vm_map_max(kernel_map);
1307         while (kernel_vm_end < addr) {
1308                 pdpe = pmap_segmap(kernel_pmap, kernel_vm_end);
1309 #ifdef __mips_n64
1310                 if (*pdpe == 0) {
1311                         /* new intermediate page table entry */
1312                         nkpg = pmap_alloc_direct_page(nkpt, req_class);
1313                         if (nkpg == NULL)
1314                                 panic("pmap_growkernel: no memory to grow kernel");
1315                         *pdpe = (pd_entry_t)MIPS_PHYS_TO_DIRECT(VM_PAGE_TO_PHYS(nkpg));
1316                         continue; /* try again */
1317                 }
1318 #endif
1319                 pde = pmap_pdpe_to_pde(pdpe, kernel_vm_end);
1320                 if (*pde != 0) {
1321                         kernel_vm_end = (kernel_vm_end + NBPDR) & ~PDRMASK;
1322                         if (kernel_vm_end - 1 >= vm_map_max(kernel_map)) {
1323                                 kernel_vm_end = vm_map_max(kernel_map);
1324                                 break;
1325                         }
1326                         continue;
1327                 }
1328
1329                 /*
1330                  * This index is bogus, but out of the way
1331                  */
1332                 nkpg = pmap_alloc_direct_page(nkpt, req_class);
1333 #ifndef __mips_n64
1334                 if (nkpg == NULL && vm_page_reclaim_contig(req_class, 1,
1335                     0, MIPS_KSEG0_LARGEST_PHYS, PAGE_SIZE, 0))
1336                         nkpg = pmap_alloc_direct_page(nkpt, req_class);
1337 #endif
1338                 if (nkpg == NULL)
1339                         panic("pmap_growkernel: no memory to grow kernel");
1340                 nkpt++;
1341                 *pde = (pd_entry_t)MIPS_PHYS_TO_DIRECT(VM_PAGE_TO_PHYS(nkpg));
1342
1343                 /*
1344                  * The R[4-7]?00 stores only one copy of the Global bit in
1345                  * the translation lookaside buffer for each 2 page entry.
1346                  * Thus invalid entrys must have the Global bit set so when
1347                  * Entry LO and Entry HI G bits are anded together they will
1348                  * produce a global bit to store in the tlb.
1349                  */
1350                 pte = (pt_entry_t *)*pde;
1351                 for (i = 0; i < NPTEPG; i++)
1352                         pte[i] = PTE_G;
1353
1354                 kernel_vm_end = (kernel_vm_end + NBPDR) & ~PDRMASK;
1355                 if (kernel_vm_end - 1 >= vm_map_max(kernel_map)) {
1356                         kernel_vm_end = vm_map_max(kernel_map);
1357                         break;
1358                 }
1359         }
1360 }
1361
1362 /***************************************************
1363  * page management routines.
1364  ***************************************************/
1365
1366 CTASSERT(sizeof(struct pv_chunk) == PAGE_SIZE);
1367 #ifdef __mips_n64
1368 CTASSERT(_NPCM == 3);
1369 CTASSERT(_NPCPV == 168);
1370 #else
1371 CTASSERT(_NPCM == 11);
1372 CTASSERT(_NPCPV == 336);
1373 #endif
1374
1375 static __inline struct pv_chunk *
1376 pv_to_chunk(pv_entry_t pv)
1377 {
1378
1379         return ((struct pv_chunk *)((uintptr_t)pv & ~(uintptr_t)PAGE_MASK));
1380 }
1381
1382 #define PV_PMAP(pv) (pv_to_chunk(pv)->pc_pmap)
1383
1384 #ifdef __mips_n64
1385 #define PC_FREE0_1      0xfffffffffffffffful
1386 #define PC_FREE2        0x000000fffffffffful
1387 #else
1388 #define PC_FREE0_9      0xfffffffful    /* Free values for index 0 through 9 */
1389 #define PC_FREE10       0x0000fffful    /* Free values for index 10 */
1390 #endif
1391
1392 static const u_long pc_freemask[_NPCM] = {
1393 #ifdef __mips_n64
1394         PC_FREE0_1, PC_FREE0_1, PC_FREE2
1395 #else
1396         PC_FREE0_9, PC_FREE0_9, PC_FREE0_9,
1397         PC_FREE0_9, PC_FREE0_9, PC_FREE0_9,
1398         PC_FREE0_9, PC_FREE0_9, PC_FREE0_9,
1399         PC_FREE0_9, PC_FREE10
1400 #endif
1401 };
1402
1403 static SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
1404     "VM/pmap parameters");
1405
1406 SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_count, CTLFLAG_RD, &pv_entry_count, 0,
1407     "Current number of pv entries");
1408
1409 #ifdef PV_STATS
1410 static int pc_chunk_count, pc_chunk_allocs, pc_chunk_frees, pc_chunk_tryfail;
1411
1412 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_count, CTLFLAG_RD, &pc_chunk_count, 0,
1413     "Current number of pv entry chunks");
1414 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_allocs, CTLFLAG_RD, &pc_chunk_allocs, 0,
1415     "Current number of pv entry chunks allocated");
1416 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_frees, CTLFLAG_RD, &pc_chunk_frees, 0,
1417     "Current number of pv entry chunks frees");
1418 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_tryfail, CTLFLAG_RD, &pc_chunk_tryfail, 0,
1419     "Number of times tried to get a chunk page but failed.");
1420
1421 static long pv_entry_frees, pv_entry_allocs;
1422 static int pv_entry_spare;
1423
1424 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_frees, CTLFLAG_RD, &pv_entry_frees, 0,
1425     "Current number of pv entry frees");
1426 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD, &pv_entry_allocs, 0,
1427     "Current number of pv entry allocs");
1428 SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD, &pv_entry_spare, 0,
1429     "Current number of spare pv entries");
1430 #endif
1431
1432 /*
1433  * We are in a serious low memory condition.  Resort to
1434  * drastic measures to free some pages so we can allocate
1435  * another pv entry chunk.
1436  */
1437 static vm_page_t
1438 pmap_pv_reclaim(pmap_t locked_pmap)
1439 {
1440         struct pch newtail;
1441         struct pv_chunk *pc;
1442         pd_entry_t *pde;
1443         pmap_t pmap;
1444         pt_entry_t *pte, oldpte;
1445         pv_entry_t pv;
1446         vm_offset_t va;
1447         vm_page_t m, m_pc;
1448         u_long inuse;
1449         int bit, field, freed, idx;
1450
1451         PMAP_LOCK_ASSERT(locked_pmap, MA_OWNED);
1452         pmap = NULL;
1453         m_pc = NULL;
1454         TAILQ_INIT(&newtail);
1455         while ((pc = TAILQ_FIRST(&pv_chunks)) != NULL) {
1456                 TAILQ_REMOVE(&pv_chunks, pc, pc_lru);
1457                 if (pmap != pc->pc_pmap) {
1458                         if (pmap != NULL) {
1459                                 pmap_invalidate_all(pmap);
1460                                 if (pmap != locked_pmap)
1461                                         PMAP_UNLOCK(pmap);
1462                         }
1463                         pmap = pc->pc_pmap;
1464                         /* Avoid deadlock and lock recursion. */
1465                         if (pmap > locked_pmap)
1466                                 PMAP_LOCK(pmap);
1467                         else if (pmap != locked_pmap && !PMAP_TRYLOCK(pmap)) {
1468                                 pmap = NULL;
1469                                 TAILQ_INSERT_TAIL(&newtail, pc, pc_lru);
1470                                 continue;
1471                         }
1472                 }
1473
1474                 /*
1475                  * Destroy every non-wired, 4 KB page mapping in the chunk.
1476                  */
1477                 freed = 0;
1478                 for (field = 0; field < _NPCM; field++) {
1479                         for (inuse = ~pc->pc_map[field] & pc_freemask[field];
1480                             inuse != 0; inuse &= ~(1UL << bit)) {
1481                                 bit = ffsl(inuse) - 1;
1482                                 idx = field * sizeof(inuse) * NBBY + bit;
1483                                 pv = &pc->pc_pventry[idx];
1484                                 va = pv->pv_va;
1485                                 pde = pmap_pde(pmap, va);
1486                                 KASSERT(pde != NULL && *pde != 0,
1487                                     ("pmap_pv_reclaim: pde"));
1488                                 pte = pmap_pde_to_pte(pde, va);
1489                                 oldpte = *pte;
1490                                 if (pte_test(&oldpte, PTE_W))
1491                                         continue;
1492                                 if (is_kernel_pmap(pmap))
1493                                         *pte = PTE_G;
1494                                 else
1495                                         *pte = 0;
1496                                 m = PHYS_TO_VM_PAGE(TLBLO_PTE_TO_PA(oldpte));
1497                                 if (pte_test(&oldpte, PTE_D))
1498                                         vm_page_dirty(m);
1499                                 if (m->md.pv_flags & PV_TABLE_REF)
1500                                         vm_page_aflag_set(m, PGA_REFERENCED);
1501                                 m->md.pv_flags &= ~PV_TABLE_REF;
1502                                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
1503                                 if (TAILQ_EMPTY(&m->md.pv_list))
1504                                         vm_page_aflag_clear(m, PGA_WRITEABLE);
1505                                 pc->pc_map[field] |= 1UL << bit;
1506
1507                                 /*
1508                                  * For simplicity, we will unconditionally shoot
1509                                  * down TLBs either at the end of this function
1510                                  * or at the top of the loop above if we switch
1511                                  * to a different pmap.
1512                                  */
1513                                 (void)pmap_unuse_pt(pmap, va, *pde);
1514
1515                                 freed++;
1516                         }
1517                 }
1518                 if (freed == 0) {
1519                         TAILQ_INSERT_TAIL(&newtail, pc, pc_lru);
1520                         continue;
1521                 }
1522                 /* Every freed mapping is for a 4 KB page. */
1523                 pmap->pm_stats.resident_count -= freed;
1524                 PV_STAT(pv_entry_frees += freed);
1525                 PV_STAT(pv_entry_spare += freed);
1526                 pv_entry_count -= freed;
1527                 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
1528                 for (field = 0; field < _NPCM; field++)
1529                         if (pc->pc_map[field] != pc_freemask[field]) {
1530                                 TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc,
1531                                     pc_list);
1532                                 TAILQ_INSERT_TAIL(&newtail, pc, pc_lru);
1533
1534                                 /*
1535                                  * One freed pv entry in locked_pmap is
1536                                  * sufficient.
1537                                  */
1538                                 if (pmap == locked_pmap)
1539                                         goto out;
1540                                 break;
1541                         }
1542                 if (field == _NPCM) {
1543                         PV_STAT(pv_entry_spare -= _NPCPV);
1544                         PV_STAT(pc_chunk_count--);
1545                         PV_STAT(pc_chunk_frees++);
1546                         /* Entire chunk is free; return it. */
1547                         m_pc = PHYS_TO_VM_PAGE(MIPS_DIRECT_TO_PHYS(
1548                             (vm_offset_t)pc));
1549                         dump_drop_page(m_pc->phys_addr);
1550                         break;
1551                 }
1552         }
1553 out:
1554         TAILQ_CONCAT(&pv_chunks, &newtail, pc_lru);
1555         if (pmap != NULL) {
1556                 pmap_invalidate_all(pmap);
1557                 if (pmap != locked_pmap)
1558                         PMAP_UNLOCK(pmap);
1559         }
1560         return (m_pc);
1561 }
1562
1563 /*
1564  * free the pv_entry back to the free list
1565  */
1566 static void
1567 free_pv_entry(pmap_t pmap, pv_entry_t pv)
1568 {
1569         struct pv_chunk *pc;
1570         int bit, field, idx;
1571
1572         rw_assert(&pvh_global_lock, RA_WLOCKED);
1573         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1574         PV_STAT(pv_entry_frees++);
1575         PV_STAT(pv_entry_spare++);
1576         pv_entry_count--;
1577         pc = pv_to_chunk(pv);
1578         idx = pv - &pc->pc_pventry[0];
1579         field = idx / (sizeof(u_long) * NBBY);
1580         bit = idx % (sizeof(u_long) * NBBY);
1581         pc->pc_map[field] |= 1ul << bit;
1582         for (idx = 0; idx < _NPCM; idx++)
1583                 if (pc->pc_map[idx] != pc_freemask[idx]) {
1584                         /*
1585                          * 98% of the time, pc is already at the head of the
1586                          * list.  If it isn't already, move it to the head.
1587                          */
1588                         if (__predict_false(TAILQ_FIRST(&pmap->pm_pvchunk) !=
1589                             pc)) {
1590                                 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
1591                                 TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc,
1592                                     pc_list);
1593                         }
1594                         return;
1595                 }
1596         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
1597         free_pv_chunk(pc);
1598 }
1599
1600 static void
1601 free_pv_chunk(struct pv_chunk *pc)
1602 {
1603         vm_page_t m;
1604
1605         TAILQ_REMOVE(&pv_chunks, pc, pc_lru);
1606         PV_STAT(pv_entry_spare -= _NPCPV);
1607         PV_STAT(pc_chunk_count--);
1608         PV_STAT(pc_chunk_frees++);
1609         /* entire chunk is free, return it */
1610         m = PHYS_TO_VM_PAGE(MIPS_DIRECT_TO_PHYS((vm_offset_t)pc));
1611         dump_drop_page(m->phys_addr);
1612         vm_page_unwire_noq(m);
1613         vm_page_free(m);
1614 }
1615
1616 /*
1617  * get a new pv_entry, allocating a block from the system
1618  * when needed.
1619  */
1620 static pv_entry_t
1621 get_pv_entry(pmap_t pmap, boolean_t try)
1622 {
1623         struct pv_chunk *pc;
1624         pv_entry_t pv;
1625         vm_page_t m;
1626         int bit, field, idx;
1627
1628         rw_assert(&pvh_global_lock, RA_WLOCKED);
1629         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1630         PV_STAT(pv_entry_allocs++);
1631         pv_entry_count++;
1632 retry:
1633         pc = TAILQ_FIRST(&pmap->pm_pvchunk);
1634         if (pc != NULL) {
1635                 for (field = 0; field < _NPCM; field++) {
1636                         if (pc->pc_map[field]) {
1637                                 bit = ffsl(pc->pc_map[field]) - 1;
1638                                 break;
1639                         }
1640                 }
1641                 if (field < _NPCM) {
1642                         idx = field * sizeof(pc->pc_map[field]) * NBBY + bit;
1643                         pv = &pc->pc_pventry[idx];
1644                         pc->pc_map[field] &= ~(1ul << bit);
1645                         /* If this was the last item, move it to tail */
1646                         for (field = 0; field < _NPCM; field++)
1647                                 if (pc->pc_map[field] != 0) {
1648                                         PV_STAT(pv_entry_spare--);
1649                                         return (pv);    /* not full, return */
1650                                 }
1651                         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
1652                         TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list);
1653                         PV_STAT(pv_entry_spare--);
1654                         return (pv);
1655                 }
1656         }
1657         /* No free items, allocate another chunk */
1658         m = vm_page_alloc_freelist(VM_FREELIST_DIRECT, VM_ALLOC_NORMAL |
1659             VM_ALLOC_WIRED);
1660         if (m == NULL) {
1661                 if (try) {
1662                         pv_entry_count--;
1663                         PV_STAT(pc_chunk_tryfail++);
1664                         return (NULL);
1665                 }
1666                 m = pmap_pv_reclaim(pmap);
1667                 if (m == NULL)
1668                         goto retry;
1669         }
1670         PV_STAT(pc_chunk_count++);
1671         PV_STAT(pc_chunk_allocs++);
1672         dump_add_page(m->phys_addr);
1673         pc = (struct pv_chunk *)MIPS_PHYS_TO_DIRECT(VM_PAGE_TO_PHYS(m));
1674         pc->pc_pmap = pmap;
1675         pc->pc_map[0] = pc_freemask[0] & ~1ul;  /* preallocated bit 0 */
1676         for (field = 1; field < _NPCM; field++)
1677                 pc->pc_map[field] = pc_freemask[field];
1678         TAILQ_INSERT_TAIL(&pv_chunks, pc, pc_lru);
1679         pv = &pc->pc_pventry[0];
1680         TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
1681         PV_STAT(pv_entry_spare += _NPCPV - 1);
1682         return (pv);
1683 }
1684
1685 static pv_entry_t
1686 pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
1687 {
1688         pv_entry_t pv;
1689
1690         rw_assert(&pvh_global_lock, RA_WLOCKED);
1691         TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) {
1692                 if (pmap == PV_PMAP(pv) && va == pv->pv_va) {
1693                         TAILQ_REMOVE(&pvh->pv_list, pv, pv_list);
1694                         break;
1695                 }
1696         }
1697         return (pv);
1698 }
1699
1700 static void
1701 pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
1702 {
1703         pv_entry_t pv;
1704
1705         pv = pmap_pvh_remove(pvh, pmap, va);
1706         KASSERT(pv != NULL, ("pmap_pvh_free: pv not found, pa %lx va %lx",
1707              (u_long)VM_PAGE_TO_PHYS(__containerof(pvh, struct vm_page, md)),
1708              (u_long)va));
1709         free_pv_entry(pmap, pv);
1710 }
1711
1712 static void
1713 pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va)
1714 {
1715
1716         rw_assert(&pvh_global_lock, RA_WLOCKED);
1717         pmap_pvh_free(&m->md, pmap, va);
1718         if (TAILQ_EMPTY(&m->md.pv_list))
1719                 vm_page_aflag_clear(m, PGA_WRITEABLE);
1720 }
1721
1722 /*
1723  * Conditionally create a pv entry.
1724  */
1725 static boolean_t
1726 pmap_try_insert_pv_entry(pmap_t pmap, vm_page_t mpte, vm_offset_t va,
1727     vm_page_t m)
1728 {
1729         pv_entry_t pv;
1730
1731         rw_assert(&pvh_global_lock, RA_WLOCKED);
1732         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1733         if ((pv = get_pv_entry(pmap, TRUE)) != NULL) {
1734                 pv->pv_va = va;
1735                 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
1736                 return (TRUE);
1737         } else
1738                 return (FALSE);
1739 }
1740
1741 /*
1742  * pmap_remove_pte: do the things to unmap a page in a process
1743  *
1744  * Returns true if this was the last PTE in the PT (and possibly the last PT in
1745  * the PD, and possibly the last PD in the segmap), in which case...
1746  *
1747  *   1) the TLB has been invalidated for the whole PT's span (at least),
1748  *   already, to ensure that MipsDoTLBMiss does not attempt to follow a
1749  *   dangling pointer into a freed page.  No additional TLB shootdown is
1750  *   required.
1751  *
1752  *   2) if this removal was part of a sweep to remove PTEs, it is safe to jump
1753  *   to the PT span boundary and continue.
1754  *
1755  *   3) The given pde may now point onto a freed page and must not be
1756  *   dereferenced
1757  *
1758  * If the return value is false, the TLB has not been shot down (and the segmap
1759  * entry, PD, and PT all remain in place).
1760  */
1761 static int
1762 pmap_remove_pte(struct pmap *pmap, pt_entry_t *ptq, vm_offset_t va,
1763     pd_entry_t pde)
1764 {
1765         pt_entry_t oldpte;
1766         vm_page_t m;
1767         vm_paddr_t pa;
1768
1769         rw_assert(&pvh_global_lock, RA_WLOCKED);
1770         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1771
1772         /*
1773          * Write back all cache lines from the page being unmapped.
1774          */
1775         mips_dcache_wbinv_range_index(va, PAGE_SIZE);
1776
1777         oldpte = *ptq;
1778         if (is_kernel_pmap(pmap))
1779                 *ptq = PTE_G;
1780         else
1781                 *ptq = 0;
1782
1783         if (pte_test(&oldpte, PTE_W))
1784                 pmap->pm_stats.wired_count -= 1;
1785
1786         pmap->pm_stats.resident_count -= 1;
1787
1788         if (pte_test(&oldpte, PTE_MANAGED)) {
1789                 pa = TLBLO_PTE_TO_PA(oldpte);
1790                 m = PHYS_TO_VM_PAGE(pa);
1791                 if (pte_test(&oldpte, PTE_D)) {
1792                         KASSERT(!pte_test(&oldpte, PTE_RO),
1793                             ("%s: modified page not writable: va: %p, pte: %#jx",
1794                             __func__, (void *)va, (uintmax_t)oldpte));
1795                         vm_page_dirty(m);
1796                 }
1797                 if (m->md.pv_flags & PV_TABLE_REF)
1798                         vm_page_aflag_set(m, PGA_REFERENCED);
1799                 m->md.pv_flags &= ~PV_TABLE_REF;
1800
1801                 pmap_remove_entry(pmap, m, va);
1802         }
1803         return (pmap_unuse_pt(pmap, va, pde));
1804 }
1805
1806 /*
1807  * Remove a single page from a process address space
1808  */
1809 static void
1810 pmap_remove_page(struct pmap *pmap, vm_offset_t va)
1811 {
1812         pd_entry_t *pde;
1813         pt_entry_t *ptq;
1814
1815         rw_assert(&pvh_global_lock, RA_WLOCKED);
1816         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1817         pde = pmap_pde(pmap, va);
1818         if (pde == NULL || *pde == 0)
1819                 return;
1820         ptq = pmap_pde_to_pte(pde, va);
1821
1822         /*
1823          * If there is no pte for this address, just skip it!
1824          */
1825         if (!pte_test(ptq, PTE_V))
1826                 return;
1827
1828         /*
1829          * Remove this PTE from the PT.  If this is the last one, then
1830          * the TLB has already been shot down, so don't bother again
1831          */
1832         if (!pmap_remove_pte(pmap, ptq, va, *pde))
1833                 pmap_invalidate_page(pmap, va);
1834 }
1835
1836 /*
1837  *      Remove the given range of addresses from the specified map.
1838  *
1839  *      It is assumed that the start and end are properly
1840  *      rounded to the page size.
1841  */
1842 void
1843 pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
1844 {
1845         pd_entry_t *pde, *pdpe;
1846         pt_entry_t *pte;
1847         vm_offset_t va_next;
1848         vm_offset_t va_init, va_fini;
1849         bool need_tlb_shootdown;
1850
1851         /*
1852          * Perform an unsynchronized read.  This is, however, safe.
1853          */
1854         if (pmap->pm_stats.resident_count == 0)
1855                 return;
1856
1857         rw_wlock(&pvh_global_lock);
1858         PMAP_LOCK(pmap);
1859
1860         /*
1861          * special handling of removing one page.  a very common operation
1862          * and easy to short circuit some code.
1863          */
1864         if ((sva + PAGE_SIZE) == eva) {
1865                 pmap_remove_page(pmap, sva);
1866                 goto out;
1867         }
1868         for (; sva < eva; sva = va_next) {
1869                 pdpe = pmap_segmap(pmap, sva);
1870 #ifdef __mips_n64
1871                 if (*pdpe == 0) {
1872                         va_next = (sva + NBSEG) & ~SEGMASK;
1873                         if (va_next < sva)
1874                                 va_next = eva;
1875                         continue;
1876                 }
1877 #endif
1878
1879                 /* Scan up to the end of the page table pointed to by pde */
1880                 va_next = (sva + NBPDR) & ~PDRMASK;
1881                 if (va_next < sva)
1882                         va_next = eva;
1883
1884                 pde = pmap_pdpe_to_pde(pdpe, sva);
1885                 if (*pde == NULL)
1886                         continue;
1887
1888                 /*
1889                  * Limit our scan to either the end of the va represented
1890                  * by the current page table page, or to the end of the
1891                  * range being removed.
1892                  */
1893                 if (va_next > eva)
1894                         va_next = eva;
1895
1896                 need_tlb_shootdown = false;
1897                 va_init = sva;
1898                 va_fini = va_next;
1899                 for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
1900                     sva += PAGE_SIZE) {
1901
1902                         /* Skip over invalid entries; no need to shootdown */
1903                         if (!pte_test(pte, PTE_V)) {
1904                                 /*
1905                                  * If we have not yet found a valid entry, then
1906                                  * we can move the lower edge of the region to
1907                                  * invalidate to the next PTE.
1908                                  */
1909                                 if (!need_tlb_shootdown)
1910                                         va_init = sva + PAGE_SIZE;
1911                                 continue;
1912                         }
1913
1914                         /*
1915                          * A valid entry; the range we are shooting down must
1916                          * include this page.  va_fini is used instead of sva
1917                          * so that if the range ends with a run of !PTE_V PTEs,
1918                          * but doesn't clear out so much that pmap_remove_pte
1919                          * removes the entire PT, we won't include these !PTE_V
1920                          * entries in the region to be shot down.
1921                          */
1922                         va_fini = sva + PAGE_SIZE;
1923
1924                         if (pmap_remove_pte(pmap, pte, sva, *pde)) {
1925                                 /* Entire PT removed and TLBs shot down. */
1926                                 need_tlb_shootdown = false;
1927                                 break;
1928                         } else {
1929                                 need_tlb_shootdown = true;
1930                         }
1931                 }
1932                 if (need_tlb_shootdown)
1933                         pmap_invalidate_range(pmap, va_init, va_fini);
1934         }
1935 out:
1936         rw_wunlock(&pvh_global_lock);
1937         PMAP_UNLOCK(pmap);
1938 }
1939
1940 /*
1941  *      Routine:        pmap_remove_all
1942  *      Function:
1943  *              Removes this physical page from
1944  *              all physical maps in which it resides.
1945  *              Reflects back modify bits to the pager.
1946  *
1947  *      Notes:
1948  *              Original versions of this routine were very
1949  *              inefficient because they iteratively called
1950  *              pmap_remove (slow...)
1951  */
1952
1953 void
1954 pmap_remove_all(vm_page_t m)
1955 {
1956         pv_entry_t pv;
1957         pmap_t pmap;
1958         pd_entry_t *pde;
1959         pt_entry_t *pte, tpte;
1960
1961         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
1962             ("pmap_remove_all: page %p is not managed", m));
1963         rw_wlock(&pvh_global_lock);
1964
1965         if (m->md.pv_flags & PV_TABLE_REF)
1966                 vm_page_aflag_set(m, PGA_REFERENCED);
1967
1968         while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
1969                 pmap = PV_PMAP(pv);
1970                 PMAP_LOCK(pmap);
1971
1972                 /*
1973                  * If it's last mapping writeback all caches from
1974                  * the page being destroyed
1975                  */
1976                 if (TAILQ_NEXT(pv, pv_list) == NULL)
1977                         mips_dcache_wbinv_range_index(pv->pv_va, PAGE_SIZE);
1978
1979                 pmap->pm_stats.resident_count--;
1980
1981                 pde = pmap_pde(pmap, pv->pv_va);
1982                 KASSERT(pde != NULL && *pde != 0, ("pmap_remove_all: pde"));
1983                 pte = pmap_pde_to_pte(pde, pv->pv_va);
1984
1985                 tpte = *pte;
1986                 if (is_kernel_pmap(pmap))
1987                         *pte = PTE_G;
1988                 else
1989                         *pte = 0;
1990
1991                 if (pte_test(&tpte, PTE_W))
1992                         pmap->pm_stats.wired_count--;
1993
1994                 /*
1995                  * Update the vm_page_t clean and reference bits.
1996                  */
1997                 if (pte_test(&tpte, PTE_D)) {
1998                         KASSERT(!pte_test(&tpte, PTE_RO),
1999                             ("%s: modified page not writable: va: %p, pte: %#jx",
2000                             __func__, (void *)pv->pv_va, (uintmax_t)tpte));
2001                         vm_page_dirty(m);
2002                 }
2003
2004                 if (!pmap_unuse_pt(pmap, pv->pv_va, *pde))
2005                         pmap_invalidate_page(pmap, pv->pv_va);
2006
2007                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
2008                 free_pv_entry(pmap, pv);
2009                 PMAP_UNLOCK(pmap);
2010         }
2011
2012         vm_page_aflag_clear(m, PGA_WRITEABLE);
2013         m->md.pv_flags &= ~PV_TABLE_REF;
2014         rw_wunlock(&pvh_global_lock);
2015 }
2016
2017 /*
2018  *      Set the physical protection on the
2019  *      specified range of this map as requested.
2020  */
2021 void
2022 pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
2023 {
2024         pt_entry_t pbits, *pte;
2025         pd_entry_t *pde, *pdpe;
2026         vm_offset_t va, va_next;
2027         vm_paddr_t pa;
2028         vm_page_t m;
2029
2030         if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
2031                 pmap_remove(pmap, sva, eva);
2032                 return;
2033         }
2034         if (prot & VM_PROT_WRITE)
2035                 return;
2036
2037         PMAP_LOCK(pmap);
2038         for (; sva < eva; sva = va_next) {
2039                 pdpe = pmap_segmap(pmap, sva);
2040 #ifdef __mips_n64
2041                 if (*pdpe == 0) {
2042                         va_next = (sva + NBSEG) & ~SEGMASK;
2043                         if (va_next < sva)
2044                                 va_next = eva;
2045                         continue;
2046                 }
2047 #endif
2048                 va_next = (sva + NBPDR) & ~PDRMASK;
2049                 if (va_next < sva)
2050                         va_next = eva;
2051
2052                 pde = pmap_pdpe_to_pde(pdpe, sva);
2053                 if (*pde == NULL)
2054                         continue;
2055
2056                 /*
2057                  * Limit our scan to either the end of the va represented
2058                  * by the current page table page, or to the end of the
2059                  * range being write protected.
2060                  */
2061                 if (va_next > eva)
2062                         va_next = eva;
2063
2064                 va = va_next;
2065                 for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
2066                     sva += PAGE_SIZE) {
2067                         pbits = *pte;
2068                         if (!pte_test(&pbits, PTE_V) || pte_test(&pbits,
2069                             PTE_RO)) {
2070                                 if (va != va_next) {
2071                                         pmap_invalidate_range(pmap, va, sva);
2072                                         va = va_next;
2073                                 }
2074                                 continue;
2075                         }
2076                         pte_set(&pbits, PTE_RO);
2077                         if (pte_test(&pbits, PTE_D)) {
2078                                 pte_clear(&pbits, PTE_D);
2079                                 if (pte_test(&pbits, PTE_MANAGED)) {
2080                                         pa = TLBLO_PTE_TO_PA(pbits);
2081                                         m = PHYS_TO_VM_PAGE(pa);
2082                                         vm_page_dirty(m);
2083                                 }
2084                                 if (va == va_next)
2085                                         va = sva;
2086                         } else {
2087                                 /*
2088                                  * Unless PTE_D is set, any TLB entries
2089                                  * mapping "sva" don't allow write access, so
2090                                  * they needn't be invalidated.
2091                                  */
2092                                 if (va != va_next) {
2093                                         pmap_invalidate_range(pmap, va, sva);
2094                                         va = va_next;
2095                                 }
2096                         }
2097                         *pte = pbits;
2098                 }
2099                 if (va != va_next)
2100                         pmap_invalidate_range(pmap, va, sva);
2101         }
2102         PMAP_UNLOCK(pmap);
2103 }
2104
2105 /*
2106  *      Insert the given physical page (p) at
2107  *      the specified virtual address (v) in the
2108  *      target physical map with the protection requested.
2109  *
2110  *      If specified, the page will be wired down, meaning
2111  *      that the related pte can not be reclaimed.
2112  *
2113  *      NB:  This is the only routine which MAY NOT lazy-evaluate
2114  *      or lose information.  That is, this routine must actually
2115  *      insert this page into the given map NOW.
2116  */
2117 int
2118 pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
2119     u_int flags, int8_t psind __unused)
2120 {
2121         vm_paddr_t pa, opa;
2122         pt_entry_t *pte;
2123         pt_entry_t origpte, newpte;
2124         pv_entry_t pv;
2125         vm_page_t mpte, om;
2126
2127         va &= ~PAGE_MASK;
2128         KASSERT(va <= VM_MAX_KERNEL_ADDRESS, ("pmap_enter: toobig"));
2129         KASSERT((m->oflags & VPO_UNMANAGED) != 0 || va < kmi.clean_sva ||
2130             va >= kmi.clean_eva,
2131             ("pmap_enter: managed mapping within the clean submap"));
2132         if ((m->oflags & VPO_UNMANAGED) == 0)
2133                 VM_PAGE_OBJECT_BUSY_ASSERT(m);
2134         pa = VM_PAGE_TO_PHYS(m);
2135         newpte = TLBLO_PA_TO_PFN(pa) | init_pte_prot(m, flags, prot);
2136         if ((flags & PMAP_ENTER_WIRED) != 0)
2137                 newpte |= PTE_W;
2138         if (is_kernel_pmap(pmap))
2139                 newpte |= PTE_G;
2140         PMAP_PTE_SET_CACHE_BITS(newpte, pa, m);
2141         if ((m->oflags & VPO_UNMANAGED) == 0)
2142                 newpte |= PTE_MANAGED;
2143
2144         mpte = NULL;
2145
2146         rw_wlock(&pvh_global_lock);
2147         PMAP_LOCK(pmap);
2148
2149         /*
2150          * In the case that a page table page is not resident, we are
2151          * creating it here.
2152          */
2153         if (va < VM_MAXUSER_ADDRESS) {
2154                 mpte = pmap_allocpte(pmap, va, flags);
2155                 if (mpte == NULL) {
2156                         KASSERT((flags & PMAP_ENTER_NOSLEEP) != 0,
2157                             ("pmap_allocpte failed with sleep allowed"));
2158                         rw_wunlock(&pvh_global_lock);
2159                         PMAP_UNLOCK(pmap);
2160                         return (KERN_RESOURCE_SHORTAGE);
2161                 }
2162         }
2163         pte = pmap_pte(pmap, va);
2164
2165         /*
2166          * Page Directory table entry not valid, we need a new PT page
2167          */
2168         if (pte == NULL) {
2169                 panic("pmap_enter: invalid page directory, pdir=%p, va=%p",
2170                     (void *)pmap->pm_segtab, (void *)va);
2171         }
2172
2173         origpte = *pte;
2174         KASSERT(!pte_test(&origpte, PTE_D | PTE_RO | PTE_V),
2175             ("pmap_enter: modified page not writable: va: %p, pte: %#jx",
2176             (void *)va, (uintmax_t)origpte));
2177         opa = TLBLO_PTE_TO_PA(origpte);
2178
2179         /*
2180          * Mapping has not changed, must be protection or wiring change.
2181          */
2182         if (pte_test(&origpte, PTE_V) && opa == pa) {
2183                 /*
2184                  * Wiring change, just update stats. We don't worry about
2185                  * wiring PT pages as they remain resident as long as there
2186                  * are valid mappings in them. Hence, if a user page is
2187                  * wired, the PT page will be also.
2188                  */
2189                 if (pte_test(&newpte, PTE_W) && !pte_test(&origpte, PTE_W))
2190                         pmap->pm_stats.wired_count++;
2191                 else if (!pte_test(&newpte, PTE_W) && pte_test(&origpte,
2192                     PTE_W))
2193                         pmap->pm_stats.wired_count--;
2194
2195                 /*
2196                  * Remove extra pte reference
2197                  */
2198                 if (mpte)
2199                         mpte->ref_count--;
2200
2201                 if (pte_test(&origpte, PTE_MANAGED)) {
2202                         m->md.pv_flags |= PV_TABLE_REF;
2203                         if (!pte_test(&newpte, PTE_RO))
2204                                 vm_page_aflag_set(m, PGA_WRITEABLE);
2205                 }
2206                 goto validate;
2207         }
2208
2209         pv = NULL;
2210
2211         /*
2212          * Mapping has changed, invalidate old range and fall through to
2213          * handle validating new mapping.
2214          */
2215         if (opa) {
2216                 if (is_kernel_pmap(pmap))
2217                         *pte = PTE_G;
2218                 else
2219                         *pte = 0;
2220                 if (pte_test(&origpte, PTE_W))
2221                         pmap->pm_stats.wired_count--;
2222                 if (pte_test(&origpte, PTE_MANAGED)) {
2223                         om = PHYS_TO_VM_PAGE(opa);
2224                         if (pte_test(&origpte, PTE_D))
2225                                 vm_page_dirty(om);
2226                         if ((om->md.pv_flags & PV_TABLE_REF) != 0) {
2227                                 om->md.pv_flags &= ~PV_TABLE_REF;
2228                                 vm_page_aflag_set(om, PGA_REFERENCED);
2229                         }
2230                         pv = pmap_pvh_remove(&om->md, pmap, va);
2231                         if (!pte_test(&newpte, PTE_MANAGED))
2232                                 free_pv_entry(pmap, pv);
2233                         if ((om->a.flags & PGA_WRITEABLE) != 0 &&
2234                             TAILQ_EMPTY(&om->md.pv_list))
2235                                 vm_page_aflag_clear(om, PGA_WRITEABLE);
2236                 }
2237                 pmap_invalidate_page(pmap, va);
2238                 origpte = 0;
2239                 if (mpte != NULL) {
2240                         mpte->ref_count--;
2241                         KASSERT(mpte->ref_count > 0,
2242                             ("pmap_enter: missing reference to page table page,"
2243                             " va: %p", (void *)va));
2244                 }
2245         } else
2246                 pmap->pm_stats.resident_count++;
2247
2248         /*
2249          * Enter on the PV list if part of our managed memory.
2250          */
2251         if (pte_test(&newpte, PTE_MANAGED)) {
2252                 m->md.pv_flags |= PV_TABLE_REF;
2253                 if (pv == NULL) {
2254                         pv = get_pv_entry(pmap, FALSE);
2255                         pv->pv_va = va;
2256                 }
2257                 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
2258                 if (!pte_test(&newpte, PTE_RO))
2259                         vm_page_aflag_set(m, PGA_WRITEABLE);
2260         }
2261
2262         /*
2263          * Increment counters
2264          */
2265         if (pte_test(&newpte, PTE_W))
2266                 pmap->pm_stats.wired_count++;
2267
2268 validate:
2269
2270 #ifdef PMAP_DEBUG
2271         printf("pmap_enter:  va: %p -> pa: %p\n", (void *)va, (void *)pa);
2272 #endif
2273
2274         /*
2275          * if the mapping or permission bits are different, we need to
2276          * update the pte.
2277          */
2278         if (origpte != newpte) {
2279                 *pte = newpte;
2280                 if (pte_test(&origpte, PTE_V)) {
2281                         KASSERT(opa == pa, ("pmap_enter: invalid update"));
2282                         if (pte_test(&origpte, PTE_D)) {
2283                                 if (pte_test(&origpte, PTE_MANAGED))
2284                                         vm_page_dirty(m);
2285                         }
2286                         pmap_update_page(pmap, va, newpte);
2287                 }
2288         }
2289
2290         /*
2291          * Sync I & D caches for executable pages.  Do this only if the
2292          * target pmap belongs to the current process.  Otherwise, an
2293          * unresolvable TLB miss may occur.
2294          */
2295         if (!is_kernel_pmap(pmap) && (pmap == &curproc->p_vmspace->vm_pmap) &&
2296             (prot & VM_PROT_EXECUTE)) {
2297                 mips_icache_sync_range(va, PAGE_SIZE);
2298                 mips_dcache_wbinv_range(va, PAGE_SIZE);
2299         }
2300         rw_wunlock(&pvh_global_lock);
2301         PMAP_UNLOCK(pmap);
2302         return (KERN_SUCCESS);
2303 }
2304
2305 /*
2306  * this code makes some *MAJOR* assumptions:
2307  * 1. Current pmap & pmap exists.
2308  * 2. Not wired.
2309  * 3. Read access.
2310  * 4. No page table pages.
2311  * but is *MUCH* faster than pmap_enter...
2312  */
2313
2314 void
2315 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
2316 {
2317
2318         rw_wlock(&pvh_global_lock);
2319         PMAP_LOCK(pmap);
2320         (void)pmap_enter_quick_locked(pmap, va, m, prot, NULL);
2321         rw_wunlock(&pvh_global_lock);
2322         PMAP_UNLOCK(pmap);
2323 }
2324
2325 static vm_page_t
2326 pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
2327     vm_prot_t prot, vm_page_t mpte)
2328 {
2329         pt_entry_t *pte, npte;
2330         vm_paddr_t pa;
2331
2332         KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
2333             (m->oflags & VPO_UNMANAGED) != 0,
2334             ("pmap_enter_quick_locked: managed mapping within the clean submap"));
2335         rw_assert(&pvh_global_lock, RA_WLOCKED);
2336         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2337
2338         /*
2339          * In the case that a page table page is not resident, we are
2340          * creating it here.
2341          */
2342         if (va < VM_MAXUSER_ADDRESS) {
2343                 pd_entry_t *pde;
2344                 unsigned ptepindex;
2345
2346                 /*
2347                  * Calculate pagetable page index
2348                  */
2349                 ptepindex = pmap_pde_pindex(va);
2350                 if (mpte && (mpte->pindex == ptepindex)) {
2351                         mpte->ref_count++;
2352                 } else {
2353                         /*
2354                          * Get the page directory entry
2355                          */
2356                         pde = pmap_pde(pmap, va);
2357
2358                         /*
2359                          * If the page table page is mapped, we just
2360                          * increment the hold count, and activate it.
2361                          */
2362                         if (pde && *pde != 0) {
2363                                 mpte = PHYS_TO_VM_PAGE(
2364                                     MIPS_DIRECT_TO_PHYS(*pde));
2365                                 mpte->ref_count++;
2366                         } else {
2367                                 mpte = _pmap_allocpte(pmap, ptepindex,
2368                                     PMAP_ENTER_NOSLEEP);
2369                                 if (mpte == NULL)
2370                                         return (mpte);
2371                         }
2372                 }
2373         } else {
2374                 mpte = NULL;
2375         }
2376
2377         pte = pmap_pte(pmap, va);
2378         if (pte_test(pte, PTE_V)) {
2379                 if (mpte != NULL) {
2380                         mpte->ref_count--;
2381                         mpte = NULL;
2382                 }
2383                 return (mpte);
2384         }
2385
2386         /*
2387          * Enter on the PV list if part of our managed memory.
2388          */
2389         if ((m->oflags & VPO_UNMANAGED) == 0 &&
2390             !pmap_try_insert_pv_entry(pmap, mpte, va, m)) {
2391                 if (mpte != NULL) {
2392                         pmap_unwire_ptp(pmap, va, mpte);
2393                         mpte = NULL;
2394                 }
2395                 return (mpte);
2396         }
2397
2398         /*
2399          * Increment counters
2400          */
2401         pmap->pm_stats.resident_count++;
2402
2403         pa = VM_PAGE_TO_PHYS(m);
2404
2405         /*
2406          * Now validate mapping with RO protection
2407          */
2408         npte = PTE_RO | TLBLO_PA_TO_PFN(pa) | PTE_V;
2409         if ((m->oflags & VPO_UNMANAGED) == 0)
2410                 npte |= PTE_MANAGED;
2411
2412         PMAP_PTE_SET_CACHE_BITS(npte, pa, m);
2413
2414         if (is_kernel_pmap(pmap))
2415                 *pte = npte | PTE_G;
2416         else {
2417                 *pte = npte;
2418                 /*
2419                  * Sync I & D caches.  Do this only if the target pmap
2420                  * belongs to the current process.  Otherwise, an
2421                  * unresolvable TLB miss may occur. */
2422                 if (pmap == &curproc->p_vmspace->vm_pmap) {
2423                         va &= ~PAGE_MASK;
2424                         mips_icache_sync_range(va, PAGE_SIZE);
2425                         mips_dcache_wbinv_range(va, PAGE_SIZE);
2426                 }
2427         }
2428         return (mpte);
2429 }
2430
2431 /*
2432  * Make a temporary mapping for a physical address.  This is only intended
2433  * to be used for panic dumps.
2434  *
2435  * Use XKPHYS for 64 bit, and KSEG0 where possible for 32 bit.
2436  */
2437 void *
2438 pmap_kenter_temporary(vm_paddr_t pa, int i)
2439 {
2440         vm_offset_t va;
2441
2442         if (i != 0)
2443                 printf("%s: ERROR!!! More than one page of virtual address mapping not supported\n",
2444                     __func__);
2445
2446         if (MIPS_DIRECT_MAPPABLE(pa)) {
2447                 va = MIPS_PHYS_TO_DIRECT(pa);
2448         } else {
2449 #ifndef __mips_n64    /* XXX : to be converted to new style */
2450                 pt_entry_t *pte, npte;
2451
2452                 pte = pmap_pte(kernel_pmap, crashdumpva); 
2453
2454                 /* Since this is for the debugger, no locks or any other fun */
2455                 npte = TLBLO_PA_TO_PFN(pa) | PTE_C_CACHE | PTE_D | PTE_V |
2456                     PTE_G;
2457                 *pte = npte;
2458                 pmap_update_page(kernel_pmap, crashdumpva, npte);
2459                 va = crashdumpva;
2460 #endif
2461         }
2462         return ((void *)va);
2463 }
2464
2465 void
2466 pmap_kenter_temporary_free(vm_paddr_t pa)
2467 {
2468  #ifndef __mips_n64    /* XXX : to be converted to new style */
2469         pt_entry_t *pte;
2470  #endif
2471         if (MIPS_DIRECT_MAPPABLE(pa)) {
2472                 /* nothing to do for this case */
2473                 return;
2474         }
2475 #ifndef __mips_n64    /* XXX : to be converted to new style */
2476         pte = pmap_pte(kernel_pmap, crashdumpva);
2477         *pte = PTE_G;
2478         pmap_invalidate_page(kernel_pmap, crashdumpva);
2479 #endif
2480 }
2481
2482 /*
2483  * Maps a sequence of resident pages belonging to the same object.
2484  * The sequence begins with the given page m_start.  This page is
2485  * mapped at the given virtual address start.  Each subsequent page is
2486  * mapped at a virtual address that is offset from start by the same
2487  * amount as the page is offset from m_start within the object.  The
2488  * last page in the sequence is the page with the largest offset from
2489  * m_start that can be mapped at a virtual address less than the given
2490  * virtual address end.  Not every virtual page between start and end
2491  * is mapped; only those for which a resident page exists with the
2492  * corresponding offset from m_start are mapped.
2493  */
2494 void
2495 pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end,
2496     vm_page_t m_start, vm_prot_t prot)
2497 {
2498         vm_page_t m, mpte;
2499         vm_pindex_t diff, psize;
2500
2501         VM_OBJECT_ASSERT_LOCKED(m_start->object);
2502
2503         psize = atop(end - start);
2504         mpte = NULL;
2505         m = m_start;
2506         rw_wlock(&pvh_global_lock);
2507         PMAP_LOCK(pmap);
2508         while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
2509                 mpte = pmap_enter_quick_locked(pmap, start + ptoa(diff), m,
2510                     prot, mpte);
2511                 m = TAILQ_NEXT(m, listq);
2512         }
2513         rw_wunlock(&pvh_global_lock);
2514         PMAP_UNLOCK(pmap);
2515 }
2516
2517 /*
2518  * pmap_object_init_pt preloads the ptes for a given object
2519  * into the specified pmap.  This eliminates the blast of soft
2520  * faults on process startup and immediately after an mmap.
2521  */
2522 void
2523 pmap_object_init_pt(pmap_t pmap, vm_offset_t addr,
2524     vm_object_t object, vm_pindex_t pindex, vm_size_t size)
2525 {
2526         VM_OBJECT_ASSERT_WLOCKED(object);
2527         KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG,
2528             ("pmap_object_init_pt: non-device object"));
2529 }
2530
2531 /*
2532  *      Clear the wired attribute from the mappings for the specified range of
2533  *      addresses in the given pmap.  Every valid mapping within that range
2534  *      must have the wired attribute set.  In contrast, invalid mappings
2535  *      cannot have the wired attribute set, so they are ignored.
2536  *
2537  *      The wired attribute of the page table entry is not a hardware feature,
2538  *      so there is no need to invalidate any TLB entries.
2539  */
2540 void
2541 pmap_unwire(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
2542 {
2543         pd_entry_t *pde, *pdpe;
2544         pt_entry_t *pte;
2545         vm_offset_t va_next;
2546
2547         PMAP_LOCK(pmap);
2548         for (; sva < eva; sva = va_next) {
2549                 pdpe = pmap_segmap(pmap, sva);
2550 #ifdef __mips_n64
2551                 if (*pdpe == NULL) {
2552                         va_next = (sva + NBSEG) & ~SEGMASK;
2553                         if (va_next < sva)
2554                                 va_next = eva;
2555                         continue;
2556                 }
2557 #endif
2558                 va_next = (sva + NBPDR) & ~PDRMASK;
2559                 if (va_next < sva)
2560                         va_next = eva;
2561                 pde = pmap_pdpe_to_pde(pdpe, sva);
2562                 if (*pde == NULL)
2563                         continue;
2564                 if (va_next > eva)
2565                         va_next = eva;
2566                 for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
2567                     sva += PAGE_SIZE) {
2568                         if (!pte_test(pte, PTE_V))
2569                                 continue;
2570                         if (!pte_test(pte, PTE_W))
2571                                 panic("pmap_unwire: pte %#jx is missing PG_W",
2572                                     (uintmax_t)*pte);
2573                         pte_clear(pte, PTE_W);
2574                         pmap->pm_stats.wired_count--;
2575                 }
2576         }
2577         PMAP_UNLOCK(pmap);
2578 }
2579
2580 /*
2581  *      Copy the range specified by src_addr/len
2582  *      from the source map to the range dst_addr/len
2583  *      in the destination map.
2584  *
2585  *      This routine is only advisory and need not do anything.
2586  */
2587
2588 void
2589 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr,
2590     vm_size_t len, vm_offset_t src_addr)
2591 {
2592 }
2593
2594 /*
2595  *      pmap_zero_page zeros the specified hardware page by mapping
2596  *      the page into KVM and using bzero to clear its contents.
2597  *
2598  *      Use XKPHYS for 64 bit, and KSEG0 where possible for 32 bit.
2599  */
2600 void
2601 pmap_zero_page(vm_page_t m)
2602 {
2603         vm_offset_t va;
2604         vm_paddr_t phys = VM_PAGE_TO_PHYS(m);
2605
2606         if (MIPS_DIRECT_MAPPABLE(phys)) {
2607                 va = MIPS_PHYS_TO_DIRECT(phys);
2608                 bzero((caddr_t)va, PAGE_SIZE);
2609                 mips_dcache_wbinv_range(va, PAGE_SIZE);
2610         } else {
2611                 va = pmap_lmem_map1(phys);
2612                 bzero((caddr_t)va, PAGE_SIZE);
2613                 mips_dcache_wbinv_range(va, PAGE_SIZE);
2614                 pmap_lmem_unmap();
2615         }
2616 }
2617
2618 /*
2619  *      pmap_zero_page_area zeros the specified hardware page by mapping
2620  *      the page into KVM and using bzero to clear its contents.
2621  *
2622  *      off and size may not cover an area beyond a single hardware page.
2623  */
2624 void
2625 pmap_zero_page_area(vm_page_t m, int off, int size)
2626 {
2627         vm_offset_t va;
2628         vm_paddr_t phys = VM_PAGE_TO_PHYS(m);
2629
2630         if (MIPS_DIRECT_MAPPABLE(phys)) {
2631                 va = MIPS_PHYS_TO_DIRECT(phys);
2632                 bzero((char *)(caddr_t)va + off, size);
2633                 mips_dcache_wbinv_range(va + off, size);
2634         } else {
2635                 va = pmap_lmem_map1(phys);
2636                 bzero((char *)va + off, size);
2637                 mips_dcache_wbinv_range(va + off, size);
2638                 pmap_lmem_unmap();
2639         }
2640 }
2641
2642 /*
2643  *      pmap_copy_page copies the specified (machine independent)
2644  *      page by mapping the page into virtual memory and using
2645  *      bcopy to copy the page, one machine dependent page at a
2646  *      time.
2647  *
2648  *      Use XKPHYS for 64 bit, and KSEG0 where possible for 32 bit.
2649  */
2650 void
2651 pmap_copy_page(vm_page_t src, vm_page_t dst)
2652 {
2653         vm_offset_t va_src, va_dst;
2654         vm_paddr_t phys_src = VM_PAGE_TO_PHYS(src);
2655         vm_paddr_t phys_dst = VM_PAGE_TO_PHYS(dst);
2656
2657         if (MIPS_DIRECT_MAPPABLE(phys_src) && MIPS_DIRECT_MAPPABLE(phys_dst)) {
2658                 /* easy case, all can be accessed via KSEG0 */
2659                 /*
2660                  * Flush all caches for VA that are mapped to this page
2661                  * to make sure that data in SDRAM is up to date
2662                  */
2663                 pmap_flush_pvcache(src);
2664                 mips_dcache_wbinv_range_index(
2665                     MIPS_PHYS_TO_DIRECT(phys_dst), PAGE_SIZE);
2666                 va_src = MIPS_PHYS_TO_DIRECT(phys_src);
2667                 va_dst = MIPS_PHYS_TO_DIRECT(phys_dst);
2668                 bcopy((caddr_t)va_src, (caddr_t)va_dst, PAGE_SIZE);
2669                 mips_dcache_wbinv_range(va_dst, PAGE_SIZE);
2670         } else {
2671                 va_src = pmap_lmem_map2(phys_src, phys_dst);
2672                 va_dst = va_src + PAGE_SIZE;
2673                 bcopy((void *)va_src, (void *)va_dst, PAGE_SIZE);
2674                 mips_dcache_wbinv_range(va_dst, PAGE_SIZE);
2675                 pmap_lmem_unmap();
2676         }
2677 }
2678
2679 int unmapped_buf_allowed;
2680
2681 void
2682 pmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[],
2683     vm_offset_t b_offset, int xfersize)
2684 {
2685         char *a_cp, *b_cp;
2686         vm_page_t a_m, b_m;
2687         vm_offset_t a_pg_offset, b_pg_offset;
2688         vm_paddr_t a_phys, b_phys;
2689         int cnt;
2690
2691         while (xfersize > 0) {
2692                 a_pg_offset = a_offset & PAGE_MASK;
2693                 cnt = min(xfersize, PAGE_SIZE - a_pg_offset);
2694                 a_m = ma[a_offset >> PAGE_SHIFT];
2695                 a_phys = VM_PAGE_TO_PHYS(a_m);
2696                 b_pg_offset = b_offset & PAGE_MASK;
2697                 cnt = min(cnt, PAGE_SIZE - b_pg_offset);
2698                 b_m = mb[b_offset >> PAGE_SHIFT];
2699                 b_phys = VM_PAGE_TO_PHYS(b_m);
2700                 if (MIPS_DIRECT_MAPPABLE(a_phys) &&
2701                     MIPS_DIRECT_MAPPABLE(b_phys)) {
2702                         pmap_flush_pvcache(a_m);
2703                         mips_dcache_wbinv_range_index(
2704                             MIPS_PHYS_TO_DIRECT(b_phys), PAGE_SIZE);
2705                         a_cp = (char *)MIPS_PHYS_TO_DIRECT(a_phys) +
2706                             a_pg_offset;
2707                         b_cp = (char *)MIPS_PHYS_TO_DIRECT(b_phys) +
2708                             b_pg_offset;
2709                         bcopy(a_cp, b_cp, cnt);
2710                         mips_dcache_wbinv_range((vm_offset_t)b_cp, cnt);
2711                 } else {
2712                         a_cp = (char *)pmap_lmem_map2(a_phys, b_phys);
2713                         b_cp = (char *)a_cp + PAGE_SIZE;
2714                         a_cp += a_pg_offset;
2715                         b_cp += b_pg_offset;
2716                         bcopy(a_cp, b_cp, cnt);
2717                         mips_dcache_wbinv_range((vm_offset_t)b_cp, cnt);
2718                         pmap_lmem_unmap();
2719                 }
2720                 a_offset += cnt;
2721                 b_offset += cnt;
2722                 xfersize -= cnt;
2723         }
2724 }
2725
2726 vm_offset_t
2727 pmap_quick_enter_page(vm_page_t m)
2728 {
2729 #if defined(__mips_n64)
2730         return MIPS_PHYS_TO_DIRECT(VM_PAGE_TO_PHYS(m));
2731 #else
2732         vm_offset_t qaddr;
2733         vm_paddr_t pa;
2734         pt_entry_t *pte, npte;
2735
2736         pa = VM_PAGE_TO_PHYS(m);
2737
2738         if (MIPS_DIRECT_MAPPABLE(pa)) {
2739                 if (pmap_page_get_memattr(m) != VM_MEMATTR_WRITE_BACK)
2740                         return (MIPS_PHYS_TO_DIRECT_UNCACHED(pa));
2741                 else
2742                         return (MIPS_PHYS_TO_DIRECT(pa));
2743         }
2744         critical_enter();
2745         qaddr = PCPU_GET(qmap_addr);
2746         pte = PCPU_GET(qmap_ptep);
2747
2748         KASSERT(*pte == PTE_G, ("pmap_quick_enter_page: PTE busy"));
2749
2750         npte = TLBLO_PA_TO_PFN(pa) | PTE_D | PTE_V | PTE_G;
2751         PMAP_PTE_SET_CACHE_BITS(npte, pa, m);
2752         *pte = npte;
2753
2754         return (qaddr);
2755 #endif
2756 }
2757
2758 void
2759 pmap_quick_remove_page(vm_offset_t addr)
2760 {
2761         mips_dcache_wbinv_range(addr, PAGE_SIZE);
2762
2763 #if !defined(__mips_n64)
2764         pt_entry_t *pte;
2765
2766         if (addr >= MIPS_KSEG0_START && addr < MIPS_KSEG0_END)
2767                 return;
2768
2769         pte = PCPU_GET(qmap_ptep);
2770
2771         KASSERT(*pte != PTE_G,
2772             ("pmap_quick_remove_page: PTE not in use"));
2773         KASSERT(PCPU_GET(qmap_addr) == addr,
2774             ("pmap_quick_remove_page: invalid address"));
2775
2776         *pte = PTE_G;
2777         tlb_invalidate_address(kernel_pmap, addr);
2778         critical_exit();
2779 #endif
2780 }
2781
2782 /*
2783  * Returns true if the pmap's pv is one of the first
2784  * 16 pvs linked to from this page.  This count may
2785  * be changed upwards or downwards in the future; it
2786  * is only necessary that true be returned for a small
2787  * subset of pmaps for proper page aging.
2788  */
2789 boolean_t
2790 pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
2791 {
2792         pv_entry_t pv;
2793         int loops = 0;
2794         boolean_t rv;
2795
2796         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
2797             ("pmap_page_exists_quick: page %p is not managed", m));
2798         rv = FALSE;
2799         rw_wlock(&pvh_global_lock);
2800         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
2801                 if (PV_PMAP(pv) == pmap) {
2802                         rv = TRUE;
2803                         break;
2804                 }
2805                 loops++;
2806                 if (loops >= 16)
2807                         break;
2808         }
2809         rw_wunlock(&pvh_global_lock);
2810         return (rv);
2811 }
2812
2813 /*
2814  * Remove all pages from specified address space
2815  * this aids process exit speeds.  Also, this code
2816  * is special cased for current process only, but
2817  * can have the more generic (and slightly slower)
2818  * mode enabled.  This is much faster than pmap_remove
2819  * in the case of running down an entire address space.
2820  */
2821 void
2822 pmap_remove_pages(pmap_t pmap)
2823 {
2824         pd_entry_t *pde;
2825         pt_entry_t *pte, tpte;
2826         pv_entry_t pv;
2827         vm_page_t m;
2828         struct pv_chunk *pc, *npc;
2829         u_long inuse, bitmask;
2830         int allfree, bit, field, idx;
2831
2832         if (pmap != vmspace_pmap(curthread->td_proc->p_vmspace)) {
2833                 printf("warning: pmap_remove_pages called with non-current pmap\n");
2834                 return;
2835         }
2836         rw_wlock(&pvh_global_lock);
2837         PMAP_LOCK(pmap);
2838         TAILQ_FOREACH_SAFE(pc, &pmap->pm_pvchunk, pc_list, npc) {
2839                 allfree = 1;
2840                 for (field = 0; field < _NPCM; field++) {
2841                         inuse = ~pc->pc_map[field] & pc_freemask[field];
2842                         while (inuse != 0) {
2843                                 bit = ffsl(inuse) - 1;
2844                                 bitmask = 1UL << bit;
2845                                 idx = field * sizeof(inuse) * NBBY + bit;
2846                                 pv = &pc->pc_pventry[idx];
2847                                 inuse &= ~bitmask;
2848
2849                                 pde = pmap_pde(pmap, pv->pv_va);
2850                                 KASSERT(pde != NULL && *pde != 0,
2851                                     ("pmap_remove_pages: pde"));
2852                                 pte = pmap_pde_to_pte(pde, pv->pv_va);
2853                                 if (!pte_test(pte, PTE_V))
2854                                         panic("pmap_remove_pages: bad pte");
2855                                 tpte = *pte;
2856
2857 /*
2858  * We cannot remove wired pages from a process' mapping at this time
2859  */
2860                                 if (pte_test(&tpte, PTE_W)) {
2861                                         allfree = 0;
2862                                         continue;
2863                                 }
2864                                 *pte = is_kernel_pmap(pmap) ? PTE_G : 0;
2865
2866                                 m = PHYS_TO_VM_PAGE(TLBLO_PTE_TO_PA(tpte));
2867                                 KASSERT(m != NULL,
2868                                     ("pmap_remove_pages: bad tpte %#jx",
2869                                     (uintmax_t)tpte));
2870
2871                                 /*
2872                                  * Update the vm_page_t clean and reference bits.
2873                                  */
2874                                 if (pte_test(&tpte, PTE_D))
2875                                         vm_page_dirty(m);
2876
2877                                 /* Mark free */
2878                                 PV_STAT(pv_entry_frees++);
2879                                 PV_STAT(pv_entry_spare++);
2880                                 pv_entry_count--;
2881                                 pc->pc_map[field] |= bitmask;
2882                                 pmap->pm_stats.resident_count--;
2883                                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
2884                                 if (TAILQ_EMPTY(&m->md.pv_list))
2885                                         vm_page_aflag_clear(m, PGA_WRITEABLE);
2886
2887                                 /*
2888                                  * For simplicity, unconditionally call
2889                                  * pmap_invalidate_all(), below.
2890                                  */
2891                                 (void)pmap_unuse_pt(pmap, pv->pv_va, *pde);
2892                         }
2893                 }
2894                 if (allfree) {
2895                         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
2896                         free_pv_chunk(pc);
2897                 }
2898         }
2899         pmap_invalidate_all(pmap);
2900         PMAP_UNLOCK(pmap);
2901         rw_wunlock(&pvh_global_lock);
2902 }
2903
2904 /*
2905  * pmap_testbit tests bits in pte's
2906  */
2907 static boolean_t
2908 pmap_testbit(vm_page_t m, int bit)
2909 {
2910         pv_entry_t pv;
2911         pmap_t pmap;
2912         pt_entry_t *pte;
2913         boolean_t rv = FALSE;
2914
2915         if (m->oflags & VPO_UNMANAGED)
2916                 return (rv);
2917
2918         rw_assert(&pvh_global_lock, RA_WLOCKED);
2919         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
2920                 pmap = PV_PMAP(pv);
2921                 PMAP_LOCK(pmap);
2922                 pte = pmap_pte(pmap, pv->pv_va);
2923                 rv = pte_test(pte, bit);
2924                 PMAP_UNLOCK(pmap);
2925                 if (rv)
2926                         break;
2927         }
2928         return (rv);
2929 }
2930
2931 /*
2932  *      pmap_page_wired_mappings:
2933  *
2934  *      Return the number of managed mappings to the given physical page
2935  *      that are wired.
2936  */
2937 int
2938 pmap_page_wired_mappings(vm_page_t m)
2939 {
2940         pv_entry_t pv;
2941         pmap_t pmap;
2942         pt_entry_t *pte;
2943         int count;
2944
2945         count = 0;
2946         if ((m->oflags & VPO_UNMANAGED) != 0)
2947                 return (count);
2948         rw_wlock(&pvh_global_lock);
2949         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
2950                 pmap = PV_PMAP(pv);
2951                 PMAP_LOCK(pmap);
2952                 pte = pmap_pte(pmap, pv->pv_va);
2953                 if (pte_test(pte, PTE_W))
2954                         count++;
2955                 PMAP_UNLOCK(pmap);
2956         }
2957         rw_wunlock(&pvh_global_lock);
2958         return (count);
2959 }
2960
2961 /*
2962  * Clear the write and modified bits in each of the given page's mappings.
2963  */
2964 void
2965 pmap_remove_write(vm_page_t m)
2966 {
2967         pmap_t pmap;
2968         pt_entry_t pbits, *pte;
2969         pv_entry_t pv;
2970
2971         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
2972             ("pmap_remove_write: page %p is not managed", m));
2973         vm_page_assert_busied(m);
2974
2975         if (!pmap_page_is_write_mapped(m))
2976                 return;
2977         rw_wlock(&pvh_global_lock);
2978         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
2979                 pmap = PV_PMAP(pv);
2980                 PMAP_LOCK(pmap);
2981                 pte = pmap_pte(pmap, pv->pv_va);
2982                 KASSERT(pte != NULL && pte_test(pte, PTE_V),
2983                     ("page on pv_list has no pte"));
2984                 pbits = *pte;
2985                 if (pte_test(&pbits, PTE_D)) {
2986                         pte_clear(&pbits, PTE_D);
2987                         vm_page_dirty(m);
2988                 }
2989                 pte_set(&pbits, PTE_RO);
2990                 if (pbits != *pte) {
2991                         *pte = pbits;
2992                         pmap_update_page(pmap, pv->pv_va, pbits);
2993                 }
2994                 PMAP_UNLOCK(pmap);
2995         }
2996         vm_page_aflag_clear(m, PGA_WRITEABLE);
2997         rw_wunlock(&pvh_global_lock);
2998 }
2999
3000 /*
3001  *      pmap_ts_referenced:
3002  *
3003  *      Return the count of reference bits for a page, clearing all of them.
3004  */
3005 int
3006 pmap_ts_referenced(vm_page_t m)
3007 {
3008
3009         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
3010             ("pmap_ts_referenced: page %p is not managed", m));
3011         if (m->md.pv_flags & PV_TABLE_REF) {
3012                 rw_wlock(&pvh_global_lock);
3013                 m->md.pv_flags &= ~PV_TABLE_REF;
3014                 rw_wunlock(&pvh_global_lock);
3015                 return (1);
3016         }
3017         return (0);
3018 }
3019
3020 /*
3021  *      pmap_is_modified:
3022  *
3023  *      Return whether or not the specified physical page was modified
3024  *      in any physical maps.
3025  */
3026 boolean_t
3027 pmap_is_modified(vm_page_t m)
3028 {
3029         boolean_t rv;
3030
3031         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
3032             ("pmap_is_modified: page %p is not managed", m));
3033
3034         /*
3035          * If the page is not busied then this check is racy.
3036          */
3037         if (!pmap_page_is_write_mapped(m))
3038                 return (FALSE);
3039
3040         rw_wlock(&pvh_global_lock);
3041         rv = pmap_testbit(m, PTE_D);
3042         rw_wunlock(&pvh_global_lock);
3043         return (rv);
3044 }
3045
3046 /* N/C */
3047
3048 /*
3049  *      pmap_is_prefaultable:
3050  *
3051  *      Return whether or not the specified virtual address is elgible
3052  *      for prefault.
3053  */
3054 boolean_t
3055 pmap_is_prefaultable(pmap_t pmap, vm_offset_t addr)
3056 {
3057         pd_entry_t *pde;
3058         pt_entry_t *pte;
3059         boolean_t rv;
3060
3061         rv = FALSE;
3062         PMAP_LOCK(pmap);
3063         pde = pmap_pde(pmap, addr);
3064         if (pde != NULL && *pde != 0) {
3065                 pte = pmap_pde_to_pte(pde, addr);
3066                 rv = (*pte == 0);
3067         }
3068         PMAP_UNLOCK(pmap);
3069         return (rv);
3070 }
3071
3072 /*
3073  *      Apply the given advice to the specified range of addresses within the
3074  *      given pmap.  Depending on the advice, clear the referenced and/or
3075  *      modified flags in each mapping and set the mapped page's dirty field.
3076  */
3077 void
3078 pmap_advise(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, int advice)
3079 {
3080         pd_entry_t *pde, *pdpe;
3081         pt_entry_t *pte;
3082         vm_offset_t va, va_next;
3083         vm_paddr_t pa;
3084         vm_page_t m;
3085
3086         if (advice != MADV_DONTNEED && advice != MADV_FREE)
3087                 return;
3088         rw_wlock(&pvh_global_lock);
3089         PMAP_LOCK(pmap);
3090         for (; sva < eva; sva = va_next) {
3091                 pdpe = pmap_segmap(pmap, sva);
3092 #ifdef __mips_n64
3093                 if (*pdpe == 0) {
3094                         va_next = (sva + NBSEG) & ~SEGMASK;
3095                         if (va_next < sva)
3096                                 va_next = eva;
3097                         continue;
3098                 }
3099 #endif
3100                 va_next = (sva + NBPDR) & ~PDRMASK;
3101                 if (va_next < sva)
3102                         va_next = eva;
3103
3104                 pde = pmap_pdpe_to_pde(pdpe, sva);
3105                 if (*pde == NULL)
3106                         continue;
3107
3108                 /*
3109                  * Limit our scan to either the end of the va represented
3110                  * by the current page table page, or to the end of the
3111                  * range being write protected.
3112                  */
3113                 if (va_next > eva)
3114                         va_next = eva;
3115
3116                 va = va_next;
3117                 for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
3118                     sva += PAGE_SIZE) {
3119                         if (!pte_test(pte, PTE_MANAGED | PTE_V)) {
3120                                 if (va != va_next) {
3121                                         pmap_invalidate_range(pmap, va, sva);
3122                                         va = va_next;
3123                                 }
3124                                 continue;
3125                         }
3126                         pa = TLBLO_PTE_TO_PA(*pte);
3127                         m = PHYS_TO_VM_PAGE(pa);
3128                         m->md.pv_flags &= ~PV_TABLE_REF;
3129                         if (pte_test(pte, PTE_D)) {
3130                                 if (advice == MADV_DONTNEED) {
3131                                         /*
3132                                          * Future calls to pmap_is_modified()
3133                                          * can be avoided by making the page
3134                                          * dirty now.
3135                                          */
3136                                         vm_page_dirty(m);
3137                                 } else {
3138                                         pte_clear(pte, PTE_D);
3139                                         if (va == va_next)
3140                                                 va = sva;
3141                                 }
3142                         } else {
3143                                 /*
3144                                  * Unless PTE_D is set, any TLB entries
3145                                  * mapping "sva" don't allow write access, so
3146                                  * they needn't be invalidated.
3147                                  */
3148                                 if (va != va_next) {
3149                                         pmap_invalidate_range(pmap, va, sva);
3150                                         va = va_next;
3151                                 }
3152                         }
3153                 }
3154                 if (va != va_next)
3155                         pmap_invalidate_range(pmap, va, sva);
3156         }
3157         rw_wunlock(&pvh_global_lock);
3158         PMAP_UNLOCK(pmap);
3159 }
3160
3161 /*
3162  *      Clear the modify bits on the specified physical page.
3163  */
3164 void
3165 pmap_clear_modify(vm_page_t m)
3166 {
3167         pmap_t pmap;
3168         pt_entry_t *pte;
3169         pv_entry_t pv;
3170
3171         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
3172             ("pmap_clear_modify: page %p is not managed", m));
3173         vm_page_assert_busied(m);
3174
3175         if (!pmap_page_is_write_mapped(m))
3176                 return;
3177         rw_wlock(&pvh_global_lock);
3178         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
3179                 pmap = PV_PMAP(pv);
3180                 PMAP_LOCK(pmap);
3181                 pte = pmap_pte(pmap, pv->pv_va);
3182                 if (pte_test(pte, PTE_D)) {
3183                         pte_clear(pte, PTE_D);
3184                         pmap_update_page(pmap, pv->pv_va, *pte);
3185                 }
3186                 PMAP_UNLOCK(pmap);
3187         }
3188         rw_wunlock(&pvh_global_lock);
3189 }
3190
3191 /*
3192  *      pmap_is_referenced:
3193  *
3194  *      Return whether or not the specified physical page was referenced
3195  *      in any physical maps.
3196  */
3197 boolean_t
3198 pmap_is_referenced(vm_page_t m)
3199 {
3200
3201         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
3202             ("pmap_is_referenced: page %p is not managed", m));
3203         return ((m->md.pv_flags & PV_TABLE_REF) != 0);
3204 }
3205
3206 /*
3207  * Miscellaneous support routines follow
3208  */
3209
3210 /*
3211  * Map a set of physical memory pages into the kernel virtual
3212  * address space. Return a pointer to where it is mapped. This
3213  * routine is intended to be used for mapping device memory,
3214  * NOT real memory.
3215  *
3216  * Use XKPHYS uncached for 64 bit, and KSEG1 where possible for 32 bit.
3217  */
3218 void *
3219 pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, vm_memattr_t ma)
3220 {
3221         vm_offset_t va, tmpva, offset;
3222
3223         /*
3224          * KSEG1 maps only first 512M of phys address space. For
3225          * pa > 0x20000000 we should make proper mapping * using pmap_kenter.
3226          */
3227         if (MIPS_DIRECT_MAPPABLE(pa + size - 1) && ma == VM_MEMATTR_UNCACHEABLE)
3228                 return ((void *)MIPS_PHYS_TO_DIRECT_UNCACHED(pa));
3229         else {
3230                 offset = pa & PAGE_MASK;
3231                 size = roundup(size + offset, PAGE_SIZE);
3232
3233                 va = kva_alloc(size);
3234                 if (!va)
3235                         panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
3236                 pa = trunc_page(pa);
3237                 for (tmpva = va; size > 0;) {
3238                         pmap_kenter_attr(tmpva, pa, ma);
3239                         size -= PAGE_SIZE;
3240                         tmpva += PAGE_SIZE;
3241                         pa += PAGE_SIZE;
3242                 }
3243         }
3244
3245         return ((void *)(va + offset));
3246 }
3247
3248 void *
3249 pmap_mapdev(vm_paddr_t pa, vm_size_t size)
3250 {
3251         return pmap_mapdev_attr(pa, size, VM_MEMATTR_UNCACHEABLE);
3252 }
3253
3254 void
3255 pmap_unmapdev(vm_offset_t va, vm_size_t size)
3256 {
3257 #ifndef __mips_n64
3258         vm_offset_t base, offset;
3259
3260         /* If the address is within KSEG1 then there is nothing to do */
3261         if (va >= MIPS_KSEG1_START && va <= MIPS_KSEG1_END)
3262                 return;
3263
3264         base = trunc_page(va);
3265         offset = va & PAGE_MASK;
3266         size = roundup(size + offset, PAGE_SIZE);
3267         pmap_qremove(base, atop(size));
3268         kva_free(base, size);
3269 #endif
3270 }
3271
3272 /*
3273  * Perform the pmap work for mincore(2).  If the page is not both referenced and
3274  * modified by this pmap, returns its physical address so that the caller can
3275  * find other mappings.
3276  */
3277 int
3278 pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *pap)
3279 {
3280         pt_entry_t *ptep, pte;
3281         vm_paddr_t pa;
3282         vm_page_t m;
3283         int val;
3284
3285         PMAP_LOCK(pmap);
3286         ptep = pmap_pte(pmap, addr);
3287         pte = (ptep != NULL) ? *ptep : 0;
3288         if (!pte_test(&pte, PTE_V)) {
3289                 PMAP_UNLOCK(pmap);
3290                 return (0);
3291         }
3292         val = MINCORE_INCORE;
3293         if (pte_test(&pte, PTE_D))
3294                 val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER;
3295         pa = TLBLO_PTE_TO_PA(pte);
3296         if (pte_test(&pte, PTE_MANAGED)) {
3297                 /*
3298                  * This may falsely report the given address as
3299                  * MINCORE_REFERENCED.  Unfortunately, due to the lack of
3300                  * per-PTE reference information, it is impossible to
3301                  * determine if the address is MINCORE_REFERENCED.
3302                  */
3303                 m = PHYS_TO_VM_PAGE(pa);
3304                 if ((m->a.flags & PGA_REFERENCED) != 0)
3305                         val |= MINCORE_REFERENCED | MINCORE_REFERENCED_OTHER;
3306         }
3307         if ((val & (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER)) !=
3308             (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER) &&
3309             pte_test(&pte, PTE_MANAGED)) {
3310                 *pap = pa;
3311         }
3312         PMAP_UNLOCK(pmap);
3313         return (val);
3314 }
3315
3316 void
3317 pmap_activate(struct thread *td)
3318 {
3319         pmap_t pmap, oldpmap;
3320         struct proc *p = td->td_proc;
3321         u_int cpuid;
3322
3323         critical_enter();
3324
3325         pmap = vmspace_pmap(p->p_vmspace);
3326         oldpmap = PCPU_GET(curpmap);
3327         cpuid = PCPU_GET(cpuid);
3328
3329         if (oldpmap)
3330                 CPU_CLR_ATOMIC(cpuid, &oldpmap->pm_active);
3331         CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
3332         pmap_asid_alloc(pmap);
3333         if (td == curthread) {
3334                 PCPU_SET(segbase, pmap->pm_segtab);
3335                 mips_wr_entryhi(pmap->pm_asid[cpuid].asid);
3336         }
3337
3338         PCPU_SET(curpmap, pmap);
3339         critical_exit();
3340 }
3341
3342 static void
3343 pmap_sync_icache_one(void *arg __unused)
3344 {
3345
3346         mips_icache_sync_all();
3347         mips_dcache_wbinv_all();
3348 }
3349
3350 void
3351 pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz)
3352 {
3353
3354         smp_rendezvous(NULL, pmap_sync_icache_one, NULL, NULL);
3355 }
3356
3357 /*
3358  *      Increase the starting virtual address of the given mapping if a
3359  *      different alignment might result in more superpage mappings.
3360  */
3361 void
3362 pmap_align_superpage(vm_object_t object, vm_ooffset_t offset,
3363     vm_offset_t *addr, vm_size_t size)
3364 {
3365         vm_offset_t superpage_offset;
3366
3367         if (size < PDRSIZE)
3368                 return;
3369         if (object != NULL && (object->flags & OBJ_COLORED) != 0)
3370                 offset += ptoa(object->pg_color);
3371         superpage_offset = offset & PDRMASK;
3372         if (size - ((PDRSIZE - superpage_offset) & PDRMASK) < PDRSIZE ||
3373             (*addr & PDRMASK) == superpage_offset)
3374                 return;
3375         if ((*addr & PDRMASK) < superpage_offset)
3376                 *addr = (*addr & ~PDRMASK) + superpage_offset;
3377         else
3378                 *addr = ((*addr + PDRMASK) & ~PDRMASK) + superpage_offset;
3379 }
3380
3381 #ifdef DDB
3382 DB_SHOW_COMMAND(ptable, ddb_pid_dump)
3383 {
3384         pmap_t pmap;
3385         struct thread *td = NULL;
3386         struct proc *p;
3387         int i, j, k;
3388         vm_paddr_t pa;
3389         vm_offset_t va;
3390
3391         if (have_addr) {
3392                 td = db_lookup_thread(addr, true);
3393                 if (td == NULL) {
3394                         db_printf("Invalid pid or tid");
3395                         return;
3396                 }
3397                 p = td->td_proc;
3398                 if (p->p_vmspace == NULL) {
3399                         db_printf("No vmspace for process");
3400                         return;
3401                 }
3402                         pmap = vmspace_pmap(p->p_vmspace);
3403         } else
3404                 pmap = kernel_pmap;
3405
3406         db_printf("pmap:%p segtab:%p asid:%x generation:%x\n",
3407             pmap, pmap->pm_segtab, pmap->pm_asid[0].asid,
3408             pmap->pm_asid[0].gen);
3409         for (i = 0; i < NPDEPG; i++) {
3410                 pd_entry_t *pdpe;
3411                 pt_entry_t *pde;
3412                 pt_entry_t pte;
3413
3414                 pdpe = (pd_entry_t *)pmap->pm_segtab[i];
3415                 if (pdpe == NULL)
3416                         continue;
3417                 db_printf("[%4d] %p\n", i, pdpe);
3418 #ifdef __mips_n64
3419                 for (j = 0; j < NPDEPG; j++) {
3420                         pde = (pt_entry_t *)pdpe[j];
3421                         if (pde == NULL)
3422                                 continue;
3423                         db_printf("\t[%4d] %p\n", j, pde);
3424 #else
3425                 {
3426                         j = 0;
3427                         pde =  (pt_entry_t *)pdpe;
3428 #endif
3429                         for (k = 0; k < NPTEPG; k++) {
3430                                 pte = pde[k];
3431                                 if (pte == 0 || !pte_test(&pte, PTE_V))
3432                                         continue;
3433                                 pa = TLBLO_PTE_TO_PA(pte);
3434                                 va = ((u_long)i << SEGSHIFT) | (j << PDRSHIFT) | (k << PAGE_SHIFT);
3435                                 db_printf("\t\t[%04d] va: %p pte: %8jx pa:%jx\n",
3436                                        k, (void *)va, (uintmax_t)pte, (uintmax_t)pa);
3437                         }
3438                 }
3439         }
3440 }
3441 #endif
3442
3443 /*
3444  * Allocate TLB address space tag (called ASID or TLBPID) and return it.
3445  * It takes almost as much or more time to search the TLB for a
3446  * specific ASID and flush those entries as it does to flush the entire TLB.
3447  * Therefore, when we allocate a new ASID, we just take the next number. When
3448  * we run out of numbers, we flush the TLB, increment the generation count
3449  * and start over. ASID zero is reserved for kernel use.
3450  */
3451 static void
3452 pmap_asid_alloc(pmap)
3453         pmap_t pmap;
3454 {
3455         if (pmap->pm_asid[PCPU_GET(cpuid)].asid != PMAP_ASID_RESERVED &&
3456             pmap->pm_asid[PCPU_GET(cpuid)].gen == PCPU_GET(asid_generation));
3457         else {
3458                 if (PCPU_GET(next_asid) == pmap_max_asid) {
3459                         tlb_invalidate_all_user(NULL);
3460                         PCPU_SET(asid_generation,
3461                             (PCPU_GET(asid_generation) + 1) & ASIDGEN_MASK);
3462                         if (PCPU_GET(asid_generation) == 0) {
3463                                 PCPU_SET(asid_generation, 1);
3464                         }
3465                         PCPU_SET(next_asid, 1); /* 0 means invalid */
3466                 }
3467                 pmap->pm_asid[PCPU_GET(cpuid)].asid = PCPU_GET(next_asid);
3468                 pmap->pm_asid[PCPU_GET(cpuid)].gen = PCPU_GET(asid_generation);
3469                 PCPU_SET(next_asid, PCPU_GET(next_asid) + 1);
3470         }
3471 }
3472
3473 static pt_entry_t
3474 init_pte_prot(vm_page_t m, vm_prot_t access, vm_prot_t prot)
3475 {
3476         pt_entry_t rw;
3477
3478         if (!(prot & VM_PROT_WRITE))
3479                 rw = PTE_V | PTE_RO;
3480         else if ((m->oflags & VPO_UNMANAGED) == 0) {
3481                 if ((access & VM_PROT_WRITE) != 0)
3482                         rw = PTE_V | PTE_D;
3483                 else
3484                         rw = PTE_V;
3485         } else
3486                 /* Needn't emulate a modified bit for unmanaged pages. */
3487                 rw = PTE_V | PTE_D;
3488         return (rw);
3489 }
3490
3491 /*
3492  * pmap_emulate_modified : do dirty bit emulation
3493  *
3494  * On SMP, update just the local TLB, other CPUs will update their
3495  * TLBs from PTE lazily, if they get the exception.
3496  * Returns 0 in case of sucess, 1 if the page is read only and we
3497  * need to fault.
3498  */
3499 int
3500 pmap_emulate_modified(pmap_t pmap, vm_offset_t va)
3501 {
3502         pt_entry_t *pte;
3503
3504         PMAP_LOCK(pmap);
3505         pte = pmap_pte(pmap, va);
3506
3507         /*
3508          * It is possible that some other CPU or thread changed the pmap while
3509          * we weren't looking; in the SMP case, this is readily apparent, but
3510          * it can even happen in the UP case, because we may have been blocked
3511          * on PMAP_LOCK(pmap) above while someone changed this out from
3512          * underneath us.
3513          */
3514
3515         if (pte == NULL) {
3516                 /*
3517                  * This PTE's PTP (or one of its ancestors) has been reclaimed;
3518                  * trigger a full fault to reconstruct it via pmap_enter.
3519                  */
3520                 PMAP_UNLOCK(pmap);
3521                 return (1);
3522         }
3523
3524         if (!pte_test(pte, PTE_V)) {
3525                 /*
3526                  * This PTE is no longer valid; the other thread or other
3527                  * processor must have arranged for our TLB to no longer
3528                  * have this entry, possibly by IPI, so no tlb_update is
3529                  * required.  Fall out of the fast path and go take a
3530                  * general fault before retrying the instruction (or taking
3531                  * a signal).
3532                  */
3533                 PMAP_UNLOCK(pmap);
3534                 return (1);
3535         }
3536
3537         if (pte_test(pte, PTE_D)) {
3538                 /*
3539                  * This PTE is valid and has the PTE_D bit asserted; since
3540                  * this is an increase in permission, we may have been expected
3541                  * to update the TLB lazily.  Do so here and return, on the
3542                  * fast path, to retry the instruction.
3543                  */
3544                 tlb_update(pmap, va, *pte);
3545                 PMAP_UNLOCK(pmap);
3546                 return (0);
3547         }
3548
3549         if (pte_test(pte, PTE_RO)) {
3550                 /*
3551                  * This PTE is valid, not dirty, and read-only.  Go take a
3552                  * full fault (most likely to upgrade this part of the address
3553                  * space to writeable).
3554                  */
3555                 PMAP_UNLOCK(pmap);
3556                 return (1);
3557         }
3558
3559         if (!pte_test(pte, PTE_MANAGED))
3560                 panic("pmap_emulate_modified: unmanaged page");
3561
3562         /*
3563          * PTE is valid, managed, not dirty, and not read-only.  Set PTE_D
3564          * and eagerly update the local TLB, returning on the fast path.
3565          */
3566
3567         pte_set(pte, PTE_D);
3568         tlb_update(pmap, va, *pte);
3569         PMAP_UNLOCK(pmap);
3570
3571         return (0);
3572 }
3573
3574 /*
3575  *      Routine:        pmap_kextract
3576  *      Function:
3577  *              Extract the physical page address associated
3578  *              virtual address.
3579  */
3580 vm_paddr_t
3581 pmap_kextract(vm_offset_t va)
3582 {
3583         int mapped;
3584
3585         /*
3586          * First, the direct-mapped regions.
3587          */
3588 #if defined(__mips_n64)
3589         if (va >= MIPS_XKPHYS_START && va < MIPS_XKPHYS_END)
3590                 return (MIPS_XKPHYS_TO_PHYS(va));
3591 #endif
3592         if (va >= MIPS_KSEG0_START && va < MIPS_KSEG0_END)
3593                 return (MIPS_KSEG0_TO_PHYS(va));
3594
3595         if (va >= MIPS_KSEG1_START && va < MIPS_KSEG1_END)
3596                 return (MIPS_KSEG1_TO_PHYS(va));
3597
3598         /*
3599          * User virtual addresses.
3600          */
3601         if (va < VM_MAXUSER_ADDRESS) {
3602                 pt_entry_t *ptep;
3603
3604                 if (curproc && curproc->p_vmspace) {
3605                         ptep = pmap_pte(&curproc->p_vmspace->vm_pmap, va);
3606                         if (ptep) {
3607                                 return (TLBLO_PTE_TO_PA(*ptep) |
3608                                     (va & PAGE_MASK));
3609                         }
3610                         return (0);
3611                 }
3612         }
3613
3614         /*
3615          * Should be kernel virtual here, otherwise fail
3616          */
3617         mapped = (va >= MIPS_KSEG2_START || va < MIPS_KSEG2_END);
3618 #if defined(__mips_n64)
3619         mapped = mapped || (va >= MIPS_XKSEG_START || va < MIPS_XKSEG_END);
3620 #endif
3621         /*
3622          * Kernel virtual.
3623          */
3624
3625         if (mapped) {
3626                 pt_entry_t *ptep;
3627
3628                 /* Is the kernel pmap initialized? */
3629                 if (!CPU_EMPTY(&kernel_pmap->pm_active)) {
3630                         /* It's inside the virtual address range */
3631                         ptep = pmap_pte(kernel_pmap, va);
3632                         if (ptep) {
3633                                 return (TLBLO_PTE_TO_PA(*ptep) |
3634                                     (va & PAGE_MASK));
3635                         }
3636                 }
3637                 return (0);
3638         }
3639
3640         panic("%s for unknown address space %p.", __func__, (void *)va);
3641 }
3642
3643
3644 void
3645 pmap_flush_pvcache(vm_page_t m)
3646 {
3647         pv_entry_t pv;
3648
3649         if (m != NULL) {
3650                 for (pv = TAILQ_FIRST(&m->md.pv_list); pv;
3651                     pv = TAILQ_NEXT(pv, pv_list)) {
3652                         mips_dcache_wbinv_range_index(pv->pv_va, PAGE_SIZE);
3653                 }
3654         }
3655 }
3656
3657 void
3658 pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
3659 {
3660
3661         /*
3662          * It appears that this function can only be called before any mappings
3663          * for the page are established.  If this ever changes, this code will
3664          * need to walk the pv_list and make each of the existing mappings
3665          * uncacheable, being careful to sync caches and PTEs (and maybe
3666          * invalidate TLB?) for any current mapping it modifies.
3667          */
3668         if (TAILQ_FIRST(&m->md.pv_list) != NULL)
3669                 panic("Can't change memattr on page with existing mappings");
3670
3671         /* Clean memattr portion of pv_flags */
3672         m->md.pv_flags &= ~PV_MEMATTR_MASK;
3673         m->md.pv_flags |= (ma << PV_MEMATTR_SHIFT) & PV_MEMATTR_MASK;
3674 }
3675
3676 static __inline void
3677 pmap_pte_attr(pt_entry_t *pte, vm_memattr_t ma)
3678 {
3679         u_int npte;
3680
3681         npte = *(u_int *)pte;
3682         npte &= ~PTE_C_MASK;
3683         npte |= PTE_C(ma);
3684         *pte = npte;
3685 }
3686
3687 int
3688 pmap_change_attr(vm_offset_t sva, vm_size_t size, vm_memattr_t ma)
3689 {
3690         pd_entry_t *pde, *pdpe;
3691         pt_entry_t *pte;
3692         vm_offset_t ova, eva, va, va_next;
3693         pmap_t pmap;
3694
3695         ova = sva;
3696         eva = sva + size;
3697         if (eva < sva)
3698                 return (EINVAL);
3699
3700         pmap = kernel_pmap;
3701         PMAP_LOCK(pmap);
3702
3703         for (; sva < eva; sva = va_next) {
3704                 pdpe = pmap_segmap(pmap, sva);
3705 #ifdef __mips_n64
3706                 if (*pdpe == 0) {
3707                         va_next = (sva + NBSEG) & ~SEGMASK;
3708                         if (va_next < sva)
3709                                 va_next = eva;
3710                         continue;
3711                 }
3712 #endif
3713                 va_next = (sva + NBPDR) & ~PDRMASK;
3714                 if (va_next < sva)
3715                         va_next = eva;
3716
3717                 pde = pmap_pdpe_to_pde(pdpe, sva);
3718                 if (*pde == NULL)
3719                         continue;
3720
3721                 /*
3722                  * Limit our scan to either the end of the va represented
3723                  * by the current page table page, or to the end of the
3724                  * range being removed.
3725                  */
3726                 if (va_next > eva)
3727                         va_next = eva;
3728
3729                 va = va_next;
3730                 for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
3731                     sva += PAGE_SIZE) {
3732                         if (!pte_test(pte, PTE_V) || pte_cache_bits(pte) == ma) {
3733                                 if (va != va_next) {
3734                                         pmap_invalidate_range(pmap, va, sva);
3735                                         va = va_next;
3736                                 }
3737                                 continue;
3738                         }
3739                         if (va == va_next)
3740                                 va = sva;
3741
3742                         pmap_pte_attr(pte, ma);
3743                 }
3744                 if (va != va_next)
3745                         pmap_invalidate_range(pmap, va, sva);
3746         }
3747         PMAP_UNLOCK(pmap);
3748
3749         /* Flush caches to be in the safe side */
3750         mips_dcache_wbinv_range(ova, size);
3751         return 0;
3752 }
3753
3754 boolean_t
3755 pmap_is_valid_memattr(pmap_t pmap __unused, vm_memattr_t mode)
3756 {
3757
3758         switch (mode) {
3759         case VM_MEMATTR_UNCACHEABLE:
3760         case VM_MEMATTR_WRITE_BACK:
3761 #ifdef MIPS_CCA_WC
3762         case VM_MEMATTR_WRITE_COMBINING:
3763 #endif
3764                 return (TRUE);
3765         default:
3766                 return (FALSE);
3767         }
3768 }