kernel - More work on x86_64 low-memory configurations
[dragonfly.git] / sys / platform / pc64 / x86_64 / pmap.c
1 /*
2  * (MPSAFE)
3  *
4  * Copyright (c) 1991 Regents of the University of California.
5  * Copyright (c) 1994 John S. Dyson
6  * Copyright (c) 1994 David Greenman
7  * Copyright (c) 2003 Peter Wemm
8  * Copyright (c) 2005-2008 Alan L. Cox <alc@cs.rice.edu>
9  * Copyright (c) 2008, 2009 The DragonFly Project.
10  * Copyright (c) 2008, 2009 Jordan Gordeev.
11  * All rights reserved.
12  *
13  * This code is derived from software contributed to Berkeley by
14  * the Systems Programming Group of the University of Utah Computer
15  * Science Department and William Jolitz of UUNET Technologies Inc.
16  *
17  * Redistribution and use in source and binary forms, with or without
18  * modification, are permitted provided that the following conditions
19  * are met:
20  * 1. Redistributions of source code must retain the above copyright
21  *    notice, this list of conditions and the following disclaimer.
22  * 2. Redistributions in binary form must reproduce the above copyright
23  *    notice, this list of conditions and the following disclaimer in the
24  *    documentation and/or other materials provided with the distribution.
25  * 3. All advertising materials mentioning features or use of this software
26  *    must display the following acknowledgement:
27  *      This product includes software developed by the University of
28  *      California, Berkeley and its contributors.
29  * 4. Neither the name of the University nor the names of its contributors
30  *    may be used to endorse or promote products derived from this software
31  *    without specific prior written permission.
32  *
33  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
34  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
35  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
36  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
37  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
38  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
39  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
40  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
41  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
42  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
43  * SUCH DAMAGE.
44  *
45  *      from:   @(#)pmap.c      7.7 (Berkeley)  5/12/91
46  * $FreeBSD: src/sys/i386/i386/pmap.c,v 1.250.2.18 2002/03/06 22:48:53 silby Exp $
47  */
48
49 /*
50  *      Manages physical address maps.
51  *
52  *      In addition to hardware address maps, this
53  *      module is called upon to provide software-use-only
54  *      maps which may or may not be stored in the same
55  *      form as hardware maps.  These pseudo-maps are
56  *      used to store intermediate results from copy
57  *      operations to and from address spaces.
58  *
59  *      Since the information managed by this module is
60  *      also stored by the logical address mapping module,
61  *      this module may throw away valid virtual-to-physical
62  *      mappings at almost any time.  However, invalidations
63  *      of virtual-to-physical mappings must be done as
64  *      requested.
65  *
66  *      In order to cope with hardware architectures which
67  *      make virtual-to-physical map invalidates expensive,
68  *      this module may delay invalidate or reduced protection
69  *      operations until such time as they are actually
70  *      necessary.  This module is given full information as
71  *      to which processors are currently using which maps,
72  *      and to when physical maps must be made correct.
73  */
74
75 #if JG
76 #include "opt_disable_pse.h"
77 #include "opt_pmap.h"
78 #endif
79 #include "opt_msgbuf.h"
80
81 #include <sys/param.h>
82 #include <sys/systm.h>
83 #include <sys/kernel.h>
84 #include <sys/proc.h>
85 #include <sys/msgbuf.h>
86 #include <sys/vmmeter.h>
87 #include <sys/mman.h>
88
89 #include <vm/vm.h>
90 #include <vm/vm_param.h>
91 #include <sys/sysctl.h>
92 #include <sys/lock.h>
93 #include <vm/vm_kern.h>
94 #include <vm/vm_page.h>
95 #include <vm/vm_map.h>
96 #include <vm/vm_object.h>
97 #include <vm/vm_extern.h>
98 #include <vm/vm_pageout.h>
99 #include <vm/vm_pager.h>
100 #include <vm/vm_zone.h>
101
102 #include <sys/user.h>
103 #include <sys/thread2.h>
104 #include <sys/sysref2.h>
105
106 #include <machine/cputypes.h>
107 #include <machine/md_var.h>
108 #include <machine/specialreg.h>
109 #include <machine/smp.h>
110 #include <machine_base/apic/apicreg.h>
111 #include <machine/globaldata.h>
112 #include <machine/pmap.h>
113 #include <machine/pmap_inval.h>
114
115 #include <ddb/ddb.h>
116
117 #define PMAP_KEEP_PDIRS
118 #ifndef PMAP_SHPGPERPROC
119 #define PMAP_SHPGPERPROC 200
120 #endif
121
122 #if defined(DIAGNOSTIC)
123 #define PMAP_DIAGNOSTIC
124 #endif
125
126 #define MINPV 2048
127
128 /*
129  * Get PDEs and PTEs for user/kernel address space
130  */
131 static pd_entry_t *pmap_pde(pmap_t pmap, vm_offset_t va);
132 #define pdir_pde(m, v) (m[(vm_offset_t)(v) >> PDRSHIFT])
133
134 #define pmap_pde_v(pte)         ((*(pd_entry_t *)pte & PG_V) != 0)
135 #define pmap_pte_w(pte)         ((*(pt_entry_t *)pte & PG_W) != 0)
136 #define pmap_pte_m(pte)         ((*(pt_entry_t *)pte & PG_M) != 0)
137 #define pmap_pte_u(pte)         ((*(pt_entry_t *)pte & PG_A) != 0)
138 #define pmap_pte_v(pte)         ((*(pt_entry_t *)pte & PG_V) != 0)
139
140
141 /*
142  * Given a map and a machine independent protection code,
143  * convert to a vax protection code.
144  */
145 #define pte_prot(m, p)          \
146         (protection_codes[p & (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE)])
147 static int protection_codes[8];
148
149 struct pmap kernel_pmap;
150 static TAILQ_HEAD(,pmap)        pmap_list = TAILQ_HEAD_INITIALIZER(pmap_list);
151
152 vm_paddr_t avail_start;         /* PA of first available physical page */
153 vm_paddr_t avail_end;           /* PA of last available physical page */
154 vm_offset_t virtual2_start;     /* cutout free area prior to kernel start */
155 vm_offset_t virtual2_end;
156 vm_offset_t virtual_start;      /* VA of first avail page (after kernel bss) */
157 vm_offset_t virtual_end;        /* VA of last avail page (end of kernel AS) */
158 vm_offset_t KvaStart;           /* VA start of KVA space */
159 vm_offset_t KvaEnd;             /* VA end of KVA space (non-inclusive) */
160 vm_offset_t KvaSize;            /* max size of kernel virtual address space */
161 static boolean_t pmap_initialized = FALSE;      /* Has pmap_init completed? */
162 static int pgeflag;             /* PG_G or-in */
163 static int pseflag;             /* PG_PS or-in */
164
165 static vm_object_t kptobj;
166
167 static int ndmpdp;
168 static vm_paddr_t dmaplimit;
169 static int nkpt;
170 vm_offset_t kernel_vm_end = VM_MIN_KERNEL_ADDRESS;
171
172 static uint64_t KPTbase;
173 static uint64_t KPTphys;
174 static uint64_t KPDphys;        /* phys addr of kernel level 2 */
175 static uint64_t KPDbase;        /* phys addr of kernel level 2 @ KERNBASE */
176 uint64_t KPDPphys;      /* phys addr of kernel level 3 */
177 uint64_t KPML4phys;     /* phys addr of kernel level 4 */
178
179 static uint64_t DMPDphys;       /* phys addr of direct mapped level 2 */
180 static uint64_t DMPDPphys;      /* phys addr of direct mapped level 3 */
181
182 /*
183  * Data for the pv entry allocation mechanism
184  */
185 static vm_zone_t pvzone;
186 static struct vm_zone pvzone_store;
187 static struct vm_object pvzone_obj;
188 static int pv_entry_count=0, pv_entry_max=0, pv_entry_high_water=0;
189 static int pmap_pagedaemon_waken = 0;
190 static struct pv_entry *pvinit;
191
192 /*
193  * All those kernel PT submaps that BSD is so fond of
194  */
195 pt_entry_t *CMAP1 = 0, *ptmmap;
196 caddr_t CADDR1 = 0, ptvmmap = 0;
197 static pt_entry_t *msgbufmap;
198 struct msgbuf *msgbufp=0;
199
200 /*
201  * Crashdump maps.
202  */
203 static pt_entry_t *pt_crashdumpmap;
204 static caddr_t crashdumpmap;
205
206 extern pt_entry_t *SMPpt;
207 extern uint64_t SMPptpa;
208
209 #define DISABLE_PSE
210
211 static pv_entry_t get_pv_entry (void);
212 static void i386_protection_init (void);
213 static void create_pagetables(vm_paddr_t *firstaddr);
214 static void pmap_remove_all (vm_page_t m);
215 static int  pmap_remove_pte (struct pmap *pmap, pt_entry_t *ptq,
216                                 vm_offset_t sva, pmap_inval_info_t info);
217 static void pmap_remove_page (struct pmap *pmap, 
218                                 vm_offset_t va, pmap_inval_info_t info);
219 static int  pmap_remove_entry (struct pmap *pmap, vm_page_t m,
220                                 vm_offset_t va, pmap_inval_info_t info);
221 static boolean_t pmap_testbit (vm_page_t m, int bit);
222 static void pmap_insert_entry (pmap_t pmap, vm_offset_t va,
223                                 vm_page_t mpte, vm_page_t m);
224
225 static vm_page_t pmap_allocpte (pmap_t pmap, vm_offset_t va);
226
227 static int pmap_release_free_page (pmap_t pmap, vm_page_t p);
228 static vm_page_t _pmap_allocpte (pmap_t pmap, vm_pindex_t ptepindex);
229 static pt_entry_t * pmap_pte_quick (pmap_t pmap, vm_offset_t va);
230 static vm_page_t pmap_page_lookup (vm_object_t object, vm_pindex_t pindex);
231 static int _pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m,
232                                 pmap_inval_info_t info);
233 static int pmap_unuse_pt (pmap_t, vm_offset_t, vm_page_t, pmap_inval_info_t);
234 static vm_offset_t pmap_kmem_choose(vm_offset_t addr);
235
236 static unsigned pdir4mb;
237
238 /*
239  * Move the kernel virtual free pointer to the next
240  * 2MB.  This is used to help improve performance
241  * by using a large (2MB) page for much of the kernel
242  * (.text, .data, .bss)
243  */
244 static
245 vm_offset_t
246 pmap_kmem_choose(vm_offset_t addr)
247 {
248         vm_offset_t newaddr = addr;
249
250         newaddr = (addr + (NBPDR - 1)) & ~(NBPDR - 1);
251         return newaddr;
252 }
253
254 /*
255  * pmap_pte_quick:
256  *
257  *      Super fast pmap_pte routine best used when scanning the pv lists.
258  *      This eliminates many course-grained invltlb calls.  Note that many of
259  *      the pv list scans are across different pmaps and it is very wasteful
260  *      to do an entire invltlb when checking a single mapping.
261  *
262  *      Should only be called while in a critical section.
263  */
264 static __inline pt_entry_t *pmap_pte(pmap_t pmap, vm_offset_t va);
265
266 static
267 pt_entry_t *
268 pmap_pte_quick(pmap_t pmap, vm_offset_t va)
269 {
270         return pmap_pte(pmap, va);
271 }
272
273 /* Return a non-clipped PD index for a given VA */
274 static __inline
275 vm_pindex_t
276 pmap_pde_pindex(vm_offset_t va)
277 {
278         return va >> PDRSHIFT;
279 }
280
281 /* Return various clipped indexes for a given VA */
282 static __inline
283 vm_pindex_t
284 pmap_pte_index(vm_offset_t va)
285 {
286
287         return ((va >> PAGE_SHIFT) & ((1ul << NPTEPGSHIFT) - 1));
288 }
289
290 static __inline
291 vm_pindex_t
292 pmap_pde_index(vm_offset_t va)
293 {
294
295         return ((va >> PDRSHIFT) & ((1ul << NPDEPGSHIFT) - 1));
296 }
297
298 static __inline
299 vm_pindex_t
300 pmap_pdpe_index(vm_offset_t va)
301 {
302
303         return ((va >> PDPSHIFT) & ((1ul << NPDPEPGSHIFT) - 1));
304 }
305
306 static __inline
307 vm_pindex_t
308 pmap_pml4e_index(vm_offset_t va)
309 {
310
311         return ((va >> PML4SHIFT) & ((1ul << NPML4EPGSHIFT) - 1));
312 }
313
314 /* Return a pointer to the PML4 slot that corresponds to a VA */
315 static __inline
316 pml4_entry_t *
317 pmap_pml4e(pmap_t pmap, vm_offset_t va)
318 {
319
320         return (&pmap->pm_pml4[pmap_pml4e_index(va)]);
321 }
322
323 /* Return a pointer to the PDP slot that corresponds to a VA */
324 static __inline
325 pdp_entry_t *
326 pmap_pml4e_to_pdpe(pml4_entry_t *pml4e, vm_offset_t va)
327 {
328         pdp_entry_t *pdpe;
329
330         pdpe = (pdp_entry_t *)PHYS_TO_DMAP(*pml4e & PG_FRAME);
331         return (&pdpe[pmap_pdpe_index(va)]);
332 }
333
334 /* Return a pointer to the PDP slot that corresponds to a VA */
335 static __inline
336 pdp_entry_t *
337 pmap_pdpe(pmap_t pmap, vm_offset_t va)
338 {
339         pml4_entry_t *pml4e;
340
341         pml4e = pmap_pml4e(pmap, va);
342         if ((*pml4e & PG_V) == 0)
343                 return NULL;
344         return (pmap_pml4e_to_pdpe(pml4e, va));
345 }
346
347 /* Return a pointer to the PD slot that corresponds to a VA */
348 static __inline
349 pd_entry_t *
350 pmap_pdpe_to_pde(pdp_entry_t *pdpe, vm_offset_t va)
351 {
352         pd_entry_t *pde;
353
354         pde = (pd_entry_t *)PHYS_TO_DMAP(*pdpe & PG_FRAME);
355         return (&pde[pmap_pde_index(va)]);
356 }
357
358 /* Return a pointer to the PD slot that corresponds to a VA */
359 static __inline
360 pd_entry_t *
361 pmap_pde(pmap_t pmap, vm_offset_t va)
362 {
363         pdp_entry_t *pdpe;
364
365         pdpe = pmap_pdpe(pmap, va);
366         if (pdpe == NULL || (*pdpe & PG_V) == 0)
367                  return NULL;
368         return (pmap_pdpe_to_pde(pdpe, va));
369 }
370
371 /* Return a pointer to the PT slot that corresponds to a VA */
372 static __inline
373 pt_entry_t *
374 pmap_pde_to_pte(pd_entry_t *pde, vm_offset_t va)
375 {
376         pt_entry_t *pte;
377
378         pte = (pt_entry_t *)PHYS_TO_DMAP(*pde & PG_FRAME);
379         return (&pte[pmap_pte_index(va)]);
380 }
381
382 /* Return a pointer to the PT slot that corresponds to a VA */
383 static __inline
384 pt_entry_t *
385 pmap_pte(pmap_t pmap, vm_offset_t va)
386 {
387         pd_entry_t *pde;
388
389         pde = pmap_pde(pmap, va);
390         if (pde == NULL || (*pde & PG_V) == 0)
391                 return NULL;
392         if ((*pde & PG_PS) != 0)        /* compat with i386 pmap_pte() */
393                 return ((pt_entry_t *)pde);
394         return (pmap_pde_to_pte(pde, va));
395 }
396
397 static __inline
398 pt_entry_t *
399 vtopte(vm_offset_t va)
400 {
401         uint64_t mask = ((1ul << (NPTEPGSHIFT + NPDEPGSHIFT + NPDPEPGSHIFT + NPML4EPGSHIFT)) - 1);
402
403         return (PTmap + ((va >> PAGE_SHIFT) & mask));
404 }
405
406 static __inline
407 pd_entry_t *
408 vtopde(vm_offset_t va)
409 {
410         uint64_t mask = ((1ul << (NPDEPGSHIFT + NPDPEPGSHIFT + NPML4EPGSHIFT)) - 1);
411
412         return (PDmap + ((va >> PDRSHIFT) & mask));
413 }
414
415 static uint64_t
416 allocpages(vm_paddr_t *firstaddr, int n)
417 {
418         uint64_t ret;
419
420         ret = *firstaddr;
421         bzero((void *)ret, n * PAGE_SIZE);
422         *firstaddr += n * PAGE_SIZE;
423         return (ret);
424 }
425
426 static
427 void
428 create_pagetables(vm_paddr_t *firstaddr)
429 {
430         int i;
431
432         /*
433          * We are running (mostly) V=P at this point
434          *
435          * Calculate NKPT - number of kernel page tables.  We have to
436          * accomodoate prealloction of the vm_page_array, dump bitmap,
437          * MSGBUF_SIZE, and other stuff.  Be generous.
438          *
439          * Maxmem is in pages.
440          */
441         ndmpdp = (ptoa(Maxmem) + NBPDP - 1) >> PDPSHIFT;
442         if (ndmpdp < 4)         /* Minimum 4GB of dirmap */
443                 ndmpdp = 4;
444
445         nkpt = (Maxmem * sizeof(struct vm_page) + NBPDR - 1) / NBPDR;
446         nkpt += ((nkpt + nkpt + 1 + NKPML4E + NKPDPE + NDMPML4E + ndmpdp) +
447                 511) / 512;
448         nkpt += 128;
449
450         /*
451          * Allocate pages
452          */
453         KPTbase = allocpages(firstaddr, nkpt);
454         KPTphys = allocpages(firstaddr, nkpt);
455         KPML4phys = allocpages(firstaddr, 1);
456         KPDPphys = allocpages(firstaddr, NKPML4E);
457
458         /*
459          * Calculate the page directory base for KERNBASE,
460          * that is where we start populating the page table pages.
461          * Basically this is the end - 2.
462          */
463         KPDphys = allocpages(firstaddr, NKPDPE);
464         KPDbase = KPDphys + ((NKPDPE - (NPDPEPG - KPDPI)) << PAGE_SHIFT);
465
466         DMPDPphys = allocpages(firstaddr, NDMPML4E);
467         if ((amd_feature & AMDID_PAGE1GB) == 0)
468                 DMPDphys = allocpages(firstaddr, ndmpdp);
469         dmaplimit = (vm_paddr_t)ndmpdp << PDPSHIFT;
470
471         /*
472          * Fill in the underlying page table pages for the area around
473          * KERNBASE.  This remaps low physical memory to KERNBASE.
474          *
475          * Read-only from zero to physfree
476          * XXX not fully used, underneath 2M pages
477          */
478         for (i = 0; (i << PAGE_SHIFT) < *firstaddr; i++) {
479                 ((pt_entry_t *)KPTbase)[i] = i << PAGE_SHIFT;
480                 ((pt_entry_t *)KPTbase)[i] |= PG_RW | PG_V | PG_G;
481         }
482
483         /*
484          * Now map the initial kernel page tables.  One block of page
485          * tables is placed at the beginning of kernel virtual memory,
486          * and another block is placed at KERNBASE to map the kernel binary,
487          * data, bss, and initial pre-allocations.
488          */
489         for (i = 0; i < nkpt; i++) {
490                 ((pd_entry_t *)KPDbase)[i] = KPTbase + (i << PAGE_SHIFT);
491                 ((pd_entry_t *)KPDbase)[i] |= PG_RW | PG_V;
492         }
493         for (i = 0; i < nkpt; i++) {
494                 ((pd_entry_t *)KPDphys)[i] = KPTphys + (i << PAGE_SHIFT);
495                 ((pd_entry_t *)KPDphys)[i] |= PG_RW | PG_V;
496         }
497
498         /*
499          * Map from zero to end of allocations using 2M pages as an
500          * optimization.  This will bypass some of the KPTBase pages
501          * above in the KERNBASE area.
502          */
503         for (i = 0; (i << PDRSHIFT) < *firstaddr; i++) {
504                 ((pd_entry_t *)KPDbase)[i] = i << PDRSHIFT;
505                 ((pd_entry_t *)KPDbase)[i] |= PG_RW | PG_V | PG_PS | PG_G;
506         }
507
508         /*
509          * And connect up the PD to the PDP.  The kernel pmap is expected
510          * to pre-populate all of its PDs.  See NKPDPE in vmparam.h.
511          */
512         for (i = 0; i < NKPDPE; i++) {
513                 ((pdp_entry_t *)KPDPphys)[NPDPEPG - NKPDPE + i] =
514                                 KPDphys + (i << PAGE_SHIFT);
515                 ((pdp_entry_t *)KPDPphys)[NPDPEPG - NKPDPE + i] |=
516                                 PG_RW | PG_V | PG_U;
517         }
518
519         /* Now set up the direct map space using either 2MB or 1GB pages */
520         /* Preset PG_M and PG_A because demotion expects it */
521         if ((amd_feature & AMDID_PAGE1GB) == 0) {
522                 for (i = 0; i < NPDEPG * ndmpdp; i++) {
523                         ((pd_entry_t *)DMPDphys)[i] = (vm_paddr_t)i << PDRSHIFT;
524                         ((pd_entry_t *)DMPDphys)[i] |= PG_RW | PG_V | PG_PS |
525                             PG_G | PG_M | PG_A;
526                 }
527                 /* And the direct map space's PDP */
528                 for (i = 0; i < ndmpdp; i++) {
529                         ((pdp_entry_t *)DMPDPphys)[i] = DMPDphys +
530                             (i << PAGE_SHIFT);
531                         ((pdp_entry_t *)DMPDPphys)[i] |= PG_RW | PG_V | PG_U;
532                 }
533         } else {
534                 for (i = 0; i < ndmpdp; i++) {
535                         ((pdp_entry_t *)DMPDPphys)[i] =
536                             (vm_paddr_t)i << PDPSHIFT;
537                         ((pdp_entry_t *)DMPDPphys)[i] |= PG_RW | PG_V | PG_PS |
538                             PG_G | PG_M | PG_A;
539                 }
540         }
541
542         /* And recursively map PML4 to itself in order to get PTmap */
543         ((pdp_entry_t *)KPML4phys)[PML4PML4I] = KPML4phys;
544         ((pdp_entry_t *)KPML4phys)[PML4PML4I] |= PG_RW | PG_V | PG_U;
545
546         /* Connect the Direct Map slot up to the PML4 */
547         ((pdp_entry_t *)KPML4phys)[DMPML4I] = DMPDPphys;
548         ((pdp_entry_t *)KPML4phys)[DMPML4I] |= PG_RW | PG_V | PG_U;
549
550         /* Connect the KVA slot up to the PML4 */
551         ((pdp_entry_t *)KPML4phys)[KPML4I] = KPDPphys;
552         ((pdp_entry_t *)KPML4phys)[KPML4I] |= PG_RW | PG_V | PG_U;
553 }
554
555 /*
556  *      Bootstrap the system enough to run with virtual memory.
557  *
558  *      On the i386 this is called after mapping has already been enabled
559  *      and just syncs the pmap module with what has already been done.
560  *      [We can't call it easily with mapping off since the kernel is not
561  *      mapped with PA == VA, hence we would have to relocate every address
562  *      from the linked base (virtual) address "KERNBASE" to the actual
563  *      (physical) address starting relative to 0]
564  */
565 void
566 pmap_bootstrap(vm_paddr_t *firstaddr)
567 {
568         vm_offset_t va;
569         pt_entry_t *pte;
570         struct mdglobaldata *gd;
571         int pg;
572
573         KvaStart = VM_MIN_KERNEL_ADDRESS;
574         KvaEnd = VM_MAX_KERNEL_ADDRESS;
575         KvaSize = KvaEnd - KvaStart;
576
577         avail_start = *firstaddr;
578
579         /*
580          * Create an initial set of page tables to run the kernel in.
581          */
582         create_pagetables(firstaddr);
583
584         virtual2_start = KvaStart;
585         virtual2_end = PTOV_OFFSET;
586
587         virtual_start = (vm_offset_t) PTOV_OFFSET + *firstaddr;
588         virtual_start = pmap_kmem_choose(virtual_start);
589
590         virtual_end = VM_MAX_KERNEL_ADDRESS;
591
592         /* XXX do %cr0 as well */
593         load_cr4(rcr4() | CR4_PGE | CR4_PSE);
594         load_cr3(KPML4phys);
595
596         /*
597          * Initialize protection array.
598          */
599         i386_protection_init();
600
601         /*
602          * The kernel's pmap is statically allocated so we don't have to use
603          * pmap_create, which is unlikely to work correctly at this part of
604          * the boot sequence (XXX and which no longer exists).
605          */
606         kernel_pmap.pm_pml4 = (pdp_entry_t *) (PTOV_OFFSET + KPML4phys);
607         kernel_pmap.pm_count = 1;
608         kernel_pmap.pm_active = (cpumask_t)-1 & ~CPUMASK_LOCK;
609         TAILQ_INIT(&kernel_pmap.pm_pvlist);
610
611         /*
612          * Reserve some special page table entries/VA space for temporary
613          * mapping of pages.
614          */
615 #define SYSMAP(c, p, v, n)      \
616         v = (c)va; va += ((n)*PAGE_SIZE); p = pte; pte += (n);
617
618         va = virtual_start;
619         pte = vtopte(va);
620
621         /*
622          * CMAP1/CMAP2 are used for zeroing and copying pages.
623          */
624         SYSMAP(caddr_t, CMAP1, CADDR1, 1)
625
626         /*
627          * Crashdump maps.
628          */
629         SYSMAP(caddr_t, pt_crashdumpmap, crashdumpmap, MAXDUMPPGS);
630
631         /*
632          * ptvmmap is used for reading arbitrary physical pages via
633          * /dev/mem.
634          */
635         SYSMAP(caddr_t, ptmmap, ptvmmap, 1)
636
637         /*
638          * msgbufp is used to map the system message buffer.
639          * XXX msgbufmap is not used.
640          */
641         SYSMAP(struct msgbuf *, msgbufmap, msgbufp,
642                atop(round_page(MSGBUF_SIZE)))
643
644         virtual_start = va;
645
646         *CMAP1 = 0;
647
648         /*
649          * PG_G is terribly broken on SMP because we IPI invltlb's in some
650          * cases rather then invl1pg.  Actually, I don't even know why it
651          * works under UP because self-referential page table mappings
652          */
653 #ifdef SMP
654         pgeflag = 0;
655 #else
656         if (cpu_feature & CPUID_PGE)
657                 pgeflag = PG_G;
658 #endif
659         
660 /*
661  * Initialize the 4MB page size flag
662  */
663         pseflag = 0;
664 /*
665  * The 4MB page version of the initial
666  * kernel page mapping.
667  */
668         pdir4mb = 0;
669
670 #if !defined(DISABLE_PSE)
671         if (cpu_feature & CPUID_PSE) {
672                 pt_entry_t ptditmp;
673                 /*
674                  * Note that we have enabled PSE mode
675                  */
676                 pseflag = PG_PS;
677                 ptditmp = *(PTmap + x86_64_btop(KERNBASE));
678                 ptditmp &= ~(NBPDR - 1);
679                 ptditmp |= PG_V | PG_RW | PG_PS | PG_U | pgeflag;
680                 pdir4mb = ptditmp;
681
682 #ifndef SMP
683                 /*
684                  * Enable the PSE mode.  If we are SMP we can't do this
685                  * now because the APs will not be able to use it when
686                  * they boot up.
687                  */
688                 load_cr4(rcr4() | CR4_PSE);
689
690                 /*
691                  * We can do the mapping here for the single processor
692                  * case.  We simply ignore the old page table page from
693                  * now on.
694                  */
695                 /*
696                  * For SMP, we still need 4K pages to bootstrap APs,
697                  * PSE will be enabled as soon as all APs are up.
698                  */
699                 PTD[KPTDI] = (pd_entry_t)ptditmp;
700                 cpu_invltlb();
701 #endif
702         }
703 #endif
704
705         /*
706          * We need to finish setting up the globaldata page for the BSP.
707          * locore has already populated the page table for the mdglobaldata
708          * portion.
709          */
710         pg = MDGLOBALDATA_BASEALLOC_PAGES;
711         gd = &CPU_prvspace[0].mdglobaldata;
712         gd->gd_CMAP1 = &SMPpt[pg + 0];
713         gd->gd_CMAP2 = &SMPpt[pg + 1];
714         gd->gd_CMAP3 = &SMPpt[pg + 2];
715         gd->gd_PMAP1 = &SMPpt[pg + 3];
716         gd->gd_CADDR1 = CPU_prvspace[0].CPAGE1;
717         gd->gd_CADDR2 = CPU_prvspace[0].CPAGE2;
718         gd->gd_CADDR3 = CPU_prvspace[0].CPAGE3;
719         gd->gd_PADDR1 = (pt_entry_t *)CPU_prvspace[0].PPAGE1;
720
721         cpu_invltlb();
722 }
723
724 #ifdef SMP
725 /*
726  * Set 4mb pdir for mp startup
727  */
728 void
729 pmap_set_opt(void)
730 {
731         if (pseflag && (cpu_feature & CPUID_PSE)) {
732                 load_cr4(rcr4() | CR4_PSE);
733                 if (pdir4mb && mycpu->gd_cpuid == 0) {  /* only on BSP */
734                         cpu_invltlb();
735                 }
736         }
737 }
738 #endif
739
740 /*
741  *      Initialize the pmap module.
742  *      Called by vm_init, to initialize any structures that the pmap
743  *      system needs to map virtual memory.
744  *      pmap_init has been enhanced to support in a fairly consistant
745  *      way, discontiguous physical memory.
746  */
747 void
748 pmap_init(void)
749 {
750         int i;
751         int initial_pvs;
752
753         /*
754          * object for kernel page table pages
755          */
756         /* JG I think the number can be arbitrary */
757         kptobj = vm_object_allocate(OBJT_DEFAULT, 5);
758
759         /*
760          * Allocate memory for random pmap data structures.  Includes the
761          * pv_head_table.
762          */
763
764         for(i = 0; i < vm_page_array_size; i++) {
765                 vm_page_t m;
766
767                 m = &vm_page_array[i];
768                 TAILQ_INIT(&m->md.pv_list);
769                 m->md.pv_list_count = 0;
770         }
771
772         /*
773          * init the pv free list
774          */
775         initial_pvs = vm_page_array_size;
776         if (initial_pvs < MINPV)
777                 initial_pvs = MINPV;
778         pvzone = &pvzone_store;
779         pvinit = (void *)kmem_alloc(&kernel_map,
780                                     initial_pvs * sizeof (struct pv_entry));
781         zbootinit(pvzone, "PV ENTRY", sizeof (struct pv_entry),
782                   pvinit, initial_pvs);
783
784         /*
785          * Now it is safe to enable pv_table recording.
786          */
787         pmap_initialized = TRUE;
788 #ifdef SMP
789         lapic = pmap_mapdev_uncacheable(cpu_apic_address, sizeof(struct LAPIC));
790 #endif
791 }
792
793 /*
794  * Initialize the address space (zone) for the pv_entries.  Set a
795  * high water mark so that the system can recover from excessive
796  * numbers of pv entries.
797  */
798 void
799 pmap_init2(void)
800 {
801         int shpgperproc = PMAP_SHPGPERPROC;
802         int entry_max;
803
804         TUNABLE_INT_FETCH("vm.pmap.shpgperproc", &shpgperproc);
805         pv_entry_max = shpgperproc * maxproc + vm_page_array_size;
806         TUNABLE_INT_FETCH("vm.pmap.pv_entries", &pv_entry_max);
807         pv_entry_high_water = 9 * (pv_entry_max / 10);
808
809         /*
810          * Subtract out pages already installed in the zone (hack)
811          */
812         entry_max = pv_entry_max - vm_page_array_size;
813         if (entry_max <= 0)
814                 entry_max = 1;
815
816         zinitna(pvzone, &pvzone_obj, NULL, 0, entry_max, ZONE_INTERRUPT, 1);
817 }
818
819
820 /***************************************************
821  * Low level helper routines.....
822  ***************************************************/
823
824 #if defined(PMAP_DIAGNOSTIC)
825
826 /*
827  * This code checks for non-writeable/modified pages.
828  * This should be an invalid condition.
829  */
830 static
831 int
832 pmap_nw_modified(pt_entry_t pte)
833 {
834         if ((pte & (PG_M|PG_RW)) == PG_M)
835                 return 1;
836         else
837                 return 0;
838 }
839 #endif
840
841
842 /*
843  * this routine defines the region(s) of memory that should
844  * not be tested for the modified bit.
845  */
846 static __inline
847 int
848 pmap_track_modified(vm_offset_t va)
849 {
850         if ((va < clean_sva) || (va >= clean_eva)) 
851                 return 1;
852         else
853                 return 0;
854 }
855
856 /*
857  * Extract the physical page address associated with the map/VA pair.
858  *
859  * The caller must hold vm_token if non-blocking operation is desired.
860  */
861 vm_paddr_t 
862 pmap_extract(pmap_t pmap, vm_offset_t va)
863 {
864         vm_paddr_t rtval;
865         pt_entry_t *pte;
866         pd_entry_t pde, *pdep;
867
868         lwkt_gettoken(&vm_token);
869         rtval = 0;
870         pdep = pmap_pde(pmap, va);
871         if (pdep != NULL) {
872                 pde = *pdep;
873                 if (pde) {
874                         if ((pde & PG_PS) != 0) {
875                                 rtval = (pde & PG_PS_FRAME) | (va & PDRMASK);
876                         } else {
877                                 pte = pmap_pde_to_pte(pdep, va);
878                                 rtval = (*pte & PG_FRAME) | (va & PAGE_MASK);
879                         }
880                 }
881         }
882         lwkt_reltoken(&vm_token);
883         return rtval;
884 }
885
886 /*
887  * Extract the physical page address associated kernel virtual address.
888  */
889 vm_paddr_t
890 pmap_kextract(vm_offset_t va)
891 {
892         pd_entry_t pde;
893         vm_paddr_t pa;
894
895         if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS) {
896                 pa = DMAP_TO_PHYS(va);
897         } else {
898                 pde = *vtopde(va);
899                 if (pde & PG_PS) {
900                         pa = (pde & PG_PS_FRAME) | (va & PDRMASK);
901                 } else {
902                         /*
903                          * Beware of a concurrent promotion that changes the
904                          * PDE at this point!  For example, vtopte() must not
905                          * be used to access the PTE because it would use the
906                          * new PDE.  It is, however, safe to use the old PDE
907                          * because the page table page is preserved by the
908                          * promotion.
909                          */
910                         pa = *pmap_pde_to_pte(&pde, va);
911                         pa = (pa & PG_FRAME) | (va & PAGE_MASK);
912                 }
913         }
914         return pa;
915 }
916
917 /***************************************************
918  * Low level mapping routines.....
919  ***************************************************/
920
921 /*
922  * Routine: pmap_kenter
923  * Function:
924  *      Add a wired page to the KVA
925  *      NOTE! note that in order for the mapping to take effect -- you
926  *      should do an invltlb after doing the pmap_kenter().
927  */
928 void 
929 pmap_kenter(vm_offset_t va, vm_paddr_t pa)
930 {
931         pt_entry_t *pte;
932         pt_entry_t npte;
933         pmap_inval_info info;
934
935         pmap_inval_init(&info);
936         npte = pa | PG_RW | PG_V | pgeflag;
937         pte = vtopte(va);
938         pmap_inval_interlock(&info, &kernel_pmap, va);
939         *pte = npte;
940         pmap_inval_deinterlock(&info, &kernel_pmap);
941         pmap_inval_done(&info);
942 }
943
944 /*
945  * Routine: pmap_kenter_quick
946  * Function:
947  *      Similar to pmap_kenter(), except we only invalidate the
948  *      mapping on the current CPU.
949  */
950 void
951 pmap_kenter_quick(vm_offset_t va, vm_paddr_t pa)
952 {
953         pt_entry_t *pte;
954         pt_entry_t npte;
955
956         npte = pa | PG_RW | PG_V | pgeflag;
957         pte = vtopte(va);
958         *pte = npte;
959         cpu_invlpg((void *)va);
960 }
961
962 void
963 pmap_kenter_sync(vm_offset_t va)
964 {
965         pmap_inval_info info;
966
967         pmap_inval_init(&info);
968         pmap_inval_interlock(&info, &kernel_pmap, va);
969         pmap_inval_deinterlock(&info, &kernel_pmap);
970         pmap_inval_done(&info);
971 }
972
973 void
974 pmap_kenter_sync_quick(vm_offset_t va)
975 {
976         cpu_invlpg((void *)va);
977 }
978
979 /*
980  * remove a page from the kernel pagetables
981  */
982 void
983 pmap_kremove(vm_offset_t va)
984 {
985         pt_entry_t *pte;
986         pmap_inval_info info;
987
988         pmap_inval_init(&info);
989         pte = vtopte(va);
990         pmap_inval_interlock(&info, &kernel_pmap, va);
991         *pte = 0;
992         pmap_inval_deinterlock(&info, &kernel_pmap);
993         pmap_inval_done(&info);
994 }
995
996 void
997 pmap_kremove_quick(vm_offset_t va)
998 {
999         pt_entry_t *pte;
1000         pte = vtopte(va);
1001         *pte = 0;
1002         cpu_invlpg((void *)va);
1003 }
1004
1005 /*
1006  * XXX these need to be recoded.  They are not used in any critical path.
1007  */
1008 void
1009 pmap_kmodify_rw(vm_offset_t va)
1010 {
1011         *vtopte(va) |= PG_RW;
1012         cpu_invlpg((void *)va);
1013 }
1014
1015 void
1016 pmap_kmodify_nc(vm_offset_t va)
1017 {
1018         *vtopte(va) |= PG_N;
1019         cpu_invlpg((void *)va);
1020 }
1021
1022 /*
1023  * Used to map a range of physical addresses into kernel virtual
1024  * address space during the low level boot, typically to map the
1025  * dump bitmap, message buffer, and vm_page_array.
1026  *
1027  * These mappings are typically made at some pointer after the end of the
1028  * kernel text+data.
1029  *
1030  * We could return PHYS_TO_DMAP(start) here and not allocate any
1031  * via (*virtp), but then kmem from userland and kernel dumps won't
1032  * have access to the related pointers.
1033  */
1034 vm_offset_t
1035 pmap_map(vm_offset_t *virtp, vm_paddr_t start, vm_paddr_t end, int prot)
1036 {
1037         vm_offset_t va;
1038         vm_offset_t va_start;
1039
1040         /*return PHYS_TO_DMAP(start);*/
1041
1042         va_start = *virtp;
1043         va = va_start;
1044
1045         while (start < end) {
1046                 pmap_kenter_quick(va, start);
1047                 va += PAGE_SIZE;
1048                 start += PAGE_SIZE;
1049         }
1050         *virtp = va;
1051         return va_start;
1052 }
1053
1054
1055 /*
1056  * Add a list of wired pages to the kva
1057  * this routine is only used for temporary
1058  * kernel mappings that do not need to have
1059  * page modification or references recorded.
1060  * Note that old mappings are simply written
1061  * over.  The page *must* be wired.
1062  */
1063 void
1064 pmap_qenter(vm_offset_t va, vm_page_t *m, int count)
1065 {
1066         vm_offset_t end_va;
1067
1068         end_va = va + count * PAGE_SIZE;
1069                 
1070         while (va < end_va) {
1071                 pt_entry_t *pte;
1072
1073                 pte = vtopte(va);
1074                 *pte = VM_PAGE_TO_PHYS(*m) | PG_RW | PG_V | pgeflag;
1075                 cpu_invlpg((void *)va);
1076                 va += PAGE_SIZE;
1077                 m++;
1078         }
1079 #ifdef SMP
1080         smp_invltlb();  /* XXX */
1081 #endif
1082 }
1083
1084 /*
1085  * This routine jerks page mappings from the
1086  * kernel -- it is meant only for temporary mappings.
1087  *
1088  * MPSAFE, INTERRUPT SAFE (cluster callback)
1089  */
1090 void
1091 pmap_qremove(vm_offset_t va, int count)
1092 {
1093         vm_offset_t end_va;
1094
1095         end_va = va + count * PAGE_SIZE;
1096
1097         while (va < end_va) {
1098                 pt_entry_t *pte;
1099
1100                 pte = vtopte(va);
1101                 *pte = 0;
1102                 cpu_invlpg((void *)va);
1103                 va += PAGE_SIZE;
1104         }
1105 #ifdef SMP
1106         smp_invltlb();
1107 #endif
1108 }
1109
1110 /*
1111  * This routine works like vm_page_lookup() but also blocks as long as the
1112  * page is busy.  This routine does not busy the page it returns.
1113  *
1114  * Unless the caller is managing objects whos pages are in a known state,
1115  * the call should be made with a critical section held so the page's object
1116  * association remains valid on return.
1117  */
1118 static
1119 vm_page_t
1120 pmap_page_lookup(vm_object_t object, vm_pindex_t pindex)
1121 {
1122         vm_page_t m;
1123
1124         do {
1125                 m = vm_page_lookup(object, pindex);
1126         } while (m && vm_page_sleep_busy(m, FALSE, "pplookp"));
1127
1128         return(m);
1129 }
1130
1131 /*
1132  * Create a new thread and optionally associate it with a (new) process.
1133  * NOTE! the new thread's cpu may not equal the current cpu.
1134  */
1135 void
1136 pmap_init_thread(thread_t td)
1137 {
1138         /* enforce pcb placement */
1139         td->td_pcb = (struct pcb *)(td->td_kstack + td->td_kstack_size) - 1;
1140         td->td_savefpu = &td->td_pcb->pcb_save;
1141         td->td_sp = (char *)td->td_pcb - 16; /* JG is -16 needed on x86_64? */
1142 }
1143
1144 /*
1145  * This routine directly affects the fork perf for a process.
1146  */
1147 void
1148 pmap_init_proc(struct proc *p)
1149 {
1150 }
1151
1152 /*
1153  * Dispose the UPAGES for a process that has exited.
1154  * This routine directly impacts the exit perf of a process.
1155  */
1156 void
1157 pmap_dispose_proc(struct proc *p)
1158 {
1159         KASSERT(p->p_lock == 0, ("attempt to dispose referenced proc! %p", p));
1160 }
1161
1162 /***************************************************
1163  * Page table page management routines.....
1164  ***************************************************/
1165
1166 /*
1167  * This routine unholds page table pages, and if the hold count
1168  * drops to zero, then it decrements the wire count.
1169  */
1170 static __inline
1171 int
1172 pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m,
1173                      pmap_inval_info_t info)
1174 {
1175         KKASSERT(m->hold_count > 0);
1176         if (m->hold_count > 1) {
1177                 vm_page_unhold(m);
1178                 return 0;
1179         } else {
1180                 return _pmap_unwire_pte_hold(pmap, va, m, info);
1181         }
1182 }
1183
1184 static
1185 int
1186 _pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m,
1187                       pmap_inval_info_t info)
1188 {
1189         /* 
1190          * Wait until we can busy the page ourselves.  We cannot have
1191          * any active flushes if we block.  We own one hold count on the
1192          * page so it cannot be freed out from under us.
1193          */
1194         if (m->flags & PG_BUSY) {
1195                 pmap_inval_flush(info);
1196                 while (vm_page_sleep_busy(m, FALSE, "pmuwpt"))
1197                         ;
1198         }
1199         KASSERT(m->queue == PQ_NONE,
1200                 ("_pmap_unwire_pte_hold: %p->queue != PQ_NONE", m));
1201
1202         /*
1203          * This case can occur if new references were acquired while
1204          * we were blocked.
1205          */
1206         if (m->hold_count > 1) {
1207                 KKASSERT(m->hold_count > 1);
1208                 vm_page_unhold(m);
1209                 return 0;
1210         }
1211
1212         /*
1213          * Unmap the page table page
1214          */
1215         KKASSERT(m->hold_count == 1);
1216         vm_page_busy(m);
1217         pmap_inval_interlock(info, pmap, -1);
1218
1219         if (m->pindex >= (NUPDE + NUPDPE)) {
1220                 /* PDP page */
1221                 pml4_entry_t *pml4;
1222                 pml4 = pmap_pml4e(pmap, va);
1223                 *pml4 = 0;
1224         } else if (m->pindex >= NUPDE) {
1225                 /* PD page */
1226                 pdp_entry_t *pdp;
1227                 pdp = pmap_pdpe(pmap, va);
1228                 *pdp = 0;
1229         } else {
1230                 /* PT page */
1231                 pd_entry_t *pd;
1232                 pd = pmap_pde(pmap, va);
1233                 *pd = 0;
1234         }
1235
1236         KKASSERT(pmap->pm_stats.resident_count > 0);
1237         --pmap->pm_stats.resident_count;
1238
1239         if (pmap->pm_ptphint == m)
1240                 pmap->pm_ptphint = NULL;
1241         pmap_inval_deinterlock(info, pmap);
1242
1243         if (m->pindex < NUPDE) {
1244                 /* We just released a PT, unhold the matching PD */
1245                 vm_page_t pdpg;
1246
1247                 pdpg = PHYS_TO_VM_PAGE(*pmap_pdpe(pmap, va) & PG_FRAME);
1248                 pmap_unwire_pte_hold(pmap, va, pdpg, info);
1249         }
1250         if (m->pindex >= NUPDE && m->pindex < (NUPDE + NUPDPE)) {
1251                 /* We just released a PD, unhold the matching PDP */
1252                 vm_page_t pdppg;
1253
1254                 pdppg = PHYS_TO_VM_PAGE(*pmap_pml4e(pmap, va) & PG_FRAME);
1255                 pmap_unwire_pte_hold(pmap, va, pdppg, info);
1256         }
1257
1258         /*
1259          * This was our last hold, the page had better be unwired
1260          * after we decrement wire_count.
1261          *
1262          * FUTURE NOTE: shared page directory page could result in
1263          * multiple wire counts.
1264          */
1265         vm_page_unhold(m);
1266         --m->wire_count;
1267         KKASSERT(m->wire_count == 0);
1268         --vmstats.v_wire_count;
1269         vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE);
1270         vm_page_flash(m);
1271         vm_page_free_zero(m);
1272
1273         return 1;
1274 }
1275
1276 /*
1277  * After removing a page table entry, this routine is used to
1278  * conditionally free the page, and manage the hold/wire counts.
1279  */
1280 static
1281 int
1282 pmap_unuse_pt(pmap_t pmap, vm_offset_t va, vm_page_t mpte,
1283                 pmap_inval_info_t info)
1284 {
1285         vm_pindex_t ptepindex;
1286
1287         if (va >= VM_MAX_USER_ADDRESS)
1288                 return 0;
1289
1290         if (mpte == NULL) {
1291                 ptepindex = pmap_pde_pindex(va);
1292 #if JGHINT
1293                 if (pmap->pm_ptphint &&
1294                         (pmap->pm_ptphint->pindex == ptepindex)) {
1295                         mpte = pmap->pm_ptphint;
1296                 } else {
1297 #endif
1298                         pmap_inval_flush(info);
1299                         mpte = pmap_page_lookup(pmap->pm_pteobj, ptepindex);
1300                         pmap->pm_ptphint = mpte;
1301 #if JGHINT
1302                 }
1303 #endif
1304         }
1305         return pmap_unwire_pte_hold(pmap, va, mpte, info);
1306 }
1307
1308 /*
1309  * Initialize pmap0/vmspace0.  This pmap is not added to pmap_list because
1310  * it, and IdlePTD, represents the template used to update all other pmaps.
1311  *
1312  * On architectures where the kernel pmap is not integrated into the user
1313  * process pmap, this pmap represents the process pmap, not the kernel pmap.
1314  * kernel_pmap should be used to directly access the kernel_pmap.
1315  */
1316 void
1317 pmap_pinit0(struct pmap *pmap)
1318 {
1319         pmap->pm_pml4 = (pml4_entry_t *)(PTOV_OFFSET + KPML4phys);
1320         pmap->pm_count = 1;
1321         pmap->pm_active = 0;
1322         pmap->pm_ptphint = NULL;
1323         TAILQ_INIT(&pmap->pm_pvlist);
1324         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
1325 }
1326
1327 /*
1328  * Initialize a preallocated and zeroed pmap structure,
1329  * such as one in a vmspace structure.
1330  */
1331 void
1332 pmap_pinit(struct pmap *pmap)
1333 {
1334         vm_page_t ptdpg;
1335
1336         /*
1337          * No need to allocate page table space yet but we do need a valid
1338          * page directory table.
1339          */
1340         if (pmap->pm_pml4 == NULL) {
1341                 pmap->pm_pml4 =
1342                     (pml4_entry_t *)kmem_alloc_pageable(&kernel_map, PAGE_SIZE);
1343         }
1344
1345         /*
1346          * Allocate an object for the ptes
1347          */
1348         if (pmap->pm_pteobj == NULL)
1349                 pmap->pm_pteobj = vm_object_allocate(OBJT_DEFAULT, NUPDE + NUPDPE + PML4PML4I + 1);
1350
1351         /*
1352          * Allocate the page directory page, unless we already have
1353          * one cached.  If we used the cached page the wire_count will
1354          * already be set appropriately.
1355          */
1356         if ((ptdpg = pmap->pm_pdirm) == NULL) {
1357                 ptdpg = vm_page_grab(pmap->pm_pteobj, NUPDE + NUPDPE + PML4PML4I,
1358                                      VM_ALLOC_NORMAL | VM_ALLOC_RETRY);
1359                 pmap->pm_pdirm = ptdpg;
1360                 vm_page_flag_clear(ptdpg, PG_MAPPED | PG_BUSY);
1361                 ptdpg->valid = VM_PAGE_BITS_ALL;
1362                 if (ptdpg->wire_count == 0)
1363                         ++vmstats.v_wire_count;
1364                 ptdpg->wire_count = 1;
1365                 pmap_kenter((vm_offset_t)pmap->pm_pml4, VM_PAGE_TO_PHYS(ptdpg));
1366         }
1367         if ((ptdpg->flags & PG_ZERO) == 0)
1368                 bzero(pmap->pm_pml4, PAGE_SIZE);
1369
1370         pmap->pm_pml4[KPML4I] = KPDPphys | PG_RW | PG_V | PG_U;
1371         pmap->pm_pml4[DMPML4I] = DMPDPphys | PG_RW | PG_V | PG_U;
1372
1373         /* install self-referential address mapping entry */
1374         pmap->pm_pml4[PML4PML4I] = VM_PAGE_TO_PHYS(ptdpg) | PG_V | PG_RW | PG_A | PG_M;
1375
1376         pmap->pm_count = 1;
1377         pmap->pm_active = 0;
1378         pmap->pm_ptphint = NULL;
1379         TAILQ_INIT(&pmap->pm_pvlist);
1380         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
1381         pmap->pm_stats.resident_count = 1;
1382 }
1383
1384 /*
1385  * Clean up a pmap structure so it can be physically freed.  This routine
1386  * is called by the vmspace dtor function.  A great deal of pmap data is
1387  * left passively mapped to improve vmspace management so we have a bit
1388  * of cleanup work to do here.
1389  */
1390 void
1391 pmap_puninit(pmap_t pmap)
1392 {
1393         vm_page_t p;
1394
1395         KKASSERT(pmap->pm_active == 0);
1396         lwkt_gettoken(&vm_token);
1397         if ((p = pmap->pm_pdirm) != NULL) {
1398                 KKASSERT(pmap->pm_pml4 != NULL);
1399                 KKASSERT(pmap->pm_pml4 != (void *)(PTOV_OFFSET + KPML4phys));
1400                 pmap_kremove((vm_offset_t)pmap->pm_pml4);
1401                 p->wire_count--;
1402                 vmstats.v_wire_count--;
1403                 KKASSERT((p->flags & PG_BUSY) == 0);
1404                 vm_page_busy(p);
1405                 vm_page_free_zero(p);
1406                 pmap->pm_pdirm = NULL;
1407         }
1408         if (pmap->pm_pml4) {
1409                 KKASSERT(pmap->pm_pml4 != (void *)(PTOV_OFFSET + KPML4phys));
1410                 kmem_free(&kernel_map, (vm_offset_t)pmap->pm_pml4, PAGE_SIZE);
1411                 pmap->pm_pml4 = NULL;
1412         }
1413         if (pmap->pm_pteobj) {
1414                 vm_object_deallocate(pmap->pm_pteobj);
1415                 pmap->pm_pteobj = NULL;
1416         }
1417         lwkt_reltoken(&vm_token);
1418 }
1419
1420 /*
1421  * Wire in kernel global address entries.  To avoid a race condition
1422  * between pmap initialization and pmap_growkernel, this procedure
1423  * adds the pmap to the master list (which growkernel scans to update),
1424  * then copies the template.
1425  */
1426 void
1427 pmap_pinit2(struct pmap *pmap)
1428 {
1429         crit_enter();
1430         lwkt_gettoken(&vm_token);
1431         TAILQ_INSERT_TAIL(&pmap_list, pmap, pm_pmnode);
1432         /* XXX copies current process, does not fill in MPPTDI */
1433         lwkt_reltoken(&vm_token);
1434         crit_exit();
1435 }
1436
1437 /*
1438  * Attempt to release and free a vm_page in a pmap.  Returns 1 on success,
1439  * 0 on failure (if the procedure had to sleep).
1440  *
1441  * When asked to remove the page directory page itself, we actually just
1442  * leave it cached so we do not have to incur the SMP inval overhead of
1443  * removing the kernel mapping.  pmap_puninit() will take care of it.
1444  */
1445 static
1446 int
1447 pmap_release_free_page(struct pmap *pmap, vm_page_t p)
1448 {
1449         /*
1450          * This code optimizes the case of freeing non-busy
1451          * page-table pages.  Those pages are zero now, and
1452          * might as well be placed directly into the zero queue.
1453          */
1454         if (vm_page_sleep_busy(p, FALSE, "pmaprl"))
1455                 return 0;
1456
1457         vm_page_busy(p);
1458
1459         /*
1460          * Remove the page table page from the processes address space.
1461          */
1462         if (p->pindex == NUPDE + NUPDPE + PML4PML4I) {
1463                 /*
1464                  * We are the pml4 table itself.
1465                  */
1466                 /* XXX anything to do here? */
1467         } else if (p->pindex >= (NUPDE + NUPDPE)) {
1468                 /*
1469                  * Remove a PDP page from the PML4.  We do not maintain
1470                  * hold counts on the PML4 page.
1471                  */
1472                 pml4_entry_t *pml4;
1473                 vm_page_t m4;
1474                 int idx;
1475
1476                 m4 = vm_page_lookup(pmap->pm_pteobj, NUPDE + NUPDPE + PML4PML4I);
1477                 KKASSERT(m4 != NULL);
1478                 pml4 = (void *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m4));
1479                 idx = (p->pindex - (NUPDE + NUPDPE)) % NPML4EPG;
1480                 KKASSERT(pml4[idx] != 0);
1481                 pml4[idx] = 0;
1482         } else if (p->pindex >= NUPDE) {
1483                 /*
1484                  * Remove a PD page from the PDP and drop the hold count
1485                  * on the PDP.  The PDP is left cached in the pmap if
1486                  * the hold count drops to 0 so the wire count remains
1487                  * intact.
1488                  */
1489                 vm_page_t m3;
1490                 pdp_entry_t *pdp;
1491                 int idx;
1492
1493                 m3 = vm_page_lookup(pmap->pm_pteobj,
1494                                 NUPDE + NUPDPE + (p->pindex - NUPDE) / NPDPEPG);
1495                 KKASSERT(m3 != NULL);
1496                 pdp = (void *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m3));
1497                 idx = (p->pindex - NUPDE) % NPDPEPG;
1498                 KKASSERT(pdp[idx] != 0);
1499                 pdp[idx] = 0;
1500                 m3->hold_count--;
1501         } else {
1502                 /*
1503                  * Remove a PT page from the PD and drop the hold count
1504                  * on the PD.  The PD is left cached in the pmap if
1505                  * the hold count drops to 0 so the wire count remains
1506                  * intact.
1507                  */
1508                 vm_page_t m2;
1509                 pd_entry_t *pd;
1510                 int idx;
1511
1512                 m2 = vm_page_lookup(pmap->pm_pteobj,
1513                                     NUPDE + p->pindex / NPDEPG);
1514                 KKASSERT(m2 != NULL);
1515                 pd = (void *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m2));
1516                 idx = p->pindex % NPDEPG;
1517                 pd[idx] = 0;
1518                 m2->hold_count--;
1519         }
1520
1521         /*
1522          * One fewer mappings in the pmap.  p's hold count had better
1523          * be zero.
1524          */
1525         KKASSERT(pmap->pm_stats.resident_count > 0);
1526         --pmap->pm_stats.resident_count;
1527         if (p->hold_count)
1528                 panic("pmap_release: freeing held page table page");
1529         if (pmap->pm_ptphint && (pmap->pm_ptphint->pindex == p->pindex))
1530                 pmap->pm_ptphint = NULL;
1531
1532         /*
1533          * We leave the top-level page table page cached, wired, and mapped in
1534          * the pmap until the dtor function (pmap_puninit()) gets called.
1535          * However, still clean it up so we can set PG_ZERO.
1536          */
1537         if (p->pindex == NUPDE + NUPDPE + PML4PML4I) {
1538                 bzero(pmap->pm_pml4, PAGE_SIZE);
1539                 vm_page_flag_set(p, PG_ZERO);
1540                 vm_page_wakeup(p);
1541         } else {
1542                 p->wire_count--;
1543                 KKASSERT(p->wire_count == 0);
1544                 vmstats.v_wire_count--;
1545                 /* JG eventually revert to using vm_page_free_zero() */
1546                 vm_page_free(p);
1547         }
1548         return 1;
1549 }
1550
1551 /*
1552  * This routine is called when various levels in the page table need to
1553  * be populated.  This routine cannot fail.
1554  */
1555 static
1556 vm_page_t
1557 _pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex)
1558 {
1559         vm_page_t m;
1560
1561         /*
1562          * Find or fabricate a new pagetable page.  This will busy the page.
1563          */
1564         m = vm_page_grab(pmap->pm_pteobj, ptepindex,
1565                          VM_ALLOC_NORMAL | VM_ALLOC_ZERO | VM_ALLOC_RETRY);
1566         if ((m->flags & PG_ZERO) == 0) {
1567                 pmap_zero_page(VM_PAGE_TO_PHYS(m));
1568         }
1569
1570         KASSERT(m->queue == PQ_NONE,
1571                 ("_pmap_allocpte: %p->queue != PQ_NONE", m));
1572
1573         /*
1574          * Increment the hold count for the page we will be returning to
1575          * the caller.
1576          */
1577         m->hold_count++;
1578         if (m->wire_count++ == 0)
1579                 vmstats.v_wire_count++;
1580
1581         /*
1582          * Map the pagetable page into the process address space, if
1583          * it isn't already there.
1584          *
1585          * It is possible that someone else got in and mapped the page
1586          * directory page while we were blocked, if so just unbusy and
1587          * return the held page.
1588          */
1589         if (ptepindex >= (NUPDE + NUPDPE)) {
1590                 /*
1591                  * Wire up a new PDP page in the PML4
1592                  */
1593                 vm_pindex_t pml4index;
1594                 pml4_entry_t *pml4;
1595
1596                 pml4index = ptepindex - (NUPDE + NUPDPE);
1597                 pml4 = &pmap->pm_pml4[pml4index];
1598                 if (*pml4 & PG_V) {
1599                         if (--m->wire_count == 0)
1600                                 --vmstats.v_wire_count;
1601                         vm_page_wakeup(m);
1602                         return(m);
1603                 }
1604                 *pml4 = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V | PG_A | PG_M;
1605         } else if (ptepindex >= NUPDE) {
1606                 /*
1607                  * Wire up a new PD page in the PDP
1608                  */
1609                 vm_pindex_t pml4index;
1610                 vm_pindex_t pdpindex;
1611                 vm_page_t pdppg;
1612                 pml4_entry_t *pml4;
1613                 pdp_entry_t *pdp;
1614
1615                 pdpindex = ptepindex - NUPDE;
1616                 pml4index = pdpindex >> NPML4EPGSHIFT;
1617
1618                 pml4 = &pmap->pm_pml4[pml4index];
1619                 if ((*pml4 & PG_V) == 0) {
1620                         /*
1621                          * Have to allocate a new PDP page, recurse.
1622                          * This always succeeds.  Returned page will
1623                          * be held.
1624                          */
1625                         pdppg = _pmap_allocpte(pmap,
1626                                                NUPDE + NUPDPE + pml4index);
1627                 } else {
1628                         /*
1629                          * Add a held reference to the PDP page.
1630                          */
1631                         pdppg = PHYS_TO_VM_PAGE(*pml4 & PG_FRAME);
1632                         pdppg->hold_count++;
1633                 }
1634
1635                 /*
1636                  * Now find the pdp_entry and map the PDP.  If the PDP
1637                  * has already been mapped unwind and return the
1638                  * already-mapped PDP held.
1639                  *
1640                  * pdppg is left held (hold_count is incremented for
1641                  * each PD in the PDP).
1642                  */
1643                 pdp = (pdp_entry_t *)PHYS_TO_DMAP(*pml4 & PG_FRAME);
1644                 pdp = &pdp[pdpindex & ((1ul << NPDPEPGSHIFT) - 1)];
1645                 if (*pdp & PG_V) {
1646                         vm_page_unhold(pdppg);
1647                         if (--m->wire_count == 0)
1648                                 --vmstats.v_wire_count;
1649                         vm_page_wakeup(m);
1650                         return(m);
1651                 }
1652                 *pdp = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V | PG_A | PG_M;
1653         } else {
1654                 /*
1655                  * Wire up the new PT page in the PD
1656                  */
1657                 vm_pindex_t pml4index;
1658                 vm_pindex_t pdpindex;
1659                 pml4_entry_t *pml4;
1660                 pdp_entry_t *pdp;
1661                 pd_entry_t *pd;
1662                 vm_page_t pdpg;
1663
1664                 pdpindex = ptepindex >> NPDPEPGSHIFT;
1665                 pml4index = pdpindex >> NPML4EPGSHIFT;
1666
1667                 /*
1668                  * Locate the PDP page in the PML4, then the PD page in
1669                  * the PDP.  If either does not exist we simply recurse
1670                  * to allocate them.
1671                  *
1672                  * We can just recurse on the PD page as it will recurse
1673                  * on the PDP if necessary.
1674                  */
1675                 pml4 = &pmap->pm_pml4[pml4index];
1676                 if ((*pml4 & PG_V) == 0) {
1677                         pdpg = _pmap_allocpte(pmap, NUPDE + pdpindex);
1678                         pdp = (pdp_entry_t *)PHYS_TO_DMAP(*pml4 & PG_FRAME);
1679                         pdp = &pdp[pdpindex & ((1ul << NPDPEPGSHIFT) - 1)];
1680                 } else {
1681                         pdp = (pdp_entry_t *)PHYS_TO_DMAP(*pml4 & PG_FRAME);
1682                         pdp = &pdp[pdpindex & ((1ul << NPDPEPGSHIFT) - 1)];
1683                         if ((*pdp & PG_V) == 0) {
1684                                 pdpg = _pmap_allocpte(pmap, NUPDE + pdpindex);
1685                         } else {
1686                                 pdpg = PHYS_TO_VM_PAGE(*pdp & PG_FRAME);
1687                                 pdpg->hold_count++;
1688                         }
1689                 }
1690
1691                 /*
1692                  * Now fill in the pte in the PD.  If the pte already exists
1693                  * (again, if we raced the grab), unhold pdpg and unwire
1694                  * m, returning a held m.
1695                  *
1696                  * pdpg is left held (hold_count is incremented for
1697                  * each PT in the PD).
1698                  */
1699                 pd = (pd_entry_t *)PHYS_TO_DMAP(*pdp & PG_FRAME);
1700                 pd = &pd[ptepindex & ((1ul << NPDEPGSHIFT) - 1)];
1701                 if (*pd != 0) {
1702                         vm_page_unhold(pdpg);
1703                         if (--m->wire_count == 0)
1704                                 --vmstats.v_wire_count;
1705                         vm_page_wakeup(m);
1706                         return(m);
1707                 }
1708                 *pd = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V | PG_A | PG_M;
1709         }
1710
1711         /*
1712          * We successfully loaded a PDP, PD, or PTE.  Set the page table hint,
1713          * valid bits, mapped flag, unbusy, and we're done.
1714          */
1715         pmap->pm_ptphint = m;
1716         ++pmap->pm_stats.resident_count;
1717
1718         m->valid = VM_PAGE_BITS_ALL;
1719         vm_page_flag_clear(m, PG_ZERO);
1720         vm_page_flag_set(m, PG_MAPPED);
1721         vm_page_wakeup(m);
1722
1723         return (m);
1724 }
1725
1726 static
1727 vm_page_t
1728 pmap_allocpte(pmap_t pmap, vm_offset_t va)
1729 {
1730         vm_pindex_t ptepindex;
1731         pd_entry_t *pd;
1732         vm_page_t m;
1733
1734         /*
1735          * Calculate pagetable page index
1736          */
1737         ptepindex = pmap_pde_pindex(va);
1738
1739         /*
1740          * Get the page directory entry
1741          */
1742         pd = pmap_pde(pmap, va);
1743
1744         /*
1745          * This supports switching from a 2MB page to a
1746          * normal 4K page.
1747          */
1748         if (pd != NULL && (*pd & (PG_PS | PG_V)) == (PG_PS | PG_V)) {
1749                 panic("no promotion/demotion yet");
1750                 *pd = 0;
1751                 pd = NULL;
1752                 cpu_invltlb();
1753                 smp_invltlb();
1754         }
1755
1756         /*
1757          * If the page table page is mapped, we just increment the
1758          * hold count, and activate it.
1759          */
1760         if (pd != NULL && (*pd & PG_V) != 0) {
1761                 /* YYY hint is used here on i386 */
1762                 m = pmap_page_lookup( pmap->pm_pteobj, ptepindex);
1763                 pmap->pm_ptphint = m;
1764                 m->hold_count++;
1765                 return m;
1766         }
1767         /*
1768          * Here if the pte page isn't mapped, or if it has been deallocated.
1769          */
1770         return _pmap_allocpte(pmap, ptepindex);
1771 }
1772
1773
1774 /***************************************************
1775  * Pmap allocation/deallocation routines.
1776  ***************************************************/
1777
1778 /*
1779  * Release any resources held by the given physical map.
1780  * Called when a pmap initialized by pmap_pinit is being released.
1781  * Should only be called if the map contains no valid mappings.
1782  */
1783 static int pmap_release_callback(struct vm_page *p, void *data);
1784
1785 void
1786 pmap_release(struct pmap *pmap)
1787 {
1788         vm_object_t object = pmap->pm_pteobj;
1789         struct rb_vm_page_scan_info info;
1790
1791         KASSERT(pmap->pm_active == 0, ("pmap still active! %08x", pmap->pm_active));
1792 #if defined(DIAGNOSTIC)
1793         if (object->ref_count != 1)
1794                 panic("pmap_release: pteobj reference count != 1");
1795 #endif
1796         
1797         info.pmap = pmap;
1798         info.object = object;
1799         crit_enter();
1800         lwkt_gettoken(&vm_token);
1801         TAILQ_REMOVE(&pmap_list, pmap, pm_pmnode);
1802         crit_exit();
1803
1804         do {
1805                 crit_enter();
1806                 info.error = 0;
1807                 info.mpte = NULL;
1808                 info.limit = object->generation;
1809
1810                 vm_page_rb_tree_RB_SCAN(&object->rb_memq, NULL, 
1811                                         pmap_release_callback, &info);
1812                 if (info.error == 0 && info.mpte) {
1813                         if (!pmap_release_free_page(pmap, info.mpte))
1814                                 info.error = 1;
1815                 }
1816                 crit_exit();
1817         } while (info.error);
1818         lwkt_reltoken(&vm_token);
1819 }
1820
1821 static
1822 int
1823 pmap_release_callback(struct vm_page *p, void *data)
1824 {
1825         struct rb_vm_page_scan_info *info = data;
1826
1827         if (p->pindex == NUPDE + NUPDPE + PML4PML4I) {
1828                 info->mpte = p;
1829                 return(0);
1830         }
1831         if (!pmap_release_free_page(info->pmap, p)) {
1832                 info->error = 1;
1833                 return(-1);
1834         }
1835         if (info->object->generation != info->limit) {
1836                 info->error = 1;
1837                 return(-1);
1838         }
1839         return(0);
1840 }
1841
1842 /*
1843  * Grow the number of kernel page table entries, if needed.
1844  *
1845  * This routine is always called to validate any address space
1846  * beyond KERNBASE (for kldloads).  kernel_vm_end only governs the address
1847  * space below KERNBASE.
1848  */
1849 void
1850 pmap_growkernel(vm_offset_t kstart, vm_offset_t kend)
1851 {
1852         vm_paddr_t paddr;
1853         vm_offset_t ptppaddr;
1854         vm_page_t nkpg;
1855         pd_entry_t *pde, newpdir;
1856         pdp_entry_t newpdp;
1857         int update_kernel_vm_end;
1858
1859         crit_enter();
1860         lwkt_gettoken(&vm_token);
1861
1862         /*
1863          * bootstrap kernel_vm_end on first real VM use
1864          */
1865         if (kernel_vm_end == 0) {
1866                 kernel_vm_end = VM_MIN_KERNEL_ADDRESS;
1867                 nkpt = 0;
1868                 while ((*pmap_pde(&kernel_pmap, kernel_vm_end) & PG_V) != 0) {
1869                         kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) &
1870                                         ~(PAGE_SIZE * NPTEPG - 1);
1871                         nkpt++;
1872                         if (kernel_vm_end - 1 >= kernel_map.max_offset) {
1873                                 kernel_vm_end = kernel_map.max_offset;
1874                                 break;                       
1875                         }
1876                 }
1877         }
1878
1879         /*
1880          * Fill in the gaps.  kernel_vm_end is only adjusted for ranges
1881          * below KERNBASE.  Ranges above KERNBASE are kldloaded and we
1882          * do not want to force-fill 128G worth of page tables.
1883          */
1884         if (kstart < KERNBASE) {
1885                 if (kstart > kernel_vm_end)
1886                         kstart = kernel_vm_end;
1887                 KKASSERT(kend <= KERNBASE);
1888                 update_kernel_vm_end = 1;
1889         } else {
1890                 update_kernel_vm_end = 0;
1891         }
1892
1893         kstart = rounddown2(kstart, PAGE_SIZE * NPTEPG);
1894         kend = roundup2(kend, PAGE_SIZE * NPTEPG);
1895
1896         if (kend - 1 >= kernel_map.max_offset)
1897                 kend = kernel_map.max_offset;
1898
1899         while (kstart < kend) {
1900                 pde = pmap_pde(&kernel_pmap, kstart);
1901                 if (pde == NULL) {
1902                         /* We need a new PDP entry */
1903                         nkpg = vm_page_alloc(kptobj, nkpt,
1904                                              VM_ALLOC_NORMAL |
1905                                              VM_ALLOC_SYSTEM |
1906                                              VM_ALLOC_INTERRUPT);
1907                         if (nkpg == NULL) {
1908                                 panic("pmap_growkernel: no memory to grow "
1909                                       "kernel");
1910                         }
1911                         paddr = VM_PAGE_TO_PHYS(nkpg);
1912                         if ((nkpg->flags & PG_ZERO) == 0)
1913                                 pmap_zero_page(paddr);
1914                         vm_page_flag_clear(nkpg, PG_ZERO);
1915                         newpdp = (pdp_entry_t)
1916                                 (paddr | PG_V | PG_RW | PG_A | PG_M);
1917                         *pmap_pdpe(&kernel_pmap, kstart) = newpdp;
1918                         nkpt++;
1919                         continue; /* try again */
1920                 }
1921                 if ((*pde & PG_V) != 0) {
1922                         kstart = (kstart + PAGE_SIZE * NPTEPG) &
1923                                  ~(PAGE_SIZE * NPTEPG - 1);
1924                         if (kstart - 1 >= kernel_map.max_offset) {
1925                                 kstart = kernel_map.max_offset;
1926                                 break;                       
1927                         }
1928                         continue;
1929                 }
1930
1931                 /*
1932                  * This index is bogus, but out of the way
1933                  */
1934                 nkpg = vm_page_alloc(kptobj, nkpt,
1935                                      VM_ALLOC_NORMAL |
1936                                      VM_ALLOC_SYSTEM |
1937                                      VM_ALLOC_INTERRUPT);
1938                 if (nkpg == NULL)
1939                         panic("pmap_growkernel: no memory to grow kernel");
1940
1941                 vm_page_wire(nkpg);
1942                 ptppaddr = VM_PAGE_TO_PHYS(nkpg);
1943                 pmap_zero_page(ptppaddr);
1944                 vm_page_flag_clear(nkpg, PG_ZERO);
1945                 newpdir = (pd_entry_t) (ptppaddr | PG_V | PG_RW | PG_A | PG_M);
1946                 *pmap_pde(&kernel_pmap, kstart) = newpdir;
1947                 nkpt++;
1948
1949                 kstart = (kstart + PAGE_SIZE * NPTEPG) &
1950                           ~(PAGE_SIZE * NPTEPG - 1);
1951
1952                 if (kstart - 1 >= kernel_map.max_offset) {
1953                         kstart = kernel_map.max_offset;
1954                         break;                       
1955                 }
1956         }
1957
1958         /*
1959          * Only update kernel_vm_end for areas below KERNBASE.
1960          */
1961         if (update_kernel_vm_end && kernel_vm_end < kstart)
1962                 kernel_vm_end = kstart;
1963
1964         lwkt_reltoken(&vm_token);
1965         crit_exit();
1966 }
1967
1968 /*
1969  *      Retire the given physical map from service.
1970  *      Should only be called if the map contains
1971  *      no valid mappings.
1972  */
1973 void
1974 pmap_destroy(pmap_t pmap)
1975 {
1976         int count;
1977
1978         if (pmap == NULL)
1979                 return;
1980
1981         lwkt_gettoken(&vm_token);
1982         count = --pmap->pm_count;
1983         if (count == 0) {
1984                 pmap_release(pmap);
1985                 panic("destroying a pmap is not yet implemented");
1986         }
1987         lwkt_reltoken(&vm_token);
1988 }
1989
1990 /*
1991  *      Add a reference to the specified pmap.
1992  */
1993 void
1994 pmap_reference(pmap_t pmap)
1995 {
1996         if (pmap != NULL) {
1997                 lwkt_gettoken(&vm_token);
1998                 pmap->pm_count++;
1999                 lwkt_reltoken(&vm_token);
2000         }
2001 }
2002
2003 /***************************************************
2004 * page management routines.
2005  ***************************************************/
2006
2007 /*
2008  * free the pv_entry back to the free list.  This function may be
2009  * called from an interrupt.
2010  */
2011 static __inline
2012 void
2013 free_pv_entry(pv_entry_t pv)
2014 {
2015         pv_entry_count--;
2016         KKASSERT(pv_entry_count >= 0);
2017         zfree(pvzone, pv);
2018 }
2019
2020 /*
2021  * get a new pv_entry, allocating a block from the system
2022  * when needed.  This function may be called from an interrupt.
2023  */
2024 static
2025 pv_entry_t
2026 get_pv_entry(void)
2027 {
2028         pv_entry_count++;
2029         if (pv_entry_high_water &&
2030                 (pv_entry_count > pv_entry_high_water) &&
2031                 (pmap_pagedaemon_waken == 0)) {
2032                 pmap_pagedaemon_waken = 1;
2033                 wakeup(&vm_pages_needed);
2034         }
2035         return zalloc(pvzone);
2036 }
2037
2038 /*
2039  * This routine is very drastic, but can save the system
2040  * in a pinch.
2041  */
2042 void
2043 pmap_collect(void)
2044 {
2045         int i;
2046         vm_page_t m;
2047         static int warningdone=0;
2048
2049         if (pmap_pagedaemon_waken == 0)
2050                 return;
2051         lwkt_gettoken(&vm_token);
2052         if (warningdone < 5) {
2053                 kprintf("pmap_collect: collecting pv entries -- suggest increasing PMAP_SHPGPERPROC\n");
2054                 warningdone++;
2055         }
2056
2057         for(i = 0; i < vm_page_array_size; i++) {
2058                 m = &vm_page_array[i];
2059                 if (m->wire_count || m->hold_count || m->busy ||
2060                     (m->flags & PG_BUSY))
2061                         continue;
2062                 pmap_remove_all(m);
2063         }
2064         pmap_pagedaemon_waken = 0;
2065         lwkt_reltoken(&vm_token);
2066 }
2067         
2068
2069 /*
2070  * If it is the first entry on the list, it is actually
2071  * in the header and we must copy the following entry up
2072  * to the header.  Otherwise we must search the list for
2073  * the entry.  In either case we free the now unused entry.
2074  */
2075 static
2076 int
2077 pmap_remove_entry(struct pmap *pmap, vm_page_t m, 
2078                         vm_offset_t va, pmap_inval_info_t info)
2079 {
2080         pv_entry_t pv;
2081         int rtval;
2082
2083         crit_enter();
2084         if (m->md.pv_list_count < pmap->pm_stats.resident_count) {
2085                 TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
2086                         if (pmap == pv->pv_pmap && va == pv->pv_va) 
2087                                 break;
2088                 }
2089         } else {
2090                 TAILQ_FOREACH(pv, &pmap->pm_pvlist, pv_plist) {
2091                         if (va == pv->pv_va) 
2092                                 break;
2093                 }
2094         }
2095
2096         rtval = 0;
2097         KKASSERT(pv);
2098
2099         TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
2100         m->md.pv_list_count--;
2101         KKASSERT(m->md.pv_list_count >= 0);
2102         if (TAILQ_EMPTY(&m->md.pv_list))
2103                 vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE);
2104         TAILQ_REMOVE(&pmap->pm_pvlist, pv, pv_plist);
2105         ++pmap->pm_generation;
2106         rtval = pmap_unuse_pt(pmap, va, pv->pv_ptem, info);
2107         free_pv_entry(pv);
2108
2109         crit_exit();
2110         return rtval;
2111 }
2112
2113 /*
2114  * Create a pv entry for page at pa for
2115  * (pmap, va).
2116  */
2117 static
2118 void
2119 pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t mpte, vm_page_t m)
2120 {
2121         pv_entry_t pv;
2122
2123         crit_enter();
2124         pv = get_pv_entry();
2125         pv->pv_va = va;
2126         pv->pv_pmap = pmap;
2127         pv->pv_ptem = mpte;
2128
2129         TAILQ_INSERT_TAIL(&pmap->pm_pvlist, pv, pv_plist);
2130         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
2131         ++pmap->pm_generation;
2132         m->md.pv_list_count++;
2133
2134         crit_exit();
2135 }
2136
2137 /*
2138  * pmap_remove_pte: do the things to unmap a page in a process
2139  */
2140 static
2141 int
2142 pmap_remove_pte(struct pmap *pmap, pt_entry_t *ptq, vm_offset_t va,
2143         pmap_inval_info_t info)
2144 {
2145         pt_entry_t oldpte;
2146         vm_page_t m;
2147
2148         pmap_inval_interlock(info, pmap, va);
2149         oldpte = pte_load_clear(ptq);
2150         pmap_inval_deinterlock(info, pmap);
2151         if (oldpte & PG_W)
2152                 pmap->pm_stats.wired_count -= 1;
2153         /*
2154          * Machines that don't support invlpg, also don't support
2155          * PG_G.  XXX PG_G is disabled for SMP so don't worry about
2156          * the SMP case.
2157          */
2158         if (oldpte & PG_G)
2159                 cpu_invlpg((void *)va);
2160         KKASSERT(pmap->pm_stats.resident_count > 0);
2161         --pmap->pm_stats.resident_count;
2162         if (oldpte & PG_MANAGED) {
2163                 m = PHYS_TO_VM_PAGE(oldpte);
2164                 if (oldpte & PG_M) {
2165 #if defined(PMAP_DIAGNOSTIC)
2166                         if (pmap_nw_modified((pt_entry_t) oldpte)) {
2167                                 kprintf(
2168         "pmap_remove: modified page not writable: va: 0x%lx, pte: 0x%lx\n",
2169                                     va, oldpte);
2170                         }
2171 #endif
2172                         if (pmap_track_modified(va))
2173                                 vm_page_dirty(m);
2174                 }
2175                 if (oldpte & PG_A)
2176                         vm_page_flag_set(m, PG_REFERENCED);
2177                 return pmap_remove_entry(pmap, m, va, info);
2178         } else {
2179                 return pmap_unuse_pt(pmap, va, NULL, info);
2180         }
2181
2182         return 0;
2183 }
2184
2185 /*
2186  * pmap_remove_page:
2187  *
2188  *      Remove a single page from a process address space.
2189  *
2190  *      This function may not be called from an interrupt if the pmap is
2191  *      not kernel_pmap.
2192  */
2193 static
2194 void
2195 pmap_remove_page(struct pmap *pmap, vm_offset_t va, pmap_inval_info_t info)
2196 {
2197         pt_entry_t *pte;
2198
2199         pte = pmap_pte(pmap, va);
2200         if (pte == NULL)
2201                 return;
2202         if ((*pte & PG_V) == 0)
2203                 return;
2204         pmap_remove_pte(pmap, pte, va, info);
2205 }
2206
2207 /*
2208  * pmap_remove:
2209  *
2210  *      Remove the given range of addresses from the specified map.
2211  *
2212  *      It is assumed that the start and end are properly
2213  *      rounded to the page size.
2214  *
2215  *      This function may not be called from an interrupt if the pmap is
2216  *      not kernel_pmap.
2217  */
2218 void
2219 pmap_remove(struct pmap *pmap, vm_offset_t sva, vm_offset_t eva)
2220 {
2221         vm_offset_t va_next;
2222         pml4_entry_t *pml4e;
2223         pdp_entry_t *pdpe;
2224         pd_entry_t ptpaddr, *pde;
2225         pt_entry_t *pte;
2226         struct pmap_inval_info info;
2227
2228         if (pmap == NULL)
2229                 return;
2230
2231         lwkt_gettoken(&vm_token);
2232         if (pmap->pm_stats.resident_count == 0) {
2233                 lwkt_reltoken(&vm_token);
2234                 return;
2235         }
2236
2237         pmap_inval_init(&info);
2238
2239         /*
2240          * special handling of removing one page.  a very
2241          * common operation and easy to short circuit some
2242          * code.
2243          */
2244         if (sva + PAGE_SIZE == eva) {
2245                 pde = pmap_pde(pmap, sva);
2246                 if (pde && (*pde & PG_PS) == 0) {
2247                         pmap_remove_page(pmap, sva, &info);
2248                         pmap_inval_done(&info);
2249                         lwkt_reltoken(&vm_token);
2250                         return;
2251                 }
2252         }
2253
2254         for (; sva < eva; sva = va_next) {
2255                 pml4e = pmap_pml4e(pmap, sva);
2256                 if ((*pml4e & PG_V) == 0) {
2257                         va_next = (sva + NBPML4) & ~PML4MASK;
2258                         if (va_next < sva)
2259                                 va_next = eva;
2260                         continue;
2261                 }
2262
2263                 pdpe = pmap_pml4e_to_pdpe(pml4e, sva);
2264                 if ((*pdpe & PG_V) == 0) {
2265                         va_next = (sva + NBPDP) & ~PDPMASK;
2266                         if (va_next < sva)
2267                                 va_next = eva;
2268                         continue;
2269                 }
2270
2271                 /*
2272                  * Calculate index for next page table.
2273                  */
2274                 va_next = (sva + NBPDR) & ~PDRMASK;
2275                 if (va_next < sva)
2276                         va_next = eva;
2277
2278                 pde = pmap_pdpe_to_pde(pdpe, sva);
2279                 ptpaddr = *pde;
2280
2281                 /*
2282                  * Weed out invalid mappings.
2283                  */
2284                 if (ptpaddr == 0)
2285                         continue;
2286
2287                 /*
2288                  * Check for large page.
2289                  */
2290                 if ((ptpaddr & PG_PS) != 0) {
2291                         /* JG FreeBSD has more complex treatment here */
2292                         pmap_inval_interlock(&info, pmap, -1);
2293                         *pde = 0;
2294                         pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
2295                         pmap_inval_deinterlock(&info, pmap);
2296                         continue;
2297                 }
2298
2299                 /*
2300                  * Limit our scan to either the end of the va represented
2301                  * by the current page table page, or to the end of the
2302                  * range being removed.
2303                  */
2304                 if (va_next > eva)
2305                         va_next = eva;
2306
2307                 /*
2308                  * NOTE: pmap_remove_pte() can block.
2309                  */
2310                 for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
2311                     sva += PAGE_SIZE) {
2312                         if (*pte == 0)
2313                                 continue;
2314                         if (pmap_remove_pte(pmap, pte, sva, &info))
2315                                 break;
2316                 }
2317         }
2318         pmap_inval_done(&info);
2319         lwkt_reltoken(&vm_token);
2320 }
2321
2322 /*
2323  * pmap_remove_all:
2324  *
2325  *      Removes this physical page from all physical maps in which it resides.
2326  *      Reflects back modify bits to the pager.
2327  *
2328  *      This routine may not be called from an interrupt.
2329  */
2330
2331 static
2332 void
2333 pmap_remove_all(vm_page_t m)
2334 {
2335         struct pmap_inval_info info;
2336         pt_entry_t *pte, tpte;
2337         pv_entry_t pv;
2338
2339         if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
2340                 return;
2341
2342         lwkt_gettoken(&vm_token);
2343         pmap_inval_init(&info);
2344         crit_enter();
2345         while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
2346                 KKASSERT(pv->pv_pmap->pm_stats.resident_count > 0);
2347                 --pv->pv_pmap->pm_stats.resident_count;
2348
2349                 pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);
2350                 pmap_inval_interlock(&info, pv->pv_pmap, pv->pv_va);
2351                 tpte = pte_load_clear(pte);
2352                 if (tpte & PG_W)
2353                         pv->pv_pmap->pm_stats.wired_count--;
2354                 pmap_inval_deinterlock(&info, pv->pv_pmap);
2355                 if (tpte & PG_A)
2356                         vm_page_flag_set(m, PG_REFERENCED);
2357
2358                 /*
2359                  * Update the vm_page_t clean and reference bits.
2360                  */
2361                 if (tpte & PG_M) {
2362 #if defined(PMAP_DIAGNOSTIC)
2363                         if (pmap_nw_modified(tpte)) {
2364                                 kprintf(
2365         "pmap_remove_all: modified page not writable: va: 0x%lx, pte: 0x%lx\n",
2366                                     pv->pv_va, tpte);
2367                         }
2368 #endif
2369                         if (pmap_track_modified(pv->pv_va))
2370                                 vm_page_dirty(m);
2371                 }
2372                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
2373                 TAILQ_REMOVE(&pv->pv_pmap->pm_pvlist, pv, pv_plist);
2374                 ++pv->pv_pmap->pm_generation;
2375                 m->md.pv_list_count--;
2376                 KKASSERT(m->md.pv_list_count >= 0);
2377                 if (TAILQ_EMPTY(&m->md.pv_list))
2378                         vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE);
2379                 pmap_unuse_pt(pv->pv_pmap, pv->pv_va, pv->pv_ptem, &info);
2380                 free_pv_entry(pv);
2381         }
2382         crit_exit();
2383         KKASSERT((m->flags & (PG_MAPPED|PG_WRITEABLE)) == 0);
2384         pmap_inval_done(&info);
2385         lwkt_reltoken(&vm_token);
2386 }
2387
2388 /*
2389  * pmap_protect:
2390  *
2391  *      Set the physical protection on the specified range of this map
2392  *      as requested.
2393  *
2394  *      This function may not be called from an interrupt if the map is
2395  *      not the kernel_pmap.
2396  */
2397 void
2398 pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
2399 {
2400         vm_offset_t va_next;
2401         pml4_entry_t *pml4e;
2402         pdp_entry_t *pdpe;
2403         pd_entry_t ptpaddr, *pde;
2404         pt_entry_t *pte;
2405         pmap_inval_info info;
2406
2407         /* JG review for NX */
2408
2409         if (pmap == NULL)
2410                 return;
2411
2412         if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
2413                 pmap_remove(pmap, sva, eva);
2414                 return;
2415         }
2416
2417         if (prot & VM_PROT_WRITE)
2418                 return;
2419
2420         lwkt_gettoken(&vm_token);
2421         pmap_inval_init(&info);
2422
2423         for (; sva < eva; sva = va_next) {
2424
2425                 pml4e = pmap_pml4e(pmap, sva);
2426                 if ((*pml4e & PG_V) == 0) {
2427                         va_next = (sva + NBPML4) & ~PML4MASK;
2428                         if (va_next < sva)
2429                                 va_next = eva;
2430                         continue;
2431                 }
2432
2433                 pdpe = pmap_pml4e_to_pdpe(pml4e, sva);
2434                 if ((*pdpe & PG_V) == 0) {
2435                         va_next = (sva + NBPDP) & ~PDPMASK;
2436                         if (va_next < sva)
2437                                 va_next = eva;
2438                         continue;
2439                 }
2440
2441                 va_next = (sva + NBPDR) & ~PDRMASK;
2442                 if (va_next < sva)
2443                         va_next = eva;
2444
2445                 pde = pmap_pdpe_to_pde(pdpe, sva);
2446                 ptpaddr = *pde;
2447
2448                 /*
2449                  * Check for large page.
2450                  */
2451                 if ((ptpaddr & PG_PS) != 0) {
2452                         pmap_inval_interlock(&info, pmap, -1);
2453                         *pde &= ~(PG_M|PG_RW);
2454                         pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
2455                         pmap_inval_deinterlock(&info, pmap);
2456                         continue;
2457                 }
2458
2459                 /*
2460                  * Weed out invalid mappings. Note: we assume that the page
2461                  * directory table is always allocated, and in kernel virtual.
2462                  */
2463                 if (ptpaddr == 0)
2464                         continue;
2465
2466                 if (va_next > eva)
2467                         va_next = eva;
2468
2469                 for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
2470                      sva += PAGE_SIZE) {
2471                         pt_entry_t pbits;
2472                         pt_entry_t cbits;
2473                         vm_page_t m;
2474
2475                         /*
2476                          * XXX non-optimal.  Note also that there can be
2477                          * no pmap_inval_flush() calls until after we modify
2478                          * ptbase[sindex] (or otherwise we have to do another
2479                          * pmap_inval_add() call).
2480                          */
2481                         pmap_inval_interlock(&info, pmap, sva);
2482 again:
2483                         pbits = *pte;
2484                         cbits = pbits;
2485                         if ((pbits & PG_V) == 0) {
2486                                 pmap_inval_deinterlock(&info, pmap);
2487                                 continue;
2488                         }
2489                         if (pbits & PG_MANAGED) {
2490                                 m = NULL;
2491                                 if (pbits & PG_A) {
2492                                         m = PHYS_TO_VM_PAGE(pbits & PG_FRAME);
2493                                         vm_page_flag_set(m, PG_REFERENCED);
2494                                         cbits &= ~PG_A;
2495                                 }
2496                                 if (pbits & PG_M) {
2497                                         if (pmap_track_modified(sva)) {
2498                                                 if (m == NULL)
2499                                                         m = PHYS_TO_VM_PAGE(pbits & PG_FRAME);
2500                                                 vm_page_dirty(m);
2501                                                 cbits &= ~PG_M;
2502                                         }
2503                                 }
2504                         }
2505                         cbits &= ~PG_RW;
2506                         if (pbits != cbits &&
2507                             !atomic_cmpset_long(pte, pbits, cbits)) {
2508                                 goto again;
2509                         }
2510                         pmap_inval_deinterlock(&info, pmap);
2511                 }
2512         }
2513         pmap_inval_done(&info);
2514         lwkt_reltoken(&vm_token);
2515 }
2516
2517 /*
2518  *      Insert the given physical page (p) at
2519  *      the specified virtual address (v) in the
2520  *      target physical map with the protection requested.
2521  *
2522  *      If specified, the page will be wired down, meaning
2523  *      that the related pte can not be reclaimed.
2524  *
2525  *      NB:  This is the only routine which MAY NOT lazy-evaluate
2526  *      or lose information.  That is, this routine must actually
2527  *      insert this page into the given map NOW.
2528  */
2529 void
2530 pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
2531            boolean_t wired)
2532 {
2533         vm_paddr_t pa;
2534         pd_entry_t *pde;
2535         pt_entry_t *pte;
2536         vm_paddr_t opa;
2537         pt_entry_t origpte, newpte;
2538         vm_page_t mpte;
2539         pmap_inval_info info;
2540
2541         if (pmap == NULL)
2542                 return;
2543
2544         va = trunc_page(va);
2545 #ifdef PMAP_DIAGNOSTIC
2546         if (va >= KvaEnd)
2547                 panic("pmap_enter: toobig");
2548         if ((va >= UPT_MIN_ADDRESS) && (va < UPT_MAX_ADDRESS))
2549                 panic("pmap_enter: invalid to pmap_enter page table pages (va: 0x%lx)", va);
2550 #endif
2551         if (va < UPT_MAX_ADDRESS && pmap == &kernel_pmap) {
2552                 kprintf("Warning: pmap_enter called on UVA with kernel_pmap\n");
2553 #ifdef DDB
2554                 db_print_backtrace();
2555 #endif
2556         }
2557         if (va >= UPT_MAX_ADDRESS && pmap != &kernel_pmap) {
2558                 kprintf("Warning: pmap_enter called on KVA without kernel_pmap\n");
2559 #ifdef DDB
2560                 db_print_backtrace();
2561 #endif
2562         }
2563
2564         lwkt_gettoken(&vm_token);
2565
2566         /*
2567          * In the case that a page table page is not
2568          * resident, we are creating it here.
2569          */
2570         if (va < VM_MAX_USER_ADDRESS)
2571                 mpte = pmap_allocpte(pmap, va);
2572         else
2573                 mpte = NULL;
2574
2575         pmap_inval_init(&info);
2576         pde = pmap_pde(pmap, va);
2577         if (pde != NULL && (*pde & PG_V) != 0) {
2578                 if ((*pde & PG_PS) != 0)
2579                         panic("pmap_enter: attempted pmap_enter on 2MB page");
2580                 pte = pmap_pde_to_pte(pde, va);
2581         } else
2582                 panic("pmap_enter: invalid page directory va=%#lx", va);
2583
2584         KKASSERT(pte != NULL);
2585         pa = VM_PAGE_TO_PHYS(m);
2586         origpte = *pte;
2587         opa = origpte & PG_FRAME;
2588
2589         /*
2590          * Mapping has not changed, must be protection or wiring change.
2591          */
2592         if (origpte && (opa == pa)) {
2593                 /*
2594                  * Wiring change, just update stats. We don't worry about
2595                  * wiring PT pages as they remain resident as long as there
2596                  * are valid mappings in them. Hence, if a user page is wired,
2597                  * the PT page will be also.
2598                  */
2599                 if (wired && ((origpte & PG_W) == 0))
2600                         pmap->pm_stats.wired_count++;
2601                 else if (!wired && (origpte & PG_W))
2602                         pmap->pm_stats.wired_count--;
2603
2604 #if defined(PMAP_DIAGNOSTIC)
2605                 if (pmap_nw_modified(origpte)) {
2606                         kprintf(
2607         "pmap_enter: modified page not writable: va: 0x%lx, pte: 0x%lx\n",
2608                             va, origpte);
2609                 }
2610 #endif
2611
2612                 /*
2613                  * Remove the extra pte reference.  Note that we cannot
2614                  * optimize the RO->RW case because we have adjusted the
2615                  * wiring count above and may need to adjust the wiring
2616                  * bits below.
2617                  */
2618                 if (mpte)
2619                         mpte->hold_count--;
2620
2621                 /*
2622                  * We might be turning off write access to the page,
2623                  * so we go ahead and sense modify status.
2624                  */
2625                 if (origpte & PG_MANAGED) {
2626                         if ((origpte & PG_M) && pmap_track_modified(va)) {
2627                                 vm_page_t om;
2628                                 om = PHYS_TO_VM_PAGE(opa);
2629                                 vm_page_dirty(om);
2630                         }
2631                         pa |= PG_MANAGED;
2632                         KKASSERT(m->flags & PG_MAPPED);
2633                 }
2634                 goto validate;
2635         } 
2636         /*
2637          * Mapping has changed, invalidate old range and fall through to
2638          * handle validating new mapping.
2639          */
2640         while (opa) {
2641                 int err;
2642                 err = pmap_remove_pte(pmap, pte, va, &info);
2643                 if (err)
2644                         panic("pmap_enter: pte vanished, va: 0x%lx", va);
2645                 origpte = *pte;
2646                 opa = origpte & PG_FRAME;
2647                 if (opa) {
2648                         kprintf("pmap_enter: Warning, raced pmap %p va %p\n",
2649                                 pmap, (void *)va);
2650                 }
2651         }
2652
2653         /*
2654          * Enter on the PV list if part of our managed memory. Note that we
2655          * raise IPL while manipulating pv_table since pmap_enter can be
2656          * called at interrupt time.
2657          */
2658         if (pmap_initialized && 
2659             (m->flags & (PG_FICTITIOUS|PG_UNMANAGED)) == 0) {
2660                 pmap_insert_entry(pmap, va, mpte, m);
2661                 pa |= PG_MANAGED;
2662                 vm_page_flag_set(m, PG_MAPPED);
2663         }
2664
2665         /*
2666          * Increment counters
2667          */
2668         ++pmap->pm_stats.resident_count;
2669         if (wired)
2670                 pmap->pm_stats.wired_count++;
2671
2672 validate:
2673         /*
2674          * Now validate mapping with desired protection/wiring.
2675          */
2676         newpte = (pt_entry_t) (pa | pte_prot(pmap, prot) | PG_V);
2677
2678         if (wired)
2679                 newpte |= PG_W;
2680         if (va < VM_MAX_USER_ADDRESS)
2681                 newpte |= PG_U;
2682         if (pmap == &kernel_pmap)
2683                 newpte |= pgeflag;
2684
2685         /*
2686          * if the mapping or permission bits are different, we need
2687          * to update the pte.
2688          */
2689         if ((origpte & ~(PG_M|PG_A)) != newpte) {
2690                 pmap_inval_interlock(&info, pmap, va);
2691                 *pte = newpte | PG_A;
2692                 pmap_inval_deinterlock(&info, pmap);
2693                 if (newpte & PG_RW)
2694                         vm_page_flag_set(m, PG_WRITEABLE);
2695         }
2696         KKASSERT((newpte & PG_MANAGED) == 0 || (m->flags & PG_MAPPED));
2697         pmap_inval_done(&info);
2698         lwkt_reltoken(&vm_token);
2699 }
2700
2701 /*
2702  * This code works like pmap_enter() but assumes VM_PROT_READ and not-wired.
2703  * This code also assumes that the pmap has no pre-existing entry for this
2704  * VA.
2705  *
2706  * This code currently may only be used on user pmaps, not kernel_pmap.
2707  */
2708 void
2709 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m)
2710 {
2711         pt_entry_t *pte;
2712         vm_paddr_t pa;
2713         vm_page_t mpte;
2714         vm_pindex_t ptepindex;
2715         pd_entry_t *ptepa;
2716         pmap_inval_info info;
2717
2718         lwkt_gettoken(&vm_token);
2719         pmap_inval_init(&info);
2720
2721         if (va < UPT_MAX_ADDRESS && pmap == &kernel_pmap) {
2722                 kprintf("Warning: pmap_enter_quick called on UVA with kernel_pmap\n");
2723 #ifdef DDB
2724                 db_print_backtrace();
2725 #endif
2726         }
2727         if (va >= UPT_MAX_ADDRESS && pmap != &kernel_pmap) {
2728                 kprintf("Warning: pmap_enter_quick called on KVA without kernel_pmap\n");
2729 #ifdef DDB
2730                 db_print_backtrace();
2731 #endif
2732         }
2733
2734         KKASSERT(va < UPT_MIN_ADDRESS); /* assert used on user pmaps only */
2735
2736         /*
2737          * Calculate the page table page (mpte), allocating it if necessary.
2738          *
2739          * A held page table page (mpte), or NULL, is passed onto the
2740          * section following.
2741          */
2742         if (va < VM_MAX_USER_ADDRESS) {
2743                 /*
2744                  * Calculate pagetable page index
2745                  */
2746                 ptepindex = pmap_pde_pindex(va);
2747
2748                 do {
2749                         /*
2750                          * Get the page directory entry
2751                          */
2752                         ptepa = pmap_pde(pmap, va);
2753
2754                         /*
2755                          * If the page table page is mapped, we just increment
2756                          * the hold count, and activate it.
2757                          */
2758                         if (ptepa && (*ptepa & PG_V) != 0) {
2759                                 if (*ptepa & PG_PS)
2760                                         panic("pmap_enter_quick: unexpected mapping into 2MB page");
2761 //                              if (pmap->pm_ptphint &&
2762 //                                  (pmap->pm_ptphint->pindex == ptepindex)) {
2763 //                                      mpte = pmap->pm_ptphint;
2764 //                              } else {
2765                                         mpte = pmap_page_lookup( pmap->pm_pteobj, ptepindex);
2766                                         pmap->pm_ptphint = mpte;
2767 //                              }
2768                                 if (mpte)
2769                                         mpte->hold_count++;
2770                         } else {
2771                                 mpte = _pmap_allocpte(pmap, ptepindex);
2772                         }
2773                 } while (mpte == NULL);
2774         } else {
2775                 mpte = NULL;
2776                 /* this code path is not yet used */
2777         }
2778
2779         /*
2780          * With a valid (and held) page directory page, we can just use
2781          * vtopte() to get to the pte.  If the pte is already present
2782          * we do not disturb it.
2783          */
2784         pte = vtopte(va);
2785         if (*pte & PG_V) {
2786                 if (mpte)
2787                         pmap_unwire_pte_hold(pmap, va, mpte, &info);
2788                 pa = VM_PAGE_TO_PHYS(m);
2789                 KKASSERT(((*pte ^ pa) & PG_FRAME) == 0);
2790                 pmap_inval_done(&info);
2791                 lwkt_reltoken(&vm_token);
2792                 return;
2793         }
2794
2795         /*
2796          * Enter on the PV list if part of our managed memory
2797          */
2798         if ((m->flags & (PG_FICTITIOUS|PG_UNMANAGED)) == 0) {
2799                 pmap_insert_entry(pmap, va, mpte, m);
2800                 vm_page_flag_set(m, PG_MAPPED);
2801         }
2802
2803         /*
2804          * Increment counters
2805          */
2806         ++pmap->pm_stats.resident_count;
2807
2808         pa = VM_PAGE_TO_PHYS(m);
2809
2810         /*
2811          * Now validate mapping with RO protection
2812          */
2813         if (m->flags & (PG_FICTITIOUS|PG_UNMANAGED))
2814                 *pte = pa | PG_V | PG_U;
2815         else
2816                 *pte = pa | PG_V | PG_U | PG_MANAGED;
2817 /*      pmap_inval_add(&info, pmap, va); shouldn't be needed inval->valid */
2818         pmap_inval_done(&info);
2819         lwkt_reltoken(&vm_token);
2820 }
2821
2822 /*
2823  * Make a temporary mapping for a physical address.  This is only intended
2824  * to be used for panic dumps.
2825  */
2826 /* JG Needed on x86_64? */
2827 void *
2828 pmap_kenter_temporary(vm_paddr_t pa, int i)
2829 {
2830         pmap_kenter((vm_offset_t)crashdumpmap + (i * PAGE_SIZE), pa);
2831         return ((void *)crashdumpmap);
2832 }
2833
2834 #define MAX_INIT_PT (96)
2835
2836 /*
2837  * This routine preloads the ptes for a given object into the specified pmap.
2838  * This eliminates the blast of soft faults on process startup and
2839  * immediately after an mmap.
2840  */
2841 static int pmap_object_init_pt_callback(vm_page_t p, void *data);
2842
2843 void
2844 pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_prot_t prot,
2845                     vm_object_t object, vm_pindex_t pindex, 
2846                     vm_size_t size, int limit)
2847 {
2848         struct rb_vm_page_scan_info info;
2849         struct lwp *lp;
2850         vm_size_t psize;
2851
2852         /*
2853          * We can't preinit if read access isn't set or there is no pmap
2854          * or object.
2855          */
2856         if ((prot & VM_PROT_READ) == 0 || pmap == NULL || object == NULL)
2857                 return;
2858
2859         /*
2860          * We can't preinit if the pmap is not the current pmap
2861          */
2862         lp = curthread->td_lwp;
2863         if (lp == NULL || pmap != vmspace_pmap(lp->lwp_vmspace))
2864                 return;
2865
2866         psize = x86_64_btop(size);
2867
2868         if ((object->type != OBJT_VNODE) ||
2869                 ((limit & MAP_PREFAULT_PARTIAL) && (psize > MAX_INIT_PT) &&
2870                         (object->resident_page_count > MAX_INIT_PT))) {
2871                 return;
2872         }
2873
2874         if (psize + pindex > object->size) {
2875                 if (object->size < pindex)
2876                         return;           
2877                 psize = object->size - pindex;
2878         }
2879
2880         if (psize == 0)
2881                 return;
2882
2883         /*
2884          * Use a red-black scan to traverse the requested range and load
2885          * any valid pages found into the pmap.
2886          *
2887          * We cannot safely scan the object's memq unless we are in a
2888          * critical section since interrupts can remove pages from objects.
2889          */
2890         info.start_pindex = pindex;
2891         info.end_pindex = pindex + psize - 1;
2892         info.limit = limit;
2893         info.mpte = NULL;
2894         info.addr = addr;
2895         info.pmap = pmap;
2896
2897         crit_enter();
2898         lwkt_gettoken(&vm_token);
2899         vm_page_rb_tree_RB_SCAN(&object->rb_memq, rb_vm_page_scancmp,
2900                                 pmap_object_init_pt_callback, &info);
2901         lwkt_reltoken(&vm_token);
2902         crit_exit();
2903 }
2904
2905 static
2906 int
2907 pmap_object_init_pt_callback(vm_page_t p, void *data)
2908 {
2909         struct rb_vm_page_scan_info *info = data;
2910         vm_pindex_t rel_index;
2911         /*
2912          * don't allow an madvise to blow away our really
2913          * free pages allocating pv entries.
2914          */
2915         if ((info->limit & MAP_PREFAULT_MADVISE) &&
2916                 vmstats.v_free_count < vmstats.v_free_reserved) {
2917                     return(-1);
2918         }
2919         if (((p->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL) &&
2920             (p->busy == 0) && (p->flags & (PG_BUSY | PG_FICTITIOUS)) == 0) {
2921                 if ((p->queue - p->pc) == PQ_CACHE)
2922                         vm_page_deactivate(p);
2923                 vm_page_busy(p);
2924                 rel_index = p->pindex - info->start_pindex;
2925                 pmap_enter_quick(info->pmap,
2926                                  info->addr + x86_64_ptob(rel_index), p);
2927                 vm_page_wakeup(p);
2928         }
2929         return(0);
2930 }
2931
2932 /*
2933  * Return TRUE if the pmap is in shape to trivially
2934  * pre-fault the specified address.
2935  *
2936  * Returns FALSE if it would be non-trivial or if a
2937  * pte is already loaded into the slot.
2938  */
2939 int
2940 pmap_prefault_ok(pmap_t pmap, vm_offset_t addr)
2941 {
2942         pt_entry_t *pte;
2943         pd_entry_t *pde;
2944         int ret;
2945
2946         lwkt_gettoken(&vm_token);
2947         pde = pmap_pde(pmap, addr);
2948         if (pde == NULL || *pde == 0) {
2949                 ret = 0;
2950         } else {
2951                 pte = vtopte(addr);
2952                 ret = (*pte) ? 0 : 1;
2953         }
2954         lwkt_reltoken(&vm_token);
2955         return(ret);
2956 }
2957
2958 /*
2959  *      Routine:        pmap_change_wiring
2960  *      Function:       Change the wiring attribute for a map/virtual-address
2961  *                      pair.
2962  *      In/out conditions:
2963  *                      The mapping must already exist in the pmap.
2964  */
2965 void
2966 pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired)
2967 {
2968         pt_entry_t *pte;
2969
2970         if (pmap == NULL)
2971                 return;
2972
2973         lwkt_gettoken(&vm_token);
2974         pte = pmap_pte(pmap, va);
2975
2976         if (wired && !pmap_pte_w(pte))
2977                 pmap->pm_stats.wired_count++;
2978         else if (!wired && pmap_pte_w(pte))
2979                 pmap->pm_stats.wired_count--;
2980
2981         /*
2982          * Wiring is not a hardware characteristic so there is no need to
2983          * invalidate TLB.  However, in an SMP environment we must use
2984          * a locked bus cycle to update the pte (if we are not using 
2985          * the pmap_inval_*() API that is)... it's ok to do this for simple
2986          * wiring changes.
2987          */
2988 #ifdef SMP
2989         if (wired)
2990                 atomic_set_long(pte, PG_W);
2991         else
2992                 atomic_clear_long(pte, PG_W);
2993 #else
2994         if (wired)
2995                 atomic_set_long_nonlocked(pte, PG_W);
2996         else
2997                 atomic_clear_long_nonlocked(pte, PG_W);
2998 #endif
2999         lwkt_reltoken(&vm_token);
3000 }
3001
3002
3003
3004 /*
3005  *      Copy the range specified by src_addr/len
3006  *      from the source map to the range dst_addr/len
3007  *      in the destination map.
3008  *
3009  *      This routine is only advisory and need not do anything.
3010  */
3011 void
3012 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, 
3013           vm_size_t len, vm_offset_t src_addr)
3014 {
3015         return;
3016 #if 0
3017         pmap_inval_info info;
3018         vm_offset_t addr;
3019         vm_offset_t end_addr = src_addr + len;
3020         vm_offset_t pdnxt;
3021         pd_entry_t src_frame, dst_frame;
3022         vm_page_t m;
3023
3024         if (dst_addr != src_addr)
3025                 return;
3026 #if JGPMAP32
3027         src_frame = src_pmap->pm_pdir[PTDPTDI] & PG_FRAME;
3028         if (src_frame != (PTDpde & PG_FRAME)) {
3029                 return;
3030         }
3031
3032         dst_frame = dst_pmap->pm_pdir[PTDPTDI] & PG_FRAME;
3033         if (dst_frame != (APTDpde & PG_FRAME)) {
3034                 APTDpde = (pd_entry_t) (dst_frame | PG_RW | PG_V);
3035                 /* The page directory is not shared between CPUs */
3036                 cpu_invltlb();
3037         }
3038 #endif
3039         pmap_inval_init(&info);
3040         pmap_inval_add(&info, dst_pmap, -1);
3041         pmap_inval_add(&info, src_pmap, -1);
3042
3043         /*
3044          * critical section protection is required to maintain the page/object
3045          * association, interrupts can free pages and remove them from 
3046          * their objects.
3047          */
3048         crit_enter();
3049         for (addr = src_addr; addr < end_addr; addr = pdnxt) {
3050                 pt_entry_t *src_pte, *dst_pte;
3051                 vm_page_t dstmpte, srcmpte;
3052                 vm_offset_t srcptepaddr;
3053                 vm_pindex_t ptepindex;
3054
3055                 if (addr >= UPT_MIN_ADDRESS)
3056                         panic("pmap_copy: invalid to pmap_copy page tables\n");
3057
3058                 /*
3059                  * Don't let optional prefaulting of pages make us go
3060                  * way below the low water mark of free pages or way
3061                  * above high water mark of used pv entries.
3062                  */
3063                 if (vmstats.v_free_count < vmstats.v_free_reserved ||
3064                     pv_entry_count > pv_entry_high_water)
3065                         break;
3066                 
3067                 pdnxt = ((addr + PAGE_SIZE*NPTEPG) & ~(PAGE_SIZE*NPTEPG - 1));
3068                 ptepindex = addr >> PDRSHIFT;
3069
3070 #if JGPMAP32
3071                 srcptepaddr = (vm_offset_t) src_pmap->pm_pdir[ptepindex];
3072 #endif
3073                 if (srcptepaddr == 0)
3074                         continue;
3075                         
3076                 if (srcptepaddr & PG_PS) {
3077 #if JGPMAP32
3078                         if (dst_pmap->pm_pdir[ptepindex] == 0) {
3079                                 dst_pmap->pm_pdir[ptepindex] = (pd_entry_t) srcptepaddr;
3080                                 dst_pmap->pm_stats.resident_count += NBPDR / PAGE_SIZE;
3081                         }
3082 #endif
3083                         continue;
3084                 }
3085
3086                 srcmpte = vm_page_lookup(src_pmap->pm_pteobj, ptepindex);
3087                 if ((srcmpte == NULL) || (srcmpte->hold_count == 0) ||
3088                     (srcmpte->flags & PG_BUSY)) {
3089                         continue;
3090                 }
3091
3092                 if (pdnxt > end_addr)
3093                         pdnxt = end_addr;
3094
3095                 src_pte = vtopte(addr);
3096 #if JGPMAP32
3097                 dst_pte = avtopte(addr);
3098 #endif
3099                 while (addr < pdnxt) {
3100                         pt_entry_t ptetemp;
3101
3102                         ptetemp = *src_pte;
3103                         /*
3104                          * we only virtual copy managed pages
3105                          */
3106                         if ((ptetemp & PG_MANAGED) != 0) {
3107                                 /*
3108                                  * We have to check after allocpte for the
3109                                  * pte still being around...  allocpte can
3110                                  * block.
3111                                  *
3112                                  * pmap_allocpte() can block.  If we lose
3113                                  * our page directory mappings we stop.
3114                                  */
3115                                 dstmpte = pmap_allocpte(dst_pmap, addr);
3116
3117 #if JGPMAP32
3118                                 if (src_frame != (PTDpde & PG_FRAME) ||
3119                                     dst_frame != (APTDpde & PG_FRAME)
3120                                 ) {
3121                                         kprintf("WARNING: pmap_copy: detected and corrected race\n");
3122                                         pmap_unwire_pte_hold(dst_pmap, dstmpte, &info);
3123                                         goto failed;
3124                                 } else if ((*dst_pte == 0) &&
3125                                            (ptetemp = *src_pte) != 0 &&
3126                                            (ptetemp & PG_MANAGED)) {
3127                                         /*
3128                                          * Clear the modified and
3129                                          * accessed (referenced) bits
3130                                          * during the copy.
3131                                          */
3132                                         m = PHYS_TO_VM_PAGE(ptetemp);
3133                                         *dst_pte = ptetemp & ~(PG_M | PG_A);
3134                                         ++dst_pmap->pm_stats.resident_count;
3135                                         pmap_insert_entry(dst_pmap, addr,
3136                                                 dstmpte, m);
3137                                         KKASSERT(m->flags & PG_MAPPED);
3138                                 } else {
3139                                         kprintf("WARNING: pmap_copy: dst_pte race detected and corrected\n");
3140                                         pmap_unwire_pte_hold(dst_pmap, dstmpte, &info);
3141                                         goto failed;
3142                                 }
3143 #endif
3144                                 if (dstmpte->hold_count >= srcmpte->hold_count)
3145                                         break;
3146                         }
3147                         addr += PAGE_SIZE;
3148                         src_pte++;
3149                         dst_pte++;
3150                 }
3151         }
3152 failed:
3153         crit_exit();
3154         pmap_inval_done(&info);
3155 #endif
3156 }       
3157
3158 /*
3159  * pmap_zero_page:
3160  *
3161  *      Zero the specified physical page.
3162  *
3163  *      This function may be called from an interrupt and no locking is
3164  *      required.
3165  */
3166 void
3167 pmap_zero_page(vm_paddr_t phys)
3168 {
3169         vm_offset_t va = PHYS_TO_DMAP(phys);
3170
3171         pagezero((void *)va);
3172 }
3173
3174 /*
3175  * pmap_page_assertzero:
3176  *
3177  *      Assert that a page is empty, panic if it isn't.
3178  */
3179 void
3180 pmap_page_assertzero(vm_paddr_t phys)
3181 {
3182         vm_offset_t virt = PHYS_TO_DMAP(phys);
3183         int i;
3184
3185         for (i = 0; i < PAGE_SIZE; i += sizeof(long)) {
3186             if (*(long *)((char *)virt + i) != 0) {
3187                 panic("pmap_page_assertzero() @ %p not zero!\n", (void *)virt);
3188             }
3189         }
3190 }
3191
3192 /*
3193  * pmap_zero_page:
3194  *
3195  *      Zero part of a physical page by mapping it into memory and clearing
3196  *      its contents with bzero.
3197  *
3198  *      off and size may not cover an area beyond a single hardware page.
3199  */
3200 void
3201 pmap_zero_page_area(vm_paddr_t phys, int off, int size)
3202 {
3203         vm_offset_t virt = PHYS_TO_DMAP(phys);
3204
3205         bzero((char *)virt + off, size);
3206 }
3207
3208 /*
3209  * pmap_copy_page:
3210  *
3211  *      Copy the physical page from the source PA to the target PA.
3212  *      This function may be called from an interrupt.  No locking
3213  *      is required.
3214  */
3215 void
3216 pmap_copy_page(vm_paddr_t src, vm_paddr_t dst)
3217 {
3218         vm_offset_t src_virt, dst_virt;
3219
3220         src_virt = PHYS_TO_DMAP(src);
3221         dst_virt = PHYS_TO_DMAP(dst);
3222         bcopy((void *)src_virt, (void *)dst_virt, PAGE_SIZE);
3223 }
3224
3225 /*
3226  * pmap_copy_page_frag:
3227  *
3228  *      Copy the physical page from the source PA to the target PA.
3229  *      This function may be called from an interrupt.  No locking
3230  *      is required.
3231  */
3232 void
3233 pmap_copy_page_frag(vm_paddr_t src, vm_paddr_t dst, size_t bytes)
3234 {
3235         vm_offset_t src_virt, dst_virt;
3236
3237         src_virt = PHYS_TO_DMAP(src);
3238         dst_virt = PHYS_TO_DMAP(dst);
3239
3240         bcopy((char *)src_virt + (src & PAGE_MASK),
3241               (char *)dst_virt + (dst & PAGE_MASK),
3242               bytes);
3243 }
3244
3245 /*
3246  * Returns true if the pmap's pv is one of the first
3247  * 16 pvs linked to from this page.  This count may
3248  * be changed upwards or downwards in the future; it
3249  * is only necessary that true be returned for a small
3250  * subset of pmaps for proper page aging.
3251  */
3252 boolean_t
3253 pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
3254 {
3255         pv_entry_t pv;
3256         int loops = 0;
3257
3258         if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
3259                 return FALSE;
3260
3261         crit_enter();
3262         lwkt_gettoken(&vm_token);
3263
3264         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
3265                 if (pv->pv_pmap == pmap) {
3266                         lwkt_reltoken(&vm_token);
3267                         crit_exit();
3268                         return TRUE;
3269                 }
3270                 loops++;
3271                 if (loops >= 16)
3272                         break;
3273         }
3274         lwkt_reltoken(&vm_token);
3275         crit_exit();
3276         return (FALSE);
3277 }
3278
3279 /*
3280  * Remove all pages from specified address space
3281  * this aids process exit speeds.  Also, this code
3282  * is special cased for current process only, but
3283  * can have the more generic (and slightly slower)
3284  * mode enabled.  This is much faster than pmap_remove
3285  * in the case of running down an entire address space.
3286  */
3287 void
3288 pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
3289 {
3290         struct lwp *lp;
3291         pt_entry_t *pte, tpte;
3292         pv_entry_t pv, npv;
3293         vm_page_t m;
3294         pmap_inval_info info;
3295         int iscurrentpmap;
3296         int save_generation;
3297
3298         lp = curthread->td_lwp;
3299         if (lp && pmap == vmspace_pmap(lp->lwp_vmspace))
3300                 iscurrentpmap = 1;
3301         else
3302                 iscurrentpmap = 0;
3303
3304         lwkt_gettoken(&vm_token);
3305         pmap_inval_init(&info);
3306         for (pv = TAILQ_FIRST(&pmap->pm_pvlist); pv; pv = npv) {
3307                 if (pv->pv_va >= eva || pv->pv_va < sva) {
3308                         npv = TAILQ_NEXT(pv, pv_plist);
3309                         continue;
3310                 }
3311
3312                 KKASSERT(pmap == pv->pv_pmap);
3313
3314                 if (iscurrentpmap)
3315                         pte = vtopte(pv->pv_va);
3316                 else
3317                         pte = pmap_pte_quick(pmap, pv->pv_va);
3318                 pmap_inval_interlock(&info, pmap, pv->pv_va);
3319
3320                 /*
3321                  * We cannot remove wired pages from a process' mapping
3322                  * at this time
3323                  */
3324                 if (*pte & PG_W) {
3325                         pmap_inval_deinterlock(&info, pmap);
3326                         npv = TAILQ_NEXT(pv, pv_plist);
3327                         continue;
3328                 }
3329                 tpte = pte_load_clear(pte);
3330
3331                 m = PHYS_TO_VM_PAGE(tpte & PG_FRAME);
3332
3333                 KASSERT(m < &vm_page_array[vm_page_array_size],
3334                         ("pmap_remove_pages: bad tpte %lx", tpte));
3335
3336                 KKASSERT(pmap->pm_stats.resident_count > 0);
3337                 --pmap->pm_stats.resident_count;
3338                 pmap_inval_deinterlock(&info, pmap);
3339
3340                 /*
3341                  * Update the vm_page_t clean and reference bits.
3342                  */
3343                 if (tpte & PG_M) {
3344                         vm_page_dirty(m);
3345                 }
3346
3347                 npv = TAILQ_NEXT(pv, pv_plist);
3348                 TAILQ_REMOVE(&pmap->pm_pvlist, pv, pv_plist);
3349                 save_generation = ++pmap->pm_generation;
3350
3351                 m->md.pv_list_count--;
3352                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
3353                 if (TAILQ_EMPTY(&m->md.pv_list))
3354                         vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE);
3355
3356                 pmap_unuse_pt(pmap, pv->pv_va, pv->pv_ptem, &info);
3357                 free_pv_entry(pv);
3358
3359                 /*
3360                  * Restart the scan if we blocked during the unuse or free
3361                  * calls and other removals were made.
3362                  */
3363                 if (save_generation != pmap->pm_generation) {
3364                         kprintf("Warning: pmap_remove_pages race-A avoided\n");
3365                         npv = TAILQ_FIRST(&pmap->pm_pvlist);
3366                 }
3367         }
3368         pmap_inval_done(&info);
3369         lwkt_reltoken(&vm_token);
3370 }
3371
3372 /*
3373  * pmap_testbit tests bits in pte's
3374  * note that the testbit/clearbit routines are inline,
3375  * and a lot of things compile-time evaluate.
3376  */
3377 static
3378 boolean_t
3379 pmap_testbit(vm_page_t m, int bit)
3380 {
3381         pv_entry_t pv;
3382         pt_entry_t *pte;
3383
3384         if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
3385                 return FALSE;
3386
3387         if (TAILQ_FIRST(&m->md.pv_list) == NULL)
3388                 return FALSE;
3389
3390         crit_enter();
3391
3392         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
3393                 /*
3394                  * if the bit being tested is the modified bit, then
3395                  * mark clean_map and ptes as never
3396                  * modified.
3397                  */
3398                 if (bit & (PG_A|PG_M)) {
3399                         if (!pmap_track_modified(pv->pv_va))
3400                                 continue;
3401                 }
3402
3403 #if defined(PMAP_DIAGNOSTIC)
3404                 if (pv->pv_pmap == NULL) {
3405                         kprintf("Null pmap (tb) at va: 0x%lx\n", pv->pv_va);
3406                         continue;
3407                 }
3408 #endif
3409                 pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);
3410                 if (*pte & bit) {
3411                         crit_exit();
3412                         return TRUE;
3413                 }
3414         }
3415         crit_exit();
3416         return (FALSE);
3417 }
3418
3419 /*
3420  * this routine is used to modify bits in ptes
3421  */
3422 static __inline
3423 void
3424 pmap_clearbit(vm_page_t m, int bit)
3425 {
3426         struct pmap_inval_info info;
3427         pv_entry_t pv;
3428         pt_entry_t *pte;
3429         pt_entry_t pbits;
3430
3431         if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
3432                 return;
3433
3434         pmap_inval_init(&info);
3435
3436         /*
3437          * Loop over all current mappings setting/clearing as appropos If
3438          * setting RO do we need to clear the VAC?
3439          */
3440         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
3441                 /*
3442                  * don't write protect pager mappings
3443                  */
3444                 if (bit == PG_RW) {
3445                         if (!pmap_track_modified(pv->pv_va))
3446                                 continue;
3447                 }
3448
3449 #if defined(PMAP_DIAGNOSTIC)
3450                 if (pv->pv_pmap == NULL) {
3451                         kprintf("Null pmap (cb) at va: 0x%lx\n", pv->pv_va);
3452                         continue;
3453                 }
3454 #endif
3455
3456                 /*
3457                  * Careful here.  We can use a locked bus instruction to
3458                  * clear PG_A or PG_M safely but we need to synchronize
3459                  * with the target cpus when we mess with PG_RW.
3460                  *
3461                  * We do not have to force synchronization when clearing
3462                  * PG_M even for PTEs generated via virtual memory maps,
3463                  * because the virtual kernel will invalidate the pmap
3464                  * entry when/if it needs to resynchronize the Modify bit.
3465                  */
3466                 if (bit & PG_RW)
3467                         pmap_inval_interlock(&info, pv->pv_pmap, pv->pv_va);
3468                 pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);
3469 again:
3470                 pbits = *pte;
3471                 if (pbits & bit) {
3472                         if (bit == PG_RW) {
3473                                 if (pbits & PG_M) {
3474                                         vm_page_dirty(m);
3475                                         atomic_clear_long(pte, PG_M|PG_RW);
3476                                 } else {
3477                                         /*
3478                                          * The cpu may be trying to set PG_M
3479                                          * simultaniously with our clearing
3480                                          * of PG_RW.
3481                                          */
3482                                         if (!atomic_cmpset_long(pte, pbits,
3483                                                                pbits & ~PG_RW))
3484                                                 goto again;
3485                                 }
3486                         } else if (bit == PG_M) {
3487                                 /*
3488                                  * We could also clear PG_RW here to force
3489                                  * a fault on write to redetect PG_M for
3490                                  * virtual kernels, but it isn't necessary
3491                                  * since virtual kernels invalidate the pte 
3492                                  * when they clear the VPTE_M bit in their
3493                                  * virtual page tables.
3494                                  */
3495                                 atomic_clear_long(pte, PG_M);
3496                         } else {
3497                                 atomic_clear_long(pte, bit);
3498                         }
3499                 }
3500                 if (bit & PG_RW)
3501                         pmap_inval_deinterlock(&info, pv->pv_pmap);
3502         }
3503         pmap_inval_done(&info);
3504 }
3505
3506 /*
3507  *      pmap_page_protect:
3508  *
3509  *      Lower the permission for all mappings to a given page.
3510  */
3511 void
3512 pmap_page_protect(vm_page_t m, vm_prot_t prot)
3513 {
3514         /* JG NX support? */
3515         if ((prot & VM_PROT_WRITE) == 0) {
3516                 lwkt_gettoken(&vm_token);
3517                 if (prot & (VM_PROT_READ | VM_PROT_EXECUTE)) {
3518                         pmap_clearbit(m, PG_RW);
3519                         vm_page_flag_clear(m, PG_WRITEABLE);
3520                 } else {
3521                         pmap_remove_all(m);
3522                 }
3523                 lwkt_reltoken(&vm_token);
3524         }
3525 }
3526
3527 vm_paddr_t
3528 pmap_phys_address(vm_pindex_t ppn)
3529 {
3530         return (x86_64_ptob(ppn));
3531 }
3532
3533 /*
3534  *      pmap_ts_referenced:
3535  *
3536  *      Return a count of reference bits for a page, clearing those bits.
3537  *      It is not necessary for every reference bit to be cleared, but it
3538  *      is necessary that 0 only be returned when there are truly no
3539  *      reference bits set.
3540  *
3541  *      XXX: The exact number of bits to check and clear is a matter that
3542  *      should be tested and standardized at some point in the future for
3543  *      optimal aging of shared pages.
3544  */
3545 int
3546 pmap_ts_referenced(vm_page_t m)
3547 {
3548         pv_entry_t pv, pvf, pvn;
3549         pt_entry_t *pte;
3550         int rtval = 0;
3551
3552         if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
3553                 return (rtval);
3554
3555         crit_enter();
3556         lwkt_gettoken(&vm_token);
3557
3558         if ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
3559
3560                 pvf = pv;
3561
3562                 do {
3563                         pvn = TAILQ_NEXT(pv, pv_list);
3564
3565                         crit_enter();
3566                         TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
3567                         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
3568                         crit_exit();
3569
3570                         if (!pmap_track_modified(pv->pv_va))
3571                                 continue;
3572
3573                         pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);
3574
3575                         if (pte && (*pte & PG_A)) {
3576 #ifdef SMP
3577                                 atomic_clear_long(pte, PG_A);
3578 #else
3579                                 atomic_clear_long_nonlocked(pte, PG_A);
3580 #endif
3581                                 rtval++;
3582                                 if (rtval > 4) {
3583                                         break;
3584                                 }
3585                         }
3586                 } while ((pv = pvn) != NULL && pv != pvf);
3587         }
3588         lwkt_reltoken(&vm_token);
3589         crit_exit();
3590
3591         return (rtval);
3592 }
3593
3594 /*
3595  *      pmap_is_modified:
3596  *
3597  *      Return whether or not the specified physical page was modified
3598  *      in any physical maps.
3599  */
3600 boolean_t
3601 pmap_is_modified(vm_page_t m)
3602 {
3603         boolean_t res;
3604
3605         lwkt_gettoken(&vm_token);
3606         res = pmap_testbit(m, PG_M);
3607         lwkt_reltoken(&vm_token);
3608         return (res);
3609 }
3610
3611 /*
3612  *      Clear the modify bits on the specified physical page.
3613  */
3614 void
3615 pmap_clear_modify(vm_page_t m)
3616 {
3617         lwkt_gettoken(&vm_token);
3618         pmap_clearbit(m, PG_M);
3619         lwkt_reltoken(&vm_token);
3620 }
3621
3622 /*
3623  *      pmap_clear_reference:
3624  *
3625  *      Clear the reference bit on the specified physical page.
3626  */
3627 void
3628 pmap_clear_reference(vm_page_t m)
3629 {
3630         lwkt_gettoken(&vm_token);
3631         pmap_clearbit(m, PG_A);
3632         lwkt_reltoken(&vm_token);
3633 }
3634
3635 /*
3636  * Miscellaneous support routines follow
3637  */
3638
3639 static
3640 void
3641 i386_protection_init(void)
3642 {
3643         int *kp, prot;
3644
3645         /* JG NX support may go here; No VM_PROT_EXECUTE ==> set NX bit  */
3646         kp = protection_codes;
3647         for (prot = 0; prot < 8; prot++) {
3648                 switch (prot) {
3649                 case VM_PROT_NONE | VM_PROT_NONE | VM_PROT_NONE:
3650                         /*
3651                          * Read access is also 0. There isn't any execute bit,
3652                          * so just make it readable.
3653                          */
3654                 case VM_PROT_READ | VM_PROT_NONE | VM_PROT_NONE:
3655                 case VM_PROT_READ | VM_PROT_NONE | VM_PROT_EXECUTE:
3656                 case VM_PROT_NONE | VM_PROT_NONE | VM_PROT_EXECUTE:
3657                         *kp++ = 0;
3658                         break;
3659                 case VM_PROT_NONE | VM_PROT_WRITE | VM_PROT_NONE:
3660                 case VM_PROT_NONE | VM_PROT_WRITE | VM_PROT_EXECUTE:
3661                 case VM_PROT_READ | VM_PROT_WRITE | VM_PROT_NONE:
3662                 case VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE:
3663                         *kp++ = PG_RW;
3664                         break;
3665                 }
3666         }
3667 }
3668
3669 /*
3670  * Map a set of physical memory pages into the kernel virtual
3671  * address space. Return a pointer to where it is mapped. This
3672  * routine is intended to be used for mapping device memory,
3673  * NOT real memory.
3674  *
3675  * NOTE: we can't use pgeflag unless we invalidate the pages one at
3676  * a time.
3677  */
3678 void *
3679 pmap_mapdev(vm_paddr_t pa, vm_size_t size)
3680 {
3681         vm_offset_t va, tmpva, offset;
3682         pt_entry_t *pte;
3683
3684         offset = pa & PAGE_MASK;
3685         size = roundup(offset + size, PAGE_SIZE);
3686
3687         va = kmem_alloc_nofault(&kernel_map, size, PAGE_SIZE);
3688         if (va == 0)
3689                 panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
3690
3691         pa = pa & ~PAGE_MASK;
3692         for (tmpva = va; size > 0;) {
3693                 pte = vtopte(tmpva);
3694                 *pte = pa | PG_RW | PG_V; /* | pgeflag; */
3695                 size -= PAGE_SIZE;
3696                 tmpva += PAGE_SIZE;
3697                 pa += PAGE_SIZE;
3698         }
3699         cpu_invltlb();
3700         smp_invltlb();
3701
3702         return ((void *)(va + offset));
3703 }
3704
3705 void *
3706 pmap_mapdev_uncacheable(vm_paddr_t pa, vm_size_t size)
3707 {
3708         vm_offset_t va, tmpva, offset;
3709         pt_entry_t *pte;
3710
3711         offset = pa & PAGE_MASK;
3712         size = roundup(offset + size, PAGE_SIZE);
3713
3714         va = kmem_alloc_nofault(&kernel_map, size, PAGE_SIZE);
3715         if (va == 0)
3716                 panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
3717
3718         pa = pa & ~PAGE_MASK;
3719         for (tmpva = va; size > 0;) {
3720                 pte = vtopte(tmpva);
3721                 *pte = pa | PG_RW | PG_V | PG_N; /* | pgeflag; */
3722                 size -= PAGE_SIZE;
3723                 tmpva += PAGE_SIZE;
3724                 pa += PAGE_SIZE;
3725         }
3726         cpu_invltlb();
3727         smp_invltlb();
3728
3729         return ((void *)(va + offset));
3730 }
3731
3732 void
3733 pmap_unmapdev(vm_offset_t va, vm_size_t size)
3734 {
3735         vm_offset_t base, offset;
3736
3737         base = va & ~PAGE_MASK;
3738         offset = va & PAGE_MASK;
3739         size = roundup(offset + size, PAGE_SIZE);
3740         pmap_qremove(va, size >> PAGE_SHIFT);
3741         kmem_free(&kernel_map, base, size);
3742 }
3743
3744 /*
3745  * perform the pmap work for mincore
3746  */
3747 int
3748 pmap_mincore(pmap_t pmap, vm_offset_t addr)
3749 {
3750         pt_entry_t *ptep, pte;
3751         vm_page_t m;
3752         int val = 0;
3753         
3754         lwkt_gettoken(&vm_token);
3755         ptep = pmap_pte(pmap, addr);
3756
3757         if (ptep && (pte = *ptep) != 0) {
3758                 vm_offset_t pa;
3759
3760                 val = MINCORE_INCORE;
3761                 if ((pte & PG_MANAGED) == 0)
3762                         goto done;
3763
3764                 pa = pte & PG_FRAME;
3765
3766                 m = PHYS_TO_VM_PAGE(pa);
3767
3768                 /*
3769                  * Modified by us
3770                  */
3771                 if (pte & PG_M)
3772                         val |= MINCORE_MODIFIED|MINCORE_MODIFIED_OTHER;
3773                 /*
3774                  * Modified by someone
3775                  */
3776                 else if (m->dirty || pmap_is_modified(m))
3777                         val |= MINCORE_MODIFIED_OTHER;
3778                 /*
3779                  * Referenced by us
3780                  */
3781                 if (pte & PG_A)
3782                         val |= MINCORE_REFERENCED|MINCORE_REFERENCED_OTHER;
3783
3784                 /*
3785                  * Referenced by someone
3786                  */
3787                 else if ((m->flags & PG_REFERENCED) || pmap_ts_referenced(m)) {
3788                         val |= MINCORE_REFERENCED_OTHER;
3789                         vm_page_flag_set(m, PG_REFERENCED);
3790                 }
3791         } 
3792 done:
3793         lwkt_reltoken(&vm_token);
3794         return val;
3795 }
3796
3797 /*
3798  * Replace p->p_vmspace with a new one.  If adjrefs is non-zero the new
3799  * vmspace will be ref'd and the old one will be deref'd.
3800  *
3801  * The vmspace for all lwps associated with the process will be adjusted
3802  * and cr3 will be reloaded if any lwp is the current lwp.
3803  */
3804 void
3805 pmap_replacevm(struct proc *p, struct vmspace *newvm, int adjrefs)
3806 {
3807         struct vmspace *oldvm;
3808         struct lwp *lp;
3809
3810         crit_enter();
3811         oldvm = p->p_vmspace;
3812         if (oldvm != newvm) {
3813                 p->p_vmspace = newvm;
3814                 KKASSERT(p->p_nthreads == 1);
3815                 lp = RB_ROOT(&p->p_lwp_tree);
3816                 pmap_setlwpvm(lp, newvm);
3817                 if (adjrefs) {
3818                         sysref_get(&newvm->vm_sysref);
3819                         sysref_put(&oldvm->vm_sysref);
3820                 }
3821         }
3822         crit_exit();
3823 }
3824
3825 /*
3826  * Set the vmspace for a LWP.  The vmspace is almost universally set the
3827  * same as the process vmspace, but virtual kernels need to swap out contexts
3828  * on a per-lwp basis.
3829  */
3830 void
3831 pmap_setlwpvm(struct lwp *lp, struct vmspace *newvm)
3832 {
3833         struct vmspace *oldvm;
3834         struct pmap *pmap;
3835
3836         crit_enter();
3837         oldvm = lp->lwp_vmspace;
3838
3839         if (oldvm != newvm) {
3840                 lp->lwp_vmspace = newvm;
3841                 if (curthread->td_lwp == lp) {
3842                         pmap = vmspace_pmap(newvm);
3843 #if defined(SMP)
3844                         atomic_set_int(&pmap->pm_active, mycpu->gd_cpumask);
3845                         if (pmap->pm_active & CPUMASK_LOCK)
3846                                 pmap_interlock_wait(newvm);
3847 #else
3848                         pmap->pm_active |= 1;
3849 #endif
3850 #if defined(SWTCH_OPTIM_STATS)
3851                         tlb_flush_count++;
3852 #endif
3853                         curthread->td_pcb->pcb_cr3 = vtophys(pmap->pm_pml4);
3854                         curthread->td_pcb->pcb_cr3 |= PG_RW | PG_U | PG_V;
3855                         load_cr3(curthread->td_pcb->pcb_cr3);
3856                         pmap = vmspace_pmap(oldvm);
3857 #if defined(SMP)
3858                         atomic_clear_int(&pmap->pm_active, mycpu->gd_cpumask);
3859 #else
3860                         pmap->pm_active &= ~1;
3861 #endif
3862                 }
3863         }
3864         crit_exit();
3865 }
3866
3867 #ifdef SMP
3868
3869 /*
3870  * Called when switching to a locked pmap
3871  */
3872 void
3873 pmap_interlock_wait(struct vmspace *vm)
3874 {
3875         struct pmap *pmap = &vm->vm_pmap;
3876
3877         if (pmap->pm_active & CPUMASK_LOCK) {
3878                 while (pmap->pm_active & CPUMASK_LOCK) {
3879                         cpu_pause();
3880                         cpu_ccfence();
3881                         lwkt_process_ipiq();
3882                 }
3883         }
3884 }
3885
3886 #endif
3887
3888 vm_offset_t
3889 pmap_addr_hint(vm_object_t obj, vm_offset_t addr, vm_size_t size)
3890 {
3891
3892         if ((obj == NULL) || (size < NBPDR) || (obj->type != OBJT_DEVICE)) {
3893                 return addr;
3894         }
3895
3896         addr = (addr + (NBPDR - 1)) & ~(NBPDR - 1);
3897         return addr;
3898 }
3899
3900 /*
3901  * Used by kmalloc/kfree, page already exists at va
3902  */
3903 vm_page_t
3904 pmap_kvtom(vm_offset_t va)
3905 {
3906         return(PHYS_TO_VM_PAGE(*vtopte(va) & PG_FRAME));
3907 }