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