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