]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/i386/i386/pmap.c
Introduce the function pmap_enter_object(). It maps a sequence of resident
[FreeBSD/FreeBSD.git] / sys / i386 / i386 / pmap.c
1 /*-
2  * Copyright (c) 1991 Regents of the University of California.
3  * All rights reserved.
4  * Copyright (c) 1994 John S. Dyson
5  * All rights reserved.
6  * Copyright (c) 1994 David Greenman
7  * All rights reserved.
8  * Copyright (c) 2005 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_msgbuf.h"
109 #include "opt_smp.h"
110 #include "opt_xbox.h"
111
112 #include <sys/param.h>
113 #include <sys/systm.h>
114 #include <sys/kernel.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/sx.h>
122 #include <sys/vmmeter.h>
123 #include <sys/sched.h>
124 #include <sys/sysctl.h>
125 #ifdef SMP
126 #include <sys/smp.h>
127 #endif
128
129 #include <vm/vm.h>
130 #include <vm/vm_param.h>
131 #include <vm/vm_kern.h>
132 #include <vm/vm_page.h>
133 #include <vm/vm_map.h>
134 #include <vm/vm_object.h>
135 #include <vm/vm_extern.h>
136 #include <vm/vm_pageout.h>
137 #include <vm/vm_pager.h>
138 #include <vm/uma.h>
139
140 #include <machine/cpu.h>
141 #include <machine/cputypes.h>
142 #include <machine/md_var.h>
143 #include <machine/pcb.h>
144 #include <machine/specialreg.h>
145 #ifdef SMP
146 #include <machine/smp.h>
147 #endif
148
149 #ifdef XBOX
150 #include <machine/xbox.h>
151 #endif
152
153 #if !defined(CPU_DISABLE_SSE) && defined(I686_CPU)
154 #define CPU_ENABLE_SSE
155 #endif
156
157 #ifndef PMAP_SHPGPERPROC
158 #define PMAP_SHPGPERPROC 200
159 #endif
160
161 #if defined(DIAGNOSTIC)
162 #define PMAP_DIAGNOSTIC
163 #endif
164
165 #if !defined(PMAP_DIAGNOSTIC)
166 #define PMAP_INLINE __inline
167 #else
168 #define PMAP_INLINE
169 #endif
170
171 #define PV_STATS
172 #ifdef PV_STATS
173 #define PV_STAT(x)      do { x ; } while (0)
174 #else
175 #define PV_STAT(x)      do { } while (0)
176 #endif
177
178 /*
179  * Get PDEs and PTEs for user/kernel address space
180  */
181 #define pmap_pde(m, v)  (&((m)->pm_pdir[(vm_offset_t)(v) >> PDRSHIFT]))
182 #define pdir_pde(m, v) (m[(vm_offset_t)(v) >> PDRSHIFT])
183
184 #define pmap_pde_v(pte)         ((*(int *)pte & PG_V) != 0)
185 #define pmap_pte_w(pte)         ((*(int *)pte & PG_W) != 0)
186 #define pmap_pte_m(pte)         ((*(int *)pte & PG_M) != 0)
187 #define pmap_pte_u(pte)         ((*(int *)pte & PG_A) != 0)
188 #define pmap_pte_v(pte)         ((*(int *)pte & PG_V) != 0)
189
190 #define pmap_pte_set_w(pte, v)  ((v) ? atomic_set_int((u_int *)(pte), PG_W) : \
191     atomic_clear_int((u_int *)(pte), PG_W))
192 #define pmap_pte_set_prot(pte, v) ((*(int *)pte &= ~PG_PROT), (*(int *)pte |= (v)))
193
194 struct pmap kernel_pmap_store;
195 LIST_HEAD(pmaplist, pmap);
196 static struct pmaplist allpmaps;
197 static struct mtx allpmaps_lock;
198
199 vm_paddr_t avail_end;   /* PA of last available physical page */
200 vm_offset_t virtual_avail;      /* VA of first avail page (after kernel bss) */
201 vm_offset_t virtual_end;        /* VA of last avail page (end of kernel AS) */
202 int pgeflag = 0;                /* PG_G or-in */
203 int pseflag = 0;                /* PG_PS or-in */
204
205 static int nkpt;
206 vm_offset_t kernel_vm_end;
207 extern u_int32_t KERNend;
208
209 #ifdef PAE
210 static uma_zone_t pdptzone;
211 #endif
212
213 /*
214  * Data for the pv entry allocation mechanism
215  */
216 static int pv_entry_count = 0, pv_entry_max = 0, pv_entry_high_water = 0;
217 static int shpgperproc = PMAP_SHPGPERPROC;
218
219 struct pv_chunk *pv_chunkbase;          /* KVA block for pv_chunks */
220 int pv_maxchunks;                       /* How many chunks we have KVA for */
221 vm_offset_t pv_vafree;                  /* freelist stored in the PTE */
222
223 /*
224  * All those kernel PT submaps that BSD is so fond of
225  */
226 struct sysmaps {
227         struct  mtx lock;
228         pt_entry_t *CMAP1;
229         pt_entry_t *CMAP2;
230         caddr_t CADDR1;
231         caddr_t CADDR2;
232 };
233 static struct sysmaps sysmaps_pcpu[MAXCPU];
234 pt_entry_t *CMAP1 = 0;
235 static pt_entry_t *CMAP3;
236 caddr_t CADDR1 = 0, ptvmmap = 0;
237 static caddr_t CADDR3;
238 struct msgbuf *msgbufp = 0;
239
240 /*
241  * Crashdump maps.
242  */
243 static caddr_t crashdumpmap;
244
245 #ifdef SMP
246 extern pt_entry_t *SMPpt;
247 #endif
248 static pt_entry_t *PMAP1 = 0, *PMAP2;
249 static pt_entry_t *PADDR1 = 0, *PADDR2;
250 #ifdef SMP
251 static int PMAP1cpu;
252 static int PMAP1changedcpu;
253 SYSCTL_INT(_debug, OID_AUTO, PMAP1changedcpu, CTLFLAG_RD, 
254            &PMAP1changedcpu, 0,
255            "Number of times pmap_pte_quick changed CPU with same PMAP1");
256 #endif
257 static int PMAP1changed;
258 SYSCTL_INT(_debug, OID_AUTO, PMAP1changed, CTLFLAG_RD, 
259            &PMAP1changed, 0,
260            "Number of times pmap_pte_quick changed PMAP1");
261 static int PMAP1unchanged;
262 SYSCTL_INT(_debug, OID_AUTO, PMAP1unchanged, CTLFLAG_RD, 
263            &PMAP1unchanged, 0,
264            "Number of times pmap_pte_quick didn't change PMAP1");
265 static struct mtx PMAP2mutex;
266
267 static void     free_pv_entry(pmap_t pmap, pv_entry_t pv);
268 static pv_entry_t get_pv_entry(pmap_t locked_pmap, int try);
269 static void     pmap_clear_ptes(vm_page_t m, int bit);
270
271 static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va,
272     vm_page_t m, vm_prot_t prot, vm_page_t mpte);
273 static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t sva);
274 static void pmap_remove_page(struct pmap *pmap, vm_offset_t va);
275 static void pmap_remove_entry(struct pmap *pmap, vm_page_t m,
276                                         vm_offset_t va);
277 static void pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m);
278 static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va,
279     vm_page_t m);
280
281 static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags);
282
283 static vm_page_t _pmap_allocpte(pmap_t pmap, unsigned ptepindex, int flags);
284 static int _pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m);
285 static pt_entry_t *pmap_pte_quick(pmap_t pmap, vm_offset_t va);
286 static void pmap_pte_release(pt_entry_t *pte);
287 static int pmap_unuse_pt(pmap_t, vm_offset_t);
288 static vm_offset_t pmap_kmem_choose(vm_offset_t addr);
289 #ifdef PAE
290 static void *pmap_pdpt_allocf(uma_zone_t zone, int bytes, u_int8_t *flags, int wait);
291 #endif
292
293 CTASSERT(1 << PDESHIFT == sizeof(pd_entry_t));
294 CTASSERT(1 << PTESHIFT == sizeof(pt_entry_t));
295
296 /*
297  * Move the kernel virtual free pointer to the next
298  * 4MB.  This is used to help improve performance
299  * by using a large (4MB) page for much of the kernel
300  * (.text, .data, .bss)
301  */
302 static vm_offset_t
303 pmap_kmem_choose(vm_offset_t addr)
304 {
305         vm_offset_t newaddr = addr;
306
307 #ifndef DISABLE_PSE
308         if (cpu_feature & CPUID_PSE)
309                 newaddr = (addr + PDRMASK) & ~PDRMASK;
310 #endif
311         return newaddr;
312 }
313
314 /*
315  *      Bootstrap the system enough to run with virtual memory.
316  *
317  *      On the i386 this is called after mapping has already been enabled
318  *      and just syncs the pmap module with what has already been done.
319  *      [We can't call it easily with mapping off since the kernel is not
320  *      mapped with PA == VA, hence we would have to relocate every address
321  *      from the linked base (virtual) address "KERNBASE" to the actual
322  *      (physical) address starting relative to 0]
323  */
324 void
325 pmap_bootstrap(firstaddr, loadaddr)
326         vm_paddr_t firstaddr;
327         vm_paddr_t loadaddr;
328 {
329         vm_offset_t va;
330         pt_entry_t *pte, *unused;
331         struct sysmaps *sysmaps;
332         int i;
333
334         /*
335          * XXX The calculation of virtual_avail is wrong. It's NKPT*PAGE_SIZE too
336          * large. It should instead be correctly calculated in locore.s and
337          * not based on 'first' (which is a physical address, not a virtual
338          * address, for the start of unused physical memory). The kernel
339          * page tables are NOT double mapped and thus should not be included
340          * in this calculation.
341          */
342         virtual_avail = (vm_offset_t) KERNBASE + firstaddr;
343         virtual_avail = pmap_kmem_choose(virtual_avail);
344
345         virtual_end = VM_MAX_KERNEL_ADDRESS;
346
347         /*
348          * Initialize the kernel pmap (which is statically allocated).
349          */
350         PMAP_LOCK_INIT(kernel_pmap);
351         kernel_pmap->pm_pdir = (pd_entry_t *) (KERNBASE + (u_int)IdlePTD);
352 #ifdef PAE
353         kernel_pmap->pm_pdpt = (pdpt_entry_t *) (KERNBASE + (u_int)IdlePDPT);
354 #endif
355         kernel_pmap->pm_active = -1;    /* don't allow deactivation */
356         TAILQ_INIT(&kernel_pmap->pm_pvchunk);
357         LIST_INIT(&allpmaps);
358         mtx_init(&allpmaps_lock, "allpmaps", NULL, MTX_SPIN);
359         mtx_lock_spin(&allpmaps_lock);
360         LIST_INSERT_HEAD(&allpmaps, kernel_pmap, pm_list);
361         mtx_unlock_spin(&allpmaps_lock);
362         nkpt = NKPT;
363
364         /*
365          * Reserve some special page table entries/VA space for temporary
366          * mapping of pages.
367          */
368 #define SYSMAP(c, p, v, n)      \
369         v = (c)va; va += ((n)*PAGE_SIZE); p = pte; pte += (n);
370
371         va = virtual_avail;
372         pte = vtopte(va);
373
374         /*
375          * CMAP1/CMAP2 are used for zeroing and copying pages.
376          * CMAP3 is used for the idle process page zeroing.
377          */
378         for (i = 0; i < MAXCPU; i++) {
379                 sysmaps = &sysmaps_pcpu[i];
380                 mtx_init(&sysmaps->lock, "SYSMAPS", NULL, MTX_DEF);
381                 SYSMAP(caddr_t, sysmaps->CMAP1, sysmaps->CADDR1, 1)
382                 SYSMAP(caddr_t, sysmaps->CMAP2, sysmaps->CADDR2, 1)
383         }
384         SYSMAP(caddr_t, CMAP1, CADDR1, 1)
385         SYSMAP(caddr_t, CMAP3, CADDR3, 1)
386         *CMAP3 = 0;
387
388         /*
389          * Crashdump maps.
390          */
391         SYSMAP(caddr_t, unused, crashdumpmap, MAXDUMPPGS)
392
393         /*
394          * ptvmmap is used for reading arbitrary physical pages via /dev/mem.
395          */
396         SYSMAP(caddr_t, unused, ptvmmap, 1)
397
398         /*
399          * msgbufp is used to map the system message buffer.
400          */
401         SYSMAP(struct msgbuf *, unused, msgbufp, atop(round_page(MSGBUF_SIZE)))
402
403         /*
404          * ptemap is used for pmap_pte_quick
405          */
406         SYSMAP(pt_entry_t *, PMAP1, PADDR1, 1);
407         SYSMAP(pt_entry_t *, PMAP2, PADDR2, 1);
408
409         mtx_init(&PMAP2mutex, "PMAP2", NULL, MTX_DEF);
410
411         virtual_avail = va;
412
413         *CMAP1 = 0;
414
415 #ifdef XBOX
416         /* FIXME: This is gross, but needed for the XBOX. Since we are in such
417          * an early stadium, we cannot yet neatly map video memory ... :-(
418          * Better fixes are very welcome! */
419         if (!arch_i386_is_xbox)
420 #endif
421         for (i = 0; i < NKPT; i++)
422                 PTD[i] = 0;
423
424         /* Initialize the PAT MSR if present. */
425         pmap_init_pat();
426
427         /* Turn on PG_G on kernel page(s) */
428         pmap_set_pg();
429 }
430
431 /*
432  * Setup the PAT MSR.
433  */
434 void
435 pmap_init_pat(void)
436 {
437         uint64_t pat_msr;
438
439         /* Bail if this CPU doesn't implement PAT. */
440         if (!(cpu_feature & CPUID_PAT))
441                 return;
442
443 #ifdef PAT_WORKS
444         /*
445          * Leave the indices 0-3 at the default of WB, WT, UC, and UC-.
446          * Program 4 and 5 as WP and WC.
447          * Leave 6 and 7 as UC and UC-.
448          */
449         pat_msr = rdmsr(MSR_PAT);
450         pat_msr &= ~(PAT_MASK(4) | PAT_MASK(5));
451         pat_msr |= PAT_VALUE(4, PAT_WRITE_PROTECTED) |
452             PAT_VALUE(5, PAT_WRITE_COMBINING);
453 #else
454         /*
455          * Due to some Intel errata, we can only safely use the lower 4
456          * PAT entries.  Thus, just replace PAT Index 2 with WC instead
457          * of UC-.
458          *
459          *   Intel Pentium III Processor Specification Update
460          * Errata E.27 (Upper Four PAT Entries Not Usable With Mode B
461          * or Mode C Paging)
462          *
463          *   Intel Pentium IV  Processor Specification Update
464          * Errata N46 (PAT Index MSB May Be Calculated Incorrectly)
465          */
466         pat_msr = rdmsr(MSR_PAT);
467         pat_msr &= ~PAT_MASK(2);
468         pat_msr |= PAT_VALUE(2, PAT_WRITE_COMBINING);
469 #endif
470         wrmsr(MSR_PAT, pat_msr);
471 }
472
473 /*
474  * Set PG_G on kernel pages.  Only the BSP calls this when SMP is turned on.
475  */
476 void
477 pmap_set_pg(void)
478 {
479         pd_entry_t pdir;
480         pt_entry_t *pte;
481         vm_offset_t va, endva;
482         int i; 
483
484         if (pgeflag == 0)
485                 return;
486
487         i = KERNLOAD/NBPDR;
488         endva = KERNBASE + KERNend;
489
490         if (pseflag) {
491                 va = KERNBASE + KERNLOAD;
492                 while (va  < endva) {
493                         pdir = kernel_pmap->pm_pdir[KPTDI+i];
494                         pdir |= pgeflag;
495                         kernel_pmap->pm_pdir[KPTDI+i] = PTD[KPTDI+i] = pdir;
496                         invltlb();      /* Play it safe, invltlb() every time */
497                         i++;
498                         va += NBPDR;
499                 }
500         } else {
501                 va = (vm_offset_t)btext;
502                 while (va < endva) {
503                         pte = vtopte(va);
504                         if (*pte)
505                                 *pte |= pgeflag;
506                         invltlb();      /* Play it safe, invltlb() every time */
507                         va += PAGE_SIZE;
508                 }
509         }
510 }
511
512 /*
513  * Initialize a vm_page's machine-dependent fields.
514  */
515 void
516 pmap_page_init(vm_page_t m)
517 {
518
519         TAILQ_INIT(&m->md.pv_list);
520         m->md.pv_list_count = 0;
521 }
522
523 #ifdef PAE
524
525 static MALLOC_DEFINE(M_PMAPPDPT, "pmap", "pmap pdpt");
526
527 static void *
528 pmap_pdpt_allocf(uma_zone_t zone, int bytes, u_int8_t *flags, int wait)
529 {
530         *flags = UMA_SLAB_PRIV;
531         return (contigmalloc(PAGE_SIZE, M_PMAPPDPT, 0, 0x0ULL, 0xffffffffULL,
532             1, 0));
533 }
534 #endif
535
536 /*
537  * ABuse the pte nodes for unmapped kva to thread a kva freelist through.
538  * Requirements:
539  *  - Must deal with pages in order to ensure that none of the PG_* bits
540  *    are ever set, PG_V in particular.
541  *  - Assumes we can write to ptes without pte_store() atomic ops, even
542  *    on PAE systems.  This should be ok.
543  *  - Assumes nothing will ever test these addresses for 0 to indicate
544  *    no mapping instead of correctly checking PG_V.
545  *  - Assumes a vm_offset_t will fit in a pte (true for i386).
546  * Because PG_V is never set, there can be no mappings to invalidate.
547  */
548 static vm_offset_t
549 pmap_ptelist_alloc(vm_offset_t *head)
550 {
551         pt_entry_t *pte;
552         vm_offset_t va;
553
554         va = *head;
555         if (va == 0)
556                 return (va);    /* Out of memory */
557         pte = vtopte(va);
558         *head = *pte;
559         if (*head & PG_V)
560                 panic("pmap_ptelist_alloc: va with PG_V set!");
561         *pte = 0;
562         return (va);
563 }
564
565 static void
566 pmap_ptelist_free(vm_offset_t *head, vm_offset_t va)
567 {
568         pt_entry_t *pte;
569
570         if (va & PG_V)
571                 panic("pmap_ptelist_free: freeing va with PG_V set!");
572         pte = vtopte(va);
573         *pte = *head;           /* virtual! PG_V is 0 though */
574         *head = va;
575 }
576
577 static void
578 pmap_ptelist_init(vm_offset_t *head, void *base, int npages)
579 {
580         int i;
581         vm_offset_t va;
582
583         *head = 0;
584         for (i = npages - 1; i >= 0; i--) {
585                 va = (vm_offset_t)base + i * PAGE_SIZE;
586                 pmap_ptelist_free(head, va);
587         }
588 }
589
590
591 /*
592  *      Initialize the pmap module.
593  *      Called by vm_init, to initialize any structures that the pmap
594  *      system needs to map virtual memory.
595  */
596 void
597 pmap_init(void)
598 {
599
600         /*
601          * Initialize the address space (zone) for the pv entries.  Set a
602          * high water mark so that the system can recover from excessive
603          * numbers of pv entries.
604          */
605         TUNABLE_INT_FETCH("vm.pmap.shpgperproc", &shpgperproc);
606         pv_entry_max = shpgperproc * maxproc + cnt.v_page_count;
607         TUNABLE_INT_FETCH("vm.pmap.pv_entries", &pv_entry_max);
608         pv_entry_max = roundup(pv_entry_max, _NPCPV);
609         pv_entry_high_water = 9 * (pv_entry_max / 10);
610
611         pv_maxchunks = pv_entry_max / _NPCPV;
612         pv_chunkbase = (struct pv_chunk *)kmem_alloc_nofault(kernel_map,
613             PAGE_SIZE * pv_maxchunks);
614         if (pv_chunkbase == NULL)
615                 panic("pmap_init: not enough kvm for pv chunks");
616         pmap_ptelist_init(&pv_vafree, pv_chunkbase, pv_maxchunks);
617 #ifdef PAE
618         pdptzone = uma_zcreate("PDPT", NPGPTD * sizeof(pdpt_entry_t), NULL,
619             NULL, NULL, NULL, (NPGPTD * sizeof(pdpt_entry_t)) - 1,
620             UMA_ZONE_VM | UMA_ZONE_NOFREE);
621         uma_zone_set_allocf(pdptzone, pmap_pdpt_allocf);
622 #endif
623 }
624
625
626 SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters");
627 SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_max, CTLFLAG_RD, &pv_entry_max, 0,
628         "Max number of PV entries");
629 SYSCTL_INT(_vm_pmap, OID_AUTO, shpgperproc, CTLFLAG_RD, &shpgperproc, 0,
630         "Page share factor per proc");
631
632 /***************************************************
633  * Low level helper routines.....
634  ***************************************************/
635
636 #ifdef SMP
637 /*
638  * For SMP, these functions have to use the IPI mechanism for coherence.
639  */
640 void
641 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
642 {
643         u_int cpumask;
644         u_int other_cpus;
645
646         if (smp_started) {
647                 if (!(read_eflags() & PSL_I))
648                         panic("%s: interrupts disabled", __func__);
649                 mtx_lock_spin(&smp_ipi_mtx);
650         } else
651                 critical_enter();
652         /*
653          * We need to disable interrupt preemption but MUST NOT have
654          * interrupts disabled here.
655          * XXX we may need to hold schedlock to get a coherent pm_active
656          * XXX critical sections disable interrupts again
657          */
658         if (pmap == kernel_pmap || pmap->pm_active == all_cpus) {
659                 invlpg(va);
660                 smp_invlpg(va);
661         } else {
662                 cpumask = PCPU_GET(cpumask);
663                 other_cpus = PCPU_GET(other_cpus);
664                 if (pmap->pm_active & cpumask)
665                         invlpg(va);
666                 if (pmap->pm_active & other_cpus)
667                         smp_masked_invlpg(pmap->pm_active & other_cpus, va);
668         }
669         if (smp_started)
670                 mtx_unlock_spin(&smp_ipi_mtx);
671         else
672                 critical_exit();
673 }
674
675 void
676 pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
677 {
678         u_int cpumask;
679         u_int other_cpus;
680         vm_offset_t addr;
681
682         if (smp_started) {
683                 if (!(read_eflags() & PSL_I))
684                         panic("%s: interrupts disabled", __func__);
685                 mtx_lock_spin(&smp_ipi_mtx);
686         } else
687                 critical_enter();
688         /*
689          * We need to disable interrupt preemption but MUST NOT have
690          * interrupts disabled here.
691          * XXX we may need to hold schedlock to get a coherent pm_active
692          * XXX critical sections disable interrupts again
693          */
694         if (pmap == kernel_pmap || pmap->pm_active == all_cpus) {
695                 for (addr = sva; addr < eva; addr += PAGE_SIZE)
696                         invlpg(addr);
697                 smp_invlpg_range(sva, eva);
698         } else {
699                 cpumask = PCPU_GET(cpumask);
700                 other_cpus = PCPU_GET(other_cpus);
701                 if (pmap->pm_active & cpumask)
702                         for (addr = sva; addr < eva; addr += PAGE_SIZE)
703                                 invlpg(addr);
704                 if (pmap->pm_active & other_cpus)
705                         smp_masked_invlpg_range(pmap->pm_active & other_cpus,
706                             sva, eva);
707         }
708         if (smp_started)
709                 mtx_unlock_spin(&smp_ipi_mtx);
710         else
711                 critical_exit();
712 }
713
714 void
715 pmap_invalidate_all(pmap_t pmap)
716 {
717         u_int cpumask;
718         u_int other_cpus;
719
720         if (smp_started) {
721                 if (!(read_eflags() & PSL_I))
722                         panic("%s: interrupts disabled", __func__);
723                 mtx_lock_spin(&smp_ipi_mtx);
724         } else
725                 critical_enter();
726         /*
727          * We need to disable interrupt preemption but MUST NOT have
728          * interrupts disabled here.
729          * XXX we may need to hold schedlock to get a coherent pm_active
730          * XXX critical sections disable interrupts again
731          */
732         if (pmap == kernel_pmap || pmap->pm_active == all_cpus) {
733                 invltlb();
734                 smp_invltlb();
735         } else {
736                 cpumask = PCPU_GET(cpumask);
737                 other_cpus = PCPU_GET(other_cpus);
738                 if (pmap->pm_active & cpumask)
739                         invltlb();
740                 if (pmap->pm_active & other_cpus)
741                         smp_masked_invltlb(pmap->pm_active & other_cpus);
742         }
743         if (smp_started)
744                 mtx_unlock_spin(&smp_ipi_mtx);
745         else
746                 critical_exit();
747 }
748
749 void
750 pmap_invalidate_cache(void)
751 {
752
753         if (smp_started) {
754                 if (!(read_eflags() & PSL_I))
755                         panic("%s: interrupts disabled", __func__);
756                 mtx_lock_spin(&smp_ipi_mtx);
757         } else
758                 critical_enter();
759         /*
760          * We need to disable interrupt preemption but MUST NOT have
761          * interrupts disabled here.
762          * XXX we may need to hold schedlock to get a coherent pm_active
763          * XXX critical sections disable interrupts again
764          */
765         wbinvd();
766         smp_cache_flush();
767         if (smp_started)
768                 mtx_unlock_spin(&smp_ipi_mtx);
769         else
770                 critical_exit();
771 }
772 #else /* !SMP */
773 /*
774  * Normal, non-SMP, 486+ invalidation functions.
775  * We inline these within pmap.c for speed.
776  */
777 PMAP_INLINE void
778 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
779 {
780
781         if (pmap == kernel_pmap || pmap->pm_active)
782                 invlpg(va);
783 }
784
785 PMAP_INLINE void
786 pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
787 {
788         vm_offset_t addr;
789
790         if (pmap == kernel_pmap || pmap->pm_active)
791                 for (addr = sva; addr < eva; addr += PAGE_SIZE)
792                         invlpg(addr);
793 }
794
795 PMAP_INLINE void
796 pmap_invalidate_all(pmap_t pmap)
797 {
798
799         if (pmap == kernel_pmap || pmap->pm_active)
800                 invltlb();
801 }
802
803 PMAP_INLINE void
804 pmap_invalidate_cache(void)
805 {
806
807         wbinvd();
808 }
809 #endif /* !SMP */
810
811 /*
812  * Are we current address space or kernel?  N.B. We return FALSE when
813  * a pmap's page table is in use because a kernel thread is borrowing
814  * it.  The borrowed page table can change spontaneously, making any
815  * dependence on its continued use subject to a race condition.
816  */
817 static __inline int
818 pmap_is_current(pmap_t pmap)
819 {
820
821         return (pmap == kernel_pmap ||
822                 (pmap == vmspace_pmap(curthread->td_proc->p_vmspace) &&
823             (pmap->pm_pdir[PTDPTDI] & PG_FRAME) == (PTDpde[0] & PG_FRAME)));
824 }
825
826 /*
827  * If the given pmap is not the current or kernel pmap, the returned pte must
828  * be released by passing it to pmap_pte_release().
829  */
830 pt_entry_t *
831 pmap_pte(pmap_t pmap, vm_offset_t va)
832 {
833         pd_entry_t newpf;
834         pd_entry_t *pde;
835
836         pde = pmap_pde(pmap, va);
837         if (*pde & PG_PS)
838                 return (pde);
839         if (*pde != 0) {
840                 /* are we current address space or kernel? */
841                 if (pmap_is_current(pmap))
842                         return (vtopte(va));
843                 mtx_lock(&PMAP2mutex);
844                 newpf = *pde & PG_FRAME;
845                 if ((*PMAP2 & PG_FRAME) != newpf) {
846                         *PMAP2 = newpf | PG_RW | PG_V | PG_A | PG_M;
847                         pmap_invalidate_page(kernel_pmap, (vm_offset_t)PADDR2);
848                 }
849                 return (PADDR2 + (i386_btop(va) & (NPTEPG - 1)));
850         }
851         return (0);
852 }
853
854 /*
855  * Releases a pte that was obtained from pmap_pte().  Be prepared for the pte
856  * being NULL.
857  */
858 static __inline void
859 pmap_pte_release(pt_entry_t *pte)
860 {
861
862         if ((pt_entry_t *)((vm_offset_t)pte & ~PAGE_MASK) == PADDR2)
863                 mtx_unlock(&PMAP2mutex);
864 }
865
866 static __inline void
867 invlcaddr(void *caddr)
868 {
869
870         invlpg((u_int)caddr);
871 }
872
873 /*
874  * Super fast pmap_pte routine best used when scanning
875  * the pv lists.  This eliminates many coarse-grained
876  * invltlb calls.  Note that many of the pv list
877  * scans are across different pmaps.  It is very wasteful
878  * to do an entire invltlb for checking a single mapping.
879  *
880  * If the given pmap is not the current pmap, vm_page_queue_mtx
881  * must be held and curthread pinned to a CPU.
882  */
883 static pt_entry_t *
884 pmap_pte_quick(pmap_t pmap, vm_offset_t va)
885 {
886         pd_entry_t newpf;
887         pd_entry_t *pde;
888
889         pde = pmap_pde(pmap, va);
890         if (*pde & PG_PS)
891                 return (pde);
892         if (*pde != 0) {
893                 /* are we current address space or kernel? */
894                 if (pmap_is_current(pmap))
895                         return (vtopte(va));
896                 mtx_assert(&vm_page_queue_mtx, MA_OWNED);
897                 KASSERT(curthread->td_pinned > 0, ("curthread not pinned"));
898                 newpf = *pde & PG_FRAME;
899                 if ((*PMAP1 & PG_FRAME) != newpf) {
900                         *PMAP1 = newpf | PG_RW | PG_V | PG_A | PG_M;
901 #ifdef SMP
902                         PMAP1cpu = PCPU_GET(cpuid);
903 #endif
904                         invlcaddr(PADDR1);
905                         PMAP1changed++;
906                 } else
907 #ifdef SMP
908                 if (PMAP1cpu != PCPU_GET(cpuid)) {
909                         PMAP1cpu = PCPU_GET(cpuid);
910                         invlcaddr(PADDR1);
911                         PMAP1changedcpu++;
912                 } else
913 #endif
914                         PMAP1unchanged++;
915                 return (PADDR1 + (i386_btop(va) & (NPTEPG - 1)));
916         }
917         return (0);
918 }
919
920 /*
921  *      Routine:        pmap_extract
922  *      Function:
923  *              Extract the physical page address associated
924  *              with the given map/virtual_address pair.
925  */
926 vm_paddr_t 
927 pmap_extract(pmap_t pmap, vm_offset_t va)
928 {
929         vm_paddr_t rtval;
930         pt_entry_t *pte;
931         pd_entry_t pde;
932
933         rtval = 0;
934         PMAP_LOCK(pmap);
935         pde = pmap->pm_pdir[va >> PDRSHIFT];
936         if (pde != 0) {
937                 if ((pde & PG_PS) != 0) {
938                         rtval = (pde & ~PDRMASK) | (va & PDRMASK);
939                         PMAP_UNLOCK(pmap);
940                         return rtval;
941                 }
942                 pte = pmap_pte(pmap, va);
943                 rtval = (*pte & PG_FRAME) | (va & PAGE_MASK);
944                 pmap_pte_release(pte);
945         }
946         PMAP_UNLOCK(pmap);
947         return (rtval);
948 }
949
950 /*
951  *      Routine:        pmap_extract_and_hold
952  *      Function:
953  *              Atomically extract and hold the physical page
954  *              with the given pmap and virtual address pair
955  *              if that mapping permits the given protection.
956  */
957 vm_page_t
958 pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
959 {
960         pd_entry_t pde;
961         pt_entry_t pte;
962         vm_page_t m;
963
964         m = NULL;
965         vm_page_lock_queues();
966         PMAP_LOCK(pmap);
967         pde = *pmap_pde(pmap, va);
968         if (pde != 0) {
969                 if (pde & PG_PS) {
970                         if ((pde & PG_RW) || (prot & VM_PROT_WRITE) == 0) {
971                                 m = PHYS_TO_VM_PAGE((pde & ~PDRMASK) |
972                                     (va & PDRMASK));
973                                 vm_page_hold(m);
974                         }
975                 } else {
976                         sched_pin();
977                         pte = *pmap_pte_quick(pmap, va);
978                         if (pte != 0 &&
979                             ((pte & PG_RW) || (prot & VM_PROT_WRITE) == 0)) {
980                                 m = PHYS_TO_VM_PAGE(pte & PG_FRAME);
981                                 vm_page_hold(m);
982                         }
983                         sched_unpin();
984                 }
985         }
986         vm_page_unlock_queues();
987         PMAP_UNLOCK(pmap);
988         return (m);
989 }
990
991 /***************************************************
992  * Low level mapping routines.....
993  ***************************************************/
994
995 /*
996  * Add a wired page to the kva.
997  * Note: not SMP coherent.
998  */
999 PMAP_INLINE void 
1000 pmap_kenter(vm_offset_t va, vm_paddr_t pa)
1001 {
1002         pt_entry_t *pte;
1003
1004         pte = vtopte(va);
1005         pte_store(pte, pa | PG_RW | PG_V | pgeflag);
1006 }
1007
1008 /*
1009  * Remove a page from the kernel pagetables.
1010  * Note: not SMP coherent.
1011  */
1012 PMAP_INLINE void
1013 pmap_kremove(vm_offset_t va)
1014 {
1015         pt_entry_t *pte;
1016
1017         pte = vtopte(va);
1018         pte_clear(pte);
1019 }
1020
1021 /*
1022  *      Used to map a range of physical addresses into kernel
1023  *      virtual address space.
1024  *
1025  *      The value passed in '*virt' is a suggested virtual address for
1026  *      the mapping. Architectures which can support a direct-mapped
1027  *      physical to virtual region can return the appropriate address
1028  *      within that region, leaving '*virt' unchanged. Other
1029  *      architectures should map the pages starting at '*virt' and
1030  *      update '*virt' with the first usable address after the mapped
1031  *      region.
1032  */
1033 vm_offset_t
1034 pmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end, int prot)
1035 {
1036         vm_offset_t va, sva;
1037
1038         va = sva = *virt;
1039         while (start < end) {
1040                 pmap_kenter(va, start);
1041                 va += PAGE_SIZE;
1042                 start += PAGE_SIZE;
1043         }
1044         pmap_invalidate_range(kernel_pmap, sva, va);
1045         *virt = va;
1046         return (sva);
1047 }
1048
1049
1050 /*
1051  * Add a list of wired pages to the kva
1052  * this routine is only used for temporary
1053  * kernel mappings that do not need to have
1054  * page modification or references recorded.
1055  * Note that old mappings are simply written
1056  * over.  The page *must* be wired.
1057  * Note: SMP coherent.  Uses a ranged shootdown IPI.
1058  */
1059 void
1060 pmap_qenter(vm_offset_t sva, vm_page_t *m, int count)
1061 {
1062         vm_offset_t va;
1063
1064         va = sva;
1065         while (count-- > 0) {
1066                 pmap_kenter(va, VM_PAGE_TO_PHYS(*m));
1067                 va += PAGE_SIZE;
1068                 m++;
1069         }
1070         pmap_invalidate_range(kernel_pmap, sva, va);
1071 }
1072
1073 /*
1074  * This routine tears out page mappings from the
1075  * kernel -- it is meant only for temporary mappings.
1076  * Note: SMP coherent.  Uses a ranged shootdown IPI.
1077  */
1078 void
1079 pmap_qremove(vm_offset_t sva, int count)
1080 {
1081         vm_offset_t va;
1082
1083         va = sva;
1084         while (count-- > 0) {
1085                 pmap_kremove(va);
1086                 va += PAGE_SIZE;
1087         }
1088         pmap_invalidate_range(kernel_pmap, sva, va);
1089 }
1090
1091 /***************************************************
1092  * Page table page management routines.....
1093  ***************************************************/
1094
1095 /*
1096  * This routine unholds page table pages, and if the hold count
1097  * drops to zero, then it decrements the wire count.
1098  */
1099 static PMAP_INLINE int
1100 pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m)
1101 {
1102
1103         --m->wire_count;
1104         if (m->wire_count == 0)
1105                 return _pmap_unwire_pte_hold(pmap, m);
1106         else
1107                 return 0;
1108 }
1109
1110 static int 
1111 _pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m)
1112 {
1113         vm_offset_t pteva;
1114
1115         /*
1116          * unmap the page table page
1117          */
1118         pmap->pm_pdir[m->pindex] = 0;
1119         --pmap->pm_stats.resident_count;
1120
1121         /*
1122          * Do an invltlb to make the invalidated mapping
1123          * take effect immediately.
1124          */
1125         pteva = VM_MAXUSER_ADDRESS + i386_ptob(m->pindex);
1126         pmap_invalidate_page(pmap, pteva);
1127
1128         vm_page_free_zero(m);
1129         atomic_subtract_int(&cnt.v_wire_count, 1);
1130         return 1;
1131 }
1132
1133 /*
1134  * After removing a page table entry, this routine is used to
1135  * conditionally free the page, and manage the hold/wire counts.
1136  */
1137 static int
1138 pmap_unuse_pt(pmap_t pmap, vm_offset_t va)
1139 {
1140         pd_entry_t ptepde;
1141         vm_page_t mpte;
1142
1143         if (va >= VM_MAXUSER_ADDRESS)
1144                 return 0;
1145         ptepde = *pmap_pde(pmap, va);
1146         mpte = PHYS_TO_VM_PAGE(ptepde & PG_FRAME);
1147         return pmap_unwire_pte_hold(pmap, mpte);
1148 }
1149
1150 void
1151 pmap_pinit0(pmap)
1152         struct pmap *pmap;
1153 {
1154
1155         PMAP_LOCK_INIT(pmap);
1156         pmap->pm_pdir = (pd_entry_t *)(KERNBASE + (vm_offset_t)IdlePTD);
1157 #ifdef PAE
1158         pmap->pm_pdpt = (pdpt_entry_t *)(KERNBASE + (vm_offset_t)IdlePDPT);
1159 #endif
1160         pmap->pm_active = 0;
1161         PCPU_SET(curpmap, pmap);
1162         TAILQ_INIT(&pmap->pm_pvchunk);
1163         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
1164         mtx_lock_spin(&allpmaps_lock);
1165         LIST_INSERT_HEAD(&allpmaps, pmap, pm_list);
1166         mtx_unlock_spin(&allpmaps_lock);
1167 }
1168
1169 /*
1170  * Initialize a preallocated and zeroed pmap structure,
1171  * such as one in a vmspace structure.
1172  */
1173 void
1174 pmap_pinit(pmap)
1175         register struct pmap *pmap;
1176 {
1177         vm_page_t m, ptdpg[NPGPTD];
1178         vm_paddr_t pa;
1179         static int color;
1180         int i;
1181
1182         PMAP_LOCK_INIT(pmap);
1183
1184         /*
1185          * No need to allocate page table space yet but we do need a valid
1186          * page directory table.
1187          */
1188         if (pmap->pm_pdir == NULL) {
1189                 pmap->pm_pdir = (pd_entry_t *)kmem_alloc_nofault(kernel_map,
1190                     NBPTD);
1191 #ifdef PAE
1192                 pmap->pm_pdpt = uma_zalloc(pdptzone, M_WAITOK | M_ZERO);
1193                 KASSERT(((vm_offset_t)pmap->pm_pdpt &
1194                     ((NPGPTD * sizeof(pdpt_entry_t)) - 1)) == 0,
1195                     ("pmap_pinit: pdpt misaligned"));
1196                 KASSERT(pmap_kextract((vm_offset_t)pmap->pm_pdpt) < (4ULL<<30),
1197                     ("pmap_pinit: pdpt above 4g"));
1198 #endif
1199         }
1200
1201         /*
1202          * allocate the page directory page(s)
1203          */
1204         for (i = 0; i < NPGPTD;) {
1205                 m = vm_page_alloc(NULL, color++,
1206                     VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED |
1207                     VM_ALLOC_ZERO);
1208                 if (m == NULL)
1209                         VM_WAIT;
1210                 else {
1211                         ptdpg[i++] = m;
1212                 }
1213         }
1214
1215         pmap_qenter((vm_offset_t)pmap->pm_pdir, ptdpg, NPGPTD);
1216
1217         for (i = 0; i < NPGPTD; i++) {
1218                 if ((ptdpg[i]->flags & PG_ZERO) == 0)
1219                         bzero(pmap->pm_pdir + (i * NPDEPG), PAGE_SIZE);
1220         }
1221
1222         mtx_lock_spin(&allpmaps_lock);
1223         LIST_INSERT_HEAD(&allpmaps, pmap, pm_list);
1224         mtx_unlock_spin(&allpmaps_lock);
1225         /* Wire in kernel global address entries. */
1226         /* XXX copies current process, does not fill in MPPTDI */
1227         bcopy(PTD + KPTDI, pmap->pm_pdir + KPTDI, nkpt * sizeof(pd_entry_t));
1228 #ifdef SMP
1229         pmap->pm_pdir[MPPTDI] = PTD[MPPTDI];
1230 #endif
1231
1232         /* install self-referential address mapping entry(s) */
1233         for (i = 0; i < NPGPTD; i++) {
1234                 pa = VM_PAGE_TO_PHYS(ptdpg[i]);
1235                 pmap->pm_pdir[PTDPTDI + i] = pa | PG_V | PG_RW | PG_A | PG_M;
1236 #ifdef PAE
1237                 pmap->pm_pdpt[i] = pa | PG_V;
1238 #endif
1239         }
1240
1241         pmap->pm_active = 0;
1242         TAILQ_INIT(&pmap->pm_pvchunk);
1243         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
1244 }
1245
1246 /*
1247  * this routine is called if the page table page is not
1248  * mapped correctly.
1249  */
1250 static vm_page_t
1251 _pmap_allocpte(pmap_t pmap, unsigned ptepindex, int flags)
1252 {
1253         vm_paddr_t ptepa;
1254         vm_page_t m;
1255
1256         KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT ||
1257             (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK,
1258             ("_pmap_allocpte: flags is neither M_NOWAIT nor M_WAITOK"));
1259
1260         /*
1261          * Allocate a page table page.
1262          */
1263         if ((m = vm_page_alloc(NULL, ptepindex, VM_ALLOC_NOOBJ |
1264             VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL) {
1265                 if (flags & M_WAITOK) {
1266                         PMAP_UNLOCK(pmap);
1267                         vm_page_unlock_queues();
1268                         VM_WAIT;
1269                         vm_page_lock_queues();
1270                         PMAP_LOCK(pmap);
1271                 }
1272
1273                 /*
1274                  * Indicate the need to retry.  While waiting, the page table
1275                  * page may have been allocated.
1276                  */
1277                 return (NULL);
1278         }
1279         if ((m->flags & PG_ZERO) == 0)
1280                 pmap_zero_page(m);
1281
1282         /*
1283          * Map the pagetable page into the process address space, if
1284          * it isn't already there.
1285          */
1286
1287         pmap->pm_stats.resident_count++;
1288
1289         ptepa = VM_PAGE_TO_PHYS(m);
1290         pmap->pm_pdir[ptepindex] =
1291                 (pd_entry_t) (ptepa | PG_U | PG_RW | PG_V | PG_A | PG_M);
1292
1293         return m;
1294 }
1295
1296 static vm_page_t
1297 pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags)
1298 {
1299         unsigned ptepindex;
1300         pd_entry_t ptepa;
1301         vm_page_t m;
1302
1303         KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT ||
1304             (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK,
1305             ("pmap_allocpte: flags is neither M_NOWAIT nor M_WAITOK"));
1306
1307         /*
1308          * Calculate pagetable page index
1309          */
1310         ptepindex = va >> PDRSHIFT;
1311 retry:
1312         /*
1313          * Get the page directory entry
1314          */
1315         ptepa = pmap->pm_pdir[ptepindex];
1316
1317         /*
1318          * This supports switching from a 4MB page to a
1319          * normal 4K page.
1320          */
1321         if (ptepa & PG_PS) {
1322                 pmap->pm_pdir[ptepindex] = 0;
1323                 ptepa = 0;
1324                 pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
1325                 pmap_invalidate_all(kernel_pmap);
1326         }
1327
1328         /*
1329          * If the page table page is mapped, we just increment the
1330          * hold count, and activate it.
1331          */
1332         if (ptepa) {
1333                 m = PHYS_TO_VM_PAGE(ptepa);
1334                 m->wire_count++;
1335         } else {
1336                 /*
1337                  * Here if the pte page isn't mapped, or if it has
1338                  * been deallocated. 
1339                  */
1340                 m = _pmap_allocpte(pmap, ptepindex, flags);
1341                 if (m == NULL && (flags & M_WAITOK))
1342                         goto retry;
1343         }
1344         return (m);
1345 }
1346
1347
1348 /***************************************************
1349 * Pmap allocation/deallocation routines.
1350  ***************************************************/
1351
1352 #ifdef SMP
1353 /*
1354  * Deal with a SMP shootdown of other users of the pmap that we are
1355  * trying to dispose of.  This can be a bit hairy.
1356  */
1357 static u_int *lazymask;
1358 static u_int lazyptd;
1359 static volatile u_int lazywait;
1360
1361 void pmap_lazyfix_action(void);
1362
1363 void
1364 pmap_lazyfix_action(void)
1365 {
1366         u_int mymask = PCPU_GET(cpumask);
1367
1368 #ifdef COUNT_IPIS
1369         *ipi_lazypmap_counts[PCPU_GET(cpuid)]++;
1370 #endif
1371         if (rcr3() == lazyptd)
1372                 load_cr3(PCPU_GET(curpcb)->pcb_cr3);
1373         atomic_clear_int(lazymask, mymask);
1374         atomic_store_rel_int(&lazywait, 1);
1375 }
1376
1377 static void
1378 pmap_lazyfix_self(u_int mymask)
1379 {
1380
1381         if (rcr3() == lazyptd)
1382                 load_cr3(PCPU_GET(curpcb)->pcb_cr3);
1383         atomic_clear_int(lazymask, mymask);
1384 }
1385
1386
1387 static void
1388 pmap_lazyfix(pmap_t pmap)
1389 {
1390         u_int mymask;
1391         u_int mask;
1392         register u_int spins;
1393
1394         while ((mask = pmap->pm_active) != 0) {
1395                 spins = 50000000;
1396                 mask = mask & -mask;    /* Find least significant set bit */
1397                 mtx_lock_spin(&smp_ipi_mtx);
1398 #ifdef PAE
1399                 lazyptd = vtophys(pmap->pm_pdpt);
1400 #else
1401                 lazyptd = vtophys(pmap->pm_pdir);
1402 #endif
1403                 mymask = PCPU_GET(cpumask);
1404                 if (mask == mymask) {
1405                         lazymask = &pmap->pm_active;
1406                         pmap_lazyfix_self(mymask);
1407                 } else {
1408                         atomic_store_rel_int((u_int *)&lazymask,
1409                             (u_int)&pmap->pm_active);
1410                         atomic_store_rel_int(&lazywait, 0);
1411                         ipi_selected(mask, IPI_LAZYPMAP);
1412                         while (lazywait == 0) {
1413                                 ia32_pause();
1414                                 if (--spins == 0)
1415                                         break;
1416                         }
1417                 }
1418                 mtx_unlock_spin(&smp_ipi_mtx);
1419                 if (spins == 0)
1420                         printf("pmap_lazyfix: spun for 50000000\n");
1421         }
1422 }
1423
1424 #else   /* SMP */
1425
1426 /*
1427  * Cleaning up on uniprocessor is easy.  For various reasons, we're
1428  * unlikely to have to even execute this code, including the fact
1429  * that the cleanup is deferred until the parent does a wait(2), which
1430  * means that another userland process has run.
1431  */
1432 static void
1433 pmap_lazyfix(pmap_t pmap)
1434 {
1435         u_int cr3;
1436
1437         cr3 = vtophys(pmap->pm_pdir);
1438         if (cr3 == rcr3()) {
1439                 load_cr3(PCPU_GET(curpcb)->pcb_cr3);
1440                 pmap->pm_active &= ~(PCPU_GET(cpumask));
1441         }
1442 }
1443 #endif  /* SMP */
1444
1445 /*
1446  * Release any resources held by the given physical map.
1447  * Called when a pmap initialized by pmap_pinit is being released.
1448  * Should only be called if the map contains no valid mappings.
1449  */
1450 void
1451 pmap_release(pmap_t pmap)
1452 {
1453         vm_page_t m, ptdpg[NPGPTD];
1454         int i;
1455
1456         KASSERT(pmap->pm_stats.resident_count == 0,
1457             ("pmap_release: pmap resident count %ld != 0",
1458             pmap->pm_stats.resident_count));
1459
1460         pmap_lazyfix(pmap);
1461         mtx_lock_spin(&allpmaps_lock);
1462         LIST_REMOVE(pmap, pm_list);
1463         mtx_unlock_spin(&allpmaps_lock);
1464
1465         for (i = 0; i < NPGPTD; i++)
1466                 ptdpg[i] = PHYS_TO_VM_PAGE(pmap->pm_pdir[PTDPTDI + i]);
1467
1468         bzero(pmap->pm_pdir + PTDPTDI, (nkpt + NPGPTD) *
1469             sizeof(*pmap->pm_pdir));
1470 #ifdef SMP
1471         pmap->pm_pdir[MPPTDI] = 0;
1472 #endif
1473
1474         pmap_qremove((vm_offset_t)pmap->pm_pdir, NPGPTD);
1475
1476         vm_page_lock_queues();
1477         for (i = 0; i < NPGPTD; i++) {
1478                 m = ptdpg[i];
1479 #ifdef PAE
1480                 KASSERT(VM_PAGE_TO_PHYS(m) == (pmap->pm_pdpt[i] & PG_FRAME),
1481                     ("pmap_release: got wrong ptd page"));
1482 #endif
1483                 m->wire_count--;
1484                 atomic_subtract_int(&cnt.v_wire_count, 1);
1485                 vm_page_free_zero(m);
1486         }
1487         vm_page_unlock_queues();
1488         PMAP_LOCK_DESTROY(pmap);
1489 }
1490 \f
1491 static int
1492 kvm_size(SYSCTL_HANDLER_ARGS)
1493 {
1494         unsigned long ksize = VM_MAX_KERNEL_ADDRESS - KERNBASE;
1495
1496         return sysctl_handle_long(oidp, &ksize, 0, req);
1497 }
1498 SYSCTL_PROC(_vm, OID_AUTO, kvm_size, CTLTYPE_LONG|CTLFLAG_RD, 
1499     0, 0, kvm_size, "IU", "Size of KVM");
1500
1501 static int
1502 kvm_free(SYSCTL_HANDLER_ARGS)
1503 {
1504         unsigned long kfree = VM_MAX_KERNEL_ADDRESS - kernel_vm_end;
1505
1506         return sysctl_handle_long(oidp, &kfree, 0, req);
1507 }
1508 SYSCTL_PROC(_vm, OID_AUTO, kvm_free, CTLTYPE_LONG|CTLFLAG_RD, 
1509     0, 0, kvm_free, "IU", "Amount of KVM free");
1510
1511 /*
1512  * grow the number of kernel page table entries, if needed
1513  */
1514 void
1515 pmap_growkernel(vm_offset_t addr)
1516 {
1517         struct pmap *pmap;
1518         vm_paddr_t ptppaddr;
1519         vm_page_t nkpg;
1520         pd_entry_t newpdir;
1521         pt_entry_t *pde;
1522
1523         mtx_assert(&kernel_map->system_mtx, MA_OWNED);
1524         if (kernel_vm_end == 0) {
1525                 kernel_vm_end = KERNBASE;
1526                 nkpt = 0;
1527                 while (pdir_pde(PTD, kernel_vm_end)) {
1528                         kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
1529                         nkpt++;
1530                         if (kernel_vm_end - 1 >= kernel_map->max_offset) {
1531                                 kernel_vm_end = kernel_map->max_offset;
1532                                 break;
1533                         }
1534                 }
1535         }
1536         addr = roundup2(addr, PAGE_SIZE * NPTEPG);
1537         if (addr - 1 >= kernel_map->max_offset)
1538                 addr = kernel_map->max_offset;
1539         while (kernel_vm_end < addr) {
1540                 if (pdir_pde(PTD, kernel_vm_end)) {
1541                         kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
1542                         if (kernel_vm_end - 1 >= kernel_map->max_offset) {
1543                                 kernel_vm_end = kernel_map->max_offset;
1544                                 break;
1545                         }
1546                         continue;
1547                 }
1548
1549                 /*
1550                  * This index is bogus, but out of the way
1551                  */
1552                 nkpg = vm_page_alloc(NULL, nkpt,
1553                     VM_ALLOC_NOOBJ | VM_ALLOC_SYSTEM | VM_ALLOC_WIRED);
1554                 if (!nkpg)
1555                         panic("pmap_growkernel: no memory to grow kernel");
1556
1557                 nkpt++;
1558
1559                 pmap_zero_page(nkpg);
1560                 ptppaddr = VM_PAGE_TO_PHYS(nkpg);
1561                 newpdir = (pd_entry_t) (ptppaddr | PG_V | PG_RW | PG_A | PG_M);
1562                 pdir_pde(PTD, kernel_vm_end) = newpdir;
1563
1564                 mtx_lock_spin(&allpmaps_lock);
1565                 LIST_FOREACH(pmap, &allpmaps, pm_list) {
1566                         pde = pmap_pde(pmap, kernel_vm_end);
1567                         pde_store(pde, newpdir);
1568                 }
1569                 mtx_unlock_spin(&allpmaps_lock);
1570                 kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
1571                 if (kernel_vm_end - 1 >= kernel_map->max_offset) {
1572                         kernel_vm_end = kernel_map->max_offset;
1573                         break;
1574                 }
1575         }
1576 }
1577
1578
1579 /***************************************************
1580  * page management routines.
1581  ***************************************************/
1582
1583 CTASSERT(sizeof(struct pv_chunk) == PAGE_SIZE);
1584 CTASSERT(_NPCM == 11);
1585
1586 static __inline struct pv_chunk *
1587 pv_to_chunk(pv_entry_t pv)
1588 {
1589
1590         return (struct pv_chunk *)((uintptr_t)pv & ~(uintptr_t)PAGE_MASK);
1591 }
1592
1593 #define PV_PMAP(pv) (pv_to_chunk(pv)->pc_pmap)
1594
1595 #define PC_FREE0_9      0xfffffffful    /* Free values for index 0 through 9 */
1596 #define PC_FREE10       0x0000fffful    /* Free values for index 10 */
1597
1598 static uint64_t pc_freemask[11] = {
1599         PC_FREE0_9, PC_FREE0_9, PC_FREE0_9,
1600         PC_FREE0_9, PC_FREE0_9, PC_FREE0_9,
1601         PC_FREE0_9, PC_FREE0_9, PC_FREE0_9,
1602         PC_FREE0_9, PC_FREE10
1603 };
1604
1605 SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_count, CTLFLAG_RD, &pv_entry_count, 0,
1606         "Current number of pv entries");
1607
1608 #ifdef PV_STATS
1609 static int pc_chunk_count, pc_chunk_allocs, pc_chunk_frees, pc_chunk_tryfail;
1610
1611 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_count, CTLFLAG_RD, &pc_chunk_count, 0,
1612         "Current number of pv entry chunks");
1613 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_allocs, CTLFLAG_RD, &pc_chunk_allocs, 0,
1614         "Current number of pv entry chunks allocated");
1615 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_frees, CTLFLAG_RD, &pc_chunk_frees, 0,
1616         "Current number of pv entry chunks frees");
1617 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_tryfail, CTLFLAG_RD, &pc_chunk_tryfail, 0,
1618         "Number of times tried to get a chunk page but failed.");
1619
1620 static long pv_entry_frees, pv_entry_allocs;
1621 static int pv_entry_spare;
1622
1623 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_frees, CTLFLAG_RD, &pv_entry_frees, 0,
1624         "Current number of pv entry frees");
1625 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD, &pv_entry_allocs, 0,
1626         "Current number of pv entry allocs");
1627 SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD, &pv_entry_spare, 0,
1628         "Current number of spare pv entries");
1629
1630 static int pmap_collect_inactive, pmap_collect_active;
1631
1632 SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_collect_inactive, CTLFLAG_RD, &pmap_collect_inactive, 0,
1633         "Current number times pmap_collect called on inactive queue");
1634 SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_collect_active, CTLFLAG_RD, &pmap_collect_active, 0,
1635         "Current number times pmap_collect called on active queue");
1636 #endif
1637
1638 /*
1639  * We are in a serious low memory condition.  Resort to
1640  * drastic measures to free some pages so we can allocate
1641  * another pv entry chunk.  This is normally called to
1642  * unmap inactive pages, and if necessary, active pages.
1643  */
1644 static void
1645 pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq)
1646 {
1647         pmap_t pmap;
1648         pt_entry_t *pte, tpte;
1649         pv_entry_t next_pv, pv;
1650         vm_offset_t va;
1651         vm_page_t m;
1652
1653         sched_pin();
1654         TAILQ_FOREACH(m, &vpq->pl, pageq) {
1655                 if (m->hold_count || m->busy || (m->flags & PG_BUSY))
1656                         continue;
1657                 TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) {
1658                         va = pv->pv_va;
1659                         pmap = PV_PMAP(pv);
1660                         /* Avoid deadlock and lock recursion. */
1661                         if (pmap > locked_pmap)
1662                                 PMAP_LOCK(pmap);
1663                         else if (pmap != locked_pmap && !PMAP_TRYLOCK(pmap))
1664                                 continue;
1665                         pmap->pm_stats.resident_count--;
1666                         pte = pmap_pte_quick(pmap, va);
1667                         tpte = pte_load_clear(pte);
1668                         KASSERT((tpte & PG_W) == 0,
1669                             ("pmap_collect: wired pte %#jx", (uintmax_t)tpte));
1670                         if (tpte & PG_A)
1671                                 vm_page_flag_set(m, PG_REFERENCED);
1672                         if (tpte & PG_M) {
1673                                 KASSERT((tpte & PG_RW),
1674         ("pmap_collect: modified page not writable: va: %#x, pte: %#jx",
1675                                     va, (uintmax_t)tpte));
1676                                 vm_page_dirty(m);
1677                         }
1678                         pmap_invalidate_page(pmap, va);
1679                         TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
1680                         if (TAILQ_EMPTY(&m->md.pv_list))
1681                                 vm_page_flag_clear(m, PG_WRITEABLE);
1682                         m->md.pv_list_count--;
1683                         pmap_unuse_pt(pmap, va);
1684                         if (pmap != locked_pmap)
1685                                 PMAP_UNLOCK(pmap);
1686                         free_pv_entry(locked_pmap, pv);
1687                 }
1688         }
1689         sched_unpin();
1690 }
1691
1692
1693 /*
1694  * free the pv_entry back to the free list
1695  */
1696 static void
1697 free_pv_entry(pmap_t pmap, pv_entry_t pv)
1698 {
1699         vm_page_t m;
1700         struct pv_chunk *pc;
1701         int idx, field, bit;
1702
1703         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
1704         PV_STAT(pv_entry_frees++);
1705         PV_STAT(pv_entry_spare++);
1706         pv_entry_count--;
1707         pc = pv_to_chunk(pv);
1708         idx = pv - &pc->pc_pventry[0];
1709         field = idx / 32;
1710         bit = idx % 32;
1711         pc->pc_map[field] |= 1ul << bit;
1712         /* move to head of list */
1713         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
1714         TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
1715         for (idx = 0; idx < _NPCM; idx++)
1716                 if (pc->pc_map[idx] != pc_freemask[idx])
1717                         return;
1718         PV_STAT(pv_entry_spare -= _NPCPV);
1719         PV_STAT(pc_chunk_count--);
1720         PV_STAT(pc_chunk_frees++);
1721         /* entire chunk is free, return it */
1722         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
1723         m = PHYS_TO_VM_PAGE(pmap_kextract((vm_offset_t)pc));
1724         pmap_qremove((vm_offset_t)pc, 1);
1725         vm_page_unwire(m, 0);
1726         vm_page_free(m);
1727         pmap_ptelist_free(&pv_vafree, (vm_offset_t)pc);
1728 }
1729
1730 /*
1731  * get a new pv_entry, allocating a block from the system
1732  * when needed.
1733  */
1734 static pv_entry_t
1735 get_pv_entry(pmap_t pmap, int try)
1736 {
1737         static const struct timeval printinterval = { 60, 0 };
1738         static struct timeval lastprint;
1739         static vm_pindex_t colour;
1740         int bit, field;
1741         pv_entry_t pv;
1742         struct pv_chunk *pc;
1743         vm_page_t m;
1744
1745         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1746         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
1747         PV_STAT(pv_entry_allocs++);
1748         pv_entry_count++;
1749         if (pv_entry_count > pv_entry_high_water)
1750                 pagedaemon_wakeup();
1751         pc = TAILQ_FIRST(&pmap->pm_pvchunk);
1752         if (pc != NULL) {
1753                 for (field = 0; field < _NPCM; field++) {
1754                         if (pc->pc_map[field]) {
1755                                 bit = bsfl(pc->pc_map[field]);
1756                                 break;
1757                         }
1758                 }
1759                 if (field < _NPCM) {
1760                         pv = &pc->pc_pventry[field * 32 + bit];
1761                         pc->pc_map[field] &= ~(1ul << bit);
1762                         /* If this was the last item, move it to tail */
1763                         for (field = 0; field < _NPCM; field++)
1764                                 if (pc->pc_map[field] != 0) {
1765                                         PV_STAT(pv_entry_spare--);
1766                                         return (pv);    /* not full, return */
1767                                 }
1768                         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
1769                         TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list);
1770                         PV_STAT(pv_entry_spare--);
1771                         return (pv);
1772                 }
1773         }
1774         pc = (struct pv_chunk *)pmap_ptelist_alloc(&pv_vafree);
1775         m = vm_page_alloc(NULL, colour, VM_ALLOC_SYSTEM |
1776             VM_ALLOC_NOOBJ | VM_ALLOC_WIRED);
1777         if (m == NULL || pc == NULL) {
1778                 if (try) {
1779                         pv_entry_count--;
1780                         PV_STAT(pc_chunk_tryfail++);
1781                         if (m) {
1782                                 vm_page_lock_queues();
1783                                 vm_page_unwire(m, 0);
1784                                 vm_page_free(m);
1785                                 vm_page_unlock_queues();
1786                         }
1787                         if (pc)
1788                                 pmap_ptelist_free(&pv_vafree, (vm_offset_t)pc);
1789                         return (NULL);
1790                 }
1791                 /*
1792                  * Reclaim pv entries: At first, destroy mappings to
1793                  * inactive pages.  After that, if a pv chunk entry
1794                  * is still needed, destroy mappings to active pages.
1795                  */
1796                 if (ratecheck(&lastprint, &printinterval))
1797                         printf("Approaching the limit on PV entries, "
1798                             "consider increasing tunables "
1799                             "vm.pmap.shpgperproc or "
1800                             "vm.pmap.pv_entry_max\n");
1801                 PV_STAT(pmap_collect_inactive++);
1802                 pmap_collect(pmap, &vm_page_queues[PQ_INACTIVE]);
1803                 if (m == NULL)
1804                         m = vm_page_alloc(NULL, colour, VM_ALLOC_SYSTEM |
1805                             VM_ALLOC_NOOBJ | VM_ALLOC_WIRED);
1806                 if (pc == NULL)
1807                         pc = (struct pv_chunk *)pmap_ptelist_alloc(&pv_vafree);
1808                 if (m == NULL || pc == NULL) {
1809                         PV_STAT(pmap_collect_active++);
1810                         pmap_collect(pmap, &vm_page_queues[PQ_ACTIVE]);
1811                         if (m == NULL)
1812                                 m = vm_page_alloc(NULL, colour,
1813                                     VM_ALLOC_SYSTEM | VM_ALLOC_NOOBJ |
1814                                     VM_ALLOC_WIRED);
1815                         if (pc == NULL)
1816                                 pc = (struct pv_chunk *)
1817                                     pmap_ptelist_alloc(&pv_vafree);
1818                         if (m == NULL || pc == NULL)
1819                                 panic("get_pv_entry: increase vm.pmap.shpgperproc");
1820                 }
1821         }
1822         PV_STAT(pc_chunk_count++);
1823         PV_STAT(pc_chunk_allocs++);
1824         colour++;
1825         pmap_qenter((vm_offset_t)pc, &m, 1);
1826         pc->pc_pmap = pmap;
1827         pc->pc_map[0] = pc_freemask[0] & ~1ul;  /* preallocated bit 0 */
1828         for (field = 1; field < _NPCM; field++)
1829                 pc->pc_map[field] = pc_freemask[field];
1830         pv = &pc->pc_pventry[0];
1831         TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
1832         PV_STAT(pv_entry_spare += _NPCPV - 1);
1833         return (pv);
1834 }
1835
1836 static void
1837 pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va)
1838 {
1839         pv_entry_t pv;
1840
1841         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1842         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
1843         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
1844                 if (pmap == PV_PMAP(pv) && va == pv->pv_va)
1845                         break;
1846         }
1847         KASSERT(pv != NULL, ("pmap_remove_entry: pv not found"));
1848         TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
1849         m->md.pv_list_count--;
1850         if (TAILQ_EMPTY(&m->md.pv_list))
1851                 vm_page_flag_clear(m, PG_WRITEABLE);
1852         free_pv_entry(pmap, pv);
1853 }
1854
1855 /*
1856  * Create a pv entry for page at pa for
1857  * (pmap, va).
1858  */
1859 static void
1860 pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m)
1861 {
1862         pv_entry_t pv;
1863
1864         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1865         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
1866         pv = get_pv_entry(pmap, FALSE);
1867         pv->pv_va = va;
1868         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
1869         m->md.pv_list_count++;
1870 }
1871
1872 /*
1873  * Conditionally create a pv entry.
1874  */
1875 static boolean_t
1876 pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m)
1877 {
1878         pv_entry_t pv;
1879
1880         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1881         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
1882         if (pv_entry_count < pv_entry_high_water && 
1883             (pv = get_pv_entry(pmap, TRUE)) != NULL) {
1884                 pv->pv_va = va;
1885                 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
1886                 m->md.pv_list_count++;
1887                 return (TRUE);
1888         } else
1889                 return (FALSE);
1890 }
1891
1892 /*
1893  * pmap_remove_pte: do the things to unmap a page in a process
1894  */
1895 static int
1896 pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va)
1897 {
1898         pt_entry_t oldpte;
1899         vm_page_t m;
1900
1901         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
1902         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1903         oldpte = pte_load_clear(ptq);
1904         if (oldpte & PG_W)
1905                 pmap->pm_stats.wired_count -= 1;
1906         /*
1907          * Machines that don't support invlpg, also don't support
1908          * PG_G.
1909          */
1910         if (oldpte & PG_G)
1911                 pmap_invalidate_page(kernel_pmap, va);
1912         pmap->pm_stats.resident_count -= 1;
1913         if (oldpte & PG_MANAGED) {
1914                 m = PHYS_TO_VM_PAGE(oldpte);
1915                 if (oldpte & PG_M) {
1916                         KASSERT((oldpte & PG_RW),
1917         ("pmap_remove_pte: modified page not writable: va: %#x, pte: %#jx",
1918                             va, (uintmax_t)oldpte));
1919                         vm_page_dirty(m);
1920                 }
1921                 if (oldpte & PG_A)
1922                         vm_page_flag_set(m, PG_REFERENCED);
1923                 pmap_remove_entry(pmap, m, va);
1924         }
1925         return (pmap_unuse_pt(pmap, va));
1926 }
1927
1928 /*
1929  * Remove a single page from a process address space
1930  */
1931 static void
1932 pmap_remove_page(pmap_t pmap, vm_offset_t va)
1933 {
1934         pt_entry_t *pte;
1935
1936         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
1937         KASSERT(curthread->td_pinned > 0, ("curthread not pinned"));
1938         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1939         if ((pte = pmap_pte_quick(pmap, va)) == NULL || *pte == 0)
1940                 return;
1941         pmap_remove_pte(pmap, pte, va);
1942         pmap_invalidate_page(pmap, va);
1943 }
1944
1945 /*
1946  *      Remove the given range of addresses from the specified map.
1947  *
1948  *      It is assumed that the start and end are properly
1949  *      rounded to the page size.
1950  */
1951 void
1952 pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
1953 {
1954         vm_offset_t pdnxt;
1955         pd_entry_t ptpaddr;
1956         pt_entry_t *pte;
1957         int anyvalid;
1958
1959         /*
1960          * Perform an unsynchronized read.  This is, however, safe.
1961          */
1962         if (pmap->pm_stats.resident_count == 0)
1963                 return;
1964
1965         anyvalid = 0;
1966
1967         vm_page_lock_queues();
1968         sched_pin();
1969         PMAP_LOCK(pmap);
1970
1971         /*
1972          * special handling of removing one page.  a very
1973          * common operation and easy to short circuit some
1974          * code.
1975          */
1976         if ((sva + PAGE_SIZE == eva) && 
1977             ((pmap->pm_pdir[(sva >> PDRSHIFT)] & PG_PS) == 0)) {
1978                 pmap_remove_page(pmap, sva);
1979                 goto out;
1980         }
1981
1982         for (; sva < eva; sva = pdnxt) {
1983                 unsigned pdirindex;
1984
1985                 /*
1986                  * Calculate index for next page table.
1987                  */
1988                 pdnxt = (sva + NBPDR) & ~PDRMASK;
1989                 if (pmap->pm_stats.resident_count == 0)
1990                         break;
1991
1992                 pdirindex = sva >> PDRSHIFT;
1993                 ptpaddr = pmap->pm_pdir[pdirindex];
1994
1995                 /*
1996                  * Weed out invalid mappings. Note: we assume that the page
1997                  * directory table is always allocated, and in kernel virtual.
1998                  */
1999                 if (ptpaddr == 0)
2000                         continue;
2001
2002                 /*
2003                  * Check for large page.
2004                  */
2005                 if ((ptpaddr & PG_PS) != 0) {
2006                         pmap->pm_pdir[pdirindex] = 0;
2007                         pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
2008                         anyvalid = 1;
2009                         continue;
2010                 }
2011
2012                 /*
2013                  * Limit our scan to either the end of the va represented
2014                  * by the current page table page, or to the end of the
2015                  * range being removed.
2016                  */
2017                 if (pdnxt > eva)
2018                         pdnxt = eva;
2019
2020                 for (pte = pmap_pte_quick(pmap, sva); sva != pdnxt; pte++,
2021                     sva += PAGE_SIZE) {
2022                         if (*pte == 0)
2023                                 continue;
2024
2025                         /*
2026                          * The TLB entry for a PG_G mapping is invalidated
2027                          * by pmap_remove_pte().
2028                          */
2029                         if ((*pte & PG_G) == 0)
2030                                 anyvalid = 1;
2031                         if (pmap_remove_pte(pmap, pte, sva))
2032                                 break;
2033                 }
2034         }
2035 out:
2036         sched_unpin();
2037         vm_page_unlock_queues();
2038         if (anyvalid)
2039                 pmap_invalidate_all(pmap);
2040         PMAP_UNLOCK(pmap);
2041 }
2042
2043 /*
2044  *      Routine:        pmap_remove_all
2045  *      Function:
2046  *              Removes this physical page from
2047  *              all physical maps in which it resides.
2048  *              Reflects back modify bits to the pager.
2049  *
2050  *      Notes:
2051  *              Original versions of this routine were very
2052  *              inefficient because they iteratively called
2053  *              pmap_remove (slow...)
2054  */
2055
2056 void
2057 pmap_remove_all(vm_page_t m)
2058 {
2059         register pv_entry_t pv;
2060         pmap_t pmap;
2061         pt_entry_t *pte, tpte;
2062
2063 #if defined(PMAP_DIAGNOSTIC)
2064         /*
2065          * XXX This makes pmap_remove_all() illegal for non-managed pages!
2066          */
2067         if (m->flags & PG_FICTITIOUS) {
2068                 panic("pmap_remove_all: illegal for unmanaged page, va: 0x%x",
2069                     VM_PAGE_TO_PHYS(m));
2070         }
2071 #endif
2072         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
2073         sched_pin();
2074         while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
2075                 pmap = PV_PMAP(pv);
2076                 PMAP_LOCK(pmap);
2077                 pmap->pm_stats.resident_count--;
2078                 pte = pmap_pte_quick(pmap, pv->pv_va);
2079                 tpte = pte_load_clear(pte);
2080                 if (tpte & PG_W)
2081                         pmap->pm_stats.wired_count--;
2082                 if (tpte & PG_A)
2083                         vm_page_flag_set(m, PG_REFERENCED);
2084
2085                 /*
2086                  * Update the vm_page_t clean and reference bits.
2087                  */
2088                 if (tpte & PG_M) {
2089                         KASSERT((tpte & PG_RW),
2090         ("pmap_remove_all: modified page not writable: va: %#x, pte: %#jx",
2091                             pv->pv_va, (uintmax_t)tpte));
2092                         vm_page_dirty(m);
2093                 }
2094                 pmap_invalidate_page(pmap, pv->pv_va);
2095                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
2096                 m->md.pv_list_count--;
2097                 pmap_unuse_pt(pmap, pv->pv_va);
2098                 PMAP_UNLOCK(pmap);
2099                 free_pv_entry(pmap, pv);
2100         }
2101         vm_page_flag_clear(m, PG_WRITEABLE);
2102         sched_unpin();
2103 }
2104
2105 /*
2106  *      Set the physical protection on the
2107  *      specified range of this map as requested.
2108  */
2109 void
2110 pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
2111 {
2112         vm_offset_t pdnxt;
2113         pd_entry_t ptpaddr;
2114         pt_entry_t *pte;
2115         int anychanged;
2116
2117         if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
2118                 pmap_remove(pmap, sva, eva);
2119                 return;
2120         }
2121
2122         if (prot & VM_PROT_WRITE)
2123                 return;
2124
2125         anychanged = 0;
2126
2127         vm_page_lock_queues();
2128         sched_pin();
2129         PMAP_LOCK(pmap);
2130         for (; sva < eva; sva = pdnxt) {
2131                 unsigned obits, pbits, pdirindex;
2132
2133                 pdnxt = (sva + NBPDR) & ~PDRMASK;
2134
2135                 pdirindex = sva >> PDRSHIFT;
2136                 ptpaddr = pmap->pm_pdir[pdirindex];
2137
2138                 /*
2139                  * Weed out invalid mappings. Note: we assume that the page
2140                  * directory table is always allocated, and in kernel virtual.
2141                  */
2142                 if (ptpaddr == 0)
2143                         continue;
2144
2145                 /*
2146                  * Check for large page.
2147                  */
2148                 if ((ptpaddr & PG_PS) != 0) {
2149                         pmap->pm_pdir[pdirindex] &= ~(PG_M|PG_RW);
2150                         anychanged = 1;
2151                         continue;
2152                 }
2153
2154                 if (pdnxt > eva)
2155                         pdnxt = eva;
2156
2157                 for (pte = pmap_pte_quick(pmap, sva); sva != pdnxt; pte++,
2158                     sva += PAGE_SIZE) {
2159                         vm_page_t m;
2160
2161 retry:
2162                         /*
2163                          * Regardless of whether a pte is 32 or 64 bits in
2164                          * size, PG_RW, PG_A, and PG_M are among the least
2165                          * significant 32 bits.
2166                          */
2167                         obits = pbits = *(u_int *)pte;
2168                         if (pbits & PG_MANAGED) {
2169                                 m = NULL;
2170                                 if (pbits & PG_A) {
2171                                         m = PHYS_TO_VM_PAGE(*pte);
2172                                         vm_page_flag_set(m, PG_REFERENCED);
2173                                         pbits &= ~PG_A;
2174                                 }
2175                                 if ((pbits & PG_M) != 0) {
2176                                         if (m == NULL)
2177                                                 m = PHYS_TO_VM_PAGE(*pte);
2178                                         vm_page_dirty(m);
2179                                 }
2180                         }
2181
2182                         pbits &= ~(PG_RW | PG_M);
2183
2184                         if (pbits != obits) {
2185                                 if (!atomic_cmpset_int((u_int *)pte, obits,
2186                                     pbits))
2187                                         goto retry;
2188                                 if (obits & PG_G)
2189                                         pmap_invalidate_page(pmap, sva);
2190                                 else
2191                                         anychanged = 1;
2192                         }
2193                 }
2194         }
2195         sched_unpin();
2196         vm_page_unlock_queues();
2197         if (anychanged)
2198                 pmap_invalidate_all(pmap);
2199         PMAP_UNLOCK(pmap);
2200 }
2201
2202 /*
2203  *      Insert the given physical page (p) at
2204  *      the specified virtual address (v) in the
2205  *      target physical map with the protection requested.
2206  *
2207  *      If specified, the page will be wired down, meaning
2208  *      that the related pte can not be reclaimed.
2209  *
2210  *      NB:  This is the only routine which MAY NOT lazy-evaluate
2211  *      or lose information.  That is, this routine must actually
2212  *      insert this page into the given map NOW.
2213  */
2214 void
2215 pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
2216            boolean_t wired)
2217 {
2218         vm_paddr_t pa;
2219         pd_entry_t *pde;
2220         register pt_entry_t *pte;
2221         vm_paddr_t opa;
2222         pt_entry_t origpte, newpte;
2223         vm_page_t mpte, om;
2224         boolean_t invlva;
2225
2226         va &= PG_FRAME;
2227 #ifdef PMAP_DIAGNOSTIC
2228         if (va > VM_MAX_KERNEL_ADDRESS)
2229                 panic("pmap_enter: toobig");
2230         if ((va >= UPT_MIN_ADDRESS) && (va < UPT_MAX_ADDRESS))
2231                 panic("pmap_enter: invalid to pmap_enter page table pages (va: 0x%x)", va);
2232 #endif
2233
2234         mpte = NULL;
2235
2236         vm_page_lock_queues();
2237         PMAP_LOCK(pmap);
2238         sched_pin();
2239
2240         /*
2241          * In the case that a page table page is not
2242          * resident, we are creating it here.
2243          */
2244         if (va < VM_MAXUSER_ADDRESS) {
2245                 mpte = pmap_allocpte(pmap, va, M_WAITOK);
2246         }
2247 #if 0 && defined(PMAP_DIAGNOSTIC)
2248         else {
2249                 pd_entry_t *pdeaddr = pmap_pde(pmap, va);
2250                 origpte = *pdeaddr;
2251                 if ((origpte & PG_V) == 0) { 
2252                         panic("pmap_enter: invalid kernel page table page, pdir=%p, pde=%p, va=%p\n",
2253                                 pmap->pm_pdir[PTDPTDI], origpte, va);
2254                 }
2255         }
2256 #endif
2257
2258         pde = pmap_pde(pmap, va);
2259         if ((*pde & PG_PS) != 0)
2260                 panic("pmap_enter: attempted pmap_enter on 4MB page");
2261         pte = pmap_pte_quick(pmap, va);
2262
2263         /*
2264          * Page Directory table entry not valid, we need a new PT page
2265          */
2266         if (pte == NULL) {
2267                 panic("pmap_enter: invalid page directory pdir=%#jx, va=%#x\n",
2268                         (uintmax_t)pmap->pm_pdir[PTDPTDI], va);
2269         }
2270
2271         pa = VM_PAGE_TO_PHYS(m);
2272         om = NULL;
2273         origpte = *pte;
2274         opa = origpte & PG_FRAME;
2275
2276         /*
2277          * Mapping has not changed, must be protection or wiring change.
2278          */
2279         if (origpte && (opa == pa)) {
2280                 /*
2281                  * Wiring change, just update stats. We don't worry about
2282                  * wiring PT pages as they remain resident as long as there
2283                  * are valid mappings in them. Hence, if a user page is wired,
2284                  * the PT page will be also.
2285                  */
2286                 if (wired && ((origpte & PG_W) == 0))
2287                         pmap->pm_stats.wired_count++;
2288                 else if (!wired && (origpte & PG_W))
2289                         pmap->pm_stats.wired_count--;
2290
2291                 /*
2292                  * Remove extra pte reference
2293                  */
2294                 if (mpte)
2295                         mpte->wire_count--;
2296
2297                 /*
2298                  * We might be turning off write access to the page,
2299                  * so we go ahead and sense modify status.
2300                  */
2301                 if (origpte & PG_MANAGED) {
2302                         om = m;
2303                         pa |= PG_MANAGED;
2304                 }
2305                 goto validate;
2306         } 
2307         /*
2308          * Mapping has changed, invalidate old range and fall through to
2309          * handle validating new mapping.
2310          */
2311         if (opa) {
2312                 if (origpte & PG_W)
2313                         pmap->pm_stats.wired_count--;
2314                 if (origpte & PG_MANAGED) {
2315                         om = PHYS_TO_VM_PAGE(opa);
2316                         pmap_remove_entry(pmap, om, va);
2317                 }
2318                 if (mpte != NULL) {
2319                         mpte->wire_count--;
2320                         KASSERT(mpte->wire_count > 0,
2321                             ("pmap_enter: missing reference to page table page,"
2322                              " va: 0x%x", va));
2323                 }
2324         } else
2325                 pmap->pm_stats.resident_count++;
2326
2327         /*
2328          * Enter on the PV list if part of our managed memory.
2329          */
2330         if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) {
2331                 KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva,
2332                     ("pmap_enter: managed mapping within the clean submap"));
2333                 pmap_insert_entry(pmap, va, m);
2334                 pa |= PG_MANAGED;
2335         }
2336
2337         /*
2338          * Increment counters
2339          */
2340         if (wired)
2341                 pmap->pm_stats.wired_count++;
2342
2343 validate:
2344         /*
2345          * Now validate mapping with desired protection/wiring.
2346          */
2347         newpte = (pt_entry_t)(pa | PG_V);
2348         if ((prot & VM_PROT_WRITE) != 0)
2349                 newpte |= PG_RW;
2350         if (wired)
2351                 newpte |= PG_W;
2352         if (va < VM_MAXUSER_ADDRESS)
2353                 newpte |= PG_U;
2354         if (pmap == kernel_pmap)
2355                 newpte |= pgeflag;
2356
2357         /*
2358          * if the mapping or permission bits are different, we need
2359          * to update the pte.
2360          */
2361         if ((origpte & ~(PG_M|PG_A)) != newpte) {
2362                 if (origpte & PG_V) {
2363                         invlva = FALSE;
2364                         origpte = pte_load_store(pte, newpte | PG_A);
2365                         if (origpte & PG_A) {
2366                                 if (origpte & PG_MANAGED)
2367                                         vm_page_flag_set(om, PG_REFERENCED);
2368                                 if (opa != VM_PAGE_TO_PHYS(m))
2369                                         invlva = TRUE;
2370                         }
2371                         if (origpte & PG_M) {
2372                                 KASSERT((origpte & PG_RW),
2373         ("pmap_enter: modified page not writable: va: %#x, pte: %#jx",
2374                                     va, (uintmax_t)origpte));
2375                                 if ((origpte & PG_MANAGED) != 0)
2376                                         vm_page_dirty(om);
2377                                 if ((prot & VM_PROT_WRITE) == 0)
2378                                         invlva = TRUE;
2379                         }
2380                         if (invlva)
2381                                 pmap_invalidate_page(pmap, va);
2382                 } else
2383                         pte_store(pte, newpte | PG_A);
2384         }
2385         sched_unpin();
2386         vm_page_unlock_queues();
2387         PMAP_UNLOCK(pmap);
2388 }
2389
2390 /*
2391  * Maps a sequence of resident pages belonging to the same object.
2392  * The sequence begins with the given page m_start.  This page is
2393  * mapped at the given virtual address start.  Each subsequent page is
2394  * mapped at a virtual address that is offset from start by the same
2395  * amount as the page is offset from m_start within the object.  The
2396  * last page in the sequence is the page with the largest offset from
2397  * m_start that can be mapped at a virtual address less than the given
2398  * virtual address end.  Not every virtual page between start and end
2399  * is mapped; only those for which a resident page exists with the
2400  * corresponding offset from m_start are mapped.
2401  */
2402 void
2403 pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end,
2404     vm_page_t m_start, vm_prot_t prot)
2405 {
2406         vm_page_t m, mpte;
2407         vm_pindex_t diff, psize;
2408
2409         psize = atop(end - start);
2410         mpte = NULL;
2411         m = m_start;
2412         PMAP_LOCK(pmap);
2413         while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
2414                 mpte = pmap_enter_quick_locked(pmap, start + ptoa(diff), m,
2415                     prot, mpte);
2416                 m = TAILQ_NEXT(m, listq);
2417         }
2418         PMAP_UNLOCK(pmap);
2419 }
2420
2421 /*
2422  * this code makes some *MAJOR* assumptions:
2423  * 1. Current pmap & pmap exists.
2424  * 2. Not wired.
2425  * 3. Read access.
2426  * 4. No page table pages.
2427  * but is *MUCH* faster than pmap_enter...
2428  */
2429
2430 vm_page_t
2431 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
2432     vm_page_t mpte)
2433 {
2434
2435         PMAP_LOCK(pmap);
2436         mpte = pmap_enter_quick_locked(pmap, va, m, prot, mpte);
2437         PMAP_UNLOCK(pmap);
2438         return (mpte);
2439 }
2440
2441 static vm_page_t
2442 pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
2443     vm_prot_t prot, vm_page_t mpte)
2444 {
2445         pt_entry_t *pte;
2446         vm_paddr_t pa;
2447
2448         KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
2449             (m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0,
2450             ("pmap_enter_quick_locked: managed mapping within the clean submap"));
2451         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
2452         VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
2453         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2454
2455         /*
2456          * In the case that a page table page is not
2457          * resident, we are creating it here.
2458          */
2459         if (va < VM_MAXUSER_ADDRESS) {
2460                 unsigned ptepindex;
2461                 pd_entry_t ptepa;
2462
2463                 /*
2464                  * Calculate pagetable page index
2465                  */
2466                 ptepindex = va >> PDRSHIFT;
2467                 if (mpte && (mpte->pindex == ptepindex)) {
2468                         mpte->wire_count++;
2469                 } else {
2470 retry:
2471                         /*
2472                          * Get the page directory entry
2473                          */
2474                         ptepa = pmap->pm_pdir[ptepindex];
2475
2476                         /*
2477                          * If the page table page is mapped, we just increment
2478                          * the hold count, and activate it.
2479                          */
2480                         if (ptepa) {
2481                                 if (ptepa & PG_PS)
2482                                         panic("pmap_enter_quick: unexpected mapping into 4MB page");
2483                                 mpte = PHYS_TO_VM_PAGE(ptepa);
2484                                 mpte->wire_count++;
2485                         } else {
2486                                 mpte = _pmap_allocpte(pmap, ptepindex,
2487                                     M_NOWAIT);
2488                                 if (mpte == NULL) {
2489                                         PMAP_UNLOCK(pmap);
2490                                         vm_page_busy(m);
2491                                         vm_page_unlock_queues();
2492                                         VM_OBJECT_UNLOCK(m->object);
2493                                         VM_WAIT;
2494                                         VM_OBJECT_LOCK(m->object);
2495                                         vm_page_lock_queues();
2496                                         vm_page_wakeup(m);
2497                                         PMAP_LOCK(pmap);
2498                                         goto retry;
2499                                 }
2500                         }
2501                 }
2502         } else {
2503                 mpte = NULL;
2504         }
2505
2506         /*
2507          * This call to vtopte makes the assumption that we are
2508          * entering the page into the current pmap.  In order to support
2509          * quick entry into any pmap, one would likely use pmap_pte_quick.
2510          * But that isn't as quick as vtopte.
2511          */
2512         pte = vtopte(va);
2513         if (*pte) {
2514                 if (mpte != NULL) {
2515                         pmap_unwire_pte_hold(pmap, mpte);
2516                         mpte = NULL;
2517                 }
2518                 return (mpte);
2519         }
2520
2521         /*
2522          * Enter on the PV list if part of our managed memory. Note that we
2523          * raise IPL while manipulating pv_table since pmap_enter can be
2524          * called at interrupt time.
2525          */
2526         if ((m->flags & (PG_FICTITIOUS|PG_UNMANAGED)) == 0)
2527                 pmap_insert_entry(pmap, va, m);
2528
2529         /*
2530          * Increment counters
2531          */
2532         pmap->pm_stats.resident_count++;
2533
2534         pa = VM_PAGE_TO_PHYS(m);
2535
2536         /*
2537          * Now validate mapping with RO protection
2538          */
2539         if (m->flags & (PG_FICTITIOUS|PG_UNMANAGED))
2540                 pte_store(pte, pa | PG_V | PG_U);
2541         else
2542                 pte_store(pte, pa | PG_V | PG_U | PG_MANAGED);
2543         return mpte;
2544 }
2545
2546 /*
2547  * Make a temporary mapping for a physical address.  This is only intended
2548  * to be used for panic dumps.
2549  */
2550 void *
2551 pmap_kenter_temporary(vm_paddr_t pa, int i)
2552 {
2553         vm_offset_t va;
2554
2555         va = (vm_offset_t)crashdumpmap + (i * PAGE_SIZE);
2556         pmap_kenter(va, pa);
2557         invlpg(va);
2558         return ((void *)crashdumpmap);
2559 }
2560
2561 /*
2562  * This code maps large physical mmap regions into the
2563  * processor address space.  Note that some shortcuts
2564  * are taken, but the code works.
2565  */
2566 void
2567 pmap_object_init_pt(pmap_t pmap, vm_offset_t addr,
2568                     vm_object_t object, vm_pindex_t pindex,
2569                     vm_size_t size)
2570 {
2571         vm_page_t p;
2572
2573         VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
2574         KASSERT(object->type == OBJT_DEVICE,
2575             ("pmap_object_init_pt: non-device object"));
2576         if (pseflag && 
2577             ((addr & (NBPDR - 1)) == 0) && ((size & (NBPDR - 1)) == 0)) {
2578                 int i;
2579                 vm_page_t m[1];
2580                 unsigned int ptepindex;
2581                 int npdes;
2582                 pd_entry_t ptepa;
2583
2584                 PMAP_LOCK(pmap);
2585                 if (pmap->pm_pdir[ptepindex = (addr >> PDRSHIFT)])
2586                         goto out;
2587                 PMAP_UNLOCK(pmap);
2588 retry:
2589                 p = vm_page_lookup(object, pindex);
2590                 if (p != NULL) {
2591                         vm_page_lock_queues();
2592                         if (vm_page_sleep_if_busy(p, FALSE, "init4p"))
2593                                 goto retry;
2594                 } else {
2595                         p = vm_page_alloc(object, pindex, VM_ALLOC_NORMAL);
2596                         if (p == NULL)
2597                                 return;
2598                         m[0] = p;
2599
2600                         if (vm_pager_get_pages(object, m, 1, 0) != VM_PAGER_OK) {
2601                                 vm_page_lock_queues();
2602                                 vm_page_free(p);
2603                                 vm_page_unlock_queues();
2604                                 return;
2605                         }
2606
2607                         p = vm_page_lookup(object, pindex);
2608                         vm_page_lock_queues();
2609                         vm_page_wakeup(p);
2610                 }
2611                 vm_page_unlock_queues();
2612
2613                 ptepa = VM_PAGE_TO_PHYS(p);
2614                 if (ptepa & (NBPDR - 1))
2615                         return;
2616
2617                 p->valid = VM_PAGE_BITS_ALL;
2618
2619                 PMAP_LOCK(pmap);
2620                 pmap->pm_stats.resident_count += size >> PAGE_SHIFT;
2621                 npdes = size >> PDRSHIFT;
2622                 for(i = 0; i < npdes; i++) {
2623                         pde_store(&pmap->pm_pdir[ptepindex],
2624                             ptepa | PG_U | PG_RW | PG_V | PG_PS);
2625                         ptepa += NBPDR;
2626                         ptepindex += 1;
2627                 }
2628                 pmap_invalidate_all(pmap);
2629 out:
2630                 PMAP_UNLOCK(pmap);
2631         }
2632 }
2633
2634 /*
2635  *      Routine:        pmap_change_wiring
2636  *      Function:       Change the wiring attribute for a map/virtual-address
2637  *                      pair.
2638  *      In/out conditions:
2639  *                      The mapping must already exist in the pmap.
2640  */
2641 void
2642 pmap_change_wiring(pmap, va, wired)
2643         register pmap_t pmap;
2644         vm_offset_t va;
2645         boolean_t wired;
2646 {
2647         register pt_entry_t *pte;
2648
2649         PMAP_LOCK(pmap);
2650         pte = pmap_pte(pmap, va);
2651
2652         if (wired && !pmap_pte_w(pte))
2653                 pmap->pm_stats.wired_count++;
2654         else if (!wired && pmap_pte_w(pte))
2655                 pmap->pm_stats.wired_count--;
2656
2657         /*
2658          * Wiring is not a hardware characteristic so there is no need to
2659          * invalidate TLB.
2660          */
2661         pmap_pte_set_w(pte, wired);
2662         pmap_pte_release(pte);
2663         PMAP_UNLOCK(pmap);
2664 }
2665
2666
2667
2668 /*
2669  *      Copy the range specified by src_addr/len
2670  *      from the source map to the range dst_addr/len
2671  *      in the destination map.
2672  *
2673  *      This routine is only advisory and need not do anything.
2674  */
2675
2676 void
2677 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
2678           vm_offset_t src_addr)
2679 {
2680         vm_offset_t addr;
2681         vm_offset_t end_addr = src_addr + len;
2682         vm_offset_t pdnxt;
2683
2684         if (dst_addr != src_addr)
2685                 return;
2686
2687         if (!pmap_is_current(src_pmap))
2688                 return;
2689
2690         vm_page_lock_queues();
2691         if (dst_pmap < src_pmap) {
2692                 PMAP_LOCK(dst_pmap);
2693                 PMAP_LOCK(src_pmap);
2694         } else {
2695                 PMAP_LOCK(src_pmap);
2696                 PMAP_LOCK(dst_pmap);
2697         }
2698         sched_pin();
2699         for (addr = src_addr; addr < end_addr; addr = pdnxt) {
2700                 pt_entry_t *src_pte, *dst_pte;
2701                 vm_page_t dstmpte, srcmpte;
2702                 pd_entry_t srcptepaddr;
2703                 unsigned ptepindex;
2704
2705                 if (addr >= UPT_MIN_ADDRESS)
2706                         panic("pmap_copy: invalid to pmap_copy page tables");
2707
2708                 pdnxt = (addr + NBPDR) & ~PDRMASK;
2709                 ptepindex = addr >> PDRSHIFT;
2710
2711                 srcptepaddr = src_pmap->pm_pdir[ptepindex];
2712                 if (srcptepaddr == 0)
2713                         continue;
2714                         
2715                 if (srcptepaddr & PG_PS) {
2716                         if (dst_pmap->pm_pdir[ptepindex] == 0) {
2717                                 dst_pmap->pm_pdir[ptepindex] = srcptepaddr;
2718                                 dst_pmap->pm_stats.resident_count +=
2719                                     NBPDR / PAGE_SIZE;
2720                         }
2721                         continue;
2722                 }
2723
2724                 srcmpte = PHYS_TO_VM_PAGE(srcptepaddr);
2725                 if (srcmpte->wire_count == 0)
2726                         panic("pmap_copy: source page table page is unused");
2727
2728                 if (pdnxt > end_addr)
2729                         pdnxt = end_addr;
2730
2731                 src_pte = vtopte(addr);
2732                 while (addr < pdnxt) {
2733                         pt_entry_t ptetemp;
2734                         ptetemp = *src_pte;
2735                         /*
2736                          * we only virtual copy managed pages
2737                          */
2738                         if ((ptetemp & PG_MANAGED) != 0) {
2739                                 /*
2740                                  * We have to check after allocpte for the
2741                                  * pte still being around...  allocpte can
2742                                  * block.
2743                                  */
2744                                 dstmpte = pmap_allocpte(dst_pmap, addr,
2745                                     M_NOWAIT);
2746                                 if (dstmpte == NULL)
2747                                         break;
2748                                 dst_pte = pmap_pte_quick(dst_pmap, addr);
2749                                 if (*dst_pte == 0 &&
2750                                     pmap_try_insert_pv_entry(dst_pmap, addr,
2751                                     PHYS_TO_VM_PAGE(ptetemp & PG_FRAME))) {
2752                                         /*
2753                                          * Clear the modified and
2754                                          * accessed (referenced) bits
2755                                          * during the copy.
2756                                          */
2757                                         *dst_pte = ptetemp & ~(PG_M | PG_A);
2758                                         dst_pmap->pm_stats.resident_count++;
2759                                 } else
2760                                         pmap_unwire_pte_hold(dst_pmap, dstmpte);
2761                                 if (dstmpte->wire_count >= srcmpte->wire_count)
2762                                         break;
2763                         }
2764                         addr += PAGE_SIZE;
2765                         src_pte++;
2766                 }
2767         }
2768         sched_unpin();
2769         vm_page_unlock_queues();
2770         PMAP_UNLOCK(src_pmap);
2771         PMAP_UNLOCK(dst_pmap);
2772 }       
2773
2774 static __inline void
2775 pagezero(void *page)
2776 {
2777 #if defined(I686_CPU)
2778         if (cpu_class == CPUCLASS_686) {
2779 #if defined(CPU_ENABLE_SSE)
2780                 if (cpu_feature & CPUID_SSE2)
2781                         sse2_pagezero(page);
2782                 else
2783 #endif
2784                         i686_pagezero(page);
2785         } else
2786 #endif
2787                 bzero(page, PAGE_SIZE);
2788 }
2789
2790 /*
2791  *      pmap_zero_page zeros the specified hardware page by mapping 
2792  *      the page into KVM and using bzero to clear its contents.
2793  */
2794 void
2795 pmap_zero_page(vm_page_t m)
2796 {
2797         struct sysmaps *sysmaps;
2798
2799         sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
2800         mtx_lock(&sysmaps->lock);
2801         if (*sysmaps->CMAP2)
2802                 panic("pmap_zero_page: CMAP2 busy");
2803         sched_pin();
2804         *sysmaps->CMAP2 = PG_V | PG_RW | VM_PAGE_TO_PHYS(m) | PG_A | PG_M;
2805         invlcaddr(sysmaps->CADDR2);
2806         pagezero(sysmaps->CADDR2);
2807         *sysmaps->CMAP2 = 0;
2808         sched_unpin();
2809         mtx_unlock(&sysmaps->lock);
2810 }
2811
2812 /*
2813  *      pmap_zero_page_area zeros the specified hardware page by mapping 
2814  *      the page into KVM and using bzero to clear its contents.
2815  *
2816  *      off and size may not cover an area beyond a single hardware page.
2817  */
2818 void
2819 pmap_zero_page_area(vm_page_t m, int off, int size)
2820 {
2821         struct sysmaps *sysmaps;
2822
2823         sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
2824         mtx_lock(&sysmaps->lock);
2825         if (*sysmaps->CMAP2)
2826                 panic("pmap_zero_page: CMAP2 busy");
2827         sched_pin();
2828         *sysmaps->CMAP2 = PG_V | PG_RW | VM_PAGE_TO_PHYS(m) | PG_A | PG_M;
2829         invlcaddr(sysmaps->CADDR2);
2830         if (off == 0 && size == PAGE_SIZE) 
2831                 pagezero(sysmaps->CADDR2);
2832         else
2833                 bzero((char *)sysmaps->CADDR2 + off, size);
2834         *sysmaps->CMAP2 = 0;
2835         sched_unpin();
2836         mtx_unlock(&sysmaps->lock);
2837 }
2838
2839 /*
2840  *      pmap_zero_page_idle zeros the specified hardware page by mapping 
2841  *      the page into KVM and using bzero to clear its contents.  This
2842  *      is intended to be called from the vm_pagezero process only and
2843  *      outside of Giant.
2844  */
2845 void
2846 pmap_zero_page_idle(vm_page_t m)
2847 {
2848
2849         if (*CMAP3)
2850                 panic("pmap_zero_page: CMAP3 busy");
2851         sched_pin();
2852         *CMAP3 = PG_V | PG_RW | VM_PAGE_TO_PHYS(m) | PG_A | PG_M;
2853         invlcaddr(CADDR3);
2854         pagezero(CADDR3);
2855         *CMAP3 = 0;
2856         sched_unpin();
2857 }
2858
2859 /*
2860  *      pmap_copy_page copies the specified (machine independent)
2861  *      page by mapping the page into virtual memory and using
2862  *      bcopy to copy the page, one machine dependent page at a
2863  *      time.
2864  */
2865 void
2866 pmap_copy_page(vm_page_t src, vm_page_t dst)
2867 {
2868         struct sysmaps *sysmaps;
2869
2870         sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
2871         mtx_lock(&sysmaps->lock);
2872         if (*sysmaps->CMAP1)
2873                 panic("pmap_copy_page: CMAP1 busy");
2874         if (*sysmaps->CMAP2)
2875                 panic("pmap_copy_page: CMAP2 busy");
2876         sched_pin();
2877         invlpg((u_int)sysmaps->CADDR1);
2878         invlpg((u_int)sysmaps->CADDR2);
2879         *sysmaps->CMAP1 = PG_V | VM_PAGE_TO_PHYS(src) | PG_A;
2880         *sysmaps->CMAP2 = PG_V | PG_RW | VM_PAGE_TO_PHYS(dst) | PG_A | PG_M;
2881         bcopy(sysmaps->CADDR1, sysmaps->CADDR2, PAGE_SIZE);
2882         *sysmaps->CMAP1 = 0;
2883         *sysmaps->CMAP2 = 0;
2884         sched_unpin();
2885         mtx_unlock(&sysmaps->lock);
2886 }
2887
2888 /*
2889  * Returns true if the pmap's pv is one of the first
2890  * 16 pvs linked to from this page.  This count may
2891  * be changed upwards or downwards in the future; it
2892  * is only necessary that true be returned for a small
2893  * subset of pmaps for proper page aging.
2894  */
2895 boolean_t
2896 pmap_page_exists_quick(pmap, m)
2897         pmap_t pmap;
2898         vm_page_t m;
2899 {
2900         pv_entry_t pv;
2901         int loops = 0;
2902
2903         if (m->flags & PG_FICTITIOUS)
2904                 return FALSE;
2905
2906         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
2907         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
2908                 if (PV_PMAP(pv) == pmap) {
2909                         return TRUE;
2910                 }
2911                 loops++;
2912                 if (loops >= 16)
2913                         break;
2914         }
2915         return (FALSE);
2916 }
2917
2918 /*
2919  * Remove all pages from specified address space
2920  * this aids process exit speeds.  Also, this code
2921  * is special cased for current process only, but
2922  * can have the more generic (and slightly slower)
2923  * mode enabled.  This is much faster than pmap_remove
2924  * in the case of running down an entire address space.
2925  */
2926 void
2927 pmap_remove_pages(pmap_t pmap)
2928 {
2929         pt_entry_t *pte, tpte;
2930         vm_page_t m;
2931         pv_entry_t pv;
2932         struct pv_chunk *pc, *npc;
2933         int field, idx;
2934         int32_t bit;
2935         uint32_t inuse, bitmask;
2936         int allfree;
2937
2938         if (pmap != vmspace_pmap(curthread->td_proc->p_vmspace)) {
2939                 printf("warning: pmap_remove_pages called with non-current pmap\n");
2940                 return;
2941         }
2942         vm_page_lock_queues();
2943         PMAP_LOCK(pmap);
2944         sched_pin();
2945         TAILQ_FOREACH_SAFE(pc, &pmap->pm_pvchunk, pc_list, npc) {
2946                 allfree = 1;
2947                 for (field = 0; field < _NPCM; field++) {
2948                         inuse = (~(pc->pc_map[field])) & pc_freemask[field];
2949                         while (inuse != 0) {
2950                                 bit = bsfl(inuse);
2951                                 bitmask = 1UL << bit;
2952                                 idx = field * 32 + bit;
2953                                 pv = &pc->pc_pventry[idx];
2954                                 inuse &= ~bitmask;
2955
2956                                 pte = vtopte(pv->pv_va);
2957                                 tpte = *pte;
2958
2959                                 if (tpte == 0) {
2960                                         printf(
2961                                             "TPTE at %p  IS ZERO @ VA %08x\n",
2962                                             pte, pv->pv_va);
2963                                         panic("bad pte");
2964                                 }
2965
2966 /*
2967  * We cannot remove wired pages from a process' mapping at this time
2968  */
2969                                 if (tpte & PG_W) {
2970                                         allfree = 0;
2971                                         continue;
2972                                 }
2973
2974                                 m = PHYS_TO_VM_PAGE(tpte);
2975                                 KASSERT(m->phys_addr == (tpte & PG_FRAME),
2976                                     ("vm_page_t %p phys_addr mismatch %016jx %016jx",
2977                                     m, (uintmax_t)m->phys_addr,
2978                                     (uintmax_t)tpte));
2979
2980                                 KASSERT(m < &vm_page_array[vm_page_array_size],
2981                                         ("pmap_remove_pages: bad tpte %#jx",
2982                                         (uintmax_t)tpte));
2983
2984                                 pmap->pm_stats.resident_count--;
2985
2986                                 pte_clear(pte);
2987
2988                                 /*
2989                                  * Update the vm_page_t clean/reference bits.
2990                                  */
2991                                 if (tpte & PG_M)
2992                                         vm_page_dirty(m);
2993
2994                                 /* Mark free */
2995                                 PV_STAT(pv_entry_frees++);
2996                                 PV_STAT(pv_entry_spare++);
2997                                 pv_entry_count--;
2998                                 pc->pc_map[field] |= bitmask;
2999                                 m->md.pv_list_count--;
3000                                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
3001                                 if (TAILQ_EMPTY(&m->md.pv_list))
3002                                         vm_page_flag_clear(m, PG_WRITEABLE);
3003
3004                                 pmap_unuse_pt(pmap, pv->pv_va);
3005                         }
3006                 }
3007                 if (allfree) {
3008                         PV_STAT(pv_entry_spare -= _NPCPV);
3009                         PV_STAT(pc_chunk_count--);
3010                         PV_STAT(pc_chunk_frees++);
3011                         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
3012                         m = PHYS_TO_VM_PAGE(pmap_kextract((vm_offset_t)pc));
3013                         pmap_qremove((vm_offset_t)pc, 1);
3014                         vm_page_unwire(m, 0);
3015                         vm_page_free(m);
3016                         pmap_ptelist_free(&pv_vafree, (vm_offset_t)pc);
3017                 }
3018         }
3019         sched_unpin();
3020         vm_page_unlock_queues();
3021         pmap_invalidate_all(pmap);
3022         PMAP_UNLOCK(pmap);
3023 }
3024
3025 /*
3026  *      pmap_is_modified:
3027  *
3028  *      Return whether or not the specified physical page was modified
3029  *      in any physical maps.
3030  */
3031 boolean_t
3032 pmap_is_modified(vm_page_t m)
3033 {
3034         pv_entry_t pv;
3035         pt_entry_t *pte;
3036         pmap_t pmap;
3037         boolean_t rv;
3038
3039         rv = FALSE;
3040         if (m->flags & PG_FICTITIOUS)
3041                 return (rv);
3042
3043         sched_pin();
3044         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
3045         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
3046                 pmap = PV_PMAP(pv);
3047                 PMAP_LOCK(pmap);
3048                 pte = pmap_pte_quick(pmap, pv->pv_va);
3049                 rv = (*pte & PG_M) != 0;
3050                 PMAP_UNLOCK(pmap);
3051                 if (rv)
3052                         break;
3053         }
3054         sched_unpin();
3055         return (rv);
3056 }
3057
3058 /*
3059  *      pmap_is_prefaultable:
3060  *
3061  *      Return whether or not the specified virtual address is elgible
3062  *      for prefault.
3063  */
3064 boolean_t
3065 pmap_is_prefaultable(pmap_t pmap, vm_offset_t addr)
3066 {
3067         pt_entry_t *pte;
3068         boolean_t rv;
3069
3070         rv = FALSE;
3071         PMAP_LOCK(pmap);
3072         if (*pmap_pde(pmap, addr)) {
3073                 pte = vtopte(addr);
3074                 rv = *pte == 0;
3075         }
3076         PMAP_UNLOCK(pmap);
3077         return (rv);
3078 }
3079
3080 /*
3081  *      Clear the given bit in each of the given page's ptes.  The bit is
3082  *      expressed as a 32-bit mask.  Consequently, if the pte is 64 bits in
3083  *      size, only a bit within the least significant 32 can be cleared.
3084  */
3085 static __inline void
3086 pmap_clear_ptes(vm_page_t m, int bit)
3087 {
3088         register pv_entry_t pv;
3089         pmap_t pmap;
3090         pt_entry_t pbits, *pte;
3091
3092         if ((m->flags & PG_FICTITIOUS) ||
3093             (bit == PG_RW && (m->flags & PG_WRITEABLE) == 0))
3094                 return;
3095
3096         sched_pin();
3097         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
3098         /*
3099          * Loop over all current mappings setting/clearing as appropos If
3100          * setting RO do we need to clear the VAC?
3101          */
3102         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
3103                 pmap = PV_PMAP(pv);
3104                 PMAP_LOCK(pmap);
3105                 pte = pmap_pte_quick(pmap, pv->pv_va);
3106 retry:
3107                 pbits = *pte;
3108                 if (pbits & bit) {
3109                         if (bit == PG_RW) {
3110                                 /*
3111                                  * Regardless of whether a pte is 32 or 64 bits
3112                                  * in size, PG_RW and PG_M are among the least
3113                                  * significant 32 bits.
3114                                  */
3115                                 if (!atomic_cmpset_int((u_int *)pte, pbits,
3116                                     pbits & ~(PG_RW | PG_M)))
3117                                         goto retry;
3118                                 if (pbits & PG_M) {
3119                                         vm_page_dirty(m);
3120                                 }
3121                         } else {
3122                                 atomic_clear_int((u_int *)pte, bit);
3123                         }
3124                         pmap_invalidate_page(pmap, pv->pv_va);
3125                 }
3126                 PMAP_UNLOCK(pmap);
3127         }
3128         if (bit == PG_RW)
3129                 vm_page_flag_clear(m, PG_WRITEABLE);
3130         sched_unpin();
3131 }
3132
3133 /*
3134  *      pmap_page_protect:
3135  *
3136  *      Lower the permission for all mappings to a given page.
3137  */
3138 void
3139 pmap_page_protect(vm_page_t m, vm_prot_t prot)
3140 {
3141         if ((prot & VM_PROT_WRITE) == 0) {
3142                 if (prot & (VM_PROT_READ | VM_PROT_EXECUTE)) {
3143                         pmap_clear_ptes(m, PG_RW);
3144                 } else {
3145                         pmap_remove_all(m);
3146                 }
3147         }
3148 }
3149
3150 /*
3151  *      pmap_ts_referenced:
3152  *
3153  *      Return a count of reference bits for a page, clearing those bits.
3154  *      It is not necessary for every reference bit to be cleared, but it
3155  *      is necessary that 0 only be returned when there are truly no
3156  *      reference bits set.
3157  *
3158  *      XXX: The exact number of bits to check and clear is a matter that
3159  *      should be tested and standardized at some point in the future for
3160  *      optimal aging of shared pages.
3161  */
3162 int
3163 pmap_ts_referenced(vm_page_t m)
3164 {
3165         register pv_entry_t pv, pvf, pvn;
3166         pmap_t pmap;
3167         pt_entry_t *pte;
3168         pt_entry_t v;
3169         int rtval = 0;
3170
3171         if (m->flags & PG_FICTITIOUS)
3172                 return (rtval);
3173
3174         sched_pin();
3175         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
3176         if ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
3177
3178                 pvf = pv;
3179
3180                 do {
3181                         pvn = TAILQ_NEXT(pv, pv_list);
3182
3183                         TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
3184
3185                         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
3186
3187                         pmap = PV_PMAP(pv);
3188                         PMAP_LOCK(pmap);
3189                         pte = pmap_pte_quick(pmap, pv->pv_va);
3190
3191                         if (pte && ((v = pte_load(pte)) & PG_A) != 0) {
3192                                 atomic_clear_int((u_int *)pte, PG_A);
3193                                 pmap_invalidate_page(pmap, pv->pv_va);
3194
3195                                 rtval++;
3196                                 if (rtval > 4) {
3197                                         PMAP_UNLOCK(pmap);
3198                                         break;
3199                                 }
3200                         }
3201                         PMAP_UNLOCK(pmap);
3202                 } while ((pv = pvn) != NULL && pv != pvf);
3203         }
3204         sched_unpin();
3205
3206         return (rtval);
3207 }
3208
3209 /*
3210  *      Clear the modify bits on the specified physical page.
3211  */
3212 void
3213 pmap_clear_modify(vm_page_t m)
3214 {
3215         pmap_clear_ptes(m, PG_M);
3216 }
3217
3218 /*
3219  *      pmap_clear_reference:
3220  *
3221  *      Clear the reference bit on the specified physical page.
3222  */
3223 void
3224 pmap_clear_reference(vm_page_t m)
3225 {
3226         pmap_clear_ptes(m, PG_A);
3227 }
3228
3229 /*
3230  * Miscellaneous support routines follow
3231  */
3232
3233 /*
3234  * Map a set of physical memory pages into the kernel virtual
3235  * address space. Return a pointer to where it is mapped. This
3236  * routine is intended to be used for mapping device memory,
3237  * NOT real memory.
3238  */
3239 void *
3240 pmap_mapdev(pa, size)
3241         vm_paddr_t pa;
3242         vm_size_t size;
3243 {
3244         vm_offset_t va, tmpva, offset;
3245
3246         offset = pa & PAGE_MASK;
3247         size = roundup(offset + size, PAGE_SIZE);
3248         pa = pa & PG_FRAME;
3249
3250         if (pa < KERNLOAD && pa + size <= KERNLOAD)
3251                 va = KERNBASE + pa;
3252         else
3253                 va = kmem_alloc_nofault(kernel_map, size);
3254         if (!va)
3255                 panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
3256
3257         for (tmpva = va; size > 0; ) {
3258                 pmap_kenter(tmpva, pa);
3259                 size -= PAGE_SIZE;
3260                 tmpva += PAGE_SIZE;
3261                 pa += PAGE_SIZE;
3262         }
3263         pmap_invalidate_range(kernel_pmap, va, tmpva);
3264         return ((void *)(va + offset));
3265 }
3266
3267 void
3268 pmap_unmapdev(va, size)
3269         vm_offset_t va;
3270         vm_size_t size;
3271 {
3272         vm_offset_t base, offset, tmpva;
3273
3274         if (va >= KERNBASE && va + size <= KERNBASE + KERNLOAD)
3275                 return;
3276         base = va & PG_FRAME;
3277         offset = va & PAGE_MASK;
3278         size = roundup(offset + size, PAGE_SIZE);
3279         for (tmpva = base; tmpva < (base + size); tmpva += PAGE_SIZE)
3280                 pmap_kremove(tmpva);
3281         pmap_invalidate_range(kernel_pmap, va, tmpva);
3282         kmem_free(kernel_map, base, size);
3283 }
3284
3285 /*
3286  * perform the pmap work for mincore
3287  */
3288 int
3289 pmap_mincore(pmap, addr)
3290         pmap_t pmap;
3291         vm_offset_t addr;
3292 {
3293         pt_entry_t *ptep, pte;
3294         vm_page_t m;
3295         int val = 0;
3296         
3297         PMAP_LOCK(pmap);
3298         ptep = pmap_pte(pmap, addr);
3299         pte = (ptep != NULL) ? *ptep : 0;
3300         pmap_pte_release(ptep);
3301         PMAP_UNLOCK(pmap);
3302
3303         if (pte != 0) {
3304                 vm_paddr_t pa;
3305
3306                 val = MINCORE_INCORE;
3307                 if ((pte & PG_MANAGED) == 0)
3308                         return val;
3309
3310                 pa = pte & PG_FRAME;
3311
3312                 m = PHYS_TO_VM_PAGE(pa);
3313
3314                 /*
3315                  * Modified by us
3316                  */
3317                 if (pte & PG_M)
3318                         val |= MINCORE_MODIFIED|MINCORE_MODIFIED_OTHER;
3319                 else {
3320                         /*
3321                          * Modified by someone else
3322                          */
3323                         vm_page_lock_queues();
3324                         if (m->dirty || pmap_is_modified(m))
3325                                 val |= MINCORE_MODIFIED_OTHER;
3326                         vm_page_unlock_queues();
3327                 }
3328                 /*
3329                  * Referenced by us
3330                  */
3331                 if (pte & PG_A)
3332                         val |= MINCORE_REFERENCED|MINCORE_REFERENCED_OTHER;
3333                 else {
3334                         /*
3335                          * Referenced by someone else
3336                          */
3337                         vm_page_lock_queues();
3338                         if ((m->flags & PG_REFERENCED) ||
3339                             pmap_ts_referenced(m)) {
3340                                 val |= MINCORE_REFERENCED_OTHER;
3341                                 vm_page_flag_set(m, PG_REFERENCED);
3342                         }
3343                         vm_page_unlock_queues();
3344                 }
3345         } 
3346         return val;
3347 }
3348
3349 void
3350 pmap_activate(struct thread *td)
3351 {
3352         pmap_t  pmap, oldpmap;
3353         u_int32_t  cr3;
3354
3355         critical_enter();
3356         pmap = vmspace_pmap(td->td_proc->p_vmspace);
3357         oldpmap = PCPU_GET(curpmap);
3358 #if defined(SMP)
3359         atomic_clear_int(&oldpmap->pm_active, PCPU_GET(cpumask));
3360         atomic_set_int(&pmap->pm_active, PCPU_GET(cpumask));
3361 #else
3362         oldpmap->pm_active &= ~1;
3363         pmap->pm_active |= 1;
3364 #endif
3365 #ifdef PAE
3366         cr3 = vtophys(pmap->pm_pdpt);
3367 #else
3368         cr3 = vtophys(pmap->pm_pdir);
3369 #endif
3370         /*
3371          * pmap_activate is for the current thread on the current cpu
3372          */
3373         td->td_pcb->pcb_cr3 = cr3;
3374         load_cr3(cr3);
3375         PCPU_SET(curpmap, pmap);
3376         critical_exit();
3377 }
3378
3379 vm_offset_t
3380 pmap_addr_hint(vm_object_t obj, vm_offset_t addr, vm_size_t size)
3381 {
3382
3383         if ((obj == NULL) || (size < NBPDR) || (obj->type != OBJT_DEVICE)) {
3384                 return addr;
3385         }
3386
3387         addr = (addr + PDRMASK) & ~PDRMASK;
3388         return addr;
3389 }
3390
3391
3392 #if defined(PMAP_DEBUG)
3393 pmap_pid_dump(int pid)
3394 {
3395         pmap_t pmap;
3396         struct proc *p;
3397         int npte = 0;
3398         int index;
3399
3400         sx_slock(&allproc_lock);
3401         LIST_FOREACH(p, &allproc, p_list) {
3402                 if (p->p_pid != pid)
3403                         continue;
3404
3405                 if (p->p_vmspace) {
3406                         int i,j;
3407                         index = 0;
3408                         pmap = vmspace_pmap(p->p_vmspace);
3409                         for (i = 0; i < NPDEPTD; i++) {
3410                                 pd_entry_t *pde;
3411                                 pt_entry_t *pte;
3412                                 vm_offset_t base = i << PDRSHIFT;
3413                                 
3414                                 pde = &pmap->pm_pdir[i];
3415                                 if (pde && pmap_pde_v(pde)) {
3416                                         for (j = 0; j < NPTEPG; j++) {
3417                                                 vm_offset_t va = base + (j << PAGE_SHIFT);
3418                                                 if (va >= (vm_offset_t) VM_MIN_KERNEL_ADDRESS) {
3419                                                         if (index) {
3420                                                                 index = 0;
3421                                                                 printf("\n");
3422                                                         }
3423                                                         sx_sunlock(&allproc_lock);
3424                                                         return npte;
3425                                                 }
3426                                                 pte = pmap_pte(pmap, va);
3427                                                 if (pte && pmap_pte_v(pte)) {
3428                                                         pt_entry_t pa;
3429                                                         vm_page_t m;
3430                                                         pa = *pte;
3431                                                         m = PHYS_TO_VM_PAGE(pa);
3432                                                         printf("va: 0x%x, pt: 0x%x, h: %d, w: %d, f: 0x%x",
3433                                                                 va, pa, m->hold_count, m->wire_count, m->flags);
3434                                                         npte++;
3435                                                         index++;
3436                                                         if (index >= 2) {
3437                                                                 index = 0;
3438                                                                 printf("\n");
3439                                                         } else {
3440                                                                 printf(" ");
3441                                                         }
3442                                                 }
3443                                         }
3444                                 }
3445                         }
3446                 }
3447         }
3448         sx_sunlock(&allproc_lock);
3449         return npte;
3450 }
3451 #endif
3452
3453 #if defined(DEBUG)
3454
3455 static void     pads(pmap_t pm);
3456 void            pmap_pvdump(vm_offset_t pa);
3457
3458 /* print address space of pmap*/
3459 static void
3460 pads(pm)
3461         pmap_t pm;
3462 {
3463         int i, j;
3464         vm_paddr_t va;
3465         pt_entry_t *ptep;
3466
3467         if (pm == kernel_pmap)
3468                 return;
3469         for (i = 0; i < NPDEPTD; i++)
3470                 if (pm->pm_pdir[i])
3471                         for (j = 0; j < NPTEPG; j++) {
3472                                 va = (i << PDRSHIFT) + (j << PAGE_SHIFT);
3473                                 if (pm == kernel_pmap && va < KERNBASE)
3474                                         continue;
3475                                 if (pm != kernel_pmap && va > UPT_MAX_ADDRESS)
3476                                         continue;
3477                                 ptep = pmap_pte(pm, va);
3478                                 if (pmap_pte_v(ptep))
3479                                         printf("%x:%x ", va, *ptep);
3480                         };
3481
3482 }
3483
3484 void
3485 pmap_pvdump(pa)
3486         vm_paddr_t pa;
3487 {
3488         pv_entry_t pv;
3489         pmap_t pmap;
3490         vm_page_t m;
3491
3492         printf("pa %x", pa);
3493         m = PHYS_TO_VM_PAGE(pa);
3494         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
3495                 pmap = PV_PMAP(pv);
3496                 printf(" -> pmap %p, va %x", (void *)pmap, pv->pv_va);
3497                 pads(pmap);
3498         }
3499         printf(" ");
3500 }
3501 #endif