]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/i386/i386/pmap.c
Merge new version of libcxxrt. This brings in three fixes:
[FreeBSD/FreeBSD.git] / sys / i386 / i386 / pmap.c
1 /*-
2  * Copyright (c) 1991 Regents of the University of California.
3  * All rights reserved.
4  * Copyright (c) 1994 John S. Dyson
5  * All rights reserved.
6  * Copyright (c) 1994 David Greenman
7  * All rights reserved.
8  * Copyright (c) 2005-2010 Alan L. Cox <alc@cs.rice.edu>
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. All advertising materials mentioning features or use of this software
24  *    must display the following acknowledgement:
25  *      This product includes software developed by the University of
26  *      California, Berkeley and its contributors.
27  * 4. Neither the name of the University nor the names of its contributors
28  *    may be used to endorse or promote products derived from this software
29  *    without specific prior written permission.
30  *
31  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
32  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
33  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
34  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
35  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
39  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
40  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
41  * SUCH DAMAGE.
42  *
43  *      from:   @(#)pmap.c      7.7 (Berkeley)  5/12/91
44  */
45 /*-
46  * Copyright (c) 2003 Networks Associates Technology, Inc.
47  * All rights reserved.
48  *
49  * This software was developed for the FreeBSD Project by Jake Burkholder,
50  * Safeport Network Services, and Network Associates Laboratories, the
51  * Security Research Division of Network Associates, Inc. under
52  * DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA
53  * CHATS research program.
54  *
55  * Redistribution and use in source and binary forms, with or without
56  * modification, are permitted provided that the following conditions
57  * are met:
58  * 1. Redistributions of source code must retain the above copyright
59  *    notice, this list of conditions and the following disclaimer.
60  * 2. Redistributions in binary form must reproduce the above copyright
61  *    notice, this list of conditions and the following disclaimer in the
62  *    documentation and/or other materials provided with the distribution.
63  *
64  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
65  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
66  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
67  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
68  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
69  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
70  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
71  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
72  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
73  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
74  * SUCH DAMAGE.
75  */
76
77 #include <sys/cdefs.h>
78 __FBSDID("$FreeBSD$");
79
80 /*
81  *      Manages physical address maps.
82  *
83  *      Since the information managed by this module is
84  *      also stored by the logical address mapping module,
85  *      this module may throw away valid virtual-to-physical
86  *      mappings at almost any time.  However, invalidations
87  *      of virtual-to-physical mappings must be done as
88  *      requested.
89  *
90  *      In order to cope with hardware architectures which
91  *      make virtual-to-physical map invalidates expensive,
92  *      this module may delay invalidate or reduced protection
93  *      operations until such time as they are actually
94  *      necessary.  This module is given full information as
95  *      to which processors are currently using which maps,
96  *      and to when physical maps must be made correct.
97  */
98
99 #include "opt_cpu.h"
100 #include "opt_pmap.h"
101 #include "opt_smp.h"
102 #include "opt_xbox.h"
103
104 #include <sys/param.h>
105 #include <sys/systm.h>
106 #include <sys/kernel.h>
107 #include <sys/ktr.h>
108 #include <sys/lock.h>
109 #include <sys/malloc.h>
110 #include <sys/mman.h>
111 #include <sys/msgbuf.h>
112 #include <sys/mutex.h>
113 #include <sys/proc.h>
114 #include <sys/rwlock.h>
115 #include <sys/sf_buf.h>
116 #include <sys/sx.h>
117 #include <sys/vmmeter.h>
118 #include <sys/sched.h>
119 #include <sys/sysctl.h>
120 #ifdef SMP
121 #include <sys/smp.h>
122 #else
123 #include <sys/cpuset.h>
124 #endif
125
126 #include <vm/vm.h>
127 #include <vm/vm_param.h>
128 #include <vm/vm_kern.h>
129 #include <vm/vm_page.h>
130 #include <vm/vm_map.h>
131 #include <vm/vm_object.h>
132 #include <vm/vm_extern.h>
133 #include <vm/vm_pageout.h>
134 #include <vm/vm_pager.h>
135 #include <vm/vm_reserv.h>
136 #include <vm/uma.h>
137
138 #include <machine/cpu.h>
139 #include <machine/cputypes.h>
140 #include <machine/md_var.h>
141 #include <machine/pcb.h>
142 #include <machine/specialreg.h>
143 #ifdef SMP
144 #include <machine/smp.h>
145 #endif
146
147 #ifdef XBOX
148 #include <machine/xbox.h>
149 #endif
150
151 #if !defined(CPU_DISABLE_SSE) && defined(I686_CPU)
152 #define CPU_ENABLE_SSE
153 #endif
154
155 #ifndef PMAP_SHPGPERPROC
156 #define PMAP_SHPGPERPROC 200
157 #endif
158
159 #if !defined(DIAGNOSTIC)
160 #ifdef __GNUC_GNU_INLINE__
161 #define PMAP_INLINE     __attribute__((__gnu_inline__)) inline
162 #else
163 #define PMAP_INLINE     extern inline
164 #endif
165 #else
166 #define PMAP_INLINE
167 #endif
168
169 #ifdef PV_STATS
170 #define PV_STAT(x)      do { x ; } while (0)
171 #else
172 #define PV_STAT(x)      do { } while (0)
173 #endif
174
175 #define pa_index(pa)    ((pa) >> PDRSHIFT)
176 #define pa_to_pvh(pa)   (&pv_table[pa_index(pa)])
177
178 /*
179  * Get PDEs and PTEs for user/kernel address space
180  */
181 #define pmap_pde(m, v)  (&((m)->pm_pdir[(vm_offset_t)(v) >> PDRSHIFT]))
182 #define pdir_pde(m, v) (m[(vm_offset_t)(v) >> PDRSHIFT])
183
184 #define pmap_pde_v(pte)         ((*(int *)pte & PG_V) != 0)
185 #define pmap_pte_w(pte)         ((*(int *)pte & PG_W) != 0)
186 #define pmap_pte_m(pte)         ((*(int *)pte & PG_M) != 0)
187 #define pmap_pte_u(pte)         ((*(int *)pte & PG_A) != 0)
188 #define pmap_pte_v(pte)         ((*(int *)pte & PG_V) != 0)
189
190 #define pmap_pte_set_w(pte, v)  ((v) ? atomic_set_int((u_int *)(pte), PG_W) : \
191     atomic_clear_int((u_int *)(pte), PG_W))
192 #define pmap_pte_set_prot(pte, v) ((*(int *)pte &= ~PG_PROT), (*(int *)pte |= (v)))
193
194 struct pmap kernel_pmap_store;
195 LIST_HEAD(pmaplist, pmap);
196 static struct pmaplist allpmaps;
197 static struct mtx allpmaps_lock;
198
199 vm_offset_t virtual_avail;      /* VA of first avail page (after kernel bss) */
200 vm_offset_t virtual_end;        /* VA of last avail page (end of kernel AS) */
201 int pgeflag = 0;                /* PG_G or-in */
202 int pseflag = 0;                /* PG_PS or-in */
203
204 static int nkpt = NKPT;
205 vm_offset_t kernel_vm_end = KERNBASE + NKPT * NBPDR;
206 extern u_int32_t KERNend;
207 extern u_int32_t KPTphys;
208
209 #ifdef PAE
210 pt_entry_t pg_nx;
211 static uma_zone_t pdptzone;
212 #endif
213
214 static SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters");
215
216 static int pat_works = 1;
217 SYSCTL_INT(_vm_pmap, OID_AUTO, pat_works, CTLFLAG_RD, &pat_works, 1,
218     "Is page attribute table fully functional?");
219
220 static int pg_ps_enabled = 1;
221 SYSCTL_INT(_vm_pmap, OID_AUTO, pg_ps_enabled, CTLFLAG_RDTUN, &pg_ps_enabled, 0,
222     "Are large page mappings enabled?");
223
224 #define PAT_INDEX_SIZE  8
225 static int pat_index[PAT_INDEX_SIZE];   /* cache mode to PAT index conversion */
226
227 static struct rwlock_padalign pvh_global_lock;
228
229 /*
230  * Data for the pv entry allocation mechanism
231  */
232 static TAILQ_HEAD(pch, pv_chunk) pv_chunks = TAILQ_HEAD_INITIALIZER(pv_chunks);
233 static int pv_entry_count = 0, pv_entry_max = 0, pv_entry_high_water = 0;
234 static struct md_page *pv_table;
235 static int shpgperproc = PMAP_SHPGPERPROC;
236
237 struct pv_chunk *pv_chunkbase;          /* KVA block for pv_chunks */
238 int pv_maxchunks;                       /* How many chunks we have KVA for */
239 vm_offset_t pv_vafree;                  /* freelist stored in the PTE */
240
241 /*
242  * All those kernel PT submaps that BSD is so fond of
243  */
244 struct sysmaps {
245         struct  mtx lock;
246         pt_entry_t *CMAP1;
247         pt_entry_t *CMAP2;
248         caddr_t CADDR1;
249         caddr_t CADDR2;
250 };
251 static struct sysmaps sysmaps_pcpu[MAXCPU];
252 pt_entry_t *CMAP1 = 0;
253 static pt_entry_t *CMAP3;
254 static pd_entry_t *KPTD;
255 caddr_t CADDR1 = 0, ptvmmap = 0;
256 static caddr_t CADDR3;
257 struct msgbuf *msgbufp = 0;
258
259 /*
260  * Crashdump maps.
261  */
262 static caddr_t crashdumpmap;
263
264 static pt_entry_t *PMAP1 = 0, *PMAP2;
265 static pt_entry_t *PADDR1 = 0, *PADDR2;
266 #ifdef SMP
267 static int PMAP1cpu;
268 static int PMAP1changedcpu;
269 SYSCTL_INT(_debug, OID_AUTO, PMAP1changedcpu, CTLFLAG_RD, 
270            &PMAP1changedcpu, 0,
271            "Number of times pmap_pte_quick changed CPU with same PMAP1");
272 #endif
273 static int PMAP1changed;
274 SYSCTL_INT(_debug, OID_AUTO, PMAP1changed, CTLFLAG_RD, 
275            &PMAP1changed, 0,
276            "Number of times pmap_pte_quick changed PMAP1");
277 static int PMAP1unchanged;
278 SYSCTL_INT(_debug, OID_AUTO, PMAP1unchanged, CTLFLAG_RD, 
279            &PMAP1unchanged, 0,
280            "Number of times pmap_pte_quick didn't change PMAP1");
281 static struct mtx PMAP2mutex;
282
283 static void     free_pv_chunk(struct pv_chunk *pc);
284 static void     free_pv_entry(pmap_t pmap, pv_entry_t pv);
285 static pv_entry_t get_pv_entry(pmap_t pmap, boolean_t try);
286 static void     pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa);
287 static boolean_t pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa);
288 static void     pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa);
289 static void     pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va);
290 static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap,
291                     vm_offset_t va);
292 static int      pmap_pvh_wired_mappings(struct md_page *pvh, int count);
293
294 static boolean_t pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va);
295 static boolean_t pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m,
296     vm_prot_t prot);
297 static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va,
298     vm_page_t m, vm_prot_t prot, vm_page_t mpte);
299 static void pmap_flush_page(vm_page_t m);
300 static void pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte);
301 static void pmap_fill_ptp(pt_entry_t *firstpte, pt_entry_t newpte);
302 static boolean_t pmap_is_modified_pvh(struct md_page *pvh);
303 static boolean_t pmap_is_referenced_pvh(struct md_page *pvh);
304 static void pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode);
305 static void pmap_kenter_pde(vm_offset_t va, pd_entry_t newpde);
306 static vm_page_t pmap_lookup_pt_page(pmap_t pmap, vm_offset_t va);
307 static void pmap_pde_attr(pd_entry_t *pde, int cache_bits);
308 static void pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va);
309 static boolean_t pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva,
310     vm_prot_t prot);
311 static void pmap_pte_attr(pt_entry_t *pte, int cache_bits);
312 static void pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva,
313     vm_page_t *free);
314 static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t sva,
315     vm_page_t *free);
316 static void pmap_remove_pt_page(pmap_t pmap, vm_page_t mpte);
317 static void pmap_remove_page(struct pmap *pmap, vm_offset_t va,
318     vm_page_t *free);
319 static void pmap_remove_entry(struct pmap *pmap, vm_page_t m,
320                                         vm_offset_t va);
321 static void pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m);
322 static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va,
323     vm_page_t m);
324 static void pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde,
325     pd_entry_t newpde);
326 static void pmap_update_pde_invalidate(vm_offset_t va, pd_entry_t newpde);
327
328 static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags);
329
330 static vm_page_t _pmap_allocpte(pmap_t pmap, u_int ptepindex, int flags);
331 static void _pmap_unwire_ptp(pmap_t pmap, vm_page_t m, vm_page_t *free);
332 static pt_entry_t *pmap_pte_quick(pmap_t pmap, vm_offset_t va);
333 static void pmap_pte_release(pt_entry_t *pte);
334 static int pmap_unuse_pt(pmap_t, vm_offset_t, vm_page_t *);
335 #ifdef PAE
336 static void *pmap_pdpt_allocf(uma_zone_t zone, int bytes, u_int8_t *flags, int wait);
337 #endif
338 static void pmap_set_pg(void);
339
340 static __inline void pagezero(void *page);
341
342 CTASSERT(1 << PDESHIFT == sizeof(pd_entry_t));
343 CTASSERT(1 << PTESHIFT == sizeof(pt_entry_t));
344
345 /*
346  * If you get an error here, then you set KVA_PAGES wrong! See the
347  * description of KVA_PAGES in sys/i386/include/pmap.h. It must be
348  * multiple of 4 for a normal kernel, or a multiple of 8 for a PAE.
349  */
350 CTASSERT(KERNBASE % (1 << 24) == 0);
351
352 /*
353  *      Bootstrap the system enough to run with virtual memory.
354  *
355  *      On the i386 this is called after mapping has already been enabled
356  *      and just syncs the pmap module with what has already been done.
357  *      [We can't call it easily with mapping off since the kernel is not
358  *      mapped with PA == VA, hence we would have to relocate every address
359  *      from the linked base (virtual) address "KERNBASE" to the actual
360  *      (physical) address starting relative to 0]
361  */
362 void
363 pmap_bootstrap(vm_paddr_t firstaddr)
364 {
365         vm_offset_t va;
366         pt_entry_t *pte, *unused;
367         struct sysmaps *sysmaps;
368         int i;
369
370         /*
371          * Initialize the first available kernel virtual address.  However,
372          * using "firstaddr" may waste a few pages of the kernel virtual
373          * address space, because locore may not have mapped every physical
374          * page that it allocated.  Preferably, locore would provide a first
375          * unused virtual address in addition to "firstaddr".
376          */
377         virtual_avail = (vm_offset_t) KERNBASE + firstaddr;
378
379         virtual_end = VM_MAX_KERNEL_ADDRESS;
380
381         /*
382          * Initialize the kernel pmap (which is statically allocated).
383          */
384         PMAP_LOCK_INIT(kernel_pmap);
385         kernel_pmap->pm_pdir = (pd_entry_t *) (KERNBASE + (u_int)IdlePTD);
386 #ifdef PAE
387         kernel_pmap->pm_pdpt = (pdpt_entry_t *) (KERNBASE + (u_int)IdlePDPT);
388 #endif
389         kernel_pmap->pm_root = NULL;
390         CPU_FILL(&kernel_pmap->pm_active);      /* don't allow deactivation */
391         TAILQ_INIT(&kernel_pmap->pm_pvchunk);
392
393         /*
394          * Initialize the global pv list lock.
395          */
396         rw_init(&pvh_global_lock, "pmap pv global");
397
398         LIST_INIT(&allpmaps);
399
400         /*
401          * Request a spin mutex so that changes to allpmaps cannot be
402          * preempted by smp_rendezvous_cpus().  Otherwise,
403          * pmap_update_pde_kernel() could access allpmaps while it is
404          * being changed.
405          */
406         mtx_init(&allpmaps_lock, "allpmaps", NULL, MTX_SPIN);
407         mtx_lock_spin(&allpmaps_lock);
408         LIST_INSERT_HEAD(&allpmaps, kernel_pmap, pm_list);
409         mtx_unlock_spin(&allpmaps_lock);
410
411         /*
412          * Reserve some special page table entries/VA space for temporary
413          * mapping of pages.
414          */
415 #define SYSMAP(c, p, v, n)      \
416         v = (c)va; va += ((n)*PAGE_SIZE); p = pte; pte += (n);
417
418         va = virtual_avail;
419         pte = vtopte(va);
420
421         /*
422          * CMAP1/CMAP2 are used for zeroing and copying pages.
423          * CMAP3 is used for the idle process page zeroing.
424          */
425         for (i = 0; i < MAXCPU; i++) {
426                 sysmaps = &sysmaps_pcpu[i];
427                 mtx_init(&sysmaps->lock, "SYSMAPS", NULL, MTX_DEF);
428                 SYSMAP(caddr_t, sysmaps->CMAP1, sysmaps->CADDR1, 1)
429                 SYSMAP(caddr_t, sysmaps->CMAP2, sysmaps->CADDR2, 1)
430         }
431         SYSMAP(caddr_t, CMAP1, CADDR1, 1)
432         SYSMAP(caddr_t, CMAP3, CADDR3, 1)
433
434         /*
435          * Crashdump maps.
436          */
437         SYSMAP(caddr_t, unused, crashdumpmap, MAXDUMPPGS)
438
439         /*
440          * ptvmmap is used for reading arbitrary physical pages via /dev/mem.
441          */
442         SYSMAP(caddr_t, unused, ptvmmap, 1)
443
444         /*
445          * msgbufp is used to map the system message buffer.
446          */
447         SYSMAP(struct msgbuf *, unused, msgbufp, atop(round_page(msgbufsize)))
448
449         /*
450          * KPTmap is used by pmap_kextract().
451          *
452          * KPTmap is first initialized by locore.  However, that initial
453          * KPTmap can only support NKPT page table pages.  Here, a larger
454          * KPTmap is created that can support KVA_PAGES page table pages.
455          */
456         SYSMAP(pt_entry_t *, KPTD, KPTmap, KVA_PAGES)
457
458         for (i = 0; i < NKPT; i++)
459                 KPTD[i] = (KPTphys + (i << PAGE_SHIFT)) | pgeflag | PG_RW | PG_V;
460
461         /*
462          * Adjust the start of the KPTD and KPTmap so that the implementation
463          * of pmap_kextract() and pmap_growkernel() can be made simpler.
464          */
465         KPTD -= KPTDI;
466         KPTmap -= i386_btop(KPTDI << PDRSHIFT);
467
468         /*
469          * PADDR1 and PADDR2 are used by pmap_pte_quick() and pmap_pte(),
470          * respectively.
471          */
472         SYSMAP(pt_entry_t *, PMAP1, PADDR1, 1)
473         SYSMAP(pt_entry_t *, PMAP2, PADDR2, 1)
474
475         mtx_init(&PMAP2mutex, "PMAP2", NULL, MTX_DEF);
476
477         virtual_avail = va;
478
479         /*
480          * Leave in place an identity mapping (virt == phys) for the low 1 MB
481          * physical memory region that is used by the ACPI wakeup code.  This
482          * mapping must not have PG_G set. 
483          */
484 #ifdef XBOX
485         /* FIXME: This is gross, but needed for the XBOX. Since we are in such
486          * an early stadium, we cannot yet neatly map video memory ... :-(
487          * Better fixes are very welcome! */
488         if (!arch_i386_is_xbox)
489 #endif
490         for (i = 1; i < NKPT; i++)
491                 PTD[i] = 0;
492
493         /* Initialize the PAT MSR if present. */
494         pmap_init_pat();
495
496         /* Turn on PG_G on kernel page(s) */
497         pmap_set_pg();
498 }
499
500 /*
501  * Setup the PAT MSR.
502  */
503 void
504 pmap_init_pat(void)
505 {
506         int pat_table[PAT_INDEX_SIZE];
507         uint64_t pat_msr;
508         u_long cr0, cr4;
509         int i;
510
511         /* Set default PAT index table. */
512         for (i = 0; i < PAT_INDEX_SIZE; i++)
513                 pat_table[i] = -1;
514         pat_table[PAT_WRITE_BACK] = 0;
515         pat_table[PAT_WRITE_THROUGH] = 1;
516         pat_table[PAT_UNCACHEABLE] = 3;
517         pat_table[PAT_WRITE_COMBINING] = 3;
518         pat_table[PAT_WRITE_PROTECTED] = 3;
519         pat_table[PAT_UNCACHED] = 3;
520
521         /* Bail if this CPU doesn't implement PAT. */
522         if ((cpu_feature & CPUID_PAT) == 0) {
523                 for (i = 0; i < PAT_INDEX_SIZE; i++)
524                         pat_index[i] = pat_table[i];
525                 pat_works = 0;
526                 return;
527         }
528
529         /*
530          * Due to some Intel errata, we can only safely use the lower 4
531          * PAT entries.
532          *
533          *   Intel Pentium III Processor Specification Update
534          * Errata E.27 (Upper Four PAT Entries Not Usable With Mode B
535          * or Mode C Paging)
536          *
537          *   Intel Pentium IV  Processor Specification Update
538          * Errata N46 (PAT Index MSB May Be Calculated Incorrectly)
539          */
540         if (cpu_vendor_id == CPU_VENDOR_INTEL &&
541             !(CPUID_TO_FAMILY(cpu_id) == 6 && CPUID_TO_MODEL(cpu_id) >= 0xe))
542                 pat_works = 0;
543
544         /* Initialize default PAT entries. */
545         pat_msr = PAT_VALUE(0, PAT_WRITE_BACK) |
546             PAT_VALUE(1, PAT_WRITE_THROUGH) |
547             PAT_VALUE(2, PAT_UNCACHED) |
548             PAT_VALUE(3, PAT_UNCACHEABLE) |
549             PAT_VALUE(4, PAT_WRITE_BACK) |
550             PAT_VALUE(5, PAT_WRITE_THROUGH) |
551             PAT_VALUE(6, PAT_UNCACHED) |
552             PAT_VALUE(7, PAT_UNCACHEABLE);
553
554         if (pat_works) {
555                 /*
556                  * Leave the indices 0-3 at the default of WB, WT, UC-, and UC.
557                  * Program 5 and 6 as WP and WC.
558                  * Leave 4 and 7 as WB and UC.
559                  */
560                 pat_msr &= ~(PAT_MASK(5) | PAT_MASK(6));
561                 pat_msr |= PAT_VALUE(5, PAT_WRITE_PROTECTED) |
562                     PAT_VALUE(6, PAT_WRITE_COMBINING);
563                 pat_table[PAT_UNCACHED] = 2;
564                 pat_table[PAT_WRITE_PROTECTED] = 5;
565                 pat_table[PAT_WRITE_COMBINING] = 6;
566         } else {
567                 /*
568                  * Just replace PAT Index 2 with WC instead of UC-.
569                  */
570                 pat_msr &= ~PAT_MASK(2);
571                 pat_msr |= PAT_VALUE(2, PAT_WRITE_COMBINING);
572                 pat_table[PAT_WRITE_COMBINING] = 2;
573         }
574
575         /* Disable PGE. */
576         cr4 = rcr4();
577         load_cr4(cr4 & ~CR4_PGE);
578
579         /* Disable caches (CD = 1, NW = 0). */
580         cr0 = rcr0();
581         load_cr0((cr0 & ~CR0_NW) | CR0_CD);
582
583         /* Flushes caches and TLBs. */
584         wbinvd();
585         invltlb();
586
587         /* Update PAT and index table. */
588         wrmsr(MSR_PAT, pat_msr);
589         for (i = 0; i < PAT_INDEX_SIZE; i++)
590                 pat_index[i] = pat_table[i];
591
592         /* Flush caches and TLBs again. */
593         wbinvd();
594         invltlb();
595
596         /* Restore caches and PGE. */
597         load_cr0(cr0);
598         load_cr4(cr4);
599 }
600
601 /*
602  * Set PG_G on kernel pages.  Only the BSP calls this when SMP is turned on.
603  */
604 static void
605 pmap_set_pg(void)
606 {
607         pt_entry_t *pte;
608         vm_offset_t va, endva;
609
610         if (pgeflag == 0)
611                 return;
612
613         endva = KERNBASE + KERNend;
614
615         if (pseflag) {
616                 va = KERNBASE + KERNLOAD;
617                 while (va  < endva) {
618                         pdir_pde(PTD, va) |= pgeflag;
619                         invltlb();      /* Play it safe, invltlb() every time */
620                         va += NBPDR;
621                 }
622         } else {
623                 va = (vm_offset_t)btext;
624                 while (va < endva) {
625                         pte = vtopte(va);
626                         if (*pte)
627                                 *pte |= pgeflag;
628                         invltlb();      /* Play it safe, invltlb() every time */
629                         va += PAGE_SIZE;
630                 }
631         }
632 }
633
634 /*
635  * Initialize a vm_page's machine-dependent fields.
636  */
637 void
638 pmap_page_init(vm_page_t m)
639 {
640
641         TAILQ_INIT(&m->md.pv_list);
642         m->md.pat_mode = PAT_WRITE_BACK;
643 }
644
645 #ifdef PAE
646 static void *
647 pmap_pdpt_allocf(uma_zone_t zone, int bytes, u_int8_t *flags, int wait)
648 {
649
650         /* Inform UMA that this allocator uses kernel_map/object. */
651         *flags = UMA_SLAB_KERNEL;
652         return ((void *)kmem_alloc_contig(kernel_map, bytes, wait, 0x0ULL,
653             0xffffffffULL, 1, 0, VM_MEMATTR_DEFAULT));
654 }
655 #endif
656
657 /*
658  * ABuse the pte nodes for unmapped kva to thread a kva freelist through.
659  * Requirements:
660  *  - Must deal with pages in order to ensure that none of the PG_* bits
661  *    are ever set, PG_V in particular.
662  *  - Assumes we can write to ptes without pte_store() atomic ops, even
663  *    on PAE systems.  This should be ok.
664  *  - Assumes nothing will ever test these addresses for 0 to indicate
665  *    no mapping instead of correctly checking PG_V.
666  *  - Assumes a vm_offset_t will fit in a pte (true for i386).
667  * Because PG_V is never set, there can be no mappings to invalidate.
668  */
669 static vm_offset_t
670 pmap_ptelist_alloc(vm_offset_t *head)
671 {
672         pt_entry_t *pte;
673         vm_offset_t va;
674
675         va = *head;
676         if (va == 0)
677                 return (va);    /* Out of memory */
678         pte = vtopte(va);
679         *head = *pte;
680         if (*head & PG_V)
681                 panic("pmap_ptelist_alloc: va with PG_V set!");
682         *pte = 0;
683         return (va);
684 }
685
686 static void
687 pmap_ptelist_free(vm_offset_t *head, vm_offset_t va)
688 {
689         pt_entry_t *pte;
690
691         if (va & PG_V)
692                 panic("pmap_ptelist_free: freeing va with PG_V set!");
693         pte = vtopte(va);
694         *pte = *head;           /* virtual! PG_V is 0 though */
695         *head = va;
696 }
697
698 static void
699 pmap_ptelist_init(vm_offset_t *head, void *base, int npages)
700 {
701         int i;
702         vm_offset_t va;
703
704         *head = 0;
705         for (i = npages - 1; i >= 0; i--) {
706                 va = (vm_offset_t)base + i * PAGE_SIZE;
707                 pmap_ptelist_free(head, va);
708         }
709 }
710
711
712 /*
713  *      Initialize the pmap module.
714  *      Called by vm_init, to initialize any structures that the pmap
715  *      system needs to map virtual memory.
716  */
717 void
718 pmap_init(void)
719 {
720         vm_page_t mpte;
721         vm_size_t s;
722         int i, pv_npg;
723
724         /*
725          * Initialize the vm page array entries for the kernel pmap's
726          * page table pages.
727          */ 
728         for (i = 0; i < NKPT; i++) {
729                 mpte = PHYS_TO_VM_PAGE(KPTphys + (i << PAGE_SHIFT));
730                 KASSERT(mpte >= vm_page_array &&
731                     mpte < &vm_page_array[vm_page_array_size],
732                     ("pmap_init: page table page is out of range"));
733                 mpte->pindex = i + KPTDI;
734                 mpte->phys_addr = KPTphys + (i << PAGE_SHIFT);
735         }
736
737         /*
738          * Initialize the address space (zone) for the pv entries.  Set a
739          * high water mark so that the system can recover from excessive
740          * numbers of pv entries.
741          */
742         TUNABLE_INT_FETCH("vm.pmap.shpgperproc", &shpgperproc);
743         pv_entry_max = shpgperproc * maxproc + cnt.v_page_count;
744         TUNABLE_INT_FETCH("vm.pmap.pv_entries", &pv_entry_max);
745         pv_entry_max = roundup(pv_entry_max, _NPCPV);
746         pv_entry_high_water = 9 * (pv_entry_max / 10);
747
748         /*
749          * If the kernel is running in a virtual machine on an AMD Family 10h
750          * processor, then it must assume that MCA is enabled by the virtual
751          * machine monitor.
752          */
753         if (vm_guest == VM_GUEST_VM && cpu_vendor_id == CPU_VENDOR_AMD &&
754             CPUID_TO_FAMILY(cpu_id) == 0x10)
755                 workaround_erratum383 = 1;
756
757         /*
758          * Are large page mappings supported and enabled?
759          */
760         TUNABLE_INT_FETCH("vm.pmap.pg_ps_enabled", &pg_ps_enabled);
761         if (pseflag == 0)
762                 pg_ps_enabled = 0;
763         else if (pg_ps_enabled) {
764                 KASSERT(MAXPAGESIZES > 1 && pagesizes[1] == 0,
765                     ("pmap_init: can't assign to pagesizes[1]"));
766                 pagesizes[1] = NBPDR;
767         }
768
769         /*
770          * Calculate the size of the pv head table for superpages.
771          */
772         for (i = 0; phys_avail[i + 1]; i += 2);
773         pv_npg = round_4mpage(phys_avail[(i - 2) + 1]) / NBPDR;
774
775         /*
776          * Allocate memory for the pv head table for superpages.
777          */
778         s = (vm_size_t)(pv_npg * sizeof(struct md_page));
779         s = round_page(s);
780         pv_table = (struct md_page *)kmem_alloc(kernel_map, s);
781         for (i = 0; i < pv_npg; i++)
782                 TAILQ_INIT(&pv_table[i].pv_list);
783
784         pv_maxchunks = MAX(pv_entry_max / _NPCPV, maxproc);
785         pv_chunkbase = (struct pv_chunk *)kmem_alloc_nofault(kernel_map,
786             PAGE_SIZE * pv_maxchunks);
787         if (pv_chunkbase == NULL)
788                 panic("pmap_init: not enough kvm for pv chunks");
789         pmap_ptelist_init(&pv_vafree, pv_chunkbase, pv_maxchunks);
790 #ifdef PAE
791         pdptzone = uma_zcreate("PDPT", NPGPTD * sizeof(pdpt_entry_t), NULL,
792             NULL, NULL, NULL, (NPGPTD * sizeof(pdpt_entry_t)) - 1,
793             UMA_ZONE_VM | UMA_ZONE_NOFREE);
794         uma_zone_set_allocf(pdptzone, pmap_pdpt_allocf);
795 #endif
796 }
797
798
799 SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_max, CTLFLAG_RD, &pv_entry_max, 0,
800         "Max number of PV entries");
801 SYSCTL_INT(_vm_pmap, OID_AUTO, shpgperproc, CTLFLAG_RD, &shpgperproc, 0,
802         "Page share factor per proc");
803
804 static SYSCTL_NODE(_vm_pmap, OID_AUTO, pde, CTLFLAG_RD, 0,
805     "2/4MB page mapping counters");
806
807 static u_long pmap_pde_demotions;
808 SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, demotions, CTLFLAG_RD,
809     &pmap_pde_demotions, 0, "2/4MB page demotions");
810
811 static u_long pmap_pde_mappings;
812 SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, mappings, CTLFLAG_RD,
813     &pmap_pde_mappings, 0, "2/4MB page mappings");
814
815 static u_long pmap_pde_p_failures;
816 SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, p_failures, CTLFLAG_RD,
817     &pmap_pde_p_failures, 0, "2/4MB page promotion failures");
818
819 static u_long pmap_pde_promotions;
820 SYSCTL_ULONG(_vm_pmap_pde, OID_AUTO, promotions, CTLFLAG_RD,
821     &pmap_pde_promotions, 0, "2/4MB page promotions");
822
823 /***************************************************
824  * Low level helper routines.....
825  ***************************************************/
826
827 /*
828  * Determine the appropriate bits to set in a PTE or PDE for a specified
829  * caching mode.
830  */
831 int
832 pmap_cache_bits(int mode, boolean_t is_pde)
833 {
834         int cache_bits, pat_flag, pat_idx;
835
836         if (mode < 0 || mode >= PAT_INDEX_SIZE || pat_index[mode] < 0)
837                 panic("Unknown caching mode %d\n", mode);
838
839         /* The PAT bit is different for PTE's and PDE's. */
840         pat_flag = is_pde ? PG_PDE_PAT : PG_PTE_PAT;
841
842         /* Map the caching mode to a PAT index. */
843         pat_idx = pat_index[mode];
844
845         /* Map the 3-bit index value into the PAT, PCD, and PWT bits. */
846         cache_bits = 0;
847         if (pat_idx & 0x4)
848                 cache_bits |= pat_flag;
849         if (pat_idx & 0x2)
850                 cache_bits |= PG_NC_PCD;
851         if (pat_idx & 0x1)
852                 cache_bits |= PG_NC_PWT;
853         return (cache_bits);
854 }
855
856 /*
857  * The caller is responsible for maintaining TLB consistency.
858  */
859 static void
860 pmap_kenter_pde(vm_offset_t va, pd_entry_t newpde)
861 {
862         pd_entry_t *pde;
863         pmap_t pmap;
864         boolean_t PTD_updated;
865
866         PTD_updated = FALSE;
867         mtx_lock_spin(&allpmaps_lock);
868         LIST_FOREACH(pmap, &allpmaps, pm_list) {
869                 if ((pmap->pm_pdir[PTDPTDI] & PG_FRAME) == (PTDpde[0] &
870                     PG_FRAME))
871                         PTD_updated = TRUE;
872                 pde = pmap_pde(pmap, va);
873                 pde_store(pde, newpde);
874         }
875         mtx_unlock_spin(&allpmaps_lock);
876         KASSERT(PTD_updated,
877             ("pmap_kenter_pde: current page table is not in allpmaps"));
878 }
879
880 /*
881  * After changing the page size for the specified virtual address in the page
882  * table, flush the corresponding entries from the processor's TLB.  Only the
883  * calling processor's TLB is affected.
884  *
885  * The calling thread must be pinned to a processor.
886  */
887 static void
888 pmap_update_pde_invalidate(vm_offset_t va, pd_entry_t newpde)
889 {
890         u_long cr4;
891
892         if ((newpde & PG_PS) == 0)
893                 /* Demotion: flush a specific 2MB page mapping. */
894                 invlpg(va);
895         else if ((newpde & PG_G) == 0)
896                 /*
897                  * Promotion: flush every 4KB page mapping from the TLB
898                  * because there are too many to flush individually.
899                  */
900                 invltlb();
901         else {
902                 /*
903                  * Promotion: flush every 4KB page mapping from the TLB,
904                  * including any global (PG_G) mappings.
905                  */
906                 cr4 = rcr4();
907                 load_cr4(cr4 & ~CR4_PGE);
908                 /*
909                  * Although preemption at this point could be detrimental to
910                  * performance, it would not lead to an error.  PG_G is simply
911                  * ignored if CR4.PGE is clear.  Moreover, in case this block
912                  * is re-entered, the load_cr4() either above or below will
913                  * modify CR4.PGE flushing the TLB.
914                  */
915                 load_cr4(cr4 | CR4_PGE);
916         }
917 }
918 #ifdef SMP
919 /*
920  * For SMP, these functions have to use the IPI mechanism for coherence.
921  *
922  * N.B.: Before calling any of the following TLB invalidation functions,
923  * the calling processor must ensure that all stores updating a non-
924  * kernel page table are globally performed.  Otherwise, another
925  * processor could cache an old, pre-update entry without being
926  * invalidated.  This can happen one of two ways: (1) The pmap becomes
927  * active on another processor after its pm_active field is checked by
928  * one of the following functions but before a store updating the page
929  * table is globally performed. (2) The pmap becomes active on another
930  * processor before its pm_active field is checked but due to
931  * speculative loads one of the following functions stills reads the
932  * pmap as inactive on the other processor.
933  * 
934  * The kernel page table is exempt because its pm_active field is
935  * immutable.  The kernel page table is always active on every
936  * processor.
937  */
938 void
939 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
940 {
941         cpuset_t other_cpus;
942         u_int cpuid;
943
944         sched_pin();
945         if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) {
946                 invlpg(va);
947                 smp_invlpg(va);
948         } else {
949                 cpuid = PCPU_GET(cpuid);
950                 other_cpus = all_cpus;
951                 CPU_CLR(cpuid, &other_cpus);
952                 if (CPU_ISSET(cpuid, &pmap->pm_active))
953                         invlpg(va);
954                 CPU_AND(&other_cpus, &pmap->pm_active);
955                 if (!CPU_EMPTY(&other_cpus))
956                         smp_masked_invlpg(other_cpus, va);
957         }
958         sched_unpin();
959 }
960
961 void
962 pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
963 {
964         cpuset_t other_cpus;
965         vm_offset_t addr;
966         u_int cpuid;
967
968         sched_pin();
969         if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) {
970                 for (addr = sva; addr < eva; addr += PAGE_SIZE)
971                         invlpg(addr);
972                 smp_invlpg_range(sva, eva);
973         } else {
974                 cpuid = PCPU_GET(cpuid);
975                 other_cpus = all_cpus;
976                 CPU_CLR(cpuid, &other_cpus);
977                 if (CPU_ISSET(cpuid, &pmap->pm_active))
978                         for (addr = sva; addr < eva; addr += PAGE_SIZE)
979                                 invlpg(addr);
980                 CPU_AND(&other_cpus, &pmap->pm_active);
981                 if (!CPU_EMPTY(&other_cpus))
982                         smp_masked_invlpg_range(other_cpus, sva, eva);
983         }
984         sched_unpin();
985 }
986
987 void
988 pmap_invalidate_all(pmap_t pmap)
989 {
990         cpuset_t other_cpus;
991         u_int cpuid;
992
993         sched_pin();
994         if (pmap == kernel_pmap || !CPU_CMP(&pmap->pm_active, &all_cpus)) {
995                 invltlb();
996                 smp_invltlb();
997         } else {
998                 cpuid = PCPU_GET(cpuid);
999                 other_cpus = all_cpus;
1000                 CPU_CLR(cpuid, &other_cpus);
1001                 if (CPU_ISSET(cpuid, &pmap->pm_active))
1002                         invltlb();
1003                 CPU_AND(&other_cpus, &pmap->pm_active);
1004                 if (!CPU_EMPTY(&other_cpus))
1005                         smp_masked_invltlb(other_cpus);
1006         }
1007         sched_unpin();
1008 }
1009
1010 void
1011 pmap_invalidate_cache(void)
1012 {
1013
1014         sched_pin();
1015         wbinvd();
1016         smp_cache_flush();
1017         sched_unpin();
1018 }
1019
1020 struct pde_action {
1021         cpuset_t invalidate;    /* processors that invalidate their TLB */
1022         vm_offset_t va;
1023         pd_entry_t *pde;
1024         pd_entry_t newpde;
1025         u_int store;            /* processor that updates the PDE */
1026 };
1027
1028 static void
1029 pmap_update_pde_kernel(void *arg)
1030 {
1031         struct pde_action *act = arg;
1032         pd_entry_t *pde;
1033         pmap_t pmap;
1034
1035         if (act->store == PCPU_GET(cpuid)) {
1036
1037                 /*
1038                  * Elsewhere, this operation requires allpmaps_lock for
1039                  * synchronization.  Here, it does not because it is being
1040                  * performed in the context of an all_cpus rendezvous.
1041                  */
1042                 LIST_FOREACH(pmap, &allpmaps, pm_list) {
1043                         pde = pmap_pde(pmap, act->va);
1044                         pde_store(pde, act->newpde);
1045                 }
1046         }
1047 }
1048
1049 static void
1050 pmap_update_pde_user(void *arg)
1051 {
1052         struct pde_action *act = arg;
1053
1054         if (act->store == PCPU_GET(cpuid))
1055                 pde_store(act->pde, act->newpde);
1056 }
1057
1058 static void
1059 pmap_update_pde_teardown(void *arg)
1060 {
1061         struct pde_action *act = arg;
1062
1063         if (CPU_ISSET(PCPU_GET(cpuid), &act->invalidate))
1064                 pmap_update_pde_invalidate(act->va, act->newpde);
1065 }
1066
1067 /*
1068  * Change the page size for the specified virtual address in a way that
1069  * prevents any possibility of the TLB ever having two entries that map the
1070  * same virtual address using different page sizes.  This is the recommended
1071  * workaround for Erratum 383 on AMD Family 10h processors.  It prevents a
1072  * machine check exception for a TLB state that is improperly diagnosed as a
1073  * hardware error.
1074  */
1075 static void
1076 pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, pd_entry_t newpde)
1077 {
1078         struct pde_action act;
1079         cpuset_t active, other_cpus;
1080         u_int cpuid;
1081
1082         sched_pin();
1083         cpuid = PCPU_GET(cpuid);
1084         other_cpus = all_cpus;
1085         CPU_CLR(cpuid, &other_cpus);
1086         if (pmap == kernel_pmap)
1087                 active = all_cpus;
1088         else
1089                 active = pmap->pm_active;
1090         if (CPU_OVERLAP(&active, &other_cpus)) {
1091                 act.store = cpuid;
1092                 act.invalidate = active;
1093                 act.va = va;
1094                 act.pde = pde;
1095                 act.newpde = newpde;
1096                 CPU_SET(cpuid, &active);
1097                 smp_rendezvous_cpus(active,
1098                     smp_no_rendevous_barrier, pmap == kernel_pmap ?
1099                     pmap_update_pde_kernel : pmap_update_pde_user,
1100                     pmap_update_pde_teardown, &act);
1101         } else {
1102                 if (pmap == kernel_pmap)
1103                         pmap_kenter_pde(va, newpde);
1104                 else
1105                         pde_store(pde, newpde);
1106                 if (CPU_ISSET(cpuid, &active))
1107                         pmap_update_pde_invalidate(va, newpde);
1108         }
1109         sched_unpin();
1110 }
1111 #else /* !SMP */
1112 /*
1113  * Normal, non-SMP, 486+ invalidation functions.
1114  * We inline these within pmap.c for speed.
1115  */
1116 PMAP_INLINE void
1117 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
1118 {
1119
1120         if (pmap == kernel_pmap || !CPU_EMPTY(&pmap->pm_active))
1121                 invlpg(va);
1122 }
1123
1124 PMAP_INLINE void
1125 pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
1126 {
1127         vm_offset_t addr;
1128
1129         if (pmap == kernel_pmap || !CPU_EMPTY(&pmap->pm_active))
1130                 for (addr = sva; addr < eva; addr += PAGE_SIZE)
1131                         invlpg(addr);
1132 }
1133
1134 PMAP_INLINE void
1135 pmap_invalidate_all(pmap_t pmap)
1136 {
1137
1138         if (pmap == kernel_pmap || !CPU_EMPTY(&pmap->pm_active))
1139                 invltlb();
1140 }
1141
1142 PMAP_INLINE void
1143 pmap_invalidate_cache(void)
1144 {
1145
1146         wbinvd();
1147 }
1148
1149 static void
1150 pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, pd_entry_t newpde)
1151 {
1152
1153         if (pmap == kernel_pmap)
1154                 pmap_kenter_pde(va, newpde);
1155         else
1156                 pde_store(pde, newpde);
1157         if (pmap == kernel_pmap || !CPU_EMPTY(&pmap->pm_active))
1158                 pmap_update_pde_invalidate(va, newpde);
1159 }
1160 #endif /* !SMP */
1161
1162 #define PMAP_CLFLUSH_THRESHOLD  (2 * 1024 * 1024)
1163
1164 void
1165 pmap_invalidate_cache_range(vm_offset_t sva, vm_offset_t eva)
1166 {
1167
1168         KASSERT((sva & PAGE_MASK) == 0,
1169             ("pmap_invalidate_cache_range: sva not page-aligned"));
1170         KASSERT((eva & PAGE_MASK) == 0,
1171             ("pmap_invalidate_cache_range: eva not page-aligned"));
1172
1173         if (cpu_feature & CPUID_SS)
1174                 ; /* If "Self Snoop" is supported, do nothing. */
1175         else if ((cpu_feature & CPUID_CLFSH) != 0 &&
1176             eva - sva < PMAP_CLFLUSH_THRESHOLD) {
1177
1178                 /*
1179                  * Otherwise, do per-cache line flush.  Use the mfence
1180                  * instruction to insure that previous stores are
1181                  * included in the write-back.  The processor
1182                  * propagates flush to other processors in the cache
1183                  * coherence domain.
1184                  */
1185                 mfence();
1186                 for (; sva < eva; sva += cpu_clflush_line_size)
1187                         clflush(sva);
1188                 mfence();
1189         } else {
1190
1191                 /*
1192                  * No targeted cache flush methods are supported by CPU,
1193                  * or the supplied range is bigger than 2MB.
1194                  * Globally invalidate cache.
1195                  */
1196                 pmap_invalidate_cache();
1197         }
1198 }
1199
1200 void
1201 pmap_invalidate_cache_pages(vm_page_t *pages, int count)
1202 {
1203         int i;
1204
1205         if (count >= PMAP_CLFLUSH_THRESHOLD / PAGE_SIZE ||
1206             (cpu_feature & CPUID_CLFSH) == 0) {
1207                 pmap_invalidate_cache();
1208         } else {
1209                 for (i = 0; i < count; i++)
1210                         pmap_flush_page(pages[i]);
1211         }
1212 }
1213
1214 /*
1215  * Are we current address space or kernel?  N.B. We return FALSE when
1216  * a pmap's page table is in use because a kernel thread is borrowing
1217  * it.  The borrowed page table can change spontaneously, making any
1218  * dependence on its continued use subject to a race condition.
1219  */
1220 static __inline int
1221 pmap_is_current(pmap_t pmap)
1222 {
1223
1224         return (pmap == kernel_pmap ||
1225             (pmap == vmspace_pmap(curthread->td_proc->p_vmspace) &&
1226             (pmap->pm_pdir[PTDPTDI] & PG_FRAME) == (PTDpde[0] & PG_FRAME)));
1227 }
1228
1229 /*
1230  * If the given pmap is not the current or kernel pmap, the returned pte must
1231  * be released by passing it to pmap_pte_release().
1232  */
1233 pt_entry_t *
1234 pmap_pte(pmap_t pmap, vm_offset_t va)
1235 {
1236         pd_entry_t newpf;
1237         pd_entry_t *pde;
1238
1239         pde = pmap_pde(pmap, va);
1240         if (*pde & PG_PS)
1241                 return (pde);
1242         if (*pde != 0) {
1243                 /* are we current address space or kernel? */
1244                 if (pmap_is_current(pmap))
1245                         return (vtopte(va));
1246                 mtx_lock(&PMAP2mutex);
1247                 newpf = *pde & PG_FRAME;
1248                 if ((*PMAP2 & PG_FRAME) != newpf) {
1249                         *PMAP2 = newpf | PG_RW | PG_V | PG_A | PG_M;
1250                         pmap_invalidate_page(kernel_pmap, (vm_offset_t)PADDR2);
1251                 }
1252                 return (PADDR2 + (i386_btop(va) & (NPTEPG - 1)));
1253         }
1254         return (NULL);
1255 }
1256
1257 /*
1258  * Releases a pte that was obtained from pmap_pte().  Be prepared for the pte
1259  * being NULL.
1260  */
1261 static __inline void
1262 pmap_pte_release(pt_entry_t *pte)
1263 {
1264
1265         if ((pt_entry_t *)((vm_offset_t)pte & ~PAGE_MASK) == PADDR2)
1266                 mtx_unlock(&PMAP2mutex);
1267 }
1268
1269 static __inline void
1270 invlcaddr(void *caddr)
1271 {
1272
1273         invlpg((u_int)caddr);
1274 }
1275
1276 /*
1277  * Super fast pmap_pte routine best used when scanning
1278  * the pv lists.  This eliminates many coarse-grained
1279  * invltlb calls.  Note that many of the pv list
1280  * scans are across different pmaps.  It is very wasteful
1281  * to do an entire invltlb for checking a single mapping.
1282  *
1283  * If the given pmap is not the current pmap, pvh_global_lock
1284  * must be held and curthread pinned to a CPU.
1285  */
1286 static pt_entry_t *
1287 pmap_pte_quick(pmap_t pmap, vm_offset_t va)
1288 {
1289         pd_entry_t newpf;
1290         pd_entry_t *pde;
1291
1292         pde = pmap_pde(pmap, va);
1293         if (*pde & PG_PS)
1294                 return (pde);
1295         if (*pde != 0) {
1296                 /* are we current address space or kernel? */
1297                 if (pmap_is_current(pmap))
1298                         return (vtopte(va));
1299                 rw_assert(&pvh_global_lock, RA_WLOCKED);
1300                 KASSERT(curthread->td_pinned > 0, ("curthread not pinned"));
1301                 newpf = *pde & PG_FRAME;
1302                 if ((*PMAP1 & PG_FRAME) != newpf) {
1303                         *PMAP1 = newpf | PG_RW | PG_V | PG_A | PG_M;
1304 #ifdef SMP
1305                         PMAP1cpu = PCPU_GET(cpuid);
1306 #endif
1307                         invlcaddr(PADDR1);
1308                         PMAP1changed++;
1309                 } else
1310 #ifdef SMP
1311                 if (PMAP1cpu != PCPU_GET(cpuid)) {
1312                         PMAP1cpu = PCPU_GET(cpuid);
1313                         invlcaddr(PADDR1);
1314                         PMAP1changedcpu++;
1315                 } else
1316 #endif
1317                         PMAP1unchanged++;
1318                 return (PADDR1 + (i386_btop(va) & (NPTEPG - 1)));
1319         }
1320         return (0);
1321 }
1322
1323 /*
1324  *      Routine:        pmap_extract
1325  *      Function:
1326  *              Extract the physical page address associated
1327  *              with the given map/virtual_address pair.
1328  */
1329 vm_paddr_t 
1330 pmap_extract(pmap_t pmap, vm_offset_t va)
1331 {
1332         vm_paddr_t rtval;
1333         pt_entry_t *pte;
1334         pd_entry_t pde;
1335
1336         rtval = 0;
1337         PMAP_LOCK(pmap);
1338         pde = pmap->pm_pdir[va >> PDRSHIFT];
1339         if (pde != 0) {
1340                 if ((pde & PG_PS) != 0)
1341                         rtval = (pde & PG_PS_FRAME) | (va & PDRMASK);
1342                 else {
1343                         pte = pmap_pte(pmap, va);
1344                         rtval = (*pte & PG_FRAME) | (va & PAGE_MASK);
1345                         pmap_pte_release(pte);
1346                 }
1347         }
1348         PMAP_UNLOCK(pmap);
1349         return (rtval);
1350 }
1351
1352 /*
1353  *      Routine:        pmap_extract_and_hold
1354  *      Function:
1355  *              Atomically extract and hold the physical page
1356  *              with the given pmap and virtual address pair
1357  *              if that mapping permits the given protection.
1358  */
1359 vm_page_t
1360 pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
1361 {
1362         pd_entry_t pde;
1363         pt_entry_t pte, *ptep;
1364         vm_page_t m;
1365         vm_paddr_t pa;
1366
1367         pa = 0;
1368         m = NULL;
1369         PMAP_LOCK(pmap);
1370 retry:
1371         pde = *pmap_pde(pmap, va);
1372         if (pde != 0) {
1373                 if (pde & PG_PS) {
1374                         if ((pde & PG_RW) || (prot & VM_PROT_WRITE) == 0) {
1375                                 if (vm_page_pa_tryrelock(pmap, (pde &
1376                                     PG_PS_FRAME) | (va & PDRMASK), &pa))
1377                                         goto retry;
1378                                 m = PHYS_TO_VM_PAGE((pde & PG_PS_FRAME) |
1379                                     (va & PDRMASK));
1380                                 vm_page_hold(m);
1381                         }
1382                 } else {
1383                         ptep = pmap_pte(pmap, va);
1384                         pte = *ptep;
1385                         pmap_pte_release(ptep);
1386                         if (pte != 0 &&
1387                             ((pte & PG_RW) || (prot & VM_PROT_WRITE) == 0)) {
1388                                 if (vm_page_pa_tryrelock(pmap, pte & PG_FRAME,
1389                                     &pa))
1390                                         goto retry;
1391                                 m = PHYS_TO_VM_PAGE(pte & PG_FRAME);
1392                                 vm_page_hold(m);
1393                         }
1394                 }
1395         }
1396         PA_UNLOCK_COND(pa);
1397         PMAP_UNLOCK(pmap);
1398         return (m);
1399 }
1400
1401 /***************************************************
1402  * Low level mapping routines.....
1403  ***************************************************/
1404
1405 /*
1406  * Add a wired page to the kva.
1407  * Note: not SMP coherent.
1408  *
1409  * This function may be used before pmap_bootstrap() is called.
1410  */
1411 PMAP_INLINE void 
1412 pmap_kenter(vm_offset_t va, vm_paddr_t pa)
1413 {
1414         pt_entry_t *pte;
1415
1416         pte = vtopte(va);
1417         pte_store(pte, pa | PG_RW | PG_V | pgeflag);
1418 }
1419
1420 static __inline void
1421 pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode)
1422 {
1423         pt_entry_t *pte;
1424
1425         pte = vtopte(va);
1426         pte_store(pte, pa | PG_RW | PG_V | pgeflag | pmap_cache_bits(mode, 0));
1427 }
1428
1429 /*
1430  * Remove a page from the kernel pagetables.
1431  * Note: not SMP coherent.
1432  *
1433  * This function may be used before pmap_bootstrap() is called.
1434  */
1435 PMAP_INLINE void
1436 pmap_kremove(vm_offset_t va)
1437 {
1438         pt_entry_t *pte;
1439
1440         pte = vtopte(va);
1441         pte_clear(pte);
1442 }
1443
1444 /*
1445  *      Used to map a range of physical addresses into kernel
1446  *      virtual address space.
1447  *
1448  *      The value passed in '*virt' is a suggested virtual address for
1449  *      the mapping. Architectures which can support a direct-mapped
1450  *      physical to virtual region can return the appropriate address
1451  *      within that region, leaving '*virt' unchanged. Other
1452  *      architectures should map the pages starting at '*virt' and
1453  *      update '*virt' with the first usable address after the mapped
1454  *      region.
1455  */
1456 vm_offset_t
1457 pmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end, int prot)
1458 {
1459         vm_offset_t va, sva;
1460         vm_paddr_t superpage_offset;
1461         pd_entry_t newpde;
1462
1463         va = *virt;
1464         /*
1465          * Does the physical address range's size and alignment permit at
1466          * least one superpage mapping to be created?
1467          */ 
1468         superpage_offset = start & PDRMASK;
1469         if ((end - start) - ((NBPDR - superpage_offset) & PDRMASK) >= NBPDR) {
1470                 /*
1471                  * Increase the starting virtual address so that its alignment
1472                  * does not preclude the use of superpage mappings.
1473                  */
1474                 if ((va & PDRMASK) < superpage_offset)
1475                         va = (va & ~PDRMASK) + superpage_offset;
1476                 else if ((va & PDRMASK) > superpage_offset)
1477                         va = ((va + PDRMASK) & ~PDRMASK) + superpage_offset;
1478         }
1479         sva = va;
1480         while (start < end) {
1481                 if ((start & PDRMASK) == 0 && end - start >= NBPDR &&
1482                     pseflag) {
1483                         KASSERT((va & PDRMASK) == 0,
1484                             ("pmap_map: misaligned va %#x", va));
1485                         newpde = start | PG_PS | pgeflag | PG_RW | PG_V;
1486                         pmap_kenter_pde(va, newpde);
1487                         va += NBPDR;
1488                         start += NBPDR;
1489                 } else {
1490                         pmap_kenter(va, start);
1491                         va += PAGE_SIZE;
1492                         start += PAGE_SIZE;
1493                 }
1494         }
1495         pmap_invalidate_range(kernel_pmap, sva, va);
1496         *virt = va;
1497         return (sva);
1498 }
1499
1500
1501 /*
1502  * Add a list of wired pages to the kva
1503  * this routine is only used for temporary
1504  * kernel mappings that do not need to have
1505  * page modification or references recorded.
1506  * Note that old mappings are simply written
1507  * over.  The page *must* be wired.
1508  * Note: SMP coherent.  Uses a ranged shootdown IPI.
1509  */
1510 void
1511 pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count)
1512 {
1513         pt_entry_t *endpte, oldpte, pa, *pte;
1514         vm_page_t m;
1515
1516         oldpte = 0;
1517         pte = vtopte(sva);
1518         endpte = pte + count;
1519         while (pte < endpte) {
1520                 m = *ma++;
1521                 pa = VM_PAGE_TO_PHYS(m) | pmap_cache_bits(m->md.pat_mode, 0);
1522                 if ((*pte & (PG_FRAME | PG_PTE_CACHE)) != pa) {
1523                         oldpte |= *pte;
1524                         pte_store(pte, pa | pgeflag | PG_RW | PG_V);
1525                 }
1526                 pte++;
1527         }
1528         if (__predict_false((oldpte & PG_V) != 0))
1529                 pmap_invalidate_range(kernel_pmap, sva, sva + count *
1530                     PAGE_SIZE);
1531 }
1532
1533 /*
1534  * This routine tears out page mappings from the
1535  * kernel -- it is meant only for temporary mappings.
1536  * Note: SMP coherent.  Uses a ranged shootdown IPI.
1537  */
1538 void
1539 pmap_qremove(vm_offset_t sva, int count)
1540 {
1541         vm_offset_t va;
1542
1543         va = sva;
1544         while (count-- > 0) {
1545                 pmap_kremove(va);
1546                 va += PAGE_SIZE;
1547         }
1548         pmap_invalidate_range(kernel_pmap, sva, va);
1549 }
1550
1551 /***************************************************
1552  * Page table page management routines.....
1553  ***************************************************/
1554 static __inline void
1555 pmap_free_zero_pages(vm_page_t free)
1556 {
1557         vm_page_t m;
1558
1559         while (free != NULL) {
1560                 m = free;
1561                 free = m->right;
1562                 /* Preserve the page's PG_ZERO setting. */
1563                 vm_page_free_toq(m);
1564         }
1565 }
1566
1567 /*
1568  * Schedule the specified unused page table page to be freed.  Specifically,
1569  * add the page to the specified list of pages that will be released to the
1570  * physical memory manager after the TLB has been updated.
1571  */
1572 static __inline void
1573 pmap_add_delayed_free_list(vm_page_t m, vm_page_t *free, boolean_t set_PG_ZERO)
1574 {
1575
1576         if (set_PG_ZERO)
1577                 m->flags |= PG_ZERO;
1578         else
1579                 m->flags &= ~PG_ZERO;
1580         m->right = *free;
1581         *free = m;
1582 }
1583
1584 /*
1585  * Inserts the specified page table page into the specified pmap's collection
1586  * of idle page table pages.  Each of a pmap's page table pages is responsible
1587  * for mapping a distinct range of virtual addresses.  The pmap's collection is
1588  * ordered by this virtual address range.
1589  */
1590 static void
1591 pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte)
1592 {
1593         vm_page_t root;
1594
1595         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1596         root = pmap->pm_root;
1597         if (root == NULL) {
1598                 mpte->left = NULL;
1599                 mpte->right = NULL;
1600         } else {
1601                 root = vm_page_splay(mpte->pindex, root);
1602                 if (mpte->pindex < root->pindex) {
1603                         mpte->left = root->left;
1604                         mpte->right = root;
1605                         root->left = NULL;
1606                 } else if (mpte->pindex == root->pindex)
1607                         panic("pmap_insert_pt_page: pindex already inserted");
1608                 else {
1609                         mpte->right = root->right;
1610                         mpte->left = root;
1611                         root->right = NULL;
1612                 }
1613         }
1614         pmap->pm_root = mpte;
1615 }
1616
1617 /*
1618  * Looks for a page table page mapping the specified virtual address in the
1619  * specified pmap's collection of idle page table pages.  Returns NULL if there
1620  * is no page table page corresponding to the specified virtual address.
1621  */
1622 static vm_page_t
1623 pmap_lookup_pt_page(pmap_t pmap, vm_offset_t va)
1624 {
1625         vm_page_t mpte;
1626         vm_pindex_t pindex = va >> PDRSHIFT;
1627
1628         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1629         if ((mpte = pmap->pm_root) != NULL && mpte->pindex != pindex) {
1630                 mpte = vm_page_splay(pindex, mpte);
1631                 if ((pmap->pm_root = mpte)->pindex != pindex)
1632                         mpte = NULL;
1633         }
1634         return (mpte);
1635 }
1636
1637 /*
1638  * Removes the specified page table page from the specified pmap's collection
1639  * of idle page table pages.  The specified page table page must be a member of
1640  * the pmap's collection.
1641  */
1642 static void
1643 pmap_remove_pt_page(pmap_t pmap, vm_page_t mpte)
1644 {
1645         vm_page_t root;
1646
1647         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1648         if (mpte != pmap->pm_root)
1649                 vm_page_splay(mpte->pindex, pmap->pm_root);
1650         if (mpte->left == NULL)
1651                 root = mpte->right;
1652         else {
1653                 root = vm_page_splay(mpte->pindex, mpte->left);
1654                 root->right = mpte->right;
1655         }
1656         pmap->pm_root = root;
1657 }
1658
1659 /*
1660  * Decrements a page table page's wire count, which is used to record the
1661  * number of valid page table entries within the page.  If the wire count
1662  * drops to zero, then the page table page is unmapped.  Returns TRUE if the
1663  * page table page was unmapped and FALSE otherwise.
1664  */
1665 static inline boolean_t
1666 pmap_unwire_ptp(pmap_t pmap, vm_page_t m, vm_page_t *free)
1667 {
1668
1669         --m->wire_count;
1670         if (m->wire_count == 0) {
1671                 _pmap_unwire_ptp(pmap, m, free);
1672                 return (TRUE);
1673         } else
1674                 return (FALSE);
1675 }
1676
1677 static void
1678 _pmap_unwire_ptp(pmap_t pmap, vm_page_t m, vm_page_t *free)
1679 {
1680         vm_offset_t pteva;
1681
1682         /*
1683          * unmap the page table page
1684          */
1685         pmap->pm_pdir[m->pindex] = 0;
1686         --pmap->pm_stats.resident_count;
1687
1688         /*
1689          * This is a release store so that the ordinary store unmapping
1690          * the page table page is globally performed before TLB shoot-
1691          * down is begun.
1692          */
1693         atomic_subtract_rel_int(&cnt.v_wire_count, 1);
1694
1695         /*
1696          * Do an invltlb to make the invalidated mapping
1697          * take effect immediately.
1698          */
1699         pteva = VM_MAXUSER_ADDRESS + i386_ptob(m->pindex);
1700         pmap_invalidate_page(pmap, pteva);
1701
1702         /* 
1703          * Put page on a list so that it is released after
1704          * *ALL* TLB shootdown is done
1705          */
1706         pmap_add_delayed_free_list(m, free, TRUE);
1707 }
1708
1709 /*
1710  * After removing a page table entry, this routine is used to
1711  * conditionally free the page, and manage the hold/wire counts.
1712  */
1713 static int
1714 pmap_unuse_pt(pmap_t pmap, vm_offset_t va, vm_page_t *free)
1715 {
1716         pd_entry_t ptepde;
1717         vm_page_t mpte;
1718
1719         if (va >= VM_MAXUSER_ADDRESS)
1720                 return (0);
1721         ptepde = *pmap_pde(pmap, va);
1722         mpte = PHYS_TO_VM_PAGE(ptepde & PG_FRAME);
1723         return (pmap_unwire_ptp(pmap, mpte, free));
1724 }
1725
1726 /*
1727  * Initialize the pmap for the swapper process.
1728  */
1729 void
1730 pmap_pinit0(pmap_t pmap)
1731 {
1732
1733         PMAP_LOCK_INIT(pmap);
1734         /*
1735          * Since the page table directory is shared with the kernel pmap,
1736          * which is already included in the list "allpmaps", this pmap does
1737          * not need to be inserted into that list.
1738          */
1739         pmap->pm_pdir = (pd_entry_t *)(KERNBASE + (vm_offset_t)IdlePTD);
1740 #ifdef PAE
1741         pmap->pm_pdpt = (pdpt_entry_t *)(KERNBASE + (vm_offset_t)IdlePDPT);
1742 #endif
1743         pmap->pm_root = NULL;
1744         CPU_ZERO(&pmap->pm_active);
1745         PCPU_SET(curpmap, pmap);
1746         TAILQ_INIT(&pmap->pm_pvchunk);
1747         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
1748 }
1749
1750 /*
1751  * Initialize a preallocated and zeroed pmap structure,
1752  * such as one in a vmspace structure.
1753  */
1754 int
1755 pmap_pinit(pmap_t pmap)
1756 {
1757         vm_page_t m, ptdpg[NPGPTD];
1758         vm_paddr_t pa;
1759         int i;
1760
1761         PMAP_LOCK_INIT(pmap);
1762
1763         /*
1764          * No need to allocate page table space yet but we do need a valid
1765          * page directory table.
1766          */
1767         if (pmap->pm_pdir == NULL) {
1768                 pmap->pm_pdir = (pd_entry_t *)kmem_alloc_nofault(kernel_map,
1769                     NBPTD);
1770                 if (pmap->pm_pdir == NULL) {
1771                         PMAP_LOCK_DESTROY(pmap);
1772                         return (0);
1773                 }
1774 #ifdef PAE
1775                 pmap->pm_pdpt = uma_zalloc(pdptzone, M_WAITOK | M_ZERO);
1776                 KASSERT(((vm_offset_t)pmap->pm_pdpt &
1777                     ((NPGPTD * sizeof(pdpt_entry_t)) - 1)) == 0,
1778                     ("pmap_pinit: pdpt misaligned"));
1779                 KASSERT(pmap_kextract((vm_offset_t)pmap->pm_pdpt) < (4ULL<<30),
1780                     ("pmap_pinit: pdpt above 4g"));
1781 #endif
1782                 pmap->pm_root = NULL;
1783         }
1784         KASSERT(pmap->pm_root == NULL,
1785             ("pmap_pinit: pmap has reserved page table page(s)"));
1786
1787         /*
1788          * allocate the page directory page(s)
1789          */
1790         for (i = 0; i < NPGPTD;) {
1791                 m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ |
1792                     VM_ALLOC_WIRED | VM_ALLOC_ZERO);
1793                 if (m == NULL)
1794                         VM_WAIT;
1795                 else {
1796                         ptdpg[i++] = m;
1797                 }
1798         }
1799
1800         pmap_qenter((vm_offset_t)pmap->pm_pdir, ptdpg, NPGPTD);
1801
1802         for (i = 0; i < NPGPTD; i++)
1803                 if ((ptdpg[i]->flags & PG_ZERO) == 0)
1804                         pagezero(pmap->pm_pdir + (i * NPDEPG));
1805
1806         mtx_lock_spin(&allpmaps_lock);
1807         LIST_INSERT_HEAD(&allpmaps, pmap, pm_list);
1808         /* Copy the kernel page table directory entries. */
1809         bcopy(PTD + KPTDI, pmap->pm_pdir + KPTDI, nkpt * sizeof(pd_entry_t));
1810         mtx_unlock_spin(&allpmaps_lock);
1811
1812         /* install self-referential address mapping entry(s) */
1813         for (i = 0; i < NPGPTD; i++) {
1814                 pa = VM_PAGE_TO_PHYS(ptdpg[i]);
1815                 pmap->pm_pdir[PTDPTDI + i] = pa | PG_V | PG_RW | PG_A | PG_M;
1816 #ifdef PAE
1817                 pmap->pm_pdpt[i] = pa | PG_V;
1818 #endif
1819         }
1820
1821         CPU_ZERO(&pmap->pm_active);
1822         TAILQ_INIT(&pmap->pm_pvchunk);
1823         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
1824
1825         return (1);
1826 }
1827
1828 /*
1829  * this routine is called if the page table page is not
1830  * mapped correctly.
1831  */
1832 static vm_page_t
1833 _pmap_allocpte(pmap_t pmap, u_int ptepindex, int flags)
1834 {
1835         vm_paddr_t ptepa;
1836         vm_page_t m;
1837
1838         KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT ||
1839             (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK,
1840             ("_pmap_allocpte: flags is neither M_NOWAIT nor M_WAITOK"));
1841
1842         /*
1843          * Allocate a page table page.
1844          */
1845         if ((m = vm_page_alloc(NULL, ptepindex, VM_ALLOC_NOOBJ |
1846             VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL) {
1847                 if (flags & M_WAITOK) {
1848                         PMAP_UNLOCK(pmap);
1849                         rw_wunlock(&pvh_global_lock);
1850                         VM_WAIT;
1851                         rw_wlock(&pvh_global_lock);
1852                         PMAP_LOCK(pmap);
1853                 }
1854
1855                 /*
1856                  * Indicate the need to retry.  While waiting, the page table
1857                  * page may have been allocated.
1858                  */
1859                 return (NULL);
1860         }
1861         if ((m->flags & PG_ZERO) == 0)
1862                 pmap_zero_page(m);
1863
1864         /*
1865          * Map the pagetable page into the process address space, if
1866          * it isn't already there.
1867          */
1868
1869         pmap->pm_stats.resident_count++;
1870
1871         ptepa = VM_PAGE_TO_PHYS(m);
1872         pmap->pm_pdir[ptepindex] =
1873                 (pd_entry_t) (ptepa | PG_U | PG_RW | PG_V | PG_A | PG_M);
1874
1875         return (m);
1876 }
1877
1878 static vm_page_t
1879 pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags)
1880 {
1881         u_int ptepindex;
1882         pd_entry_t ptepa;
1883         vm_page_t m;
1884
1885         KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT ||
1886             (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK,
1887             ("pmap_allocpte: flags is neither M_NOWAIT nor M_WAITOK"));
1888
1889         /*
1890          * Calculate pagetable page index
1891          */
1892         ptepindex = va >> PDRSHIFT;
1893 retry:
1894         /*
1895          * Get the page directory entry
1896          */
1897         ptepa = pmap->pm_pdir[ptepindex];
1898
1899         /*
1900          * This supports switching from a 4MB page to a
1901          * normal 4K page.
1902          */
1903         if (ptepa & PG_PS) {
1904                 (void)pmap_demote_pde(pmap, &pmap->pm_pdir[ptepindex], va);
1905                 ptepa = pmap->pm_pdir[ptepindex];
1906         }
1907
1908         /*
1909          * If the page table page is mapped, we just increment the
1910          * hold count, and activate it.
1911          */
1912         if (ptepa) {
1913                 m = PHYS_TO_VM_PAGE(ptepa & PG_FRAME);
1914                 m->wire_count++;
1915         } else {
1916                 /*
1917                  * Here if the pte page isn't mapped, or if it has
1918                  * been deallocated. 
1919                  */
1920                 m = _pmap_allocpte(pmap, ptepindex, flags);
1921                 if (m == NULL && (flags & M_WAITOK))
1922                         goto retry;
1923         }
1924         return (m);
1925 }
1926
1927
1928 /***************************************************
1929 * Pmap allocation/deallocation routines.
1930  ***************************************************/
1931
1932 #ifdef SMP
1933 /*
1934  * Deal with a SMP shootdown of other users of the pmap that we are
1935  * trying to dispose of.  This can be a bit hairy.
1936  */
1937 static cpuset_t *lazymask;
1938 static u_int lazyptd;
1939 static volatile u_int lazywait;
1940
1941 void pmap_lazyfix_action(void);
1942
1943 void
1944 pmap_lazyfix_action(void)
1945 {
1946
1947 #ifdef COUNT_IPIS
1948         (*ipi_lazypmap_counts[PCPU_GET(cpuid)])++;
1949 #endif
1950         if (rcr3() == lazyptd)
1951                 load_cr3(curpcb->pcb_cr3);
1952         CPU_CLR_ATOMIC(PCPU_GET(cpuid), lazymask);
1953         atomic_store_rel_int(&lazywait, 1);
1954 }
1955
1956 static void
1957 pmap_lazyfix_self(u_int cpuid)
1958 {
1959
1960         if (rcr3() == lazyptd)
1961                 load_cr3(curpcb->pcb_cr3);
1962         CPU_CLR_ATOMIC(cpuid, lazymask);
1963 }
1964
1965
1966 static void
1967 pmap_lazyfix(pmap_t pmap)
1968 {
1969         cpuset_t mymask, mask;
1970         u_int cpuid, spins;
1971         int lsb;
1972
1973         mask = pmap->pm_active;
1974         while (!CPU_EMPTY(&mask)) {
1975                 spins = 50000000;
1976
1977                 /* Find least significant set bit. */
1978                 lsb = cpusetobj_ffs(&mask);
1979                 MPASS(lsb != 0);
1980                 lsb--;
1981                 CPU_SETOF(lsb, &mask);
1982                 mtx_lock_spin(&smp_ipi_mtx);
1983 #ifdef PAE
1984                 lazyptd = vtophys(pmap->pm_pdpt);
1985 #else
1986                 lazyptd = vtophys(pmap->pm_pdir);
1987 #endif
1988                 cpuid = PCPU_GET(cpuid);
1989
1990                 /* Use a cpuset just for having an easy check. */
1991                 CPU_SETOF(cpuid, &mymask);
1992                 if (!CPU_CMP(&mask, &mymask)) {
1993                         lazymask = &pmap->pm_active;
1994                         pmap_lazyfix_self(cpuid);
1995                 } else {
1996                         atomic_store_rel_int((u_int *)&lazymask,
1997                             (u_int)&pmap->pm_active);
1998                         atomic_store_rel_int(&lazywait, 0);
1999                         ipi_selected(mask, IPI_LAZYPMAP);
2000                         while (lazywait == 0) {
2001                                 ia32_pause();
2002                                 if (--spins == 0)
2003                                         break;
2004                         }
2005                 }
2006                 mtx_unlock_spin(&smp_ipi_mtx);
2007                 if (spins == 0)
2008                         printf("pmap_lazyfix: spun for 50000000\n");
2009                 mask = pmap->pm_active;
2010         }
2011 }
2012
2013 #else   /* SMP */
2014
2015 /*
2016  * Cleaning up on uniprocessor is easy.  For various reasons, we're
2017  * unlikely to have to even execute this code, including the fact
2018  * that the cleanup is deferred until the parent does a wait(2), which
2019  * means that another userland process has run.
2020  */
2021 static void
2022 pmap_lazyfix(pmap_t pmap)
2023 {
2024         u_int cr3;
2025
2026         cr3 = vtophys(pmap->pm_pdir);
2027         if (cr3 == rcr3()) {
2028                 load_cr3(curpcb->pcb_cr3);
2029                 CPU_CLR(PCPU_GET(cpuid), &pmap->pm_active);
2030         }
2031 }
2032 #endif  /* SMP */
2033
2034 /*
2035  * Release any resources held by the given physical map.
2036  * Called when a pmap initialized by pmap_pinit is being released.
2037  * Should only be called if the map contains no valid mappings.
2038  */
2039 void
2040 pmap_release(pmap_t pmap)
2041 {
2042         vm_page_t m, ptdpg[NPGPTD];
2043         int i;
2044
2045         KASSERT(pmap->pm_stats.resident_count == 0,
2046             ("pmap_release: pmap resident count %ld != 0",
2047             pmap->pm_stats.resident_count));
2048         KASSERT(pmap->pm_root == NULL,
2049             ("pmap_release: pmap has reserved page table page(s)"));
2050
2051         pmap_lazyfix(pmap);
2052         mtx_lock_spin(&allpmaps_lock);
2053         LIST_REMOVE(pmap, pm_list);
2054         mtx_unlock_spin(&allpmaps_lock);
2055
2056         for (i = 0; i < NPGPTD; i++)
2057                 ptdpg[i] = PHYS_TO_VM_PAGE(pmap->pm_pdir[PTDPTDI + i] &
2058                     PG_FRAME);
2059
2060         bzero(pmap->pm_pdir + PTDPTDI, (nkpt + NPGPTD) *
2061             sizeof(*pmap->pm_pdir));
2062
2063         pmap_qremove((vm_offset_t)pmap->pm_pdir, NPGPTD);
2064
2065         for (i = 0; i < NPGPTD; i++) {
2066                 m = ptdpg[i];
2067 #ifdef PAE
2068                 KASSERT(VM_PAGE_TO_PHYS(m) == (pmap->pm_pdpt[i] & PG_FRAME),
2069                     ("pmap_release: got wrong ptd page"));
2070 #endif
2071                 m->wire_count--;
2072                 atomic_subtract_int(&cnt.v_wire_count, 1);
2073                 vm_page_free_zero(m);
2074         }
2075         PMAP_LOCK_DESTROY(pmap);
2076 }
2077 \f
2078 static int
2079 kvm_size(SYSCTL_HANDLER_ARGS)
2080 {
2081         unsigned long ksize = VM_MAX_KERNEL_ADDRESS - KERNBASE;
2082
2083         return (sysctl_handle_long(oidp, &ksize, 0, req));
2084 }
2085 SYSCTL_PROC(_vm, OID_AUTO, kvm_size, CTLTYPE_LONG|CTLFLAG_RD, 
2086     0, 0, kvm_size, "IU", "Size of KVM");
2087
2088 static int
2089 kvm_free(SYSCTL_HANDLER_ARGS)
2090 {
2091         unsigned long kfree = VM_MAX_KERNEL_ADDRESS - kernel_vm_end;
2092
2093         return (sysctl_handle_long(oidp, &kfree, 0, req));
2094 }
2095 SYSCTL_PROC(_vm, OID_AUTO, kvm_free, CTLTYPE_LONG|CTLFLAG_RD, 
2096     0, 0, kvm_free, "IU", "Amount of KVM free");
2097
2098 /*
2099  * grow the number of kernel page table entries, if needed
2100  */
2101 void
2102 pmap_growkernel(vm_offset_t addr)
2103 {
2104         vm_paddr_t ptppaddr;
2105         vm_page_t nkpg;
2106         pd_entry_t newpdir;
2107
2108         mtx_assert(&kernel_map->system_mtx, MA_OWNED);
2109         addr = roundup2(addr, NBPDR);
2110         if (addr - 1 >= kernel_map->max_offset)
2111                 addr = kernel_map->max_offset;
2112         while (kernel_vm_end < addr) {
2113                 if (pdir_pde(PTD, kernel_vm_end)) {
2114                         kernel_vm_end = (kernel_vm_end + NBPDR) & ~PDRMASK;
2115                         if (kernel_vm_end - 1 >= kernel_map->max_offset) {
2116                                 kernel_vm_end = kernel_map->max_offset;
2117                                 break;
2118                         }
2119                         continue;
2120                 }
2121
2122                 nkpg = vm_page_alloc(NULL, kernel_vm_end >> PDRSHIFT,
2123                     VM_ALLOC_INTERRUPT | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED |
2124                     VM_ALLOC_ZERO);
2125                 if (nkpg == NULL)
2126                         panic("pmap_growkernel: no memory to grow kernel");
2127
2128                 nkpt++;
2129
2130                 if ((nkpg->flags & PG_ZERO) == 0)
2131                         pmap_zero_page(nkpg);
2132                 ptppaddr = VM_PAGE_TO_PHYS(nkpg);
2133                 newpdir = (pd_entry_t) (ptppaddr | PG_V | PG_RW | PG_A | PG_M);
2134                 pdir_pde(KPTD, kernel_vm_end) = pgeflag | newpdir;
2135
2136                 pmap_kenter_pde(kernel_vm_end, newpdir);
2137                 kernel_vm_end = (kernel_vm_end + NBPDR) & ~PDRMASK;
2138                 if (kernel_vm_end - 1 >= kernel_map->max_offset) {
2139                         kernel_vm_end = kernel_map->max_offset;
2140                         break;
2141                 }
2142         }
2143 }
2144
2145
2146 /***************************************************
2147  * page management routines.
2148  ***************************************************/
2149
2150 CTASSERT(sizeof(struct pv_chunk) == PAGE_SIZE);
2151 CTASSERT(_NPCM == 11);
2152 CTASSERT(_NPCPV == 336);
2153
2154 static __inline struct pv_chunk *
2155 pv_to_chunk(pv_entry_t pv)
2156 {
2157
2158         return ((struct pv_chunk *)((uintptr_t)pv & ~(uintptr_t)PAGE_MASK));
2159 }
2160
2161 #define PV_PMAP(pv) (pv_to_chunk(pv)->pc_pmap)
2162
2163 #define PC_FREE0_9      0xfffffffful    /* Free values for index 0 through 9 */
2164 #define PC_FREE10       0x0000fffful    /* Free values for index 10 */
2165
2166 static const uint32_t pc_freemask[_NPCM] = {
2167         PC_FREE0_9, PC_FREE0_9, PC_FREE0_9,
2168         PC_FREE0_9, PC_FREE0_9, PC_FREE0_9,
2169         PC_FREE0_9, PC_FREE0_9, PC_FREE0_9,
2170         PC_FREE0_9, PC_FREE10
2171 };
2172
2173 SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_count, CTLFLAG_RD, &pv_entry_count, 0,
2174         "Current number of pv entries");
2175
2176 #ifdef PV_STATS
2177 static int pc_chunk_count, pc_chunk_allocs, pc_chunk_frees, pc_chunk_tryfail;
2178
2179 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_count, CTLFLAG_RD, &pc_chunk_count, 0,
2180         "Current number of pv entry chunks");
2181 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_allocs, CTLFLAG_RD, &pc_chunk_allocs, 0,
2182         "Current number of pv entry chunks allocated");
2183 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_frees, CTLFLAG_RD, &pc_chunk_frees, 0,
2184         "Current number of pv entry chunks frees");
2185 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_tryfail, CTLFLAG_RD, &pc_chunk_tryfail, 0,
2186         "Number of times tried to get a chunk page but failed.");
2187
2188 static long pv_entry_frees, pv_entry_allocs;
2189 static int pv_entry_spare;
2190
2191 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_frees, CTLFLAG_RD, &pv_entry_frees, 0,
2192         "Current number of pv entry frees");
2193 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD, &pv_entry_allocs, 0,
2194         "Current number of pv entry allocs");
2195 SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD, &pv_entry_spare, 0,
2196         "Current number of spare pv entries");
2197 #endif
2198
2199 /*
2200  * We are in a serious low memory condition.  Resort to
2201  * drastic measures to free some pages so we can allocate
2202  * another pv entry chunk.
2203  */
2204 static vm_page_t
2205 pmap_pv_reclaim(pmap_t locked_pmap)
2206 {
2207         struct pch newtail;
2208         struct pv_chunk *pc;
2209         struct md_page *pvh;
2210         pd_entry_t *pde;
2211         pmap_t pmap;
2212         pt_entry_t *pte, tpte;
2213         pv_entry_t pv;
2214         vm_offset_t va;
2215         vm_page_t free, m, m_pc;
2216         uint32_t inuse;
2217         int bit, field, freed;
2218
2219         PMAP_LOCK_ASSERT(locked_pmap, MA_OWNED);
2220         pmap = NULL;
2221         free = m_pc = NULL;
2222         TAILQ_INIT(&newtail);
2223         while ((pc = TAILQ_FIRST(&pv_chunks)) != NULL && (pv_vafree == 0 ||
2224             free == NULL)) {
2225                 TAILQ_REMOVE(&pv_chunks, pc, pc_lru);
2226                 if (pmap != pc->pc_pmap) {
2227                         if (pmap != NULL) {
2228                                 pmap_invalidate_all(pmap);
2229                                 if (pmap != locked_pmap)
2230                                         PMAP_UNLOCK(pmap);
2231                         }
2232                         pmap = pc->pc_pmap;
2233                         /* Avoid deadlock and lock recursion. */
2234                         if (pmap > locked_pmap)
2235                                 PMAP_LOCK(pmap);
2236                         else if (pmap != locked_pmap && !PMAP_TRYLOCK(pmap)) {
2237                                 pmap = NULL;
2238                                 TAILQ_INSERT_TAIL(&newtail, pc, pc_lru);
2239                                 continue;
2240                         }
2241                 }
2242
2243                 /*
2244                  * Destroy every non-wired, 4 KB page mapping in the chunk.
2245                  */
2246                 freed = 0;
2247                 for (field = 0; field < _NPCM; field++) {
2248                         for (inuse = ~pc->pc_map[field] & pc_freemask[field];
2249                             inuse != 0; inuse &= ~(1UL << bit)) {
2250                                 bit = bsfl(inuse);
2251                                 pv = &pc->pc_pventry[field * 32 + bit];
2252                                 va = pv->pv_va;
2253                                 pde = pmap_pde(pmap, va);
2254                                 if ((*pde & PG_PS) != 0)
2255                                         continue;
2256                                 pte = pmap_pte(pmap, va);
2257                                 tpte = *pte;
2258                                 if ((tpte & PG_W) == 0)
2259                                         tpte = pte_load_clear(pte);
2260                                 pmap_pte_release(pte);
2261                                 if ((tpte & PG_W) != 0)
2262                                         continue;
2263                                 KASSERT(tpte != 0,
2264                                     ("pmap_pv_reclaim: pmap %p va %x zero pte",
2265                                     pmap, va));
2266                                 if ((tpte & PG_G) != 0)
2267                                         pmap_invalidate_page(pmap, va);
2268                                 m = PHYS_TO_VM_PAGE(tpte & PG_FRAME);
2269                                 if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
2270                                         vm_page_dirty(m);
2271                                 if ((tpte & PG_A) != 0)
2272                                         vm_page_aflag_set(m, PGA_REFERENCED);
2273                                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
2274                                 if (TAILQ_EMPTY(&m->md.pv_list) &&
2275                                     (m->flags & PG_FICTITIOUS) == 0) {
2276                                         pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
2277                                         if (TAILQ_EMPTY(&pvh->pv_list)) {
2278                                                 vm_page_aflag_clear(m,
2279                                                     PGA_WRITEABLE);
2280                                         }
2281                                 }
2282                                 pc->pc_map[field] |= 1UL << bit;
2283                                 pmap_unuse_pt(pmap, va, &free);
2284                                 freed++;
2285                         }
2286                 }
2287                 if (freed == 0) {
2288                         TAILQ_INSERT_TAIL(&newtail, pc, pc_lru);
2289                         continue;
2290                 }
2291                 /* Every freed mapping is for a 4 KB page. */
2292                 pmap->pm_stats.resident_count -= freed;
2293                 PV_STAT(pv_entry_frees += freed);
2294                 PV_STAT(pv_entry_spare += freed);
2295                 pv_entry_count -= freed;
2296                 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
2297                 for (field = 0; field < _NPCM; field++)
2298                         if (pc->pc_map[field] != pc_freemask[field]) {
2299                                 TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc,
2300                                     pc_list);
2301                                 TAILQ_INSERT_TAIL(&newtail, pc, pc_lru);
2302
2303                                 /*
2304                                  * One freed pv entry in locked_pmap is
2305                                  * sufficient.
2306                                  */
2307                                 if (pmap == locked_pmap)
2308                                         goto out;
2309                                 break;
2310                         }
2311                 if (field == _NPCM) {
2312                         PV_STAT(pv_entry_spare -= _NPCPV);
2313                         PV_STAT(pc_chunk_count--);
2314                         PV_STAT(pc_chunk_frees++);
2315                         /* Entire chunk is free; return it. */
2316                         m_pc = PHYS_TO_VM_PAGE(pmap_kextract((vm_offset_t)pc));
2317                         pmap_qremove((vm_offset_t)pc, 1);
2318                         pmap_ptelist_free(&pv_vafree, (vm_offset_t)pc);
2319                         break;
2320                 }
2321         }
2322 out:
2323         TAILQ_CONCAT(&pv_chunks, &newtail, pc_lru);
2324         if (pmap != NULL) {
2325                 pmap_invalidate_all(pmap);
2326                 if (pmap != locked_pmap)
2327                         PMAP_UNLOCK(pmap);
2328         }
2329         if (m_pc == NULL && pv_vafree != 0 && free != NULL) {
2330                 m_pc = free;
2331                 free = m_pc->right;
2332                 /* Recycle a freed page table page. */
2333                 m_pc->wire_count = 1;
2334                 atomic_add_int(&cnt.v_wire_count, 1);
2335         }
2336         pmap_free_zero_pages(free);
2337         return (m_pc);
2338 }
2339
2340 /*
2341  * free the pv_entry back to the free list
2342  */
2343 static void
2344 free_pv_entry(pmap_t pmap, pv_entry_t pv)
2345 {
2346         struct pv_chunk *pc;
2347         int idx, field, bit;
2348
2349         rw_assert(&pvh_global_lock, RA_WLOCKED);
2350         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2351         PV_STAT(pv_entry_frees++);
2352         PV_STAT(pv_entry_spare++);
2353         pv_entry_count--;
2354         pc = pv_to_chunk(pv);
2355         idx = pv - &pc->pc_pventry[0];
2356         field = idx / 32;
2357         bit = idx % 32;
2358         pc->pc_map[field] |= 1ul << bit;
2359         for (idx = 0; idx < _NPCM; idx++)
2360                 if (pc->pc_map[idx] != pc_freemask[idx]) {
2361                         /*
2362                          * 98% of the time, pc is already at the head of the
2363                          * list.  If it isn't already, move it to the head.
2364                          */
2365                         if (__predict_false(TAILQ_FIRST(&pmap->pm_pvchunk) !=
2366                             pc)) {
2367                                 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
2368                                 TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc,
2369                                     pc_list);
2370                         }
2371                         return;
2372                 }
2373         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
2374         free_pv_chunk(pc);
2375 }
2376
2377 static void
2378 free_pv_chunk(struct pv_chunk *pc)
2379 {
2380         vm_page_t m;
2381
2382         TAILQ_REMOVE(&pv_chunks, pc, pc_lru);
2383         PV_STAT(pv_entry_spare -= _NPCPV);
2384         PV_STAT(pc_chunk_count--);
2385         PV_STAT(pc_chunk_frees++);
2386         /* entire chunk is free, return it */
2387         m = PHYS_TO_VM_PAGE(pmap_kextract((vm_offset_t)pc));
2388         pmap_qremove((vm_offset_t)pc, 1);
2389         vm_page_unwire(m, 0);
2390         vm_page_free(m);
2391         pmap_ptelist_free(&pv_vafree, (vm_offset_t)pc);
2392 }
2393
2394 /*
2395  * get a new pv_entry, allocating a block from the system
2396  * when needed.
2397  */
2398 static pv_entry_t
2399 get_pv_entry(pmap_t pmap, boolean_t try)
2400 {
2401         static const struct timeval printinterval = { 60, 0 };
2402         static struct timeval lastprint;
2403         int bit, field;
2404         pv_entry_t pv;
2405         struct pv_chunk *pc;
2406         vm_page_t m;
2407
2408         rw_assert(&pvh_global_lock, RA_WLOCKED);
2409         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2410         PV_STAT(pv_entry_allocs++);
2411         pv_entry_count++;
2412         if (pv_entry_count > pv_entry_high_water)
2413                 if (ratecheck(&lastprint, &printinterval))
2414                         printf("Approaching the limit on PV entries, consider "
2415                             "increasing either the vm.pmap.shpgperproc or the "
2416                             "vm.pmap.pv_entry_max tunable.\n");
2417 retry:
2418         pc = TAILQ_FIRST(&pmap->pm_pvchunk);
2419         if (pc != NULL) {
2420                 for (field = 0; field < _NPCM; field++) {
2421                         if (pc->pc_map[field]) {
2422                                 bit = bsfl(pc->pc_map[field]);
2423                                 break;
2424                         }
2425                 }
2426                 if (field < _NPCM) {
2427                         pv = &pc->pc_pventry[field * 32 + bit];
2428                         pc->pc_map[field] &= ~(1ul << bit);
2429                         /* If this was the last item, move it to tail */
2430                         for (field = 0; field < _NPCM; field++)
2431                                 if (pc->pc_map[field] != 0) {
2432                                         PV_STAT(pv_entry_spare--);
2433                                         return (pv);    /* not full, return */
2434                                 }
2435                         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
2436                         TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list);
2437                         PV_STAT(pv_entry_spare--);
2438                         return (pv);
2439                 }
2440         }
2441         /*
2442          * Access to the ptelist "pv_vafree" is synchronized by the pvh
2443          * global lock.  If "pv_vafree" is currently non-empty, it will
2444          * remain non-empty until pmap_ptelist_alloc() completes.
2445          */
2446         if (pv_vafree == 0 || (m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL |
2447             VM_ALLOC_NOOBJ | VM_ALLOC_WIRED)) == NULL) {
2448                 if (try) {
2449                         pv_entry_count--;
2450                         PV_STAT(pc_chunk_tryfail++);
2451                         return (NULL);
2452                 }
2453                 m = pmap_pv_reclaim(pmap);
2454                 if (m == NULL)
2455                         goto retry;
2456         }
2457         PV_STAT(pc_chunk_count++);
2458         PV_STAT(pc_chunk_allocs++);
2459         pc = (struct pv_chunk *)pmap_ptelist_alloc(&pv_vafree);
2460         pmap_qenter((vm_offset_t)pc, &m, 1);
2461         pc->pc_pmap = pmap;
2462         pc->pc_map[0] = pc_freemask[0] & ~1ul;  /* preallocated bit 0 */
2463         for (field = 1; field < _NPCM; field++)
2464                 pc->pc_map[field] = pc_freemask[field];
2465         TAILQ_INSERT_TAIL(&pv_chunks, pc, pc_lru);
2466         pv = &pc->pc_pventry[0];
2467         TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
2468         PV_STAT(pv_entry_spare += _NPCPV - 1);
2469         return (pv);
2470 }
2471
2472 static __inline pv_entry_t
2473 pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
2474 {
2475         pv_entry_t pv;
2476
2477         rw_assert(&pvh_global_lock, RA_WLOCKED);
2478         TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) {
2479                 if (pmap == PV_PMAP(pv) && va == pv->pv_va) {
2480                         TAILQ_REMOVE(&pvh->pv_list, pv, pv_list);
2481                         break;
2482                 }
2483         }
2484         return (pv);
2485 }
2486
2487 static void
2488 pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa)
2489 {
2490         struct md_page *pvh;
2491         pv_entry_t pv;
2492         vm_offset_t va_last;
2493         vm_page_t m;
2494
2495         rw_assert(&pvh_global_lock, RA_WLOCKED);
2496         KASSERT((pa & PDRMASK) == 0,
2497             ("pmap_pv_demote_pde: pa is not 4mpage aligned"));
2498
2499         /*
2500          * Transfer the 4mpage's pv entry for this mapping to the first
2501          * page's pv list.
2502          */
2503         pvh = pa_to_pvh(pa);
2504         va = trunc_4mpage(va);
2505         pv = pmap_pvh_remove(pvh, pmap, va);
2506         KASSERT(pv != NULL, ("pmap_pv_demote_pde: pv not found"));
2507         m = PHYS_TO_VM_PAGE(pa);
2508         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
2509         /* Instantiate the remaining NPTEPG - 1 pv entries. */
2510         va_last = va + NBPDR - PAGE_SIZE;
2511         do {
2512                 m++;
2513                 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
2514                     ("pmap_pv_demote_pde: page %p is not managed", m));
2515                 va += PAGE_SIZE;
2516                 pmap_insert_entry(pmap, va, m);
2517         } while (va < va_last);
2518 }
2519
2520 static void
2521 pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa)
2522 {
2523         struct md_page *pvh;
2524         pv_entry_t pv;
2525         vm_offset_t va_last;
2526         vm_page_t m;
2527
2528         rw_assert(&pvh_global_lock, RA_WLOCKED);
2529         KASSERT((pa & PDRMASK) == 0,
2530             ("pmap_pv_promote_pde: pa is not 4mpage aligned"));
2531
2532         /*
2533          * Transfer the first page's pv entry for this mapping to the
2534          * 4mpage's pv list.  Aside from avoiding the cost of a call
2535          * to get_pv_entry(), a transfer avoids the possibility that
2536          * get_pv_entry() calls pmap_collect() and that pmap_collect()
2537          * removes one of the mappings that is being promoted.
2538          */
2539         m = PHYS_TO_VM_PAGE(pa);
2540         va = trunc_4mpage(va);
2541         pv = pmap_pvh_remove(&m->md, pmap, va);
2542         KASSERT(pv != NULL, ("pmap_pv_promote_pde: pv not found"));
2543         pvh = pa_to_pvh(pa);
2544         TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_list);
2545         /* Free the remaining NPTEPG - 1 pv entries. */
2546         va_last = va + NBPDR - PAGE_SIZE;
2547         do {
2548                 m++;
2549                 va += PAGE_SIZE;
2550                 pmap_pvh_free(&m->md, pmap, va);
2551         } while (va < va_last);
2552 }
2553
2554 static void
2555 pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
2556 {
2557         pv_entry_t pv;
2558
2559         pv = pmap_pvh_remove(pvh, pmap, va);
2560         KASSERT(pv != NULL, ("pmap_pvh_free: pv not found"));
2561         free_pv_entry(pmap, pv);
2562 }
2563
2564 static void
2565 pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va)
2566 {
2567         struct md_page *pvh;
2568
2569         rw_assert(&pvh_global_lock, RA_WLOCKED);
2570         pmap_pvh_free(&m->md, pmap, va);
2571         if (TAILQ_EMPTY(&m->md.pv_list) && (m->flags & PG_FICTITIOUS) == 0) {
2572                 pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
2573                 if (TAILQ_EMPTY(&pvh->pv_list))
2574                         vm_page_aflag_clear(m, PGA_WRITEABLE);
2575         }
2576 }
2577
2578 /*
2579  * Create a pv entry for page at pa for
2580  * (pmap, va).
2581  */
2582 static void
2583 pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m)
2584 {
2585         pv_entry_t pv;
2586
2587         rw_assert(&pvh_global_lock, RA_WLOCKED);
2588         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2589         pv = get_pv_entry(pmap, FALSE);
2590         pv->pv_va = va;
2591         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
2592 }
2593
2594 /*
2595  * Conditionally create a pv entry.
2596  */
2597 static boolean_t
2598 pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m)
2599 {
2600         pv_entry_t pv;
2601
2602         rw_assert(&pvh_global_lock, RA_WLOCKED);
2603         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2604         if (pv_entry_count < pv_entry_high_water && 
2605             (pv = get_pv_entry(pmap, TRUE)) != NULL) {
2606                 pv->pv_va = va;
2607                 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
2608                 return (TRUE);
2609         } else
2610                 return (FALSE);
2611 }
2612
2613 /*
2614  * Create the pv entries for each of the pages within a superpage.
2615  */
2616 static boolean_t
2617 pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa)
2618 {
2619         struct md_page *pvh;
2620         pv_entry_t pv;
2621
2622         rw_assert(&pvh_global_lock, RA_WLOCKED);
2623         if (pv_entry_count < pv_entry_high_water && 
2624             (pv = get_pv_entry(pmap, TRUE)) != NULL) {
2625                 pv->pv_va = va;
2626                 pvh = pa_to_pvh(pa);
2627                 TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_list);
2628                 return (TRUE);
2629         } else
2630                 return (FALSE);
2631 }
2632
2633 /*
2634  * Fills a page table page with mappings to consecutive physical pages.
2635  */
2636 static void
2637 pmap_fill_ptp(pt_entry_t *firstpte, pt_entry_t newpte)
2638 {
2639         pt_entry_t *pte;
2640
2641         for (pte = firstpte; pte < firstpte + NPTEPG; pte++) {
2642                 *pte = newpte;  
2643                 newpte += PAGE_SIZE;
2644         }
2645 }
2646
2647 /*
2648  * Tries to demote a 2- or 4MB page mapping.  If demotion fails, the
2649  * 2- or 4MB page mapping is invalidated.
2650  */
2651 static boolean_t
2652 pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va)
2653 {
2654         pd_entry_t newpde, oldpde;
2655         pt_entry_t *firstpte, newpte;
2656         vm_paddr_t mptepa;
2657         vm_page_t free, mpte;
2658
2659         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2660         oldpde = *pde;
2661         KASSERT((oldpde & (PG_PS | PG_V)) == (PG_PS | PG_V),
2662             ("pmap_demote_pde: oldpde is missing PG_PS and/or PG_V"));
2663         mpte = pmap_lookup_pt_page(pmap, va);
2664         if (mpte != NULL)
2665                 pmap_remove_pt_page(pmap, mpte);
2666         else {
2667                 KASSERT((oldpde & PG_W) == 0,
2668                     ("pmap_demote_pde: page table page for a wired mapping"
2669                     " is missing"));
2670
2671                 /*
2672                  * Invalidate the 2- or 4MB page mapping and return
2673                  * "failure" if the mapping was never accessed or the
2674                  * allocation of the new page table page fails.
2675                  */
2676                 if ((oldpde & PG_A) == 0 || (mpte = vm_page_alloc(NULL,
2677                     va >> PDRSHIFT, VM_ALLOC_NOOBJ | VM_ALLOC_NORMAL |
2678                     VM_ALLOC_WIRED)) == NULL) {
2679                         free = NULL;
2680                         pmap_remove_pde(pmap, pde, trunc_4mpage(va), &free);
2681                         pmap_invalidate_page(pmap, trunc_4mpage(va));
2682                         pmap_free_zero_pages(free);
2683                         CTR2(KTR_PMAP, "pmap_demote_pde: failure for va %#x"
2684                             " in pmap %p", va, pmap);
2685                         return (FALSE);
2686                 }
2687                 if (va < VM_MAXUSER_ADDRESS)
2688                         pmap->pm_stats.resident_count++;
2689         }
2690         mptepa = VM_PAGE_TO_PHYS(mpte);
2691
2692         /*
2693          * If the page mapping is in the kernel's address space, then the
2694          * KPTmap can provide access to the page table page.  Otherwise,
2695          * temporarily map the page table page (mpte) into the kernel's
2696          * address space at either PADDR1 or PADDR2. 
2697          */
2698         if (va >= KERNBASE)
2699                 firstpte = &KPTmap[i386_btop(trunc_4mpage(va))];
2700         else if (curthread->td_pinned > 0 && rw_wowned(&pvh_global_lock)) {
2701                 if ((*PMAP1 & PG_FRAME) != mptepa) {
2702                         *PMAP1 = mptepa | PG_RW | PG_V | PG_A | PG_M;
2703 #ifdef SMP
2704                         PMAP1cpu = PCPU_GET(cpuid);
2705 #endif
2706                         invlcaddr(PADDR1);
2707                         PMAP1changed++;
2708                 } else
2709 #ifdef SMP
2710                 if (PMAP1cpu != PCPU_GET(cpuid)) {
2711                         PMAP1cpu = PCPU_GET(cpuid);
2712                         invlcaddr(PADDR1);
2713                         PMAP1changedcpu++;
2714                 } else
2715 #endif
2716                         PMAP1unchanged++;
2717                 firstpte = PADDR1;
2718         } else {
2719                 mtx_lock(&PMAP2mutex);
2720                 if ((*PMAP2 & PG_FRAME) != mptepa) {
2721                         *PMAP2 = mptepa | PG_RW | PG_V | PG_A | PG_M;
2722                         pmap_invalidate_page(kernel_pmap, (vm_offset_t)PADDR2);
2723                 }
2724                 firstpte = PADDR2;
2725         }
2726         newpde = mptepa | PG_M | PG_A | (oldpde & PG_U) | PG_RW | PG_V;
2727         KASSERT((oldpde & PG_A) != 0,
2728             ("pmap_demote_pde: oldpde is missing PG_A"));
2729         KASSERT((oldpde & (PG_M | PG_RW)) != PG_RW,
2730             ("pmap_demote_pde: oldpde is missing PG_M"));
2731         newpte = oldpde & ~PG_PS;
2732         if ((newpte & PG_PDE_PAT) != 0)
2733                 newpte ^= PG_PDE_PAT | PG_PTE_PAT;
2734
2735         /*
2736          * If the page table page is new, initialize it.
2737          */
2738         if (mpte->wire_count == 1) {
2739                 mpte->wire_count = NPTEPG;
2740                 pmap_fill_ptp(firstpte, newpte);
2741         }
2742         KASSERT((*firstpte & PG_FRAME) == (newpte & PG_FRAME),
2743             ("pmap_demote_pde: firstpte and newpte map different physical"
2744             " addresses"));
2745
2746         /*
2747          * If the mapping has changed attributes, update the page table
2748          * entries.
2749          */ 
2750         if ((*firstpte & PG_PTE_PROMOTE) != (newpte & PG_PTE_PROMOTE))
2751                 pmap_fill_ptp(firstpte, newpte);
2752         
2753         /*
2754          * Demote the mapping.  This pmap is locked.  The old PDE has
2755          * PG_A set.  If the old PDE has PG_RW set, it also has PG_M
2756          * set.  Thus, there is no danger of a race with another
2757          * processor changing the setting of PG_A and/or PG_M between
2758          * the read above and the store below. 
2759          */
2760         if (workaround_erratum383)
2761                 pmap_update_pde(pmap, va, pde, newpde);
2762         else if (pmap == kernel_pmap)
2763                 pmap_kenter_pde(va, newpde);
2764         else
2765                 pde_store(pde, newpde); 
2766         if (firstpte == PADDR2)
2767                 mtx_unlock(&PMAP2mutex);
2768
2769         /*
2770          * Invalidate the recursive mapping of the page table page.
2771          */
2772         pmap_invalidate_page(pmap, (vm_offset_t)vtopte(va));
2773
2774         /*
2775          * Demote the pv entry.  This depends on the earlier demotion
2776          * of the mapping.  Specifically, the (re)creation of a per-
2777          * page pv entry might trigger the execution of pmap_collect(),
2778          * which might reclaim a newly (re)created per-page pv entry
2779          * and destroy the associated mapping.  In order to destroy
2780          * the mapping, the PDE must have already changed from mapping
2781          * the 2mpage to referencing the page table page.
2782          */
2783         if ((oldpde & PG_MANAGED) != 0)
2784                 pmap_pv_demote_pde(pmap, va, oldpde & PG_PS_FRAME);
2785
2786         pmap_pde_demotions++;
2787         CTR2(KTR_PMAP, "pmap_demote_pde: success for va %#x"
2788             " in pmap %p", va, pmap);
2789         return (TRUE);
2790 }
2791
2792 /*
2793  * pmap_remove_pde: do the things to unmap a superpage in a process
2794  */
2795 static void
2796 pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva,
2797     vm_page_t *free)
2798 {
2799         struct md_page *pvh;
2800         pd_entry_t oldpde;
2801         vm_offset_t eva, va;
2802         vm_page_t m, mpte;
2803
2804         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2805         KASSERT((sva & PDRMASK) == 0,
2806             ("pmap_remove_pde: sva is not 4mpage aligned"));
2807         oldpde = pte_load_clear(pdq);
2808         if (oldpde & PG_W)
2809                 pmap->pm_stats.wired_count -= NBPDR / PAGE_SIZE;
2810
2811         /*
2812          * Machines that don't support invlpg, also don't support
2813          * PG_G.
2814          */
2815         if (oldpde & PG_G)
2816                 pmap_invalidate_page(kernel_pmap, sva);
2817         pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
2818         if (oldpde & PG_MANAGED) {
2819                 pvh = pa_to_pvh(oldpde & PG_PS_FRAME);
2820                 pmap_pvh_free(pvh, pmap, sva);
2821                 eva = sva + NBPDR;
2822                 for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME);
2823                     va < eva; va += PAGE_SIZE, m++) {
2824                         if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW))
2825                                 vm_page_dirty(m);
2826                         if (oldpde & PG_A)
2827                                 vm_page_aflag_set(m, PGA_REFERENCED);
2828                         if (TAILQ_EMPTY(&m->md.pv_list) &&
2829                             TAILQ_EMPTY(&pvh->pv_list))
2830                                 vm_page_aflag_clear(m, PGA_WRITEABLE);
2831                 }
2832         }
2833         if (pmap == kernel_pmap) {
2834                 if (!pmap_demote_pde(pmap, pdq, sva))
2835                         panic("pmap_remove_pde: failed demotion");
2836         } else {
2837                 mpte = pmap_lookup_pt_page(pmap, sva);
2838                 if (mpte != NULL) {
2839                         pmap_remove_pt_page(pmap, mpte);
2840                         pmap->pm_stats.resident_count--;
2841                         KASSERT(mpte->wire_count == NPTEPG,
2842                             ("pmap_remove_pde: pte page wire count error"));
2843                         mpte->wire_count = 0;
2844                         pmap_add_delayed_free_list(mpte, free, FALSE);
2845                         atomic_subtract_int(&cnt.v_wire_count, 1);
2846                 }
2847         }
2848 }
2849
2850 /*
2851  * pmap_remove_pte: do the things to unmap a page in a process
2852  */
2853 static int
2854 pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va, vm_page_t *free)
2855 {
2856         pt_entry_t oldpte;
2857         vm_page_t m;
2858
2859         rw_assert(&pvh_global_lock, RA_WLOCKED);
2860         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2861         oldpte = pte_load_clear(ptq);
2862         KASSERT(oldpte != 0,
2863             ("pmap_remove_pte: pmap %p va %x zero pte", pmap, va));
2864         if (oldpte & PG_W)
2865                 pmap->pm_stats.wired_count -= 1;
2866         /*
2867          * Machines that don't support invlpg, also don't support
2868          * PG_G.
2869          */
2870         if (oldpte & PG_G)
2871                 pmap_invalidate_page(kernel_pmap, va);
2872         pmap->pm_stats.resident_count -= 1;
2873         if (oldpte & PG_MANAGED) {
2874                 m = PHYS_TO_VM_PAGE(oldpte & PG_FRAME);
2875                 if ((oldpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
2876                         vm_page_dirty(m);
2877                 if (oldpte & PG_A)
2878                         vm_page_aflag_set(m, PGA_REFERENCED);
2879                 pmap_remove_entry(pmap, m, va);
2880         }
2881         return (pmap_unuse_pt(pmap, va, free));
2882 }
2883
2884 /*
2885  * Remove a single page from a process address space
2886  */
2887 static void
2888 pmap_remove_page(pmap_t pmap, vm_offset_t va, vm_page_t *free)
2889 {
2890         pt_entry_t *pte;
2891
2892         rw_assert(&pvh_global_lock, RA_WLOCKED);
2893         KASSERT(curthread->td_pinned > 0, ("curthread not pinned"));
2894         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2895         if ((pte = pmap_pte_quick(pmap, va)) == NULL || *pte == 0)
2896                 return;
2897         pmap_remove_pte(pmap, pte, va, free);
2898         pmap_invalidate_page(pmap, va);
2899 }
2900
2901 /*
2902  *      Remove the given range of addresses from the specified map.
2903  *
2904  *      It is assumed that the start and end are properly
2905  *      rounded to the page size.
2906  */
2907 void
2908 pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
2909 {
2910         vm_offset_t pdnxt;
2911         pd_entry_t ptpaddr;
2912         pt_entry_t *pte;
2913         vm_page_t free = NULL;
2914         int anyvalid;
2915
2916         /*
2917          * Perform an unsynchronized read.  This is, however, safe.
2918          */
2919         if (pmap->pm_stats.resident_count == 0)
2920                 return;
2921
2922         anyvalid = 0;
2923
2924         rw_wlock(&pvh_global_lock);
2925         sched_pin();
2926         PMAP_LOCK(pmap);
2927
2928         /*
2929          * special handling of removing one page.  a very
2930          * common operation and easy to short circuit some
2931          * code.
2932          */
2933         if ((sva + PAGE_SIZE == eva) && 
2934             ((pmap->pm_pdir[(sva >> PDRSHIFT)] & PG_PS) == 0)) {
2935                 pmap_remove_page(pmap, sva, &free);
2936                 goto out;
2937         }
2938
2939         for (; sva < eva; sva = pdnxt) {
2940                 u_int pdirindex;
2941
2942                 /*
2943                  * Calculate index for next page table.
2944                  */
2945                 pdnxt = (sva + NBPDR) & ~PDRMASK;
2946                 if (pdnxt < sva)
2947                         pdnxt = eva;
2948                 if (pmap->pm_stats.resident_count == 0)
2949                         break;
2950
2951                 pdirindex = sva >> PDRSHIFT;
2952                 ptpaddr = pmap->pm_pdir[pdirindex];
2953
2954                 /*
2955                  * Weed out invalid mappings. Note: we assume that the page
2956                  * directory table is always allocated, and in kernel virtual.
2957                  */
2958                 if (ptpaddr == 0)
2959                         continue;
2960
2961                 /*
2962                  * Check for large page.
2963                  */
2964                 if ((ptpaddr & PG_PS) != 0) {
2965                         /*
2966                          * Are we removing the entire large page?  If not,
2967                          * demote the mapping and fall through.
2968                          */
2969                         if (sva + NBPDR == pdnxt && eva >= pdnxt) {
2970                                 /*
2971                                  * The TLB entry for a PG_G mapping is
2972                                  * invalidated by pmap_remove_pde().
2973                                  */
2974                                 if ((ptpaddr & PG_G) == 0)
2975                                         anyvalid = 1;
2976                                 pmap_remove_pde(pmap,
2977                                     &pmap->pm_pdir[pdirindex], sva, &free);
2978                                 continue;
2979                         } else if (!pmap_demote_pde(pmap,
2980                             &pmap->pm_pdir[pdirindex], sva)) {
2981                                 /* The large page mapping was destroyed. */
2982                                 continue;
2983                         }
2984                 }
2985
2986                 /*
2987                  * Limit our scan to either the end of the va represented
2988                  * by the current page table page, or to the end of the
2989                  * range being removed.
2990                  */
2991                 if (pdnxt > eva)
2992                         pdnxt = eva;
2993
2994                 for (pte = pmap_pte_quick(pmap, sva); sva != pdnxt; pte++,
2995                     sva += PAGE_SIZE) {
2996                         if (*pte == 0)
2997                                 continue;
2998
2999                         /*
3000                          * The TLB entry for a PG_G mapping is invalidated
3001                          * by pmap_remove_pte().
3002                          */
3003                         if ((*pte & PG_G) == 0)
3004                                 anyvalid = 1;
3005                         if (pmap_remove_pte(pmap, pte, sva, &free))
3006                                 break;
3007                 }
3008         }
3009 out:
3010         sched_unpin();
3011         if (anyvalid)
3012                 pmap_invalidate_all(pmap);
3013         rw_wunlock(&pvh_global_lock);
3014         PMAP_UNLOCK(pmap);
3015         pmap_free_zero_pages(free);
3016 }
3017
3018 /*
3019  *      Routine:        pmap_remove_all
3020  *      Function:
3021  *              Removes this physical page from
3022  *              all physical maps in which it resides.
3023  *              Reflects back modify bits to the pager.
3024  *
3025  *      Notes:
3026  *              Original versions of this routine were very
3027  *              inefficient because they iteratively called
3028  *              pmap_remove (slow...)
3029  */
3030
3031 void
3032 pmap_remove_all(vm_page_t m)
3033 {
3034         struct md_page *pvh;
3035         pv_entry_t pv;
3036         pmap_t pmap;
3037         pt_entry_t *pte, tpte;
3038         pd_entry_t *pde;
3039         vm_offset_t va;
3040         vm_page_t free;
3041
3042         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
3043             ("pmap_remove_all: page %p is not managed", m));
3044         free = NULL;
3045         rw_wlock(&pvh_global_lock);
3046         sched_pin();
3047         if ((m->flags & PG_FICTITIOUS) != 0)
3048                 goto small_mappings;
3049         pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
3050         while ((pv = TAILQ_FIRST(&pvh->pv_list)) != NULL) {
3051                 va = pv->pv_va;
3052                 pmap = PV_PMAP(pv);
3053                 PMAP_LOCK(pmap);
3054                 pde = pmap_pde(pmap, va);
3055                 (void)pmap_demote_pde(pmap, pde, va);
3056                 PMAP_UNLOCK(pmap);
3057         }
3058 small_mappings:
3059         while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
3060                 pmap = PV_PMAP(pv);
3061                 PMAP_LOCK(pmap);
3062                 pmap->pm_stats.resident_count--;
3063                 pde = pmap_pde(pmap, pv->pv_va);
3064                 KASSERT((*pde & PG_PS) == 0, ("pmap_remove_all: found"
3065                     " a 4mpage in page %p's pv list", m));
3066                 pte = pmap_pte_quick(pmap, pv->pv_va);
3067                 tpte = pte_load_clear(pte);
3068                 KASSERT(tpte != 0, ("pmap_remove_all: pmap %p va %x zero pte",
3069                     pmap, pv->pv_va));
3070                 if (tpte & PG_W)
3071                         pmap->pm_stats.wired_count--;
3072                 if (tpte & PG_A)
3073                         vm_page_aflag_set(m, PGA_REFERENCED);
3074
3075                 /*
3076                  * Update the vm_page_t clean and reference bits.
3077                  */
3078                 if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
3079                         vm_page_dirty(m);
3080                 pmap_unuse_pt(pmap, pv->pv_va, &free);
3081                 pmap_invalidate_page(pmap, pv->pv_va);
3082                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
3083                 free_pv_entry(pmap, pv);
3084                 PMAP_UNLOCK(pmap);
3085         }
3086         vm_page_aflag_clear(m, PGA_WRITEABLE);
3087         sched_unpin();
3088         rw_wunlock(&pvh_global_lock);
3089         pmap_free_zero_pages(free);
3090 }
3091
3092 /*
3093  * pmap_protect_pde: do the things to protect a 4mpage in a process
3094  */
3095 static boolean_t
3096 pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva, vm_prot_t prot)
3097 {
3098         pd_entry_t newpde, oldpde;
3099         vm_offset_t eva, va;
3100         vm_page_t m;
3101         boolean_t anychanged;
3102
3103         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
3104         KASSERT((sva & PDRMASK) == 0,
3105             ("pmap_protect_pde: sva is not 4mpage aligned"));
3106         anychanged = FALSE;
3107 retry:
3108         oldpde = newpde = *pde;
3109         if (oldpde & PG_MANAGED) {
3110                 eva = sva + NBPDR;
3111                 for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME);
3112                     va < eva; va += PAGE_SIZE, m++)
3113                         if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW))
3114                                 vm_page_dirty(m);
3115         }
3116         if ((prot & VM_PROT_WRITE) == 0)
3117                 newpde &= ~(PG_RW | PG_M);
3118 #ifdef PAE
3119         if ((prot & VM_PROT_EXECUTE) == 0)
3120                 newpde |= pg_nx;
3121 #endif
3122         if (newpde != oldpde) {
3123                 if (!pde_cmpset(pde, oldpde, newpde))
3124                         goto retry;
3125                 if (oldpde & PG_G)
3126                         pmap_invalidate_page(pmap, sva);
3127                 else
3128                         anychanged = TRUE;
3129         }
3130         return (anychanged);
3131 }
3132
3133 /*
3134  *      Set the physical protection on the
3135  *      specified range of this map as requested.
3136  */
3137 void
3138 pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
3139 {
3140         vm_offset_t pdnxt;
3141         pd_entry_t ptpaddr;
3142         pt_entry_t *pte;
3143         boolean_t anychanged, pv_lists_locked;
3144
3145         if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
3146                 pmap_remove(pmap, sva, eva);
3147                 return;
3148         }
3149
3150 #ifdef PAE
3151         if ((prot & (VM_PROT_WRITE|VM_PROT_EXECUTE)) ==
3152             (VM_PROT_WRITE|VM_PROT_EXECUTE))
3153                 return;
3154 #else
3155         if (prot & VM_PROT_WRITE)
3156                 return;
3157 #endif
3158
3159         if (pmap_is_current(pmap))
3160                 pv_lists_locked = FALSE;
3161         else {
3162                 pv_lists_locked = TRUE;
3163 resume:
3164                 rw_wlock(&pvh_global_lock);
3165                 sched_pin();
3166         }
3167         anychanged = FALSE;
3168
3169         PMAP_LOCK(pmap);
3170         for (; sva < eva; sva = pdnxt) {
3171                 pt_entry_t obits, pbits;
3172                 u_int pdirindex;
3173
3174                 pdnxt = (sva + NBPDR) & ~PDRMASK;
3175                 if (pdnxt < sva)
3176                         pdnxt = eva;
3177
3178                 pdirindex = sva >> PDRSHIFT;
3179                 ptpaddr = pmap->pm_pdir[pdirindex];
3180
3181                 /*
3182                  * Weed out invalid mappings. Note: we assume that the page
3183                  * directory table is always allocated, and in kernel virtual.
3184                  */
3185                 if (ptpaddr == 0)
3186                         continue;
3187
3188                 /*
3189                  * Check for large page.
3190                  */
3191                 if ((ptpaddr & PG_PS) != 0) {
3192                         /*
3193                          * Are we protecting the entire large page?  If not,
3194                          * demote the mapping and fall through.
3195                          */
3196                         if (sva + NBPDR == pdnxt && eva >= pdnxt) {
3197                                 /*
3198                                  * The TLB entry for a PG_G mapping is
3199                                  * invalidated by pmap_protect_pde().
3200                                  */
3201                                 if (pmap_protect_pde(pmap,
3202                                     &pmap->pm_pdir[pdirindex], sva, prot))
3203                                         anychanged = TRUE;
3204                                 continue;
3205                         } else {
3206                                 if (!pv_lists_locked) {
3207                                         pv_lists_locked = TRUE;
3208                                         if (!rw_try_wlock(&pvh_global_lock)) {
3209                                                 if (anychanged)
3210                                                         pmap_invalidate_all(
3211                                                             pmap);
3212                                                 PMAP_UNLOCK(pmap);
3213                                                 goto resume;
3214                                         }
3215                                         sched_pin();
3216                                 }
3217                                 if (!pmap_demote_pde(pmap,
3218                                     &pmap->pm_pdir[pdirindex], sva)) {
3219                                         /*
3220                                          * The large page mapping was
3221                                          * destroyed.
3222                                          */
3223                                         continue;
3224                                 }
3225                         }
3226                 }
3227
3228                 if (pdnxt > eva)
3229                         pdnxt = eva;
3230
3231                 for (pte = pmap_pte_quick(pmap, sva); sva != pdnxt; pte++,
3232                     sva += PAGE_SIZE) {
3233                         vm_page_t m;
3234
3235 retry:
3236                         /*
3237                          * Regardless of whether a pte is 32 or 64 bits in
3238                          * size, PG_RW, PG_A, and PG_M are among the least
3239                          * significant 32 bits.
3240                          */
3241                         obits = pbits = *pte;
3242                         if ((pbits & PG_V) == 0)
3243                                 continue;
3244
3245                         if ((prot & VM_PROT_WRITE) == 0) {
3246                                 if ((pbits & (PG_MANAGED | PG_M | PG_RW)) ==
3247                                     (PG_MANAGED | PG_M | PG_RW)) {
3248                                         m = PHYS_TO_VM_PAGE(pbits & PG_FRAME);
3249                                         vm_page_dirty(m);
3250                                 }
3251                                 pbits &= ~(PG_RW | PG_M);
3252                         }
3253 #ifdef PAE
3254                         if ((prot & VM_PROT_EXECUTE) == 0)
3255                                 pbits |= pg_nx;
3256 #endif
3257
3258                         if (pbits != obits) {
3259 #ifdef PAE
3260                                 if (!atomic_cmpset_64(pte, obits, pbits))
3261                                         goto retry;
3262 #else
3263                                 if (!atomic_cmpset_int((u_int *)pte, obits,
3264                                     pbits))
3265                                         goto retry;
3266 #endif
3267                                 if (obits & PG_G)
3268                                         pmap_invalidate_page(pmap, sva);
3269                                 else
3270                                         anychanged = TRUE;
3271                         }
3272                 }
3273         }
3274         if (anychanged)
3275                 pmap_invalidate_all(pmap);
3276         if (pv_lists_locked) {
3277                 sched_unpin();
3278                 rw_wunlock(&pvh_global_lock);
3279         }
3280         PMAP_UNLOCK(pmap);
3281 }
3282
3283 /*
3284  * Tries to promote the 512 or 1024, contiguous 4KB page mappings that are
3285  * within a single page table page (PTP) to a single 2- or 4MB page mapping.
3286  * For promotion to occur, two conditions must be met: (1) the 4KB page
3287  * mappings must map aligned, contiguous physical memory and (2) the 4KB page
3288  * mappings must have identical characteristics.
3289  *
3290  * Managed (PG_MANAGED) mappings within the kernel address space are not
3291  * promoted.  The reason is that kernel PDEs are replicated in each pmap but
3292  * pmap_clear_ptes() and pmap_ts_referenced() only read the PDE from the kernel
3293  * pmap.
3294  */
3295 static void
3296 pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va)
3297 {
3298         pd_entry_t newpde;
3299         pt_entry_t *firstpte, oldpte, pa, *pte;
3300         vm_offset_t oldpteva;
3301         vm_page_t mpte;
3302
3303         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
3304
3305         /*
3306          * Examine the first PTE in the specified PTP.  Abort if this PTE is
3307          * either invalid, unused, or does not map the first 4KB physical page
3308          * within a 2- or 4MB page.
3309          */
3310         firstpte = pmap_pte_quick(pmap, trunc_4mpage(va));
3311 setpde:
3312         newpde = *firstpte;
3313         if ((newpde & ((PG_FRAME & PDRMASK) | PG_A | PG_V)) != (PG_A | PG_V)) {
3314                 pmap_pde_p_failures++;
3315                 CTR2(KTR_PMAP, "pmap_promote_pde: failure for va %#x"
3316                     " in pmap %p", va, pmap);
3317                 return;
3318         }
3319         if ((*firstpte & PG_MANAGED) != 0 && pmap == kernel_pmap) {
3320                 pmap_pde_p_failures++;
3321                 CTR2(KTR_PMAP, "pmap_promote_pde: failure for va %#x"
3322                     " in pmap %p", va, pmap);
3323                 return;
3324         }
3325         if ((newpde & (PG_M | PG_RW)) == PG_RW) {
3326                 /*
3327                  * When PG_M is already clear, PG_RW can be cleared without
3328                  * a TLB invalidation.
3329                  */
3330                 if (!atomic_cmpset_int((u_int *)firstpte, newpde, newpde &
3331                     ~PG_RW))  
3332                         goto setpde;
3333                 newpde &= ~PG_RW;
3334         }
3335
3336         /* 
3337          * Examine each of the other PTEs in the specified PTP.  Abort if this
3338          * PTE maps an unexpected 4KB physical page or does not have identical
3339          * characteristics to the first PTE.
3340          */
3341         pa = (newpde & (PG_PS_FRAME | PG_A | PG_V)) + NBPDR - PAGE_SIZE;
3342         for (pte = firstpte + NPTEPG - 1; pte > firstpte; pte--) {
3343 setpte:
3344                 oldpte = *pte;
3345                 if ((oldpte & (PG_FRAME | PG_A | PG_V)) != pa) {
3346                         pmap_pde_p_failures++;
3347                         CTR2(KTR_PMAP, "pmap_promote_pde: failure for va %#x"
3348                             " in pmap %p", va, pmap);
3349                         return;
3350                 }
3351                 if ((oldpte & (PG_M | PG_RW)) == PG_RW) {
3352                         /*
3353                          * When PG_M is already clear, PG_RW can be cleared
3354                          * without a TLB invalidation.
3355                          */
3356                         if (!atomic_cmpset_int((u_int *)pte, oldpte,
3357                             oldpte & ~PG_RW))
3358                                 goto setpte;
3359                         oldpte &= ~PG_RW;
3360                         oldpteva = (oldpte & PG_FRAME & PDRMASK) |
3361                             (va & ~PDRMASK);
3362                         CTR2(KTR_PMAP, "pmap_promote_pde: protect for va %#x"
3363                             " in pmap %p", oldpteva, pmap);
3364                 }
3365                 if ((oldpte & PG_PTE_PROMOTE) != (newpde & PG_PTE_PROMOTE)) {
3366                         pmap_pde_p_failures++;
3367                         CTR2(KTR_PMAP, "pmap_promote_pde: failure for va %#x"
3368                             " in pmap %p", va, pmap);
3369                         return;
3370                 }
3371                 pa -= PAGE_SIZE;
3372         }
3373
3374         /*
3375          * Save the page table page in its current state until the PDE
3376          * mapping the superpage is demoted by pmap_demote_pde() or
3377          * destroyed by pmap_remove_pde(). 
3378          */
3379         mpte = PHYS_TO_VM_PAGE(*pde & PG_FRAME);
3380         KASSERT(mpte >= vm_page_array &&
3381             mpte < &vm_page_array[vm_page_array_size],
3382             ("pmap_promote_pde: page table page is out of range"));
3383         KASSERT(mpte->pindex == va >> PDRSHIFT,
3384             ("pmap_promote_pde: page table page's pindex is wrong"));
3385         pmap_insert_pt_page(pmap, mpte);
3386
3387         /*
3388          * Promote the pv entries.
3389          */
3390         if ((newpde & PG_MANAGED) != 0)
3391                 pmap_pv_promote_pde(pmap, va, newpde & PG_PS_FRAME);
3392
3393         /*
3394          * Propagate the PAT index to its proper position.
3395          */
3396         if ((newpde & PG_PTE_PAT) != 0)
3397                 newpde ^= PG_PDE_PAT | PG_PTE_PAT;
3398
3399         /*
3400          * Map the superpage.
3401          */
3402         if (workaround_erratum383)
3403                 pmap_update_pde(pmap, va, pde, PG_PS | newpde);
3404         else if (pmap == kernel_pmap)
3405                 pmap_kenter_pde(va, PG_PS | newpde);
3406         else
3407                 pde_store(pde, PG_PS | newpde);
3408
3409         pmap_pde_promotions++;
3410         CTR2(KTR_PMAP, "pmap_promote_pde: success for va %#x"
3411             " in pmap %p", va, pmap);
3412 }
3413
3414 /*
3415  *      Insert the given physical page (p) at
3416  *      the specified virtual address (v) in the
3417  *      target physical map with the protection requested.
3418  *
3419  *      If specified, the page will be wired down, meaning
3420  *      that the related pte can not be reclaimed.
3421  *
3422  *      NB:  This is the only routine which MAY NOT lazy-evaluate
3423  *      or lose information.  That is, this routine must actually
3424  *      insert this page into the given map NOW.
3425  */
3426 void
3427 pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m,
3428     vm_prot_t prot, boolean_t wired)
3429 {
3430         pd_entry_t *pde;
3431         pt_entry_t *pte;
3432         pt_entry_t newpte, origpte;
3433         pv_entry_t pv;
3434         vm_paddr_t opa, pa;
3435         vm_page_t mpte, om;
3436         boolean_t invlva;
3437
3438         va = trunc_page(va);
3439         KASSERT(va <= VM_MAX_KERNEL_ADDRESS, ("pmap_enter: toobig"));
3440         KASSERT(va < UPT_MIN_ADDRESS || va >= UPT_MAX_ADDRESS,
3441             ("pmap_enter: invalid to pmap_enter page table pages (va: 0x%x)",
3442             va));
3443         KASSERT((m->oflags & (VPO_UNMANAGED | VPO_BUSY)) != 0 ||
3444             VM_OBJECT_LOCKED(m->object),
3445             ("pmap_enter: page %p is not busy", m));
3446
3447         mpte = NULL;
3448
3449         rw_wlock(&pvh_global_lock);
3450         PMAP_LOCK(pmap);
3451         sched_pin();
3452
3453         /*
3454          * In the case that a page table page is not
3455          * resident, we are creating it here.
3456          */
3457         if (va < VM_MAXUSER_ADDRESS) {
3458                 mpte = pmap_allocpte(pmap, va, M_WAITOK);
3459         }
3460
3461         pde = pmap_pde(pmap, va);
3462         if ((*pde & PG_PS) != 0)
3463                 panic("pmap_enter: attempted pmap_enter on 4MB page");
3464         pte = pmap_pte_quick(pmap, va);
3465
3466         /*
3467          * Page Directory table entry not valid, we need a new PT page
3468          */
3469         if (pte == NULL) {
3470                 panic("pmap_enter: invalid page directory pdir=%#jx, va=%#x",
3471                         (uintmax_t)pmap->pm_pdir[PTDPTDI], va);
3472         }
3473
3474         pa = VM_PAGE_TO_PHYS(m);
3475         om = NULL;
3476         origpte = *pte;
3477         opa = origpte & PG_FRAME;
3478
3479         /*
3480          * Mapping has not changed, must be protection or wiring change.
3481          */
3482         if (origpte && (opa == pa)) {
3483                 /*
3484                  * Wiring change, just update stats. We don't worry about
3485                  * wiring PT pages as they remain resident as long as there
3486                  * are valid mappings in them. Hence, if a user page is wired,
3487                  * the PT page will be also.
3488                  */
3489                 if (wired && ((origpte & PG_W) == 0))
3490                         pmap->pm_stats.wired_count++;
3491                 else if (!wired && (origpte & PG_W))
3492                         pmap->pm_stats.wired_count--;
3493
3494                 /*
3495                  * Remove extra pte reference
3496                  */
3497                 if (mpte)
3498                         mpte->wire_count--;
3499
3500                 if (origpte & PG_MANAGED) {
3501                         om = m;
3502                         pa |= PG_MANAGED;
3503                 }
3504                 goto validate;
3505         } 
3506
3507         pv = NULL;
3508
3509         /*
3510          * Mapping has changed, invalidate old range and fall through to
3511          * handle validating new mapping.
3512          */
3513         if (opa) {
3514                 if (origpte & PG_W)
3515                         pmap->pm_stats.wired_count--;
3516                 if (origpte & PG_MANAGED) {
3517                         om = PHYS_TO_VM_PAGE(opa);
3518                         pv = pmap_pvh_remove(&om->md, pmap, va);
3519                 }
3520                 if (mpte != NULL) {
3521                         mpte->wire_count--;
3522                         KASSERT(mpte->wire_count > 0,
3523                             ("pmap_enter: missing reference to page table page,"
3524                              " va: 0x%x", va));
3525                 }
3526         } else
3527                 pmap->pm_stats.resident_count++;
3528
3529         /*
3530          * Enter on the PV list if part of our managed memory.
3531          */
3532         if ((m->oflags & VPO_UNMANAGED) == 0) {
3533                 KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva,
3534                     ("pmap_enter: managed mapping within the clean submap"));
3535                 if (pv == NULL)
3536                         pv = get_pv_entry(pmap, FALSE);
3537                 pv->pv_va = va;
3538                 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
3539                 pa |= PG_MANAGED;
3540         } else if (pv != NULL)
3541                 free_pv_entry(pmap, pv);
3542
3543         /*
3544          * Increment counters
3545          */
3546         if (wired)
3547                 pmap->pm_stats.wired_count++;
3548
3549 validate:
3550         /*
3551          * Now validate mapping with desired protection/wiring.
3552          */
3553         newpte = (pt_entry_t)(pa | pmap_cache_bits(m->md.pat_mode, 0) | PG_V);
3554         if ((prot & VM_PROT_WRITE) != 0) {
3555                 newpte |= PG_RW;
3556                 if ((newpte & PG_MANAGED) != 0)
3557                         vm_page_aflag_set(m, PGA_WRITEABLE);
3558         }
3559 #ifdef PAE
3560         if ((prot & VM_PROT_EXECUTE) == 0)
3561                 newpte |= pg_nx;
3562 #endif
3563         if (wired)
3564                 newpte |= PG_W;
3565         if (va < VM_MAXUSER_ADDRESS)
3566                 newpte |= PG_U;
3567         if (pmap == kernel_pmap)
3568                 newpte |= pgeflag;
3569
3570         /*
3571          * if the mapping or permission bits are different, we need
3572          * to update the pte.
3573          */
3574         if ((origpte & ~(PG_M|PG_A)) != newpte) {
3575                 newpte |= PG_A;
3576                 if ((access & VM_PROT_WRITE) != 0)
3577                         newpte |= PG_M;
3578                 if (origpte & PG_V) {
3579                         invlva = FALSE;
3580                         origpte = pte_load_store(pte, newpte);
3581                         if (origpte & PG_A) {
3582                                 if (origpte & PG_MANAGED)
3583                                         vm_page_aflag_set(om, PGA_REFERENCED);
3584                                 if (opa != VM_PAGE_TO_PHYS(m))
3585                                         invlva = TRUE;
3586 #ifdef PAE
3587                                 if ((origpte & PG_NX) == 0 &&
3588                                     (newpte & PG_NX) != 0)
3589                                         invlva = TRUE;
3590 #endif
3591                         }
3592                         if ((origpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) {
3593                                 if ((origpte & PG_MANAGED) != 0)
3594                                         vm_page_dirty(om);
3595                                 if ((prot & VM_PROT_WRITE) == 0)
3596                                         invlva = TRUE;
3597                         }
3598                         if ((origpte & PG_MANAGED) != 0 &&
3599                             TAILQ_EMPTY(&om->md.pv_list) &&
3600                             ((om->flags & PG_FICTITIOUS) != 0 ||
3601                             TAILQ_EMPTY(&pa_to_pvh(opa)->pv_list)))
3602                                 vm_page_aflag_clear(om, PGA_WRITEABLE);
3603                         if (invlva)
3604                                 pmap_invalidate_page(pmap, va);
3605                 } else
3606                         pte_store(pte, newpte);
3607         }
3608
3609         /*
3610          * If both the page table page and the reservation are fully
3611          * populated, then attempt promotion.
3612          */
3613         if ((mpte == NULL || mpte->wire_count == NPTEPG) &&
3614             pg_ps_enabled && (m->flags & PG_FICTITIOUS) == 0 &&
3615             vm_reserv_level_iffullpop(m) == 0)
3616                 pmap_promote_pde(pmap, pde, va);
3617
3618         sched_unpin();
3619         rw_wunlock(&pvh_global_lock);
3620         PMAP_UNLOCK(pmap);
3621 }
3622
3623 /*
3624  * Tries to create a 2- or 4MB page mapping.  Returns TRUE if successful and
3625  * FALSE otherwise.  Fails if (1) a page table page cannot be allocated without
3626  * blocking, (2) a mapping already exists at the specified virtual address, or
3627  * (3) a pv entry cannot be allocated without reclaiming another pv entry. 
3628  */
3629 static boolean_t
3630 pmap_enter_pde(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
3631 {
3632         pd_entry_t *pde, newpde;
3633
3634         rw_assert(&pvh_global_lock, RA_WLOCKED);
3635         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
3636         pde = pmap_pde(pmap, va);
3637         if (*pde != 0) {
3638                 CTR2(KTR_PMAP, "pmap_enter_pde: failure for va %#lx"
3639                     " in pmap %p", va, pmap);
3640                 return (FALSE);
3641         }
3642         newpde = VM_PAGE_TO_PHYS(m) | pmap_cache_bits(m->md.pat_mode, 1) |
3643             PG_PS | PG_V;
3644         if ((m->oflags & VPO_UNMANAGED) == 0) {
3645                 newpde |= PG_MANAGED;
3646
3647                 /*
3648                  * Abort this mapping if its PV entry could not be created.
3649                  */
3650                 if (!pmap_pv_insert_pde(pmap, va, VM_PAGE_TO_PHYS(m))) {
3651                         CTR2(KTR_PMAP, "pmap_enter_pde: failure for va %#lx"
3652                             " in pmap %p", va, pmap);
3653                         return (FALSE);
3654                 }
3655         }
3656 #ifdef PAE
3657         if ((prot & VM_PROT_EXECUTE) == 0)
3658                 newpde |= pg_nx;
3659 #endif
3660         if (va < VM_MAXUSER_ADDRESS)
3661                 newpde |= PG_U;
3662
3663         /*
3664          * Increment counters.
3665          */
3666         pmap->pm_stats.resident_count += NBPDR / PAGE_SIZE;
3667
3668         /*
3669          * Map the superpage.
3670          */
3671         pde_store(pde, newpde);
3672
3673         pmap_pde_mappings++;
3674         CTR2(KTR_PMAP, "pmap_enter_pde: success for va %#lx"
3675             " in pmap %p", va, pmap);
3676         return (TRUE);
3677 }
3678
3679 /*
3680  * Maps a sequence of resident pages belonging to the same object.
3681  * The sequence begins with the given page m_start.  This page is
3682  * mapped at the given virtual address start.  Each subsequent page is
3683  * mapped at a virtual address that is offset from start by the same
3684  * amount as the page is offset from m_start within the object.  The
3685  * last page in the sequence is the page with the largest offset from
3686  * m_start that can be mapped at a virtual address less than the given
3687  * virtual address end.  Not every virtual page between start and end
3688  * is mapped; only those for which a resident page exists with the
3689  * corresponding offset from m_start are mapped.
3690  */
3691 void
3692 pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end,
3693     vm_page_t m_start, vm_prot_t prot)
3694 {
3695         vm_offset_t va;
3696         vm_page_t m, mpte;
3697         vm_pindex_t diff, psize;
3698
3699         VM_OBJECT_LOCK_ASSERT(m_start->object, MA_OWNED);
3700         psize = atop(end - start);
3701         mpte = NULL;
3702         m = m_start;
3703         rw_wlock(&pvh_global_lock);
3704         PMAP_LOCK(pmap);
3705         while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
3706                 va = start + ptoa(diff);
3707                 if ((va & PDRMASK) == 0 && va + NBPDR <= end &&
3708                     (VM_PAGE_TO_PHYS(m) & PDRMASK) == 0 &&
3709                     pg_ps_enabled && vm_reserv_level_iffullpop(m) == 0 &&
3710                     pmap_enter_pde(pmap, va, m, prot))
3711                         m = &m[NBPDR / PAGE_SIZE - 1];
3712                 else
3713                         mpte = pmap_enter_quick_locked(pmap, va, m, prot,
3714                             mpte);
3715                 m = TAILQ_NEXT(m, listq);
3716         }
3717         rw_wunlock(&pvh_global_lock);
3718         PMAP_UNLOCK(pmap);
3719 }
3720
3721 /*
3722  * this code makes some *MAJOR* assumptions:
3723  * 1. Current pmap & pmap exists.
3724  * 2. Not wired.
3725  * 3. Read access.
3726  * 4. No page table pages.
3727  * but is *MUCH* faster than pmap_enter...
3728  */
3729
3730 void
3731 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
3732 {
3733
3734         rw_wlock(&pvh_global_lock);
3735         PMAP_LOCK(pmap);
3736         (void)pmap_enter_quick_locked(pmap, va, m, prot, NULL);
3737         rw_wunlock(&pvh_global_lock);
3738         PMAP_UNLOCK(pmap);
3739 }
3740
3741 static vm_page_t
3742 pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
3743     vm_prot_t prot, vm_page_t mpte)
3744 {
3745         pt_entry_t *pte;
3746         vm_paddr_t pa;
3747         vm_page_t free;
3748
3749         KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
3750             (m->oflags & VPO_UNMANAGED) != 0,
3751             ("pmap_enter_quick_locked: managed mapping within the clean submap"));
3752         rw_assert(&pvh_global_lock, RA_WLOCKED);
3753         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
3754
3755         /*
3756          * In the case that a page table page is not
3757          * resident, we are creating it here.
3758          */
3759         if (va < VM_MAXUSER_ADDRESS) {
3760                 u_int ptepindex;
3761                 pd_entry_t ptepa;
3762
3763                 /*
3764                  * Calculate pagetable page index
3765                  */
3766                 ptepindex = va >> PDRSHIFT;
3767                 if (mpte && (mpte->pindex == ptepindex)) {
3768                         mpte->wire_count++;
3769                 } else {
3770                         /*
3771                          * Get the page directory entry
3772                          */
3773                         ptepa = pmap->pm_pdir[ptepindex];
3774
3775                         /*
3776                          * If the page table page is mapped, we just increment
3777                          * the hold count, and activate it.
3778                          */
3779                         if (ptepa) {
3780                                 if (ptepa & PG_PS)
3781                                         return (NULL);
3782                                 mpte = PHYS_TO_VM_PAGE(ptepa & PG_FRAME);
3783                                 mpte->wire_count++;
3784                         } else {
3785                                 mpte = _pmap_allocpte(pmap, ptepindex,
3786                                     M_NOWAIT);
3787                                 if (mpte == NULL)
3788                                         return (mpte);
3789                         }
3790                 }
3791         } else {
3792                 mpte = NULL;
3793         }
3794
3795         /*
3796          * This call to vtopte makes the assumption that we are
3797          * entering the page into the current pmap.  In order to support
3798          * quick entry into any pmap, one would likely use pmap_pte_quick.
3799          * But that isn't as quick as vtopte.
3800          */
3801         pte = vtopte(va);
3802         if (*pte) {
3803                 if (mpte != NULL) {
3804                         mpte->wire_count--;
3805                         mpte = NULL;
3806                 }
3807                 return (mpte);
3808         }
3809
3810         /*
3811          * Enter on the PV list if part of our managed memory.
3812          */
3813         if ((m->oflags & VPO_UNMANAGED) == 0 &&
3814             !pmap_try_insert_pv_entry(pmap, va, m)) {
3815                 if (mpte != NULL) {
3816                         free = NULL;
3817                         if (pmap_unwire_ptp(pmap, mpte, &free)) {
3818                                 pmap_invalidate_page(pmap, va);
3819                                 pmap_free_zero_pages(free);
3820                         }
3821                         
3822                         mpte = NULL;
3823                 }
3824                 return (mpte);
3825         }
3826
3827         /*
3828          * Increment counters
3829          */
3830         pmap->pm_stats.resident_count++;
3831
3832         pa = VM_PAGE_TO_PHYS(m) | pmap_cache_bits(m->md.pat_mode, 0);
3833 #ifdef PAE
3834         if ((prot & VM_PROT_EXECUTE) == 0)
3835                 pa |= pg_nx;
3836 #endif
3837
3838         /*
3839          * Now validate mapping with RO protection
3840          */
3841         if ((m->oflags & VPO_UNMANAGED) != 0)
3842                 pte_store(pte, pa | PG_V | PG_U);
3843         else
3844                 pte_store(pte, pa | PG_V | PG_U | PG_MANAGED);
3845         return (mpte);
3846 }
3847
3848 /*
3849  * Make a temporary mapping for a physical address.  This is only intended
3850  * to be used for panic dumps.
3851  */
3852 void *
3853 pmap_kenter_temporary(vm_paddr_t pa, int i)
3854 {
3855         vm_offset_t va;
3856
3857         va = (vm_offset_t)crashdumpmap + (i * PAGE_SIZE);
3858         pmap_kenter(va, pa);
3859         invlpg(va);
3860         return ((void *)crashdumpmap);
3861 }
3862
3863 /*
3864  * This code maps large physical mmap regions into the
3865  * processor address space.  Note that some shortcuts
3866  * are taken, but the code works.
3867  */
3868 void
3869 pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object,
3870     vm_pindex_t pindex, vm_size_t size)
3871 {
3872         pd_entry_t *pde;
3873         vm_paddr_t pa, ptepa;
3874         vm_page_t p;
3875         int pat_mode;
3876
3877         VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
3878         KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG,
3879             ("pmap_object_init_pt: non-device object"));
3880         if (pseflag && 
3881             (addr & (NBPDR - 1)) == 0 && (size & (NBPDR - 1)) == 0) {
3882                 if (!vm_object_populate(object, pindex, pindex + atop(size)))
3883                         return;
3884                 p = vm_page_lookup(object, pindex);
3885                 KASSERT(p->valid == VM_PAGE_BITS_ALL,
3886                     ("pmap_object_init_pt: invalid page %p", p));
3887                 pat_mode = p->md.pat_mode;
3888
3889                 /*
3890                  * Abort the mapping if the first page is not physically
3891                  * aligned to a 2/4MB page boundary.
3892                  */
3893                 ptepa = VM_PAGE_TO_PHYS(p);
3894                 if (ptepa & (NBPDR - 1))
3895                         return;
3896
3897                 /*
3898                  * Skip the first page.  Abort the mapping if the rest of
3899                  * the pages are not physically contiguous or have differing
3900                  * memory attributes.
3901                  */
3902                 p = TAILQ_NEXT(p, listq);
3903                 for (pa = ptepa + PAGE_SIZE; pa < ptepa + size;
3904                     pa += PAGE_SIZE) {
3905                         KASSERT(p->valid == VM_PAGE_BITS_ALL,
3906                             ("pmap_object_init_pt: invalid page %p", p));
3907                         if (pa != VM_PAGE_TO_PHYS(p) ||
3908                             pat_mode != p->md.pat_mode)
3909                                 return;
3910                         p = TAILQ_NEXT(p, listq);
3911                 }
3912
3913                 /*
3914                  * Map using 2/4MB pages.  Since "ptepa" is 2/4M aligned and
3915                  * "size" is a multiple of 2/4M, adding the PAT setting to
3916                  * "pa" will not affect the termination of this loop.
3917                  */
3918                 PMAP_LOCK(pmap);
3919                 for (pa = ptepa | pmap_cache_bits(pat_mode, 1); pa < ptepa +
3920                     size; pa += NBPDR) {
3921                         pde = pmap_pde(pmap, addr);
3922                         if (*pde == 0) {
3923                                 pde_store(pde, pa | PG_PS | PG_M | PG_A |
3924                                     PG_U | PG_RW | PG_V);
3925                                 pmap->pm_stats.resident_count += NBPDR /
3926                                     PAGE_SIZE;
3927                                 pmap_pde_mappings++;
3928                         }
3929                         /* Else continue on if the PDE is already valid. */
3930                         addr += NBPDR;
3931                 }
3932                 PMAP_UNLOCK(pmap);
3933         }
3934 }
3935
3936 /*
3937  *      Routine:        pmap_change_wiring
3938  *      Function:       Change the wiring attribute for a map/virtual-address
3939  *                      pair.
3940  *      In/out conditions:
3941  *                      The mapping must already exist in the pmap.
3942  */
3943 void
3944 pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired)
3945 {
3946         pd_entry_t *pde;
3947         pt_entry_t *pte;
3948         boolean_t are_queues_locked;
3949
3950         are_queues_locked = FALSE;
3951 retry:
3952         PMAP_LOCK(pmap);
3953         pde = pmap_pde(pmap, va);
3954         if ((*pde & PG_PS) != 0) {
3955                 if (!wired != ((*pde & PG_W) == 0)) {
3956                         if (!are_queues_locked) {
3957                                 are_queues_locked = TRUE;
3958                                 if (!rw_try_wlock(&pvh_global_lock)) {
3959                                         PMAP_UNLOCK(pmap);
3960                                         rw_wlock(&pvh_global_lock);
3961                                         goto retry;
3962                                 }
3963                         }
3964                         if (!pmap_demote_pde(pmap, pde, va))
3965                                 panic("pmap_change_wiring: demotion failed");
3966                 } else
3967                         goto out;
3968         }
3969         pte = pmap_pte(pmap, va);
3970
3971         if (wired && !pmap_pte_w(pte))
3972                 pmap->pm_stats.wired_count++;
3973         else if (!wired && pmap_pte_w(pte))
3974                 pmap->pm_stats.wired_count--;
3975
3976         /*
3977          * Wiring is not a hardware characteristic so there is no need to
3978          * invalidate TLB.
3979          */
3980         pmap_pte_set_w(pte, wired);
3981         pmap_pte_release(pte);
3982 out:
3983         if (are_queues_locked)
3984                 rw_wunlock(&pvh_global_lock);
3985         PMAP_UNLOCK(pmap);
3986 }
3987
3988
3989
3990 /*
3991  *      Copy the range specified by src_addr/len
3992  *      from the source map to the range dst_addr/len
3993  *      in the destination map.
3994  *
3995  *      This routine is only advisory and need not do anything.
3996  */
3997
3998 void
3999 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
4000     vm_offset_t src_addr)
4001 {
4002         vm_page_t   free;
4003         vm_offset_t addr;
4004         vm_offset_t end_addr = src_addr + len;
4005         vm_offset_t pdnxt;
4006
4007         if (dst_addr != src_addr)
4008                 return;
4009
4010         if (!pmap_is_current(src_pmap))
4011                 return;
4012
4013         rw_wlock(&pvh_global_lock);
4014         if (dst_pmap < src_pmap) {
4015                 PMAP_LOCK(dst_pmap);
4016                 PMAP_LOCK(src_pmap);
4017         } else {
4018                 PMAP_LOCK(src_pmap);
4019                 PMAP_LOCK(dst_pmap);
4020         }
4021         sched_pin();
4022         for (addr = src_addr; addr < end_addr; addr = pdnxt) {
4023                 pt_entry_t *src_pte, *dst_pte;
4024                 vm_page_t dstmpte, srcmpte;
4025                 pd_entry_t srcptepaddr;
4026                 u_int ptepindex;
4027
4028                 KASSERT(addr < UPT_MIN_ADDRESS,
4029                     ("pmap_copy: invalid to pmap_copy page tables"));
4030
4031                 pdnxt = (addr + NBPDR) & ~PDRMASK;
4032                 if (pdnxt < addr)
4033                         pdnxt = end_addr;
4034                 ptepindex = addr >> PDRSHIFT;
4035
4036                 srcptepaddr = src_pmap->pm_pdir[ptepindex];
4037                 if (srcptepaddr == 0)
4038                         continue;
4039                         
4040                 if (srcptepaddr & PG_PS) {
4041                         if (dst_pmap->pm_pdir[ptepindex] == 0 &&
4042                             ((srcptepaddr & PG_MANAGED) == 0 ||
4043                             pmap_pv_insert_pde(dst_pmap, addr, srcptepaddr &
4044                             PG_PS_FRAME))) {
4045                                 dst_pmap->pm_pdir[ptepindex] = srcptepaddr &
4046                                     ~PG_W;
4047                                 dst_pmap->pm_stats.resident_count +=
4048                                     NBPDR / PAGE_SIZE;
4049                         }
4050                         continue;
4051                 }
4052
4053                 srcmpte = PHYS_TO_VM_PAGE(srcptepaddr & PG_FRAME);
4054                 KASSERT(srcmpte->wire_count > 0,
4055                     ("pmap_copy: source page table page is unused"));
4056
4057                 if (pdnxt > end_addr)
4058                         pdnxt = end_addr;
4059
4060                 src_pte = vtopte(addr);
4061                 while (addr < pdnxt) {
4062                         pt_entry_t ptetemp;
4063                         ptetemp = *src_pte;
4064                         /*
4065                          * we only virtual copy managed pages
4066                          */
4067                         if ((ptetemp & PG_MANAGED) != 0) {
4068                                 dstmpte = pmap_allocpte(dst_pmap, addr,
4069                                     M_NOWAIT);
4070                                 if (dstmpte == NULL)
4071                                         goto out;
4072                                 dst_pte = pmap_pte_quick(dst_pmap, addr);
4073                                 if (*dst_pte == 0 &&
4074                                     pmap_try_insert_pv_entry(dst_pmap, addr,
4075                                     PHYS_TO_VM_PAGE(ptetemp & PG_FRAME))) {
4076                                         /*
4077                                          * Clear the wired, modified, and
4078                                          * accessed (referenced) bits
4079                                          * during the copy.
4080                                          */
4081                                         *dst_pte = ptetemp & ~(PG_W | PG_M |
4082                                             PG_A);
4083                                         dst_pmap->pm_stats.resident_count++;
4084                                 } else {
4085                                         free = NULL;
4086                                         if (pmap_unwire_ptp(dst_pmap, dstmpte,
4087                                             &free)) {
4088                                                 pmap_invalidate_page(dst_pmap,
4089                                                     addr);
4090                                                 pmap_free_zero_pages(free);
4091                                         }
4092                                         goto out;
4093                                 }
4094                                 if (dstmpte->wire_count >= srcmpte->wire_count)
4095                                         break;
4096                         }
4097                         addr += PAGE_SIZE;
4098                         src_pte++;
4099                 }
4100         }
4101 out:
4102         sched_unpin();
4103         rw_wunlock(&pvh_global_lock);
4104         PMAP_UNLOCK(src_pmap);
4105         PMAP_UNLOCK(dst_pmap);
4106 }       
4107
4108 static __inline void
4109 pagezero(void *page)
4110 {
4111 #if defined(I686_CPU)
4112         if (cpu_class == CPUCLASS_686) {
4113 #if defined(CPU_ENABLE_SSE)
4114                 if (cpu_feature & CPUID_SSE2)
4115                         sse2_pagezero(page);
4116                 else
4117 #endif
4118                         i686_pagezero(page);
4119         } else
4120 #endif
4121                 bzero(page, PAGE_SIZE);
4122 }
4123
4124 /*
4125  *      pmap_zero_page zeros the specified hardware page by mapping 
4126  *      the page into KVM and using bzero to clear its contents.
4127  */
4128 void
4129 pmap_zero_page(vm_page_t m)
4130 {
4131         struct sysmaps *sysmaps;
4132
4133         sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
4134         mtx_lock(&sysmaps->lock);
4135         if (*sysmaps->CMAP2)
4136                 panic("pmap_zero_page: CMAP2 busy");
4137         sched_pin();
4138         *sysmaps->CMAP2 = PG_V | PG_RW | VM_PAGE_TO_PHYS(m) | PG_A | PG_M |
4139             pmap_cache_bits(m->md.pat_mode, 0);
4140         invlcaddr(sysmaps->CADDR2);
4141         pagezero(sysmaps->CADDR2);
4142         *sysmaps->CMAP2 = 0;
4143         sched_unpin();
4144         mtx_unlock(&sysmaps->lock);
4145 }
4146
4147 /*
4148  *      pmap_zero_page_area zeros the specified hardware page by mapping 
4149  *      the page into KVM and using bzero to clear its contents.
4150  *
4151  *      off and size may not cover an area beyond a single hardware page.
4152  */
4153 void
4154 pmap_zero_page_area(vm_page_t m, int off, int size)
4155 {
4156         struct sysmaps *sysmaps;
4157
4158         sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
4159         mtx_lock(&sysmaps->lock);
4160         if (*sysmaps->CMAP2)
4161                 panic("pmap_zero_page_area: CMAP2 busy");
4162         sched_pin();
4163         *sysmaps->CMAP2 = PG_V | PG_RW | VM_PAGE_TO_PHYS(m) | PG_A | PG_M |
4164             pmap_cache_bits(m->md.pat_mode, 0);
4165         invlcaddr(sysmaps->CADDR2);
4166         if (off == 0 && size == PAGE_SIZE) 
4167                 pagezero(sysmaps->CADDR2);
4168         else
4169                 bzero((char *)sysmaps->CADDR2 + off, size);
4170         *sysmaps->CMAP2 = 0;
4171         sched_unpin();
4172         mtx_unlock(&sysmaps->lock);
4173 }
4174
4175 /*
4176  *      pmap_zero_page_idle zeros the specified hardware page by mapping 
4177  *      the page into KVM and using bzero to clear its contents.  This
4178  *      is intended to be called from the vm_pagezero process only and
4179  *      outside of Giant.
4180  */
4181 void
4182 pmap_zero_page_idle(vm_page_t m)
4183 {
4184
4185         if (*CMAP3)
4186                 panic("pmap_zero_page_idle: CMAP3 busy");
4187         sched_pin();
4188         *CMAP3 = PG_V | PG_RW | VM_PAGE_TO_PHYS(m) | PG_A | PG_M |
4189             pmap_cache_bits(m->md.pat_mode, 0);
4190         invlcaddr(CADDR3);
4191         pagezero(CADDR3);
4192         *CMAP3 = 0;
4193         sched_unpin();
4194 }
4195
4196 /*
4197  *      pmap_copy_page copies the specified (machine independent)
4198  *      page by mapping the page into virtual memory and using
4199  *      bcopy to copy the page, one machine dependent page at a
4200  *      time.
4201  */
4202 void
4203 pmap_copy_page(vm_page_t src, vm_page_t dst)
4204 {
4205         struct sysmaps *sysmaps;
4206
4207         sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
4208         mtx_lock(&sysmaps->lock);
4209         if (*sysmaps->CMAP1)
4210                 panic("pmap_copy_page: CMAP1 busy");
4211         if (*sysmaps->CMAP2)
4212                 panic("pmap_copy_page: CMAP2 busy");
4213         sched_pin();
4214         invlpg((u_int)sysmaps->CADDR1);
4215         invlpg((u_int)sysmaps->CADDR2);
4216         *sysmaps->CMAP1 = PG_V | VM_PAGE_TO_PHYS(src) | PG_A |
4217             pmap_cache_bits(src->md.pat_mode, 0);
4218         *sysmaps->CMAP2 = PG_V | PG_RW | VM_PAGE_TO_PHYS(dst) | PG_A | PG_M |
4219             pmap_cache_bits(dst->md.pat_mode, 0);
4220         bcopy(sysmaps->CADDR1, sysmaps->CADDR2, PAGE_SIZE);
4221         *sysmaps->CMAP1 = 0;
4222         *sysmaps->CMAP2 = 0;
4223         sched_unpin();
4224         mtx_unlock(&sysmaps->lock);
4225 }
4226
4227 /*
4228  * Returns true if the pmap's pv is one of the first
4229  * 16 pvs linked to from this page.  This count may
4230  * be changed upwards or downwards in the future; it
4231  * is only necessary that true be returned for a small
4232  * subset of pmaps for proper page aging.
4233  */
4234 boolean_t
4235 pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
4236 {
4237         struct md_page *pvh;
4238         pv_entry_t pv;
4239         int loops = 0;
4240         boolean_t rv;
4241
4242         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
4243             ("pmap_page_exists_quick: page %p is not managed", m));
4244         rv = FALSE;
4245         rw_wlock(&pvh_global_lock);
4246         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
4247                 if (PV_PMAP(pv) == pmap) {
4248                         rv = TRUE;
4249                         break;
4250                 }
4251                 loops++;
4252                 if (loops >= 16)
4253                         break;
4254         }
4255         if (!rv && loops < 16 && (m->flags & PG_FICTITIOUS) == 0) {
4256                 pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
4257                 TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) {
4258                         if (PV_PMAP(pv) == pmap) {
4259                                 rv = TRUE;
4260                                 break;
4261                         }
4262                         loops++;
4263                         if (loops >= 16)
4264                                 break;
4265                 }
4266         }
4267         rw_wunlock(&pvh_global_lock);
4268         return (rv);
4269 }
4270
4271 /*
4272  *      pmap_page_wired_mappings:
4273  *
4274  *      Return the number of managed mappings to the given physical page
4275  *      that are wired.
4276  */
4277 int
4278 pmap_page_wired_mappings(vm_page_t m)
4279 {
4280         int count;
4281
4282         count = 0;
4283         if ((m->oflags & VPO_UNMANAGED) != 0)
4284                 return (count);
4285         rw_wlock(&pvh_global_lock);
4286         count = pmap_pvh_wired_mappings(&m->md, count);
4287         if ((m->flags & PG_FICTITIOUS) == 0) {
4288             count = pmap_pvh_wired_mappings(pa_to_pvh(VM_PAGE_TO_PHYS(m)),
4289                 count);
4290         }
4291         rw_wunlock(&pvh_global_lock);
4292         return (count);
4293 }
4294
4295 /*
4296  *      pmap_pvh_wired_mappings:
4297  *
4298  *      Return the updated number "count" of managed mappings that are wired.
4299  */
4300 static int
4301 pmap_pvh_wired_mappings(struct md_page *pvh, int count)
4302 {
4303         pmap_t pmap;
4304         pt_entry_t *pte;
4305         pv_entry_t pv;
4306
4307         rw_assert(&pvh_global_lock, RA_WLOCKED);
4308         sched_pin();
4309         TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) {
4310                 pmap = PV_PMAP(pv);
4311                 PMAP_LOCK(pmap);
4312                 pte = pmap_pte_quick(pmap, pv->pv_va);
4313                 if ((*pte & PG_W) != 0)
4314                         count++;
4315                 PMAP_UNLOCK(pmap);
4316         }
4317         sched_unpin();
4318         return (count);
4319 }
4320
4321 /*
4322  * Returns TRUE if the given page is mapped individually or as part of
4323  * a 4mpage.  Otherwise, returns FALSE.
4324  */
4325 boolean_t
4326 pmap_page_is_mapped(vm_page_t m)
4327 {
4328         boolean_t rv;
4329
4330         if ((m->oflags & VPO_UNMANAGED) != 0)
4331                 return (FALSE);
4332         rw_wlock(&pvh_global_lock);
4333         rv = !TAILQ_EMPTY(&m->md.pv_list) ||
4334             ((m->flags & PG_FICTITIOUS) == 0 &&
4335             !TAILQ_EMPTY(&pa_to_pvh(VM_PAGE_TO_PHYS(m))->pv_list));
4336         rw_wunlock(&pvh_global_lock);
4337         return (rv);
4338 }
4339
4340 /*
4341  * Remove all pages from specified address space
4342  * this aids process exit speeds.  Also, this code
4343  * is special cased for current process only, but
4344  * can have the more generic (and slightly slower)
4345  * mode enabled.  This is much faster than pmap_remove
4346  * in the case of running down an entire address space.
4347  */
4348 void
4349 pmap_remove_pages(pmap_t pmap)
4350 {
4351         pt_entry_t *pte, tpte;
4352         vm_page_t free = NULL;
4353         vm_page_t m, mpte, mt;
4354         pv_entry_t pv;
4355         struct md_page *pvh;
4356         struct pv_chunk *pc, *npc;
4357         int field, idx;
4358         int32_t bit;
4359         uint32_t inuse, bitmask;
4360         int allfree;
4361
4362         if (pmap != PCPU_GET(curpmap)) {
4363                 printf("warning: pmap_remove_pages called with non-current pmap\n");
4364                 return;
4365         }
4366         rw_wlock(&pvh_global_lock);
4367         PMAP_LOCK(pmap);
4368         sched_pin();
4369         TAILQ_FOREACH_SAFE(pc, &pmap->pm_pvchunk, pc_list, npc) {
4370                 KASSERT(pc->pc_pmap == pmap, ("Wrong pmap %p %p", pmap,
4371                     pc->pc_pmap));
4372                 allfree = 1;
4373                 for (field = 0; field < _NPCM; field++) {
4374                         inuse = ~pc->pc_map[field] & pc_freemask[field];
4375                         while (inuse != 0) {
4376                                 bit = bsfl(inuse);
4377                                 bitmask = 1UL << bit;
4378                                 idx = field * 32 + bit;
4379                                 pv = &pc->pc_pventry[idx];
4380                                 inuse &= ~bitmask;
4381
4382                                 pte = pmap_pde(pmap, pv->pv_va);
4383                                 tpte = *pte;
4384                                 if ((tpte & PG_PS) == 0) {
4385                                         pte = vtopte(pv->pv_va);
4386                                         tpte = *pte & ~PG_PTE_PAT;
4387                                 }
4388
4389                                 if (tpte == 0) {
4390                                         printf(
4391                                             "TPTE at %p  IS ZERO @ VA %08x\n",
4392                                             pte, pv->pv_va);
4393                                         panic("bad pte");
4394                                 }
4395
4396 /*
4397  * We cannot remove wired pages from a process' mapping at this time
4398  */
4399                                 if (tpte & PG_W) {
4400                                         allfree = 0;
4401                                         continue;
4402                                 }
4403
4404                                 m = PHYS_TO_VM_PAGE(tpte & PG_FRAME);
4405                                 KASSERT(m->phys_addr == (tpte & PG_FRAME),
4406                                     ("vm_page_t %p phys_addr mismatch %016jx %016jx",
4407                                     m, (uintmax_t)m->phys_addr,
4408                                     (uintmax_t)tpte));
4409
4410                                 KASSERT((m->flags & PG_FICTITIOUS) != 0 ||
4411                                     m < &vm_page_array[vm_page_array_size],
4412                                     ("pmap_remove_pages: bad tpte %#jx",
4413                                     (uintmax_t)tpte));
4414
4415                                 pte_clear(pte);
4416
4417                                 /*
4418                                  * Update the vm_page_t clean/reference bits.
4419                                  */
4420                                 if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) {
4421                                         if ((tpte & PG_PS) != 0) {
4422                                                 for (mt = m; mt < &m[NBPDR / PAGE_SIZE]; mt++)
4423                                                         vm_page_dirty(mt);
4424                                         } else
4425                                                 vm_page_dirty(m);
4426                                 }
4427
4428                                 /* Mark free */
4429                                 PV_STAT(pv_entry_frees++);
4430                                 PV_STAT(pv_entry_spare++);
4431                                 pv_entry_count--;
4432                                 pc->pc_map[field] |= bitmask;
4433                                 if ((tpte & PG_PS) != 0) {
4434                                         pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
4435                                         pvh = pa_to_pvh(tpte & PG_PS_FRAME);
4436                                         TAILQ_REMOVE(&pvh->pv_list, pv, pv_list);
4437                                         if (TAILQ_EMPTY(&pvh->pv_list)) {
4438                                                 for (mt = m; mt < &m[NBPDR / PAGE_SIZE]; mt++)
4439                                                         if (TAILQ_EMPTY(&mt->md.pv_list))
4440                                                                 vm_page_aflag_clear(mt, PGA_WRITEABLE);
4441                                         }
4442                                         mpte = pmap_lookup_pt_page(pmap, pv->pv_va);
4443                                         if (mpte != NULL) {
4444                                                 pmap_remove_pt_page(pmap, mpte);
4445                                                 pmap->pm_stats.resident_count--;
4446                                                 KASSERT(mpte->wire_count == NPTEPG,
4447                                                     ("pmap_remove_pages: pte page wire count error"));
4448                                                 mpte->wire_count = 0;
4449                                                 pmap_add_delayed_free_list(mpte, &free, FALSE);
4450                                                 atomic_subtract_int(&cnt.v_wire_count, 1);
4451                                         }
4452                                 } else {
4453                                         pmap->pm_stats.resident_count--;
4454                                         TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
4455                                         if (TAILQ_EMPTY(&m->md.pv_list) &&
4456                                             (m->flags & PG_FICTITIOUS) == 0) {
4457                                                 pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
4458                                                 if (TAILQ_EMPTY(&pvh->pv_list))
4459                                                         vm_page_aflag_clear(m, PGA_WRITEABLE);
4460                                         }
4461                                         pmap_unuse_pt(pmap, pv->pv_va, &free);
4462                                 }
4463                         }
4464                 }
4465                 if (allfree) {
4466                         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
4467                         free_pv_chunk(pc);
4468                 }
4469         }
4470         sched_unpin();
4471         pmap_invalidate_all(pmap);
4472         rw_wunlock(&pvh_global_lock);
4473         PMAP_UNLOCK(pmap);
4474         pmap_free_zero_pages(free);
4475 }
4476
4477 /*
4478  *      pmap_is_modified:
4479  *
4480  *      Return whether or not the specified physical page was modified
4481  *      in any physical maps.
4482  */
4483 boolean_t
4484 pmap_is_modified(vm_page_t m)
4485 {
4486         boolean_t rv;
4487
4488         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
4489             ("pmap_is_modified: page %p is not managed", m));
4490
4491         /*
4492          * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be
4493          * concurrently set while the object is locked.  Thus, if PGA_WRITEABLE
4494          * is clear, no PTEs can have PG_M set.
4495          */
4496         VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
4497         if ((m->oflags & VPO_BUSY) == 0 &&
4498             (m->aflags & PGA_WRITEABLE) == 0)
4499                 return (FALSE);
4500         rw_wlock(&pvh_global_lock);
4501         rv = pmap_is_modified_pvh(&m->md) ||
4502             ((m->flags & PG_FICTITIOUS) == 0 &&
4503             pmap_is_modified_pvh(pa_to_pvh(VM_PAGE_TO_PHYS(m))));
4504         rw_wunlock(&pvh_global_lock);
4505         return (rv);
4506 }
4507
4508 /*
4509  * Returns TRUE if any of the given mappings were used to modify
4510  * physical memory.  Otherwise, returns FALSE.  Both page and 2mpage
4511  * mappings are supported.
4512  */
4513 static boolean_t
4514 pmap_is_modified_pvh(struct md_page *pvh)
4515 {
4516         pv_entry_t pv;
4517         pt_entry_t *pte;
4518         pmap_t pmap;
4519         boolean_t rv;
4520
4521         rw_assert(&pvh_global_lock, RA_WLOCKED);
4522         rv = FALSE;
4523         sched_pin();
4524         TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) {
4525                 pmap = PV_PMAP(pv);
4526                 PMAP_LOCK(pmap);
4527                 pte = pmap_pte_quick(pmap, pv->pv_va);
4528                 rv = (*pte & (PG_M | PG_RW)) == (PG_M | PG_RW);
4529                 PMAP_UNLOCK(pmap);
4530                 if (rv)
4531                         break;
4532         }
4533         sched_unpin();
4534         return (rv);
4535 }
4536
4537 /*
4538  *      pmap_is_prefaultable:
4539  *
4540  *      Return whether or not the specified virtual address is elgible
4541  *      for prefault.
4542  */
4543 boolean_t
4544 pmap_is_prefaultable(pmap_t pmap, vm_offset_t addr)
4545 {
4546         pd_entry_t *pde;
4547         pt_entry_t *pte;
4548         boolean_t rv;
4549
4550         rv = FALSE;
4551         PMAP_LOCK(pmap);
4552         pde = pmap_pde(pmap, addr);
4553         if (*pde != 0 && (*pde & PG_PS) == 0) {
4554                 pte = vtopte(addr);
4555                 rv = *pte == 0;
4556         }
4557         PMAP_UNLOCK(pmap);
4558         return (rv);
4559 }
4560
4561 /*
4562  *      pmap_is_referenced:
4563  *
4564  *      Return whether or not the specified physical page was referenced
4565  *      in any physical maps.
4566  */
4567 boolean_t
4568 pmap_is_referenced(vm_page_t m)
4569 {
4570         boolean_t rv;
4571
4572         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
4573             ("pmap_is_referenced: page %p is not managed", m));
4574         rw_wlock(&pvh_global_lock);
4575         rv = pmap_is_referenced_pvh(&m->md) ||
4576             ((m->flags & PG_FICTITIOUS) == 0 &&
4577             pmap_is_referenced_pvh(pa_to_pvh(VM_PAGE_TO_PHYS(m))));
4578         rw_wunlock(&pvh_global_lock);
4579         return (rv);
4580 }
4581
4582 /*
4583  * Returns TRUE if any of the given mappings were referenced and FALSE
4584  * otherwise.  Both page and 4mpage mappings are supported.
4585  */
4586 static boolean_t
4587 pmap_is_referenced_pvh(struct md_page *pvh)
4588 {
4589         pv_entry_t pv;
4590         pt_entry_t *pte;
4591         pmap_t pmap;
4592         boolean_t rv;
4593
4594         rw_assert(&pvh_global_lock, RA_WLOCKED);
4595         rv = FALSE;
4596         sched_pin();
4597         TAILQ_FOREACH(pv, &pvh->pv_list, pv_list) {
4598                 pmap = PV_PMAP(pv);
4599                 PMAP_LOCK(pmap);
4600                 pte = pmap_pte_quick(pmap, pv->pv_va);
4601                 rv = (*pte & (PG_A | PG_V)) == (PG_A | PG_V);
4602                 PMAP_UNLOCK(pmap);
4603                 if (rv)
4604                         break;
4605         }
4606         sched_unpin();
4607         return (rv);
4608 }
4609
4610 /*
4611  * Clear the write and modified bits in each of the given page's mappings.
4612  */
4613 void
4614 pmap_remove_write(vm_page_t m)
4615 {
4616         struct md_page *pvh;
4617         pv_entry_t next_pv, pv;
4618         pmap_t pmap;
4619         pd_entry_t *pde;
4620         pt_entry_t oldpte, *pte;
4621         vm_offset_t va;
4622
4623         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
4624             ("pmap_remove_write: page %p is not managed", m));
4625
4626         /*
4627          * If the page is not VPO_BUSY, then PGA_WRITEABLE cannot be set by
4628          * another thread while the object is locked.  Thus, if PGA_WRITEABLE
4629          * is clear, no page table entries need updating.
4630          */
4631         VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
4632         if ((m->oflags & VPO_BUSY) == 0 &&
4633             (m->aflags & PGA_WRITEABLE) == 0)
4634                 return;
4635         rw_wlock(&pvh_global_lock);
4636         sched_pin();
4637         if ((m->flags & PG_FICTITIOUS) != 0)
4638                 goto small_mappings;
4639         pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
4640         TAILQ_FOREACH_SAFE(pv, &pvh->pv_list, pv_list, next_pv) {
4641                 va = pv->pv_va;
4642                 pmap = PV_PMAP(pv);
4643                 PMAP_LOCK(pmap);
4644                 pde = pmap_pde(pmap, va);
4645                 if ((*pde & PG_RW) != 0)
4646                         (void)pmap_demote_pde(pmap, pde, va);
4647                 PMAP_UNLOCK(pmap);
4648         }
4649 small_mappings:
4650         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
4651                 pmap = PV_PMAP(pv);
4652                 PMAP_LOCK(pmap);
4653                 pde = pmap_pde(pmap, pv->pv_va);
4654                 KASSERT((*pde & PG_PS) == 0, ("pmap_clear_write: found"
4655                     " a 4mpage in page %p's pv list", m));
4656                 pte = pmap_pte_quick(pmap, pv->pv_va);
4657 retry:
4658                 oldpte = *pte;
4659                 if ((oldpte & PG_RW) != 0) {
4660                         /*
4661                          * Regardless of whether a pte is 32 or 64 bits
4662                          * in size, PG_RW and PG_M are among the least
4663                          * significant 32 bits.
4664                          */
4665                         if (!atomic_cmpset_int((u_int *)pte, oldpte,
4666                             oldpte & ~(PG_RW | PG_M)))
4667                                 goto retry;
4668                         if ((oldpte & PG_M) != 0)
4669                                 vm_page_dirty(m);
4670                         pmap_invalidate_page(pmap, pv->pv_va);
4671                 }
4672                 PMAP_UNLOCK(pmap);
4673         }
4674         vm_page_aflag_clear(m, PGA_WRITEABLE);
4675         sched_unpin();
4676         rw_wunlock(&pvh_global_lock);
4677 }
4678
4679 /*
4680  *      pmap_ts_referenced:
4681  *
4682  *      Return a count of reference bits for a page, clearing those bits.
4683  *      It is not necessary for every reference bit to be cleared, but it
4684  *      is necessary that 0 only be returned when there are truly no
4685  *      reference bits set.
4686  *
4687  *      XXX: The exact number of bits to check and clear is a matter that
4688  *      should be tested and standardized at some point in the future for
4689  *      optimal aging of shared pages.
4690  */
4691 int
4692 pmap_ts_referenced(vm_page_t m)
4693 {
4694         struct md_page *pvh;
4695         pv_entry_t pv, pvf, pvn;
4696         pmap_t pmap;
4697         pd_entry_t oldpde, *pde;
4698         pt_entry_t *pte;
4699         vm_offset_t va;
4700         int rtval = 0;
4701
4702         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
4703             ("pmap_ts_referenced: page %p is not managed", m));
4704         pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
4705         rw_wlock(&pvh_global_lock);
4706         sched_pin();
4707         if ((m->flags & PG_FICTITIOUS) != 0)
4708                 goto small_mappings;
4709         TAILQ_FOREACH_SAFE(pv, &pvh->pv_list, pv_list, pvn) {
4710                 va = pv->pv_va;
4711                 pmap = PV_PMAP(pv);
4712                 PMAP_LOCK(pmap);
4713                 pde = pmap_pde(pmap, va);
4714                 oldpde = *pde;
4715                 if ((oldpde & PG_A) != 0) {
4716                         if (pmap_demote_pde(pmap, pde, va)) {
4717                                 if ((oldpde & PG_W) == 0) {
4718                                         /*
4719                                          * Remove the mapping to a single page
4720                                          * so that a subsequent access may
4721                                          * repromote.  Since the underlying
4722                                          * page table page is fully populated,
4723                                          * this removal never frees a page
4724                                          * table page.
4725                                          */
4726                                         va += VM_PAGE_TO_PHYS(m) - (oldpde &
4727                                             PG_PS_FRAME);
4728                                         pmap_remove_page(pmap, va, NULL);
4729                                         rtval++;
4730                                         if (rtval > 4) {
4731                                                 PMAP_UNLOCK(pmap);
4732                                                 goto out;
4733                                         }
4734                                 }
4735                         }
4736                 }
4737                 PMAP_UNLOCK(pmap);
4738         }
4739 small_mappings:
4740         if ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
4741                 pvf = pv;
4742                 do {
4743                         pvn = TAILQ_NEXT(pv, pv_list);
4744                         TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
4745                         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
4746                         pmap = PV_PMAP(pv);
4747                         PMAP_LOCK(pmap);
4748                         pde = pmap_pde(pmap, pv->pv_va);
4749                         KASSERT((*pde & PG_PS) == 0, ("pmap_ts_referenced:"
4750                             " found a 4mpage in page %p's pv list", m));
4751                         pte = pmap_pte_quick(pmap, pv->pv_va);
4752                         if ((*pte & PG_A) != 0) {
4753                                 atomic_clear_int((u_int *)pte, PG_A);
4754                                 pmap_invalidate_page(pmap, pv->pv_va);
4755                                 rtval++;
4756                                 if (rtval > 4)
4757                                         pvn = NULL;
4758                         }
4759                         PMAP_UNLOCK(pmap);
4760                 } while ((pv = pvn) != NULL && pv != pvf);
4761         }
4762 out:
4763         sched_unpin();
4764         rw_wunlock(&pvh_global_lock);
4765         return (rtval);
4766 }
4767
4768 /*
4769  *      Clear the modify bits on the specified physical page.
4770  */
4771 void
4772 pmap_clear_modify(vm_page_t m)
4773 {
4774         struct md_page *pvh;
4775         pv_entry_t next_pv, pv;
4776         pmap_t pmap;
4777         pd_entry_t oldpde, *pde;
4778         pt_entry_t oldpte, *pte;
4779         vm_offset_t va;
4780
4781         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
4782             ("pmap_clear_modify: page %p is not managed", m));
4783         VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
4784         KASSERT((m->oflags & VPO_BUSY) == 0,
4785             ("pmap_clear_modify: page %p is busy", m));
4786
4787         /*
4788          * If the page is not PGA_WRITEABLE, then no PTEs can have PG_M set.
4789          * If the object containing the page is locked and the page is not
4790          * VPO_BUSY, then PGA_WRITEABLE cannot be concurrently set.
4791          */
4792         if ((m->aflags & PGA_WRITEABLE) == 0)
4793                 return;
4794         rw_wlock(&pvh_global_lock);
4795         sched_pin();
4796         if ((m->flags & PG_FICTITIOUS) != 0)
4797                 goto small_mappings;
4798         pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
4799         TAILQ_FOREACH_SAFE(pv, &pvh->pv_list, pv_list, next_pv) {
4800                 va = pv->pv_va;
4801                 pmap = PV_PMAP(pv);
4802                 PMAP_LOCK(pmap);
4803                 pde = pmap_pde(pmap, va);
4804                 oldpde = *pde;
4805                 if ((oldpde & PG_RW) != 0) {
4806                         if (pmap_demote_pde(pmap, pde, va)) {
4807                                 if ((oldpde & PG_W) == 0) {
4808                                         /*
4809                                          * Write protect the mapping to a
4810                                          * single page so that a subsequent
4811                                          * write access may repromote.
4812                                          */
4813                                         va += VM_PAGE_TO_PHYS(m) - (oldpde &
4814                                             PG_PS_FRAME);
4815                                         pte = pmap_pte_quick(pmap, va);
4816                                         oldpte = *pte;
4817                                         if ((oldpte & PG_V) != 0) {
4818                                                 /*
4819                                                  * Regardless of whether a pte is 32 or 64 bits
4820                                                  * in size, PG_RW and PG_M are among the least
4821                                                  * significant 32 bits.
4822                                                  */
4823                                                 while (!atomic_cmpset_int((u_int *)pte,
4824                                                     oldpte,
4825                                                     oldpte & ~(PG_M | PG_RW)))
4826                                                         oldpte = *pte;
4827                                                 vm_page_dirty(m);
4828                                                 pmap_invalidate_page(pmap, va);
4829                                         }
4830                                 }
4831                         }
4832                 }
4833                 PMAP_UNLOCK(pmap);
4834         }
4835 small_mappings:
4836         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
4837                 pmap = PV_PMAP(pv);
4838                 PMAP_LOCK(pmap);
4839                 pde = pmap_pde(pmap, pv->pv_va);
4840                 KASSERT((*pde & PG_PS) == 0, ("pmap_clear_modify: found"
4841                     " a 4mpage in page %p's pv list", m));
4842                 pte = pmap_pte_quick(pmap, pv->pv_va);
4843                 if ((*pte & (PG_M | PG_RW)) == (PG_M | PG_RW)) {
4844                         /*
4845                          * Regardless of whether a pte is 32 or 64 bits
4846                          * in size, PG_M is among the least significant
4847                          * 32 bits. 
4848                          */
4849                         atomic_clear_int((u_int *)pte, PG_M);
4850                         pmap_invalidate_page(pmap, pv->pv_va);
4851                 }
4852                 PMAP_UNLOCK(pmap);
4853         }
4854         sched_unpin();
4855         rw_wunlock(&pvh_global_lock);
4856 }
4857
4858 /*
4859  *      pmap_clear_reference:
4860  *
4861  *      Clear the reference bit on the specified physical page.
4862  */
4863 void
4864 pmap_clear_reference(vm_page_t m)
4865 {
4866         struct md_page *pvh;
4867         pv_entry_t next_pv, pv;
4868         pmap_t pmap;
4869         pd_entry_t oldpde, *pde;
4870         pt_entry_t *pte;
4871         vm_offset_t va;
4872
4873         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
4874             ("pmap_clear_reference: page %p is not managed", m));
4875         rw_wlock(&pvh_global_lock);
4876         sched_pin();
4877         if ((m->flags & PG_FICTITIOUS) != 0)
4878                 goto small_mappings;
4879         pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
4880         TAILQ_FOREACH_SAFE(pv, &pvh->pv_list, pv_list, next_pv) {
4881                 va = pv->pv_va;
4882                 pmap = PV_PMAP(pv);
4883                 PMAP_LOCK(pmap);
4884                 pde = pmap_pde(pmap, va);
4885                 oldpde = *pde;
4886                 if ((oldpde & PG_A) != 0) {
4887                         if (pmap_demote_pde(pmap, pde, va)) {
4888                                 /*
4889                                  * Remove the mapping to a single page so
4890                                  * that a subsequent access may repromote.
4891                                  * Since the underlying page table page is
4892                                  * fully populated, this removal never frees
4893                                  * a page table page.
4894                                  */
4895                                 va += VM_PAGE_TO_PHYS(m) - (oldpde &
4896                                     PG_PS_FRAME);
4897                                 pmap_remove_page(pmap, va, NULL);
4898                         }
4899                 }
4900                 PMAP_UNLOCK(pmap);
4901         }
4902 small_mappings:
4903         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
4904                 pmap = PV_PMAP(pv);
4905                 PMAP_LOCK(pmap);
4906                 pde = pmap_pde(pmap, pv->pv_va);
4907                 KASSERT((*pde & PG_PS) == 0, ("pmap_clear_reference: found"
4908                     " a 4mpage in page %p's pv list", m));
4909                 pte = pmap_pte_quick(pmap, pv->pv_va);
4910                 if ((*pte & PG_A) != 0) {
4911                         /*
4912                          * Regardless of whether a pte is 32 or 64 bits
4913                          * in size, PG_A is among the least significant
4914                          * 32 bits. 
4915                          */
4916                         atomic_clear_int((u_int *)pte, PG_A);
4917                         pmap_invalidate_page(pmap, pv->pv_va);
4918                 }
4919                 PMAP_UNLOCK(pmap);
4920         }
4921         sched_unpin();
4922         rw_wunlock(&pvh_global_lock);
4923 }
4924
4925 /*
4926  * Miscellaneous support routines follow
4927  */
4928
4929 /* Adjust the cache mode for a 4KB page mapped via a PTE. */
4930 static __inline void
4931 pmap_pte_attr(pt_entry_t *pte, int cache_bits)
4932 {
4933         u_int opte, npte;
4934
4935         /*
4936          * The cache mode bits are all in the low 32-bits of the
4937          * PTE, so we can just spin on updating the low 32-bits.
4938          */
4939         do {
4940                 opte = *(u_int *)pte;
4941                 npte = opte & ~PG_PTE_CACHE;
4942                 npte |= cache_bits;
4943         } while (npte != opte && !atomic_cmpset_int((u_int *)pte, opte, npte));
4944 }
4945
4946 /* Adjust the cache mode for a 2/4MB page mapped via a PDE. */
4947 static __inline void
4948 pmap_pde_attr(pd_entry_t *pde, int cache_bits)
4949 {
4950         u_int opde, npde;
4951
4952         /*
4953          * The cache mode bits are all in the low 32-bits of the
4954          * PDE, so we can just spin on updating the low 32-bits.
4955          */
4956         do {
4957                 opde = *(u_int *)pde;
4958                 npde = opde & ~PG_PDE_CACHE;
4959                 npde |= cache_bits;
4960         } while (npde != opde && !atomic_cmpset_int((u_int *)pde, opde, npde));
4961 }
4962
4963 /*
4964  * Map a set of physical memory pages into the kernel virtual
4965  * address space. Return a pointer to where it is mapped. This
4966  * routine is intended to be used for mapping device memory,
4967  * NOT real memory.
4968  */
4969 void *
4970 pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, int mode)
4971 {
4972         vm_offset_t va, offset;
4973         vm_size_t tmpsize;
4974
4975         offset = pa & PAGE_MASK;
4976         size = roundup(offset + size, PAGE_SIZE);
4977         pa = pa & PG_FRAME;
4978
4979         if (pa < KERNLOAD && pa + size <= KERNLOAD)
4980                 va = KERNBASE + pa;
4981         else
4982                 va = kmem_alloc_nofault(kernel_map, size);
4983         if (!va)
4984                 panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
4985
4986         for (tmpsize = 0; tmpsize < size; tmpsize += PAGE_SIZE)
4987                 pmap_kenter_attr(va + tmpsize, pa + tmpsize, mode);
4988         pmap_invalidate_range(kernel_pmap, va, va + tmpsize);
4989         pmap_invalidate_cache_range(va, va + size);
4990         return ((void *)(va + offset));
4991 }
4992
4993 void *
4994 pmap_mapdev(vm_paddr_t pa, vm_size_t size)
4995 {
4996
4997         return (pmap_mapdev_attr(pa, size, PAT_UNCACHEABLE));
4998 }
4999
5000 void *
5001 pmap_mapbios(vm_paddr_t pa, vm_size_t size)
5002 {
5003
5004         return (pmap_mapdev_attr(pa, size, PAT_WRITE_BACK));
5005 }
5006
5007 void
5008 pmap_unmapdev(vm_offset_t va, vm_size_t size)
5009 {
5010         vm_offset_t base, offset;
5011
5012         if (va >= KERNBASE && va + size <= KERNBASE + KERNLOAD)
5013                 return;
5014         base = trunc_page(va);
5015         offset = va & PAGE_MASK;
5016         size = roundup(offset + size, PAGE_SIZE);
5017         kmem_free(kernel_map, base, size);
5018 }
5019
5020 /*
5021  * Sets the memory attribute for the specified page.
5022  */
5023 void
5024 pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
5025 {
5026
5027         m->md.pat_mode = ma;
5028         if ((m->flags & PG_FICTITIOUS) != 0)
5029                 return;
5030
5031         /*
5032          * If "m" is a normal page, flush it from the cache.
5033          * See pmap_invalidate_cache_range().
5034          *
5035          * First, try to find an existing mapping of the page by sf
5036          * buffer. sf_buf_invalidate_cache() modifies mapping and
5037          * flushes the cache.
5038          */    
5039         if (sf_buf_invalidate_cache(m))
5040                 return;
5041
5042         /*
5043          * If page is not mapped by sf buffer, but CPU does not
5044          * support self snoop, map the page transient and do
5045          * invalidation. In the worst case, whole cache is flushed by
5046          * pmap_invalidate_cache_range().
5047          */
5048         if ((cpu_feature & CPUID_SS) == 0)
5049                 pmap_flush_page(m);
5050 }
5051
5052 static void
5053 pmap_flush_page(vm_page_t m)
5054 {
5055         struct sysmaps *sysmaps;
5056         vm_offset_t sva, eva;
5057
5058         if ((cpu_feature & CPUID_CLFSH) != 0) {
5059                 sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
5060                 mtx_lock(&sysmaps->lock);
5061                 if (*sysmaps->CMAP2)
5062                         panic("pmap_flush_page: CMAP2 busy");
5063                 sched_pin();
5064                 *sysmaps->CMAP2 = PG_V | PG_RW | VM_PAGE_TO_PHYS(m) |
5065                     PG_A | PG_M | pmap_cache_bits(m->md.pat_mode, 0);
5066                 invlcaddr(sysmaps->CADDR2);
5067                 sva = (vm_offset_t)sysmaps->CADDR2;
5068                 eva = sva + PAGE_SIZE;
5069
5070                 /*
5071                  * Use mfence despite the ordering implied by
5072                  * mtx_{un,}lock() because clflush is not guaranteed
5073                  * to be ordered by any other instruction.
5074                  */
5075                 mfence();
5076                 for (; sva < eva; sva += cpu_clflush_line_size)
5077                         clflush(sva);
5078                 mfence();
5079                 *sysmaps->CMAP2 = 0;
5080                 sched_unpin();
5081                 mtx_unlock(&sysmaps->lock);
5082         } else
5083                 pmap_invalidate_cache();
5084 }
5085
5086 /*
5087  * Changes the specified virtual address range's memory type to that given by
5088  * the parameter "mode".  The specified virtual address range must be
5089  * completely contained within either the kernel map.
5090  *
5091  * Returns zero if the change completed successfully, and either EINVAL or
5092  * ENOMEM if the change failed.  Specifically, EINVAL is returned if some part
5093  * of the virtual address range was not mapped, and ENOMEM is returned if
5094  * there was insufficient memory available to complete the change.
5095  */
5096 int
5097 pmap_change_attr(vm_offset_t va, vm_size_t size, int mode)
5098 {
5099         vm_offset_t base, offset, tmpva;
5100         pd_entry_t *pde;
5101         pt_entry_t *pte;
5102         int cache_bits_pte, cache_bits_pde;
5103         boolean_t changed;
5104
5105         base = trunc_page(va);
5106         offset = va & PAGE_MASK;
5107         size = roundup(offset + size, PAGE_SIZE);
5108
5109         /*
5110          * Only supported on kernel virtual addresses above the recursive map.
5111          */
5112         if (base < VM_MIN_KERNEL_ADDRESS)
5113                 return (EINVAL);
5114
5115         cache_bits_pde = pmap_cache_bits(mode, 1);
5116         cache_bits_pte = pmap_cache_bits(mode, 0);
5117         changed = FALSE;
5118
5119         /*
5120          * Pages that aren't mapped aren't supported.  Also break down
5121          * 2/4MB pages into 4KB pages if required.
5122          */
5123         PMAP_LOCK(kernel_pmap);
5124         for (tmpva = base; tmpva < base + size; ) {
5125                 pde = pmap_pde(kernel_pmap, tmpva);
5126                 if (*pde == 0) {
5127                         PMAP_UNLOCK(kernel_pmap);
5128                         return (EINVAL);
5129                 }
5130                 if (*pde & PG_PS) {
5131                         /*
5132                          * If the current 2/4MB page already has
5133                          * the required memory type, then we need not
5134                          * demote this page.  Just increment tmpva to
5135                          * the next 2/4MB page frame.
5136                          */
5137                         if ((*pde & PG_PDE_CACHE) == cache_bits_pde) {
5138                                 tmpva = trunc_4mpage(tmpva) + NBPDR;
5139                                 continue;
5140                         }
5141
5142                         /*
5143                          * If the current offset aligns with a 2/4MB
5144                          * page frame and there is at least 2/4MB left
5145                          * within the range, then we need not break
5146                          * down this page into 4KB pages.
5147                          */
5148                         if ((tmpva & PDRMASK) == 0 &&
5149                             tmpva + PDRMASK < base + size) {
5150                                 tmpva += NBPDR;
5151                                 continue;
5152                         }
5153                         if (!pmap_demote_pde(kernel_pmap, pde, tmpva)) {
5154                                 PMAP_UNLOCK(kernel_pmap);
5155                                 return (ENOMEM);
5156                         }
5157                 }
5158                 pte = vtopte(tmpva);
5159                 if (*pte == 0) {
5160                         PMAP_UNLOCK(kernel_pmap);
5161                         return (EINVAL);
5162                 }
5163                 tmpva += PAGE_SIZE;
5164         }
5165         PMAP_UNLOCK(kernel_pmap);
5166
5167         /*
5168          * Ok, all the pages exist, so run through them updating their
5169          * cache mode if required.
5170          */
5171         for (tmpva = base; tmpva < base + size; ) {
5172                 pde = pmap_pde(kernel_pmap, tmpva);
5173                 if (*pde & PG_PS) {
5174                         if ((*pde & PG_PDE_CACHE) != cache_bits_pde) {
5175                                 pmap_pde_attr(pde, cache_bits_pde);
5176                                 changed = TRUE;
5177                         }
5178                         tmpva = trunc_4mpage(tmpva) + NBPDR;
5179                 } else {
5180                         pte = vtopte(tmpva);
5181                         if ((*pte & PG_PTE_CACHE) != cache_bits_pte) {
5182                                 pmap_pte_attr(pte, cache_bits_pte);
5183                                 changed = TRUE;
5184                         }
5185                         tmpva += PAGE_SIZE;
5186                 }
5187         }
5188
5189         /*
5190          * Flush CPU caches to make sure any data isn't cached that
5191          * shouldn't be, etc.
5192          */
5193         if (changed) {
5194                 pmap_invalidate_range(kernel_pmap, base, tmpva);
5195                 pmap_invalidate_cache_range(base, tmpva);
5196         }
5197         return (0);
5198 }
5199
5200 /*
5201  * perform the pmap work for mincore
5202  */
5203 int
5204 pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *locked_pa)
5205 {
5206         pd_entry_t *pdep;
5207         pt_entry_t *ptep, pte;
5208         vm_paddr_t pa;
5209         int val;
5210
5211         PMAP_LOCK(pmap);
5212 retry:
5213         pdep = pmap_pde(pmap, addr);
5214         if (*pdep != 0) {
5215                 if (*pdep & PG_PS) {
5216                         pte = *pdep;
5217                         /* Compute the physical address of the 4KB page. */
5218                         pa = ((*pdep & PG_PS_FRAME) | (addr & PDRMASK)) &
5219                             PG_FRAME;
5220                         val = MINCORE_SUPER;
5221                 } else {
5222                         ptep = pmap_pte(pmap, addr);
5223                         pte = *ptep;
5224                         pmap_pte_release(ptep);
5225                         pa = pte & PG_FRAME;
5226                         val = 0;
5227                 }
5228         } else {
5229                 pte = 0;
5230                 pa = 0;
5231                 val = 0;
5232         }
5233         if ((pte & PG_V) != 0) {
5234                 val |= MINCORE_INCORE;
5235                 if ((pte & (PG_M | PG_RW)) == (PG_M | PG_RW))
5236                         val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER;
5237                 if ((pte & PG_A) != 0)
5238                         val |= MINCORE_REFERENCED | MINCORE_REFERENCED_OTHER;
5239         }
5240         if ((val & (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER)) !=
5241             (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER) &&
5242             (pte & (PG_MANAGED | PG_V)) == (PG_MANAGED | PG_V)) {
5243                 /* Ensure that "PHYS_TO_VM_PAGE(pa)->object" doesn't change. */
5244                 if (vm_page_pa_tryrelock(pmap, pa, locked_pa))
5245                         goto retry;
5246         } else
5247                 PA_UNLOCK_COND(*locked_pa);
5248         PMAP_UNLOCK(pmap);
5249         return (val);
5250 }
5251
5252 void
5253 pmap_activate(struct thread *td)
5254 {
5255         pmap_t  pmap, oldpmap;
5256         u_int   cpuid;
5257         u_int32_t  cr3;
5258
5259         critical_enter();
5260         pmap = vmspace_pmap(td->td_proc->p_vmspace);
5261         oldpmap = PCPU_GET(curpmap);
5262         cpuid = PCPU_GET(cpuid);
5263 #if defined(SMP)
5264         CPU_CLR_ATOMIC(cpuid, &oldpmap->pm_active);
5265         CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
5266 #else
5267         CPU_CLR(cpuid, &oldpmap->pm_active);
5268         CPU_SET(cpuid, &pmap->pm_active);
5269 #endif
5270 #ifdef PAE
5271         cr3 = vtophys(pmap->pm_pdpt);
5272 #else
5273         cr3 = vtophys(pmap->pm_pdir);
5274 #endif
5275         /*
5276          * pmap_activate is for the current thread on the current cpu
5277          */
5278         td->td_pcb->pcb_cr3 = cr3;
5279         load_cr3(cr3);
5280         PCPU_SET(curpmap, pmap);
5281         critical_exit();
5282 }
5283
5284 void
5285 pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz)
5286 {
5287 }
5288
5289 /*
5290  *      Increase the starting virtual address of the given mapping if a
5291  *      different alignment might result in more superpage mappings.
5292  */
5293 void
5294 pmap_align_superpage(vm_object_t object, vm_ooffset_t offset,
5295     vm_offset_t *addr, vm_size_t size)
5296 {
5297         vm_offset_t superpage_offset;
5298
5299         if (size < NBPDR)
5300                 return;
5301         if (object != NULL && (object->flags & OBJ_COLORED) != 0)
5302                 offset += ptoa(object->pg_color);
5303         superpage_offset = offset & PDRMASK;
5304         if (size - ((NBPDR - superpage_offset) & PDRMASK) < NBPDR ||
5305             (*addr & PDRMASK) == superpage_offset)
5306                 return;
5307         if ((*addr & PDRMASK) < superpage_offset)
5308                 *addr = (*addr & ~PDRMASK) + superpage_offset;
5309         else
5310                 *addr = ((*addr + PDRMASK) & ~PDRMASK) + superpage_offset;
5311 }
5312
5313
5314 #if defined(PMAP_DEBUG)
5315 pmap_pid_dump(int pid)
5316 {
5317         pmap_t pmap;
5318         struct proc *p;
5319         int npte = 0;
5320         int index;
5321
5322         sx_slock(&allproc_lock);
5323         FOREACH_PROC_IN_SYSTEM(p) {
5324                 if (p->p_pid != pid)
5325                         continue;
5326
5327                 if (p->p_vmspace) {
5328                         int i,j;
5329                         index = 0;
5330                         pmap = vmspace_pmap(p->p_vmspace);
5331                         for (i = 0; i < NPDEPTD; i++) {
5332                                 pd_entry_t *pde;
5333                                 pt_entry_t *pte;
5334                                 vm_offset_t base = i << PDRSHIFT;
5335                                 
5336                                 pde = &pmap->pm_pdir[i];
5337                                 if (pde && pmap_pde_v(pde)) {
5338                                         for (j = 0; j < NPTEPG; j++) {
5339                                                 vm_offset_t va = base + (j << PAGE_SHIFT);
5340                                                 if (va >= (vm_offset_t) VM_MIN_KERNEL_ADDRESS) {
5341                                                         if (index) {
5342                                                                 index = 0;
5343                                                                 printf("\n");
5344                                                         }
5345                                                         sx_sunlock(&allproc_lock);
5346                                                         return (npte);
5347                                                 }
5348                                                 pte = pmap_pte(pmap, va);
5349                                                 if (pte && pmap_pte_v(pte)) {
5350                                                         pt_entry_t pa;
5351                                                         vm_page_t m;
5352                                                         pa = *pte;
5353                                                         m = PHYS_TO_VM_PAGE(pa & PG_FRAME);
5354                                                         printf("va: 0x%x, pt: 0x%x, h: %d, w: %d, f: 0x%x",
5355                                                                 va, pa, m->hold_count, m->wire_count, m->flags);
5356                                                         npte++;
5357                                                         index++;
5358                                                         if (index >= 2) {
5359                                                                 index = 0;
5360                                                                 printf("\n");
5361                                                         } else {
5362                                                                 printf(" ");
5363                                                         }
5364                                                 }
5365                                         }
5366                                 }
5367                         }
5368                 }
5369         }
5370         sx_sunlock(&allproc_lock);
5371         return (npte);
5372 }
5373 #endif
5374
5375 #if defined(DEBUG)
5376
5377 static void     pads(pmap_t pm);
5378 void            pmap_pvdump(vm_paddr_t pa);
5379
5380 /* print address space of pmap*/
5381 static void
5382 pads(pmap_t pm)
5383 {
5384         int i, j;
5385         vm_paddr_t va;
5386         pt_entry_t *ptep;
5387
5388         if (pm == kernel_pmap)
5389                 return;
5390         for (i = 0; i < NPDEPTD; i++)
5391                 if (pm->pm_pdir[i])
5392                         for (j = 0; j < NPTEPG; j++) {
5393                                 va = (i << PDRSHIFT) + (j << PAGE_SHIFT);
5394                                 if (pm == kernel_pmap && va < KERNBASE)
5395                                         continue;
5396                                 if (pm != kernel_pmap && va > UPT_MAX_ADDRESS)
5397                                         continue;
5398                                 ptep = pmap_pte(pm, va);
5399                                 if (pmap_pte_v(ptep))
5400                                         printf("%x:%x ", va, *ptep);
5401                         };
5402
5403 }
5404
5405 void
5406 pmap_pvdump(vm_paddr_t pa)
5407 {
5408         pv_entry_t pv;
5409         pmap_t pmap;
5410         vm_page_t m;
5411
5412         printf("pa %x", pa);
5413         m = PHYS_TO_VM_PAGE(pa);
5414         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
5415                 pmap = PV_PMAP(pv);
5416                 printf(" -> pmap %p, va %x", (void *)pmap, pv->pv_va);
5417                 pads(pmap);
5418         }
5419         printf(" ");
5420 }
5421 #endif