kernel: Correctly handle fake pages
[dragonfly.git] / sys / platform / vkernel64 / platform / 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
53 #if JG
54 #include "opt_pmap.h"
55 #endif
56 #include "opt_msgbuf.h"
57
58 #include <sys/param.h>
59 #include <sys/systm.h>
60 #include <sys/kernel.h>
61 #include <sys/proc.h>
62 #include <sys/msgbuf.h>
63 #include <sys/vmmeter.h>
64 #include <sys/mman.h>
65 #include <sys/vmspace.h>
66
67 #include <vm/vm.h>
68 #include <vm/vm_param.h>
69 #include <sys/sysctl.h>
70 #include <sys/lock.h>
71 #include <vm/vm_kern.h>
72 #include <vm/vm_page.h>
73 #include <vm/vm_map.h>
74 #include <vm/vm_object.h>
75 #include <vm/vm_extern.h>
76 #include <vm/vm_pageout.h>
77 #include <vm/vm_pager.h>
78 #include <vm/vm_zone.h>
79
80 #include <sys/user.h>
81 #include <sys/thread2.h>
82 #include <sys/sysref2.h>
83 #include <sys/spinlock2.h>
84
85 #include <machine/cputypes.h>
86 #include <machine/md_var.h>
87 #include <machine/specialreg.h>
88 #include <machine/smp.h>
89 #include <machine/globaldata.h>
90 #include <machine/pmap.h>
91 #include <machine/pmap_inval.h>
92
93 #include <ddb/ddb.h>
94
95 #include <stdio.h>
96 #include <assert.h>
97 #include <stdlib.h>
98
99 #define PMAP_KEEP_PDIRS
100 #ifndef PMAP_SHPGPERPROC
101 #define PMAP_SHPGPERPROC 1000
102 #endif
103
104 #if defined(DIAGNOSTIC)
105 #define PMAP_DIAGNOSTIC
106 #endif
107
108 #define MINPV 2048
109
110 #if !defined(PMAP_DIAGNOSTIC)
111 #define PMAP_INLINE __inline
112 #else
113 #define PMAP_INLINE
114 #endif
115
116 /*
117  * Get PDEs and PTEs for user/kernel address space
118  */
119 static pd_entry_t *pmap_pde(pmap_t pmap, vm_offset_t va);
120 #define pdir_pde(m, v) (m[(vm_offset_t)(v) >> PDRSHIFT])
121
122 #define pmap_pde_v(pte)         ((*(pd_entry_t *)pte & VPTE_V) != 0)
123 #define pmap_pte_w(pte)         ((*(pt_entry_t *)pte & VPTE_WIRED) != 0)
124 #define pmap_pte_m(pte)         ((*(pt_entry_t *)pte & VPTE_M) != 0)
125 #define pmap_pte_u(pte)         ((*(pt_entry_t *)pte & VPTE_A) != 0)
126 #define pmap_pte_v(pte)         ((*(pt_entry_t *)pte & VPTE_V) != 0)
127
128 /*
129  * Given a map and a machine independent protection code,
130  * convert to a vax protection code.
131  */
132 #define pte_prot(m, p)          \
133         (protection_codes[p & (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE)])
134 static int protection_codes[8];
135
136 struct pmap kernel_pmap;
137 static TAILQ_HEAD(,pmap)        pmap_list = TAILQ_HEAD_INITIALIZER(pmap_list);
138
139 static boolean_t pmap_initialized = FALSE;      /* Has pmap_init completed? */
140
141 static vm_object_t kptobj;
142
143 static int nkpt;
144
145 static uint64_t KPDphys;        /* phys addr of kernel level 2 */
146 uint64_t                KPDPphys;       /* phys addr of kernel level 3 */
147 uint64_t                KPML4phys;      /* phys addr of kernel level 4 */
148
149
150 /*
151  * Data for the pv entry allocation mechanism
152  */
153 static vm_zone_t pvzone;
154 static struct vm_zone pvzone_store;
155 static struct vm_object pvzone_obj;
156 static int pv_entry_count=0, pv_entry_max=0, pv_entry_high_water=0;
157 static int pmap_pagedaemon_waken = 0;
158 static struct pv_entry *pvinit;
159
160 /*
161  * All those kernel PT submaps that BSD is so fond of
162  */
163 pt_entry_t *CMAP1 = NULL, *ptmmap;
164 caddr_t CADDR1 = NULL;
165 static pt_entry_t *msgbufmap;
166
167 uint64_t KPTphys;
168
169 static PMAP_INLINE void free_pv_entry (pv_entry_t pv);
170 static pv_entry_t get_pv_entry (void);
171 static void     i386_protection_init (void);
172 static __inline void    pmap_clearbit (vm_page_t m, int bit);
173
174 static void     pmap_remove_all (vm_page_t m);
175 static int pmap_remove_pte (struct pmap *pmap, pt_entry_t *ptq,
176                                 vm_offset_t sva);
177 static void pmap_remove_page (struct pmap *pmap, vm_offset_t va);
178 static int pmap_remove_entry (struct pmap *pmap, vm_page_t m,
179                                 vm_offset_t va);
180 static boolean_t pmap_testbit (vm_page_t m, int bit);
181 static void pmap_insert_entry (pmap_t pmap, vm_offset_t va,
182                 vm_page_t mpte, vm_page_t m);
183
184 static vm_page_t pmap_allocpte (pmap_t pmap, vm_offset_t va);
185
186 static int pmap_release_free_page (pmap_t pmap, vm_page_t p);
187 static vm_page_t _pmap_allocpte (pmap_t pmap, vm_pindex_t ptepindex);
188 #if JGPMAP32
189 static pt_entry_t * pmap_pte_quick (pmap_t pmap, vm_offset_t va);
190 #endif
191 static vm_page_t pmap_page_lookup (vm_object_t object, vm_pindex_t pindex);
192 static int pmap_unuse_pt (pmap_t, vm_offset_t, vm_page_t);
193
194 /*
195  * pmap_pte_quick:
196  *
197  *      Super fast pmap_pte routine best used when scanning the pv lists.
198  *      This eliminates many course-grained invltlb calls.  Note that many of
199  *      the pv list scans are across different pmaps and it is very wasteful
200  *      to do an entire invltlb when checking a single mapping.
201  *
202  *      Should only be called while in a critical section.
203  */
204 #if JGPMAP32
205 static __inline pt_entry_t *pmap_pte(pmap_t pmap, vm_offset_t va);
206
207 static pt_entry_t *
208 pmap_pte_quick(pmap_t pmap, vm_offset_t va)
209 {
210         return pmap_pte(pmap, va);
211 }
212 #endif
213
214 /* Return a non-clipped PD index for a given VA */
215 static __inline vm_pindex_t
216 pmap_pde_pindex(vm_offset_t va)
217 {
218         return va >> PDRSHIFT;
219 }
220
221 /* Return various clipped indexes for a given VA */
222 static __inline vm_pindex_t
223 pmap_pte_index(vm_offset_t va)
224 {
225
226         return ((va >> PAGE_SHIFT) & ((1ul << NPTEPGSHIFT) - 1));
227 }
228
229 static __inline vm_pindex_t
230 pmap_pde_index(vm_offset_t va)
231 {
232
233         return ((va >> PDRSHIFT) & ((1ul << NPDEPGSHIFT) - 1));
234 }
235
236 static __inline vm_pindex_t
237 pmap_pdpe_index(vm_offset_t va)
238 {
239
240         return ((va >> PDPSHIFT) & ((1ul << NPDPEPGSHIFT) - 1));
241 }
242
243 static __inline vm_pindex_t
244 pmap_pml4e_index(vm_offset_t va)
245 {
246
247         return ((va >> PML4SHIFT) & ((1ul << NPML4EPGSHIFT) - 1));
248 }
249
250 /* Return a pointer to the PML4 slot that corresponds to a VA */
251 static __inline pml4_entry_t *
252 pmap_pml4e(pmap_t pmap, vm_offset_t va)
253 {
254
255         return (&pmap->pm_pml4[pmap_pml4e_index(va)]);
256 }
257
258 /* Return a pointer to the PDP slot that corresponds to a VA */
259 static __inline pdp_entry_t *
260 pmap_pml4e_to_pdpe(pml4_entry_t *pml4e, vm_offset_t va)
261 {
262         pdp_entry_t *pdpe;
263
264         pdpe = (pdp_entry_t *)PHYS_TO_DMAP(*pml4e & VPTE_FRAME);
265         return (&pdpe[pmap_pdpe_index(va)]);
266 }
267
268 /* Return a pointer to the PDP slot that corresponds to a VA */
269 static __inline pdp_entry_t *
270 pmap_pdpe(pmap_t pmap, vm_offset_t va)
271 {
272         pml4_entry_t *pml4e;
273
274         pml4e = pmap_pml4e(pmap, va);
275         if ((*pml4e & VPTE_V) == 0)
276                 return NULL;
277         return (pmap_pml4e_to_pdpe(pml4e, va));
278 }
279
280 /* Return a pointer to the PD slot that corresponds to a VA */
281 static __inline pd_entry_t *
282 pmap_pdpe_to_pde(pdp_entry_t *pdpe, vm_offset_t va)
283 {
284         pd_entry_t *pde;
285
286         pde = (pd_entry_t *)PHYS_TO_DMAP(*pdpe & VPTE_FRAME);
287         return (&pde[pmap_pde_index(va)]);
288 }
289
290 /* Return a pointer to the PD slot that corresponds to a VA */
291 static __inline pd_entry_t *
292 pmap_pde(pmap_t pmap, vm_offset_t va)
293 {
294         pdp_entry_t *pdpe;
295
296         pdpe = pmap_pdpe(pmap, va);
297         if (pdpe == NULL || (*pdpe & VPTE_V) == 0)
298                  return NULL;
299         return (pmap_pdpe_to_pde(pdpe, va));
300 }
301
302 /* Return a pointer to the PT slot that corresponds to a VA */
303 static __inline pt_entry_t *
304 pmap_pde_to_pte(pd_entry_t *pde, vm_offset_t va)
305 {
306         pt_entry_t *pte;
307
308         pte = (pt_entry_t *)PHYS_TO_DMAP(*pde & VPTE_FRAME);
309         return (&pte[pmap_pte_index(va)]);
310 }
311
312 /* Return a pointer to the PT slot that corresponds to a VA */
313 static __inline pt_entry_t *
314 pmap_pte(pmap_t pmap, vm_offset_t va)
315 {
316         pd_entry_t *pde;
317
318         pde = pmap_pde(pmap, va);
319         if (pde == NULL || (*pde & VPTE_V) == 0)
320                 return NULL;
321         if ((*pde & VPTE_PS) != 0)      /* compat with i386 pmap_pte() */
322                 return ((pt_entry_t *)pde);
323         return (pmap_pde_to_pte(pde, va));
324 }
325
326
327 #if JGV
328 PMAP_INLINE pt_entry_t *
329 vtopte(vm_offset_t va)
330 {
331         uint64_t mask = ((1ul << (NPTEPGSHIFT + NPDEPGSHIFT +
332                                   NPDPEPGSHIFT + NPML4EPGSHIFT)) - 1);
333
334         return (PTmap + ((va >> PAGE_SHIFT) & mask));
335 }
336
337 static __inline pd_entry_t *
338 vtopde(vm_offset_t va)
339 {
340         uint64_t mask = ((1ul << (NPDEPGSHIFT + NPDPEPGSHIFT +
341                                   NPML4EPGSHIFT)) - 1);
342
343         return (PDmap + ((va >> PDRSHIFT) & mask));
344 }
345 #else
346 static PMAP_INLINE pt_entry_t *
347 vtopte(vm_offset_t va)
348 {
349         pt_entry_t *x;
350         x = pmap_pte(&kernel_pmap, va);
351         assert(x != NULL);
352         return x;
353 }
354
355 static __inline pd_entry_t *
356 vtopde(vm_offset_t va)
357 {
358         pd_entry_t *x;
359         x = pmap_pde(&kernel_pmap, va);
360         assert(x != NULL);
361         return x;
362 }
363 #endif
364
365 static uint64_t
366 allocpages(vm_paddr_t *firstaddr, int n)
367 {
368         uint64_t ret;
369
370         ret = *firstaddr;
371 #if JGV
372         bzero((void *)ret, n * PAGE_SIZE);
373 #endif
374         *firstaddr += n * PAGE_SIZE;
375         return (ret);
376 }
377
378 static void
379 create_pagetables(vm_paddr_t *firstaddr, int64_t ptov_offset)
380 {
381         int i;
382         pml4_entry_t *KPML4virt;
383         pdp_entry_t *KPDPvirt;
384         pd_entry_t *KPDvirt;
385         pt_entry_t *KPTvirt;
386         int kpml4i = pmap_pml4e_index(ptov_offset);
387         int kpdpi = pmap_pdpe_index(ptov_offset);
388
389         /*
390          * Calculate NKPT - number of kernel page tables.  We have to
391          * accomodoate prealloction of the vm_page_array, dump bitmap,
392          * MSGBUF_SIZE, and other stuff.  Be generous.
393          *
394          * Maxmem is in pages.
395          */
396         nkpt = (Maxmem * (sizeof(struct vm_page) * 2) + MSGBUF_SIZE) / NBPDR;
397
398         /*
399          * Allocate pages
400          */
401         KPML4phys = allocpages(firstaddr, 1);
402         KPDPphys = allocpages(firstaddr, NKPML4E);
403         KPDphys = allocpages(firstaddr, NKPDPE);
404         KPTphys = allocpages(firstaddr, nkpt);
405
406         KPML4virt = (pml4_entry_t *)PHYS_TO_DMAP(KPML4phys);
407         KPDPvirt = (pdp_entry_t *)PHYS_TO_DMAP(KPDPphys);
408         KPDvirt = (pd_entry_t *)PHYS_TO_DMAP(KPDphys);
409         KPTvirt = (pt_entry_t *)PHYS_TO_DMAP(KPTphys);
410
411         bzero(KPML4virt, 1 * PAGE_SIZE);
412         bzero(KPDPvirt, NKPML4E * PAGE_SIZE);
413         bzero(KPDvirt, NKPDPE * PAGE_SIZE);
414         bzero(KPTvirt, nkpt * PAGE_SIZE);
415
416         /* Now map the page tables at their location within PTmap */
417         for (i = 0; i < nkpt; i++) {
418                 KPDvirt[i] = KPTphys + (i << PAGE_SHIFT);
419                 KPDvirt[i] |= VPTE_R | VPTE_W | VPTE_V;
420         }
421
422         /* And connect up the PD to the PDP */
423         for (i = 0; i < NKPDPE; i++) {
424                 KPDPvirt[i + kpdpi] = KPDphys + (i << PAGE_SHIFT);
425                 KPDPvirt[i + kpdpi] |= VPTE_R | VPTE_W | VPTE_V;
426         }
427
428         /* And recursively map PML4 to itself in order to get PTmap */
429         KPML4virt[PML4PML4I] = KPML4phys;
430         KPML4virt[PML4PML4I] |= VPTE_R | VPTE_W | VPTE_V;
431
432         /* Connect the KVA slot up to the PML4 */
433         KPML4virt[kpml4i] = KPDPphys;
434         KPML4virt[kpml4i] |= VPTE_R | VPTE_W | VPTE_V;
435 }
436
437 /*
438  * Typically used to initialize a fictitious page by vm/device_pager.c
439  */
440 void
441 pmap_page_init(struct vm_page *m)
442 {
443         vm_page_init(m);
444         TAILQ_INIT(&m->md.pv_list);
445 }
446
447 /*
448  *      Bootstrap the system enough to run with virtual memory.
449  *
450  *      On the i386 this is called after mapping has already been enabled
451  *      and just syncs the pmap module with what has already been done.
452  *      [We can't call it easily with mapping off since the kernel is not
453  *      mapped with PA == VA, hence we would have to relocate every address
454  *      from the linked base (virtual) address "KERNBASE" to the actual
455  *      (physical) address starting relative to 0]
456  */
457 void
458 pmap_bootstrap(vm_paddr_t *firstaddr, int64_t ptov_offset)
459 {
460         vm_offset_t va;
461         pt_entry_t *pte;
462
463         /*
464          * Create an initial set of page tables to run the kernel in.
465          */
466         create_pagetables(firstaddr, ptov_offset);
467
468         virtual_start = KvaStart + *firstaddr;
469         virtual_end = KvaEnd;
470
471         /*
472          * Initialize protection array.
473          */
474         i386_protection_init();
475
476         /*
477          * The kernel's pmap is statically allocated so we don't have to use
478          * pmap_create, which is unlikely to work correctly at this part of
479          * the boot sequence (XXX and which no longer exists).
480          *
481          * The kernel_pmap's pm_pteobj is used only for locking and not
482          * for mmu pages.
483          */
484         kernel_pmap.pm_pml4 = (pml4_entry_t *)PHYS_TO_DMAP(KPML4phys);
485         kernel_pmap.pm_count = 1;
486         kernel_pmap.pm_active = (cpumask_t)-1;  /* don't allow deactivation */
487         kernel_pmap.pm_pteobj = &kernel_object;
488         TAILQ_INIT(&kernel_pmap.pm_pvlist);
489         TAILQ_INIT(&kernel_pmap.pm_pvlist_free);
490         lwkt_token_init(&kernel_pmap.pm_token, "kpmap_tok");
491         spin_init(&kernel_pmap.pm_spin);
492
493         /*
494          * Reserve some special page table entries/VA space for temporary
495          * mapping of pages.
496          */
497 #define SYSMAP(c, p, v, n)      \
498         v = (c)va; va += ((n)*PAGE_SIZE); p = pte; pte += (n);
499
500         va = virtual_start;
501         pte = pmap_pte(&kernel_pmap, va);
502
503         /*
504          * CMAP1/CMAP2 are used for zeroing and copying pages.
505          */
506         SYSMAP(caddr_t, CMAP1, CADDR1, 1)
507
508 #if JGV
509         /*
510          * Crashdump maps.
511          */
512         SYSMAP(caddr_t, pt_crashdumpmap, crashdumpmap, MAXDUMPPGS);
513 #endif
514
515         /*
516          * ptvmmap is used for reading arbitrary physical pages via
517          * /dev/mem.
518          */
519         SYSMAP(caddr_t, ptmmap, ptvmmap, 1)
520
521         /*
522          * msgbufp is used to map the system message buffer.
523          * XXX msgbufmap is not used.
524          */
525         SYSMAP(struct msgbuf *, msgbufmap, msgbufp,
526                atop(round_page(MSGBUF_SIZE)))
527
528         virtual_start = va;
529
530         *CMAP1 = 0;
531
532         cpu_invltlb();
533 }
534
535 /*
536  *      Initialize the pmap module.
537  *      Called by vm_init, to initialize any structures that the pmap
538  *      system needs to map virtual memory.
539  *      pmap_init has been enhanced to support in a fairly consistant
540  *      way, discontiguous physical memory.
541  */
542 void
543 pmap_init(void)
544 {
545         int i;
546         int initial_pvs;
547
548         /*
549          * object for kernel page table pages
550          */
551         /* JG I think the number can be arbitrary */
552         kptobj = vm_object_allocate(OBJT_DEFAULT, 5);
553
554         /*
555          * Allocate memory for random pmap data structures.  Includes the
556          * pv_head_table.
557          */
558
559         for(i = 0; i < vm_page_array_size; i++) {
560                 vm_page_t m;
561
562                 m = &vm_page_array[i];
563                 TAILQ_INIT(&m->md.pv_list);
564                 m->md.pv_list_count = 0;
565         }
566
567         /*
568          * init the pv free list
569          */
570         initial_pvs = vm_page_array_size;
571         if (initial_pvs < MINPV)
572                 initial_pvs = MINPV;
573         pvzone = &pvzone_store;
574         pvinit = (struct pv_entry *) kmem_alloc(&kernel_map,
575                 initial_pvs * sizeof (struct pv_entry));
576         zbootinit(pvzone, "PV ENTRY", sizeof (struct pv_entry), pvinit,
577                 initial_pvs);
578
579         /*
580          * Now it is safe to enable pv_table recording.
581          */
582         pmap_initialized = TRUE;
583 }
584
585 /*
586  * Initialize the address space (zone) for the pv_entries.  Set a
587  * high water mark so that the system can recover from excessive
588  * numbers of pv entries.
589  */
590 void
591 pmap_init2(void)
592 {
593         int shpgperproc = PMAP_SHPGPERPROC;
594
595         TUNABLE_INT_FETCH("vm.pmap.shpgperproc", &shpgperproc);
596         pv_entry_max = shpgperproc * maxproc + vm_page_array_size;
597         TUNABLE_INT_FETCH("vm.pmap.pv_entries", &pv_entry_max);
598         pv_entry_high_water = 9 * (pv_entry_max / 10);
599         zinitna(pvzone, &pvzone_obj, NULL, 0, pv_entry_max, ZONE_INTERRUPT, 1);
600 }
601
602
603 /***************************************************
604  * Low level helper routines.....
605  ***************************************************/
606
607 /*
608  * The modification bit is not tracked for any pages in this range. XXX
609  * such pages in this maps should always use pmap_k*() functions and not
610  * be managed anyhow.
611  *
612  * XXX User and kernel address spaces are independant for virtual kernels,
613  * this function only applies to the kernel pmap.
614  */
615 static int
616 pmap_track_modified(pmap_t pmap, vm_offset_t va)
617 {
618         if (pmap != &kernel_pmap)
619                 return 1;
620         if ((va < clean_sva) || (va >= clean_eva))
621                 return 1;
622         else
623                 return 0;
624 }
625
626 /*
627  * Extract the physical page address associated with the map/VA pair.
628  *
629  * No requirements.
630  */
631 vm_paddr_t
632 pmap_extract(pmap_t pmap, vm_offset_t va)
633 {
634         vm_paddr_t rtval;
635         pt_entry_t *pte;
636         pd_entry_t pde, *pdep;
637
638         lwkt_gettoken(&vm_token);
639         rtval = 0;
640         pdep = pmap_pde(pmap, va);
641         if (pdep != NULL) {
642                 pde = *pdep;
643                 if (pde) {
644                         if ((pde & VPTE_PS) != 0) {
645                                 /* JGV */
646                                 rtval = (pde & PG_PS_FRAME) | (va & PDRMASK);
647                         } else {
648                                 pte = pmap_pde_to_pte(pdep, va);
649                                 rtval = (*pte & VPTE_FRAME) | (va & PAGE_MASK);
650                         }
651                 }
652         }
653         lwkt_reltoken(&vm_token);
654         return rtval;
655 }
656
657 /*
658  *      Routine:        pmap_kextract
659  *      Function:
660  *              Extract the physical page address associated
661  *              kernel virtual address.
662  */
663 vm_paddr_t
664 pmap_kextract(vm_offset_t va)
665 {
666         pd_entry_t pde;
667         vm_paddr_t pa;
668
669         KKASSERT(va >= KvaStart && va < KvaEnd);
670
671         /*
672          * The DMAP region is not included in [KvaStart, KvaEnd)
673          */
674 #if 0
675         if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS) {
676                 pa = DMAP_TO_PHYS(va);
677         } else {
678 #endif
679                 pde = *vtopde(va);
680                 if (pde & VPTE_PS) {
681                         /* JGV */
682                         pa = (pde & PG_PS_FRAME) | (va & PDRMASK);
683                 } else {
684                         /*
685                          * Beware of a concurrent promotion that changes the
686                          * PDE at this point!  For example, vtopte() must not
687                          * be used to access the PTE because it would use the
688                          * new PDE.  It is, however, safe to use the old PDE
689                          * because the page table page is preserved by the
690                          * promotion.
691                          */
692                         pa = *pmap_pde_to_pte(&pde, va);
693                         pa = (pa & VPTE_FRAME) | (va & PAGE_MASK);
694                 }
695 #if 0
696         }
697 #endif
698         return pa;
699 }
700
701 /***************************************************
702  * Low level mapping routines.....
703  ***************************************************/
704
705 /*
706  * Enter a mapping into kernel_pmap.  Mappings created in this fashion
707  * are not managed.  Mappings must be immediately accessible on all cpus.
708  *
709  * Call pmap_inval_pte() to invalidate the virtual pte and clean out the
710  * real pmap and handle related races before storing the new vpte.
711  */
712 void
713 pmap_kenter(vm_offset_t va, vm_paddr_t pa)
714 {
715         pt_entry_t *pte;
716         pt_entry_t npte;
717
718         KKASSERT(va >= KvaStart && va < KvaEnd);
719         npte = pa | VPTE_R | VPTE_W | VPTE_V;
720         pte = vtopte(va);
721         if (*pte & VPTE_V)
722                 pmap_inval_pte(pte, &kernel_pmap, va);
723         *pte = npte;
724 }
725
726 /*
727  * Enter an unmanaged KVA mapping for the private use of the current
728  * cpu only.  pmap_kenter_sync() may be called to make the mapping usable
729  * by other cpus.
730  *
731  * It is illegal for the mapping to be accessed by other cpus unleess
732  * pmap_kenter_sync*() is called.
733  */
734 void
735 pmap_kenter_quick(vm_offset_t va, vm_paddr_t pa)
736 {
737         pt_entry_t *pte;
738         pt_entry_t npte;
739
740         KKASSERT(va >= KvaStart && va < KvaEnd);
741
742         npte = (vpte_t)pa | VPTE_R | VPTE_W | VPTE_V;
743         pte = vtopte(va);
744         if (*pte & VPTE_V)
745                 pmap_inval_pte_quick(pte, &kernel_pmap, va);
746         *pte = npte;
747         //cpu_invlpg((void *)va);
748 }
749
750 /*
751  * Synchronize a kvm mapping originally made for the private use on
752  * some other cpu so it can be used on all cpus.
753  *
754  * XXX add MADV_RESYNC to improve performance.
755  */
756 void
757 pmap_kenter_sync(vm_offset_t va)
758 {
759         madvise((void *)va, PAGE_SIZE, MADV_INVAL);
760 }
761
762 /*
763  * Synchronize a kvm mapping originally made for the private use on
764  * some other cpu so it can be used on our cpu.  Turns out to be the
765  * same madvise() call, because we have to sync the real pmaps anyway.
766  *
767  * XXX add MADV_RESYNC to improve performance.
768  */
769 void
770 pmap_kenter_sync_quick(vm_offset_t va)
771 {
772         madvise((void *)va, PAGE_SIZE, MADV_INVAL);
773 }
774
775 /*
776  * Remove an unmanaged mapping created with pmap_kenter*().
777  */
778 void
779 pmap_kremove(vm_offset_t va)
780 {
781         pt_entry_t *pte;
782
783         KKASSERT(va >= KvaStart && va < KvaEnd);
784
785         pte = vtopte(va);
786         if (*pte & VPTE_V)
787                 pmap_inval_pte(pte, &kernel_pmap, va);
788         *pte = 0;
789 }
790
791 /*
792  * Remove an unmanaged mapping created with pmap_kenter*() but synchronize
793  * only with this cpu.
794  *
795  * Unfortunately because we optimize new entries by testing VPTE_V later
796  * on, we actually still have to synchronize with all the cpus.  XXX maybe
797  * store a junk value and test against 0 in the other places instead?
798  */
799 void
800 pmap_kremove_quick(vm_offset_t va)
801 {
802         pt_entry_t *pte;
803
804         KKASSERT(va >= KvaStart && va < KvaEnd);
805
806         pte = vtopte(va);
807         if (*pte & VPTE_V)
808                 pmap_inval_pte(pte, &kernel_pmap, va); /* NOT _quick */
809         *pte = 0;
810 }
811
812 /*
813  *      Used to map a range of physical addresses into kernel
814  *      virtual address space.
815  *
816  *      For now, VM is already on, we only need to map the
817  *      specified memory.
818  */
819 vm_offset_t
820 pmap_map(vm_offset_t *virtp, vm_paddr_t start, vm_paddr_t end, int prot)
821 {
822         return PHYS_TO_DMAP(start);
823 }
824
825
826 /*
827  * Map a set of unmanaged VM pages into KVM.
828  */
829 void
830 pmap_qenter(vm_offset_t va, vm_page_t *m, int count)
831 {
832         vm_offset_t end_va;
833
834         end_va = va + count * PAGE_SIZE;
835         KKASSERT(va >= KvaStart && end_va < KvaEnd);
836
837         while (va < end_va) {
838                 pt_entry_t *pte;
839
840                 pte = vtopte(va);
841                 if (*pte & VPTE_V)
842                         pmap_inval_pte(pte, &kernel_pmap, va);
843                 *pte = VM_PAGE_TO_PHYS(*m) | VPTE_R | VPTE_W | VPTE_V;
844                 va += PAGE_SIZE;
845                 m++;
846         }
847 }
848
849 /*
850  * Undo the effects of pmap_qenter*().
851  */
852 void
853 pmap_qremove(vm_offset_t va, int count)
854 {
855         vm_offset_t end_va;
856
857         end_va = va + count * PAGE_SIZE;
858         KKASSERT(va >= KvaStart && end_va < KvaEnd);
859
860         while (va < end_va) {
861                 pt_entry_t *pte;
862
863                 pte = vtopte(va);
864                 if (*pte & VPTE_V)
865                         pmap_inval_pte(pte, &kernel_pmap, va);
866                 *pte = 0;
867                 va += PAGE_SIZE;
868         }
869 }
870
871 /*
872  * This routine works like vm_page_lookup() but also blocks as long as the
873  * page is busy.  This routine does not busy the page it returns.
874  *
875  * Unless the caller is managing objects whos pages are in a known state,
876  * the call should be made with a critical section held so the page's object
877  * association remains valid on return.
878  */
879 static vm_page_t
880 pmap_page_lookup(vm_object_t object, vm_pindex_t pindex)
881 {
882         vm_page_t m;
883
884         ASSERT_LWKT_TOKEN_HELD(vm_object_token(object));
885         m = vm_page_lookup_busy_wait(object, pindex, FALSE, "pplookp");
886
887         return(m);
888 }
889
890 /*
891  * Create a new thread and optionally associate it with a (new) process.
892  * NOTE! the new thread's cpu may not equal the current cpu.
893  */
894 void
895 pmap_init_thread(thread_t td)
896 {
897         /* enforce pcb placement */
898         td->td_pcb = (struct pcb *)(td->td_kstack + td->td_kstack_size) - 1;
899         td->td_savefpu = &td->td_pcb->pcb_save;
900         td->td_sp = (char *)td->td_pcb - 16; /* JG is -16 needed on x86_64? */
901 }
902
903 /*
904  * This routine directly affects the fork perf for a process.
905  */
906 void
907 pmap_init_proc(struct proc *p)
908 {
909 }
910
911 /***************************************************
912  * Page table page management routines.....
913  ***************************************************/
914
915 static __inline int pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va,
916                         vm_page_t m);
917
918 /*
919  * This routine unholds page table pages, and if the hold count
920  * drops to zero, then it decrements the wire count.
921  *
922  * We must recheck that this is the last hold reference after busy-sleeping
923  * on the page.
924  */
925 static int
926 _pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m)
927 {
928         vm_page_busy_wait(m, FALSE, "pmuwpt");
929         KASSERT(m->queue == PQ_NONE,
930                 ("_pmap_unwire_pte_hold: %p->queue != PQ_NONE", m));
931
932         if (m->hold_count == 1) {
933                 /*
934                  * Unmap the page table page.
935                  */
936                 //abort(); /* JG */
937                 /* pmap_inval_add(info, pmap, -1); */
938
939                 if (m->pindex >= (NUPDE + NUPDPE)) {
940                         /* PDP page */
941                         pml4_entry_t *pml4;
942                         pml4 = pmap_pml4e(pmap, va);
943                         *pml4 = 0;
944                 } else if (m->pindex >= NUPDE) {
945                         /* PD page */
946                         pdp_entry_t *pdp;
947                         pdp = pmap_pdpe(pmap, va);
948                         *pdp = 0;
949                 } else {
950                         /* PT page */
951                         pd_entry_t *pd;
952                         pd = pmap_pde(pmap, va);
953                         *pd = 0;
954                 }
955
956                 KKASSERT(pmap->pm_stats.resident_count > 0);
957                 --pmap->pm_stats.resident_count;
958
959                 if (pmap->pm_ptphint == m)
960                         pmap->pm_ptphint = NULL;
961
962                 if (m->pindex < NUPDE) {
963                         /* We just released a PT, unhold the matching PD */
964                         vm_page_t pdpg;
965
966                         pdpg = PHYS_TO_VM_PAGE(*pmap_pdpe(pmap, va) & VPTE_FRAME);
967                         pmap_unwire_pte_hold(pmap, va, pdpg);
968                 }
969                 if (m->pindex >= NUPDE && m->pindex < (NUPDE + NUPDPE)) {
970                         /* We just released a PD, unhold the matching PDP */
971                         vm_page_t pdppg;
972
973                         pdppg = PHYS_TO_VM_PAGE(*pmap_pml4e(pmap, va) & VPTE_FRAME);
974                         pmap_unwire_pte_hold(pmap, va, pdppg);
975                 }
976
977                 /*
978                  * This was our last hold, the page had better be unwired
979                  * after we decrement wire_count.
980                  *
981                  * FUTURE NOTE: shared page directory page could result in
982                  * multiple wire counts.
983                  */
984                 vm_page_unhold(m);
985                 --m->wire_count;
986                 KKASSERT(m->wire_count == 0);
987                 atomic_add_int(&vmstats.v_wire_count, -1);
988                 vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE);
989                 vm_page_flash(m);
990                 vm_page_free_zero(m);
991                 return 1;
992         } else {
993                 KKASSERT(m->hold_count > 1);
994                 vm_page_unhold(m);
995                 vm_page_wakeup(m);
996                 return 0;
997         }
998 }
999
1000 static __inline int
1001 pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m)
1002 {
1003         KKASSERT(m->hold_count > 0);
1004         if (m->hold_count > 1) {
1005                 vm_page_unhold(m);
1006                 return 0;
1007         } else {
1008                 return _pmap_unwire_pte_hold(pmap, va, m);
1009         }
1010 }
1011
1012 /*
1013  * After removing a page table entry, this routine is used to
1014  * conditionally free the page, and manage the hold/wire counts.
1015  */
1016 static int
1017 pmap_unuse_pt(pmap_t pmap, vm_offset_t va, vm_page_t mpte)
1018 {
1019         /* JG Use FreeBSD/amd64 or FreeBSD/i386 ptepde approaches? */
1020         vm_pindex_t ptepindex;
1021
1022         ASSERT_LWKT_TOKEN_HELD(vm_object_token(pmap->pm_pteobj));
1023
1024         if (mpte == NULL) {
1025                 /*
1026                  * page table pages in the kernel_pmap are not managed.
1027                  */
1028                 if (pmap == &kernel_pmap)
1029                         return(0);
1030                 ptepindex = pmap_pde_pindex(va);
1031                 if (pmap->pm_ptphint &&
1032                         (pmap->pm_ptphint->pindex == ptepindex)) {
1033                         mpte = pmap->pm_ptphint;
1034                 } else {
1035                         mpte = pmap_page_lookup(pmap->pm_pteobj, ptepindex);
1036                         pmap->pm_ptphint = mpte;
1037                         vm_page_wakeup(mpte);
1038                 }
1039         }
1040
1041         return pmap_unwire_pte_hold(pmap, va, mpte);
1042 }
1043
1044 /*
1045  * Initialize pmap0/vmspace0 .  Since process 0 never enters user mode we
1046  * just dummy it up so it works well enough for fork().
1047  *
1048  * In DragonFly, process pmaps may only be used to manipulate user address
1049  * space, never kernel address space.
1050  */
1051 void
1052 pmap_pinit0(struct pmap *pmap)
1053 {
1054         pmap_pinit(pmap);
1055 }
1056
1057 /*
1058  * Initialize a preallocated and zeroed pmap structure,
1059  * such as one in a vmspace structure.
1060  */
1061 void
1062 pmap_pinit(struct pmap *pmap)
1063 {
1064         vm_page_t ptdpg;
1065
1066         /*
1067          * No need to allocate page table space yet but we do need a valid
1068          * page directory table.
1069          */
1070         if (pmap->pm_pml4 == NULL) {
1071                 pmap->pm_pml4 =
1072                     (pml4_entry_t *)kmem_alloc_pageable(&kernel_map, PAGE_SIZE);
1073         }
1074
1075         /*
1076          * Allocate an object for the ptes
1077          */
1078         if (pmap->pm_pteobj == NULL)
1079                 pmap->pm_pteobj = vm_object_allocate(OBJT_DEFAULT, NUPDE + NUPDPE + PML4PML4I + 1);
1080
1081         /*
1082          * Allocate the page directory page, unless we already have
1083          * one cached.  If we used the cached page the wire_count will
1084          * already be set appropriately.
1085          */
1086         if ((ptdpg = pmap->pm_pdirm) == NULL) {
1087                 ptdpg = vm_page_grab(pmap->pm_pteobj,
1088                                      NUPDE + NUPDPE + PML4PML4I,
1089                                      VM_ALLOC_NORMAL | VM_ALLOC_RETRY |
1090                                      VM_ALLOC_ZERO);
1091                 pmap->pm_pdirm = ptdpg;
1092                 vm_page_flag_clear(ptdpg, PG_MAPPED);
1093                 vm_page_wire(ptdpg);
1094                 vm_page_wakeup(ptdpg);
1095                 pmap_kenter((vm_offset_t)pmap->pm_pml4, VM_PAGE_TO_PHYS(ptdpg));
1096         }
1097         pmap->pm_count = 1;
1098         pmap->pm_active = 0;
1099         pmap->pm_ptphint = NULL;
1100         TAILQ_INIT(&pmap->pm_pvlist);
1101         TAILQ_INIT(&pmap->pm_pvlist_free);
1102         spin_init(&pmap->pm_spin);
1103         lwkt_token_init(&pmap->pm_token, "pmap_tok");
1104         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
1105         pmap->pm_stats.resident_count = 1;
1106 }
1107
1108 /*
1109  * Clean up a pmap structure so it can be physically freed.  This routine
1110  * is called by the vmspace dtor function.  A great deal of pmap data is
1111  * left passively mapped to improve vmspace management so we have a bit
1112  * of cleanup work to do here.
1113  *
1114  * No requirements.
1115  */
1116 void
1117 pmap_puninit(pmap_t pmap)
1118 {
1119         vm_page_t p;
1120
1121         KKASSERT(pmap->pm_active == 0);
1122         if ((p = pmap->pm_pdirm) != NULL) {
1123                 KKASSERT(pmap->pm_pml4 != NULL);
1124                 pmap_kremove((vm_offset_t)pmap->pm_pml4);
1125                 vm_page_busy_wait(p, FALSE, "pgpun");
1126                 p->wire_count--;
1127                 atomic_add_int(&vmstats.v_wire_count, -1);
1128                 vm_page_free_zero(p);
1129                 pmap->pm_pdirm = NULL;
1130         }
1131         if (pmap->pm_pml4) {
1132                 kmem_free(&kernel_map, (vm_offset_t)pmap->pm_pml4, PAGE_SIZE);
1133                 pmap->pm_pml4 = NULL;
1134         }
1135         if (pmap->pm_pteobj) {
1136                 vm_object_deallocate(pmap->pm_pteobj);
1137                 pmap->pm_pteobj = NULL;
1138         }
1139 }
1140
1141 /*
1142  * Wire in kernel global address entries.  To avoid a race condition
1143  * between pmap initialization and pmap_growkernel, this procedure
1144  * adds the pmap to the master list (which growkernel scans to update),
1145  * then copies the template.
1146  *
1147  * In a virtual kernel there are no kernel global address entries.
1148  *
1149  * No requirements.
1150  */
1151 void
1152 pmap_pinit2(struct pmap *pmap)
1153 {
1154         spin_lock(&pmap_spin);
1155         TAILQ_INSERT_TAIL(&pmap_list, pmap, pm_pmnode);
1156         spin_unlock(&pmap_spin);
1157 }
1158
1159 /*
1160  * Attempt to release and free a vm_page in a pmap.  Returns 1 on success,
1161  * 0 on failure (if the procedure had to sleep).
1162  *
1163  * When asked to remove the page directory page itself, we actually just
1164  * leave it cached so we do not have to incur the SMP inval overhead of
1165  * removing the kernel mapping.  pmap_puninit() will take care of it.
1166  */
1167 static int
1168 pmap_release_free_page(struct pmap *pmap, vm_page_t p)
1169 {
1170         /*
1171          * This code optimizes the case of freeing non-busy
1172          * page-table pages.  Those pages are zero now, and
1173          * might as well be placed directly into the zero queue.
1174          */
1175         if (vm_page_busy_try(p, FALSE)) {
1176                 vm_page_sleep_busy(p, FALSE, "pmaprl");
1177                 return 0;
1178         }
1179
1180         /*
1181          * Remove the page table page from the processes address space.
1182          */
1183         if (p->pindex == NUPDE + NUPDPE + PML4PML4I) {
1184                 /*
1185                  * We are the pml4 table itself.
1186                  */
1187                 /* XXX anything to do here? */
1188         } else if (p->pindex >= (NUPDE + NUPDPE)) {
1189                 /*
1190                  * We are a PDP page.
1191                  * We look for the PML4 entry that points to us.
1192                  */
1193                 vm_page_t m4 = vm_page_lookup(pmap->pm_pteobj, NUPDE + NUPDPE + PML4PML4I);
1194                 KKASSERT(m4 != NULL);
1195                 pml4_entry_t *pml4 = (pml4_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m4));
1196                 int idx = (p->pindex - (NUPDE + NUPDPE)) % NPML4EPG;
1197                 KKASSERT(pml4[idx] != 0);
1198                 pml4[idx] = 0;
1199                 m4->hold_count--;
1200                 /* JG What about wire_count? */
1201         } else if (p->pindex >= NUPDE) {
1202                 /*
1203                  * We are a PD page.
1204                  * We look for the PDP entry that points to us.
1205                  */
1206                 vm_page_t m3 = vm_page_lookup(pmap->pm_pteobj, NUPDE + NUPDPE + (p->pindex - NUPDE) / NPDPEPG);
1207                 KKASSERT(m3 != NULL);
1208                 pdp_entry_t *pdp = (pdp_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m3));
1209                 int idx = (p->pindex - NUPDE) % NPDPEPG;
1210                 KKASSERT(pdp[idx] != 0);
1211                 pdp[idx] = 0;
1212                 m3->hold_count--;
1213                 /* JG What about wire_count? */
1214         } else {
1215                 /* We are a PT page.
1216                  * We look for the PD entry that points to us.
1217                  */
1218                 vm_page_t m2 = vm_page_lookup(pmap->pm_pteobj, NUPDE + p->pindex / NPDEPG);
1219                 KKASSERT(m2 != NULL);
1220                 pd_entry_t *pd = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m2));
1221                 int idx = p->pindex % NPDEPG;
1222                 pd[idx] = 0;
1223                 m2->hold_count--;
1224                 /* JG What about wire_count? */
1225         }
1226         KKASSERT(pmap->pm_stats.resident_count > 0);
1227         --pmap->pm_stats.resident_count;
1228
1229         if (p->hold_count)  {
1230                 panic("pmap_release: freeing held page table page");
1231         }
1232         if (pmap->pm_ptphint && (pmap->pm_ptphint->pindex == p->pindex))
1233                 pmap->pm_ptphint = NULL;
1234
1235         /*
1236          * We leave the top-level page table page cached, wired, and mapped in
1237          * the pmap until the dtor function (pmap_puninit()) gets called.
1238          * However, still clean it up so we can set PG_ZERO.
1239          */
1240         if (p->pindex == NUPDE + NUPDPE + PML4PML4I) {
1241                 bzero(pmap->pm_pml4, PAGE_SIZE);
1242                 vm_page_flag_set(p, PG_ZERO);
1243                 vm_page_wakeup(p);
1244         } else {
1245                 abort();
1246                 p->wire_count--;
1247                 atomic_add_int(&vmstats.v_wire_count, -1);
1248                 /* JG eventually revert to using vm_page_free_zero() */
1249                 vm_page_free(p);
1250         }
1251         return 1;
1252 }
1253
1254 /*
1255  * this routine is called if the page table page is not
1256  * mapped correctly.
1257  */
1258 static vm_page_t
1259 _pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex)
1260 {
1261         vm_page_t m, pdppg, pdpg;
1262
1263         /*
1264          * Find or fabricate a new pagetable page.  Handle allocation
1265          * races by checking m->valid.
1266          */
1267         m = vm_page_grab(pmap->pm_pteobj, ptepindex,
1268                          VM_ALLOC_NORMAL | VM_ALLOC_ZERO | VM_ALLOC_RETRY);
1269
1270         KASSERT(m->queue == PQ_NONE,
1271                 ("_pmap_allocpte: %p->queue != PQ_NONE", m));
1272
1273         /*
1274          * Increment the hold count for the page we will be returning to
1275          * the caller.
1276          */
1277         m->hold_count++;
1278         vm_page_wire(m);
1279
1280         /*
1281          * Map the pagetable page into the process address space, if
1282          * it isn't already there.
1283          */
1284         ++pmap->pm_stats.resident_count;
1285
1286         if (ptepindex >= (NUPDE + NUPDPE)) {
1287                 pml4_entry_t *pml4;
1288                 vm_pindex_t pml4index;
1289
1290                 /* Wire up a new PDP page */
1291                 pml4index = ptepindex - (NUPDE + NUPDPE);
1292                 pml4 = &pmap->pm_pml4[pml4index];
1293                 *pml4 = VM_PAGE_TO_PHYS(m) | VPTE_R | VPTE_W | VPTE_V |
1294                         VPTE_A | VPTE_M;
1295         } else if (ptepindex >= NUPDE) {
1296                 vm_pindex_t pml4index;
1297                 vm_pindex_t pdpindex;
1298                 pml4_entry_t *pml4;
1299                 pdp_entry_t *pdp;
1300
1301                 /* Wire up a new PD page */
1302                 pdpindex = ptepindex - NUPDE;
1303                 pml4index = pdpindex >> NPML4EPGSHIFT;
1304
1305                 pml4 = &pmap->pm_pml4[pml4index];
1306                 if ((*pml4 & VPTE_V) == 0) {
1307                         /* Have to allocate a new PDP page, recurse */
1308                         if (_pmap_allocpte(pmap, NUPDE + NUPDPE + pml4index)
1309                              == NULL) {
1310                                 --m->wire_count;
1311                                 vm_page_free(m);
1312                                 return (NULL);
1313                         }
1314                 } else {
1315                         /* Add reference to the PDP page */
1316                         pdppg = PHYS_TO_VM_PAGE(*pml4 & VPTE_FRAME);
1317                         pdppg->hold_count++;
1318                 }
1319                 pdp = (pdp_entry_t *)PHYS_TO_DMAP(*pml4 & VPTE_FRAME);
1320
1321                 /* Now find the pdp page */
1322                 pdp = &pdp[pdpindex & ((1ul << NPDPEPGSHIFT) - 1)];
1323                 KKASSERT(*pdp == 0);    /* JG DEBUG64 */
1324                 *pdp = VM_PAGE_TO_PHYS(m) | VPTE_R | VPTE_W | VPTE_V |
1325                        VPTE_A | VPTE_M;
1326         } else {
1327                 vm_pindex_t pml4index;
1328                 vm_pindex_t pdpindex;
1329                 pml4_entry_t *pml4;
1330                 pdp_entry_t *pdp;
1331                 pd_entry_t *pd;
1332
1333                 /* Wire up a new PT page */
1334                 pdpindex = ptepindex >> NPDPEPGSHIFT;
1335                 pml4index = pdpindex >> NPML4EPGSHIFT;
1336
1337                 /* First, find the pdp and check that its valid. */
1338                 pml4 = &pmap->pm_pml4[pml4index];
1339                 if ((*pml4 & VPTE_V) == 0) {
1340                         /* We miss a PDP page. We ultimately need a PD page.
1341                          * Recursively allocating a PD page will allocate
1342                          * the missing PDP page and will also allocate
1343                          * the PD page we need.
1344                          */
1345                         /* Have to allocate a new PD page, recurse */
1346                         if (_pmap_allocpte(pmap, NUPDE + pdpindex)
1347                              == NULL) {
1348                                 --m->wire_count;
1349                                 vm_page_free(m);
1350                                 return (NULL);
1351                         }
1352                         pdp = (pdp_entry_t *)PHYS_TO_DMAP(*pml4 & VPTE_FRAME);
1353                         pdp = &pdp[pdpindex & ((1ul << NPDPEPGSHIFT) - 1)];
1354                 } else {
1355                         pdp = (pdp_entry_t *)PHYS_TO_DMAP(*pml4 & VPTE_FRAME);
1356                         pdp = &pdp[pdpindex & ((1ul << NPDPEPGSHIFT) - 1)];
1357                         if ((*pdp & VPTE_V) == 0) {
1358                                 /* Have to allocate a new PD page, recurse */
1359                                 if (_pmap_allocpte(pmap, NUPDE + pdpindex)
1360                                      == NULL) {
1361                                         --m->wire_count;
1362                                         vm_page_free(m);
1363                                         return (NULL);
1364                                 }
1365                         } else {
1366                                 /* Add reference to the PD page */
1367                                 pdpg = PHYS_TO_VM_PAGE(*pdp & VPTE_FRAME);
1368                                 pdpg->hold_count++;
1369                         }
1370                 }
1371                 pd = (pd_entry_t *)PHYS_TO_DMAP(*pdp & VPTE_FRAME);
1372
1373                 /* Now we know where the page directory page is */
1374                 pd = &pd[ptepindex & ((1ul << NPDEPGSHIFT) - 1)];
1375                 KKASSERT(*pd == 0);     /* JG DEBUG64 */
1376                 *pd = VM_PAGE_TO_PHYS(m) | VPTE_R | VPTE_W | VPTE_V |
1377                       VPTE_A | VPTE_M;
1378         }
1379
1380         /*
1381          * Set the page table hint
1382          */
1383         pmap->pm_ptphint = m;
1384         vm_page_flag_set(m, PG_MAPPED);
1385         vm_page_wakeup(m);
1386
1387         return m;
1388 }
1389
1390 /*
1391  * Determine the page table page required to access the VA in the pmap
1392  * and allocate it if necessary.  Return a held vm_page_t for the page.
1393  *
1394  * Only used with user pmaps.
1395  */
1396 static vm_page_t
1397 pmap_allocpte(pmap_t pmap, vm_offset_t va)
1398 {
1399         vm_pindex_t ptepindex;
1400         pd_entry_t *pd;
1401         vm_page_t m;
1402
1403         ASSERT_LWKT_TOKEN_HELD(vm_object_token(pmap->pm_pteobj));
1404
1405         /*
1406          * Calculate pagetable page index
1407          */
1408         ptepindex = pmap_pde_pindex(va);
1409
1410         /*
1411          * Get the page directory entry
1412          */
1413         pd = pmap_pde(pmap, va);
1414
1415         /*
1416          * This supports switching from a 2MB page to a
1417          * normal 4K page.
1418          */
1419         if (pd != NULL && (*pd & (VPTE_PS | VPTE_V)) == (VPTE_PS | VPTE_V)) {
1420                 panic("no promotion/demotion yet");
1421                 *pd = 0;
1422                 pd = NULL;
1423                 /*cpu_invltlb();*/
1424                 /*smp_invltlb();*/
1425         }
1426
1427         /*
1428          * If the page table page is mapped, we just increment the
1429          * hold count, and activate it.
1430          */
1431         if (pd != NULL && (*pd & VPTE_V) != 0) {
1432                 /* YYY hint is used here on i386 */
1433                 m = pmap_page_lookup(pmap->pm_pteobj, ptepindex);
1434                 pmap->pm_ptphint = m;
1435                 vm_page_hold(m);
1436                 vm_page_wakeup(m);
1437                 return m;
1438         }
1439         /*
1440          * Here if the pte page isn't mapped, or if it has been deallocated.
1441          */
1442         return _pmap_allocpte(pmap, ptepindex);
1443 }
1444
1445
1446 /***************************************************
1447  * Pmap allocation/deallocation routines.
1448  ***************************************************/
1449
1450 /*
1451  * Release any resources held by the given physical map.
1452  * Called when a pmap initialized by pmap_pinit is being released.
1453  * Should only be called if the map contains no valid mappings.
1454  *
1455  * Caller must hold pmap->pm_token
1456  */
1457 static int pmap_release_callback(struct vm_page *p, void *data);
1458
1459 void
1460 pmap_release(struct pmap *pmap)
1461 {
1462         vm_object_t object = pmap->pm_pteobj;
1463         struct rb_vm_page_scan_info info;
1464
1465         KKASSERT(pmap != &kernel_pmap);
1466
1467 #if defined(DIAGNOSTIC)
1468         if (object->ref_count != 1)
1469                 panic("pmap_release: pteobj reference count != 1");
1470 #endif
1471
1472         info.pmap = pmap;
1473         info.object = object;
1474
1475         spin_lock(&pmap_spin);
1476         TAILQ_REMOVE(&pmap_list, pmap, pm_pmnode);
1477         spin_unlock(&pmap_spin);
1478
1479         vm_object_hold(object);
1480         do {
1481                 info.error = 0;
1482                 info.mpte = NULL;
1483                 info.limit = object->generation;
1484
1485                 vm_page_rb_tree_RB_SCAN(&object->rb_memq, NULL,
1486                                         pmap_release_callback, &info);
1487                 if (info.error == 0 && info.mpte) {
1488                         if (!pmap_release_free_page(pmap, info.mpte))
1489                                 info.error = 1;
1490                 }
1491         } while (info.error);
1492         vm_object_drop(object);
1493 }
1494
1495 static int
1496 pmap_release_callback(struct vm_page *p, void *data)
1497 {
1498         struct rb_vm_page_scan_info *info = data;
1499
1500         if (p->pindex == NUPDE + NUPDPE + PML4PML4I) {
1501                 info->mpte = p;
1502                 return(0);
1503         }
1504         if (!pmap_release_free_page(info->pmap, p)) {
1505                 info->error = 1;
1506                 return(-1);
1507         }
1508         if (info->object->generation != info->limit) {
1509                 info->error = 1;
1510                 return(-1);
1511         }
1512         return(0);
1513 }
1514
1515 /*
1516  * Grow the number of kernel page table entries, if needed.
1517  *
1518  * No requirements.
1519  */
1520 void
1521 pmap_growkernel(vm_offset_t kstart, vm_offset_t kend)
1522 {
1523         vm_offset_t addr;
1524         vm_paddr_t paddr;
1525         vm_offset_t ptppaddr;
1526         vm_page_t nkpg;
1527         pd_entry_t *pde, newpdir;
1528         pdp_entry_t newpdp;
1529
1530         addr = kend;
1531
1532         vm_object_hold(kptobj);
1533         if (kernel_vm_end == 0) {
1534                 kernel_vm_end = KvaStart;
1535                 nkpt = 0;
1536                 while ((*pmap_pde(&kernel_pmap, kernel_vm_end) & VPTE_V) != 0) {
1537                         kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
1538                         nkpt++;
1539                         if (kernel_vm_end - 1 >= kernel_map.max_offset) {
1540                                 kernel_vm_end = kernel_map.max_offset;
1541                                 break;
1542                         }
1543                 }
1544         }
1545         addr = roundup2(addr, PAGE_SIZE * NPTEPG);
1546         if (addr - 1 >= kernel_map.max_offset)
1547                 addr = kernel_map.max_offset;
1548         while (kernel_vm_end < addr) {
1549                 pde = pmap_pde(&kernel_pmap, kernel_vm_end);
1550                 if (pde == NULL) {
1551                         /* We need a new PDP entry */
1552                         nkpg = vm_page_alloc(kptobj, nkpt,
1553                                              VM_ALLOC_NORMAL | VM_ALLOC_SYSTEM
1554                                              | VM_ALLOC_INTERRUPT);
1555                         if (nkpg == NULL) {
1556                                 panic("pmap_growkernel: no memory to "
1557                                       "grow kernel");
1558                         }
1559                         paddr = VM_PAGE_TO_PHYS(nkpg);
1560                         if ((nkpg->flags & PG_ZERO) == 0)
1561                                 pmap_zero_page(paddr);
1562                         vm_page_flag_clear(nkpg, PG_ZERO);
1563                         newpdp = (pdp_entry_t)(paddr | VPTE_V | VPTE_R |
1564                                                VPTE_W | VPTE_A | VPTE_M);
1565                         *pmap_pdpe(&kernel_pmap, kernel_vm_end) = newpdp;
1566                         nkpt++;
1567                         continue; /* try again */
1568                 }
1569                 if ((*pde & VPTE_V) != 0) {
1570                         kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) &
1571                                         ~(PAGE_SIZE * NPTEPG - 1);
1572                         if (kernel_vm_end - 1 >= kernel_map.max_offset) {
1573                                 kernel_vm_end = kernel_map.max_offset;
1574                                 break;
1575                         }
1576                         continue;
1577                 }
1578
1579                 /*
1580                  * This index is bogus, but out of the way
1581                  */
1582                 nkpg = vm_page_alloc(kptobj, nkpt,
1583                                      VM_ALLOC_NORMAL |
1584                                      VM_ALLOC_SYSTEM |
1585                                      VM_ALLOC_INTERRUPT);
1586                 if (nkpg == NULL)
1587                         panic("pmap_growkernel: no memory to grow kernel");
1588
1589                 vm_page_wire(nkpg);
1590                 ptppaddr = VM_PAGE_TO_PHYS(nkpg);
1591                 pmap_zero_page(ptppaddr);
1592                 vm_page_flag_clear(nkpg, PG_ZERO);
1593                 newpdir = (pd_entry_t)(ptppaddr | VPTE_V | VPTE_R |
1594                                        VPTE_W | VPTE_A | VPTE_M);
1595                 *pmap_pde(&kernel_pmap, kernel_vm_end) = newpdir;
1596                 nkpt++;
1597
1598                 kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) &
1599                                 ~(PAGE_SIZE * NPTEPG - 1);
1600                 if (kernel_vm_end - 1 >= kernel_map.max_offset) {
1601                         kernel_vm_end = kernel_map.max_offset;
1602                         break;
1603                 }
1604         }
1605         vm_object_drop(kptobj);
1606 }
1607
1608 /*
1609  * Add a reference to the specified pmap.
1610  *
1611  * No requirements.
1612  */
1613 void
1614 pmap_reference(pmap_t pmap)
1615 {
1616         if (pmap) {
1617                 lwkt_gettoken(&vm_token);
1618                 ++pmap->pm_count;
1619                 lwkt_reltoken(&vm_token);
1620         }
1621 }
1622
1623 /************************************************************************
1624  *                      VMSPACE MANAGEMENT                              *
1625  ************************************************************************
1626  *
1627  * The VMSPACE management we do in our virtual kernel must be reflected
1628  * in the real kernel.  This is accomplished by making vmspace system
1629  * calls to the real kernel.
1630  */
1631 void
1632 cpu_vmspace_alloc(struct vmspace *vm)
1633 {
1634         int r;
1635         void *rp;
1636         vpte_t vpte;
1637
1638 #define USER_SIZE       (VM_MAX_USER_ADDRESS - VM_MIN_USER_ADDRESS)
1639
1640         if (vmspace_create(&vm->vm_pmap, 0, NULL) < 0)
1641                 panic("vmspace_create() failed");
1642
1643         rp = vmspace_mmap(&vm->vm_pmap, VM_MIN_USER_ADDRESS, USER_SIZE,
1644                           PROT_READ|PROT_WRITE,
1645                           MAP_FILE|MAP_SHARED|MAP_VPAGETABLE|MAP_FIXED,
1646                           MemImageFd, 0);
1647         if (rp == MAP_FAILED)
1648                 panic("vmspace_mmap: failed");
1649         vmspace_mcontrol(&vm->vm_pmap, VM_MIN_USER_ADDRESS, USER_SIZE,
1650                          MADV_NOSYNC, 0);
1651         vpte = VM_PAGE_TO_PHYS(vmspace_pmap(vm)->pm_pdirm) | VPTE_R | VPTE_W | VPTE_V;
1652         r = vmspace_mcontrol(&vm->vm_pmap, VM_MIN_USER_ADDRESS, USER_SIZE,
1653                              MADV_SETMAP, vpte);
1654         if (r < 0)
1655                 panic("vmspace_mcontrol: failed");
1656 }
1657
1658 void
1659 cpu_vmspace_free(struct vmspace *vm)
1660 {
1661         if (vmspace_destroy(&vm->vm_pmap) < 0)
1662                 panic("vmspace_destroy() failed");
1663 }
1664
1665 /***************************************************
1666 * page management routines.
1667  ***************************************************/
1668
1669 /*
1670  * free the pv_entry back to the free list.  This function may be
1671  * called from an interrupt.
1672  */
1673 static __inline void
1674 free_pv_entry(pv_entry_t pv)
1675 {
1676         pv_entry_count--;
1677         KKASSERT(pv_entry_count >= 0);
1678         zfree(pvzone, pv);
1679 }
1680
1681 /*
1682  * get a new pv_entry, allocating a block from the system
1683  * when needed.  This function may be called from an interrupt.
1684  */
1685 static pv_entry_t
1686 get_pv_entry(void)
1687 {
1688         pv_entry_count++;
1689         if (pv_entry_high_water &&
1690                 (pv_entry_count > pv_entry_high_water) &&
1691                 (pmap_pagedaemon_waken == 0)) {
1692                 pmap_pagedaemon_waken = 1;
1693                 wakeup(&vm_pages_needed);
1694         }
1695         return zalloc(pvzone);
1696 }
1697
1698 /*
1699  * This routine is very drastic, but can save the system
1700  * in a pinch.
1701  *
1702  * No requirements.
1703  */
1704 void
1705 pmap_collect(void)
1706 {
1707         int i;
1708         vm_page_t m;
1709         static int warningdone=0;
1710
1711         if (pmap_pagedaemon_waken == 0)
1712                 return;
1713         lwkt_gettoken(&vm_token);
1714         pmap_pagedaemon_waken = 0;
1715
1716         if (warningdone < 5) {
1717                 kprintf("pmap_collect: collecting pv entries -- suggest increasing PMAP_SHPGPERPROC\n");
1718                 warningdone++;
1719         }
1720
1721         for (i = 0; i < vm_page_array_size; i++) {
1722                 m = &vm_page_array[i];
1723                 if (m->wire_count || m->hold_count)
1724                         continue;
1725                 if (vm_page_busy_try(m, TRUE) == 0) {
1726                         if (m->wire_count == 0 && m->hold_count == 0) {
1727                                 pmap_remove_all(m);
1728                         }
1729                         vm_page_wakeup(m);
1730                 }
1731         }
1732         lwkt_reltoken(&vm_token);
1733 }
1734
1735
1736 /*
1737  * If it is the first entry on the list, it is actually
1738  * in the header and we must copy the following entry up
1739  * to the header.  Otherwise we must search the list for
1740  * the entry.  In either case we free the now unused entry.
1741  *
1742  * caller must hold vm_token.
1743  */
1744 static int
1745 pmap_remove_entry(struct pmap *pmap, vm_page_t m, vm_offset_t va)
1746 {
1747         pv_entry_t pv;
1748         int rtval;
1749
1750         if (m->md.pv_list_count < pmap->pm_stats.resident_count) {
1751                 TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
1752                         if (pmap == pv->pv_pmap && va == pv->pv_va)
1753                                 break;
1754                 }
1755         } else {
1756                 TAILQ_FOREACH(pv, &pmap->pm_pvlist, pv_plist) {
1757                         if (va == pv->pv_va)
1758                                 break;
1759                 }
1760         }
1761
1762         /*
1763          * Note that pv_ptem is NULL if the page table page itself is not
1764          * managed, even if the page being removed IS managed.
1765          */
1766         rtval = 0;
1767         /* JGXXX When can 'pv' be NULL? */
1768         if (pv) {
1769                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
1770                 m->md.pv_list_count--;
1771                 atomic_add_int(&m->object->agg_pv_list_count, -1);
1772                 KKASSERT(m->md.pv_list_count >= 0);
1773                 if (TAILQ_EMPTY(&m->md.pv_list))
1774                         vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE);
1775                 TAILQ_REMOVE(&pmap->pm_pvlist, pv, pv_plist);
1776                 ++pmap->pm_generation;
1777                 KKASSERT(pmap->pm_pteobj != NULL);
1778                 vm_object_hold(pmap->pm_pteobj);
1779                 rtval = pmap_unuse_pt(pmap, va, pv->pv_ptem);
1780                 vm_object_drop(pmap->pm_pteobj);
1781                 free_pv_entry(pv);
1782         }
1783         return rtval;
1784 }
1785
1786 /*
1787  * Create a pv entry for page at pa for (pmap, va).  If the page table page
1788  * holding the VA is managed, mpte will be non-NULL.
1789  */
1790 static void
1791 pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t mpte, vm_page_t m)
1792 {
1793         pv_entry_t pv;
1794
1795         crit_enter();
1796         pv = get_pv_entry();
1797         pv->pv_va = va;
1798         pv->pv_pmap = pmap;
1799         pv->pv_ptem = mpte;
1800
1801         TAILQ_INSERT_TAIL(&pmap->pm_pvlist, pv, pv_plist);
1802         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
1803         m->md.pv_list_count++;
1804         atomic_add_int(&m->object->agg_pv_list_count, 1);
1805
1806         crit_exit();
1807 }
1808
1809 /*
1810  * pmap_remove_pte: do the things to unmap a page in a process
1811  */
1812 static int
1813 pmap_remove_pte(struct pmap *pmap, pt_entry_t *ptq, vm_offset_t va)
1814 {
1815         pt_entry_t oldpte;
1816         vm_page_t m;
1817
1818         oldpte = pmap_inval_loadandclear(ptq, pmap, va);
1819         if (oldpte & VPTE_WIRED)
1820                 --pmap->pm_stats.wired_count;
1821         KKASSERT(pmap->pm_stats.wired_count >= 0);
1822
1823 #if 0
1824         /*
1825          * Machines that don't support invlpg, also don't support
1826          * PG_G.  XXX PG_G is disabled for SMP so don't worry about
1827          * the SMP case.
1828          */
1829         if (oldpte & PG_G)
1830                 cpu_invlpg((void *)va);
1831 #endif
1832         KKASSERT(pmap->pm_stats.resident_count > 0);
1833         --pmap->pm_stats.resident_count;
1834         if (oldpte & VPTE_MANAGED) {
1835                 m = PHYS_TO_VM_PAGE(oldpte);
1836                 if (oldpte & VPTE_M) {
1837 #if defined(PMAP_DIAGNOSTIC)
1838                         if (pmap_nw_modified(oldpte)) {
1839                                 kprintf("pmap_remove: modified page not "
1840                                         "writable: va: 0x%lx, pte: 0x%lx\n",
1841                                         va, oldpte);
1842                         }
1843 #endif
1844                         if (pmap_track_modified(pmap, va))
1845                                 vm_page_dirty(m);
1846                 }
1847                 if (oldpte & VPTE_A)
1848                         vm_page_flag_set(m, PG_REFERENCED);
1849                 return pmap_remove_entry(pmap, m, va);
1850         } else {
1851                 return pmap_unuse_pt(pmap, va, NULL);
1852         }
1853
1854         return 0;
1855 }
1856
1857 /*
1858  * pmap_remove_page:
1859  *
1860  *      Remove a single page from a process address space.
1861  *
1862  *      This function may not be called from an interrupt if the pmap is
1863  *      not kernel_pmap.
1864  */
1865 static void
1866 pmap_remove_page(struct pmap *pmap, vm_offset_t va)
1867 {
1868         pt_entry_t *pte;
1869
1870         pte = pmap_pte(pmap, va);
1871         if (pte == NULL)
1872                 return;
1873         if ((*pte & VPTE_V) == 0)
1874                 return;
1875         pmap_remove_pte(pmap, pte, va);
1876 }
1877
1878 /*
1879  * Remove the given range of addresses from the specified map.
1880  *
1881  * It is assumed that the start and end are properly rounded to
1882  * the page size.
1883  *
1884  * This function may not be called from an interrupt if the pmap is
1885  * not kernel_pmap.
1886  *
1887  * No requirements.
1888  */
1889 void
1890 pmap_remove(struct pmap *pmap, vm_offset_t sva, vm_offset_t eva)
1891 {
1892         vm_offset_t va_next;
1893         pml4_entry_t *pml4e;
1894         pdp_entry_t *pdpe;
1895         pd_entry_t ptpaddr, *pde;
1896         pt_entry_t *pte;
1897
1898         if (pmap == NULL)
1899                 return;
1900
1901         vm_object_hold(pmap->pm_pteobj);
1902         lwkt_gettoken(&vm_token);
1903         KKASSERT(pmap->pm_stats.resident_count >= 0);
1904         if (pmap->pm_stats.resident_count == 0) {
1905                 lwkt_reltoken(&vm_token);
1906                 vm_object_drop(pmap->pm_pteobj);
1907                 return;
1908         }
1909
1910         /*
1911          * special handling of removing one page.  a very
1912          * common operation and easy to short circuit some
1913          * code.
1914          */
1915         if (sva + PAGE_SIZE == eva) {
1916                 pde = pmap_pde(pmap, sva);
1917                 if (pde && (*pde & VPTE_PS) == 0) {
1918                         pmap_remove_page(pmap, sva);
1919                         lwkt_reltoken(&vm_token);
1920                         vm_object_drop(pmap->pm_pteobj);
1921                         return;
1922                 }
1923         }
1924
1925         for (; sva < eva; sva = va_next) {
1926                 pml4e = pmap_pml4e(pmap, sva);
1927                 if ((*pml4e & VPTE_V) == 0) {
1928                         va_next = (sva + NBPML4) & ~PML4MASK;
1929                         if (va_next < sva)
1930                                 va_next = eva;
1931                         continue;
1932                 }
1933
1934                 pdpe = pmap_pml4e_to_pdpe(pml4e, sva);
1935                 if ((*pdpe & VPTE_V) == 0) {
1936                         va_next = (sva + NBPDP) & ~PDPMASK;
1937                         if (va_next < sva)
1938                                 va_next = eva;
1939                         continue;
1940                 }
1941
1942                 /*
1943                  * Calculate index for next page table.
1944                  */
1945                 va_next = (sva + NBPDR) & ~PDRMASK;
1946                 if (va_next < sva)
1947                         va_next = eva;
1948
1949                 pde = pmap_pdpe_to_pde(pdpe, sva);
1950                 ptpaddr = *pde;
1951
1952                 /*
1953                  * Weed out invalid mappings.
1954                  */
1955                 if (ptpaddr == 0)
1956                         continue;
1957
1958                 /*
1959                  * Check for large page.
1960                  */
1961                 if ((ptpaddr & VPTE_PS) != 0) {
1962                         /* JG FreeBSD has more complex treatment here */
1963                         KKASSERT(*pde != 0);
1964                         pmap_inval_pde(pde, pmap, sva);
1965                         pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
1966                         continue;
1967                 }
1968
1969                 /*
1970                  * Limit our scan to either the end of the va represented
1971                  * by the current page table page, or to the end of the
1972                  * range being removed.
1973                  */
1974                 if (va_next > eva)
1975                         va_next = eva;
1976
1977                 /*
1978                  * NOTE: pmap_remove_pte() can block.
1979                  */
1980                 for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
1981                     sva += PAGE_SIZE) {
1982                         if (*pte == 0)
1983                                 continue;
1984                         if (pmap_remove_pte(pmap, pte, sva))
1985                                 break;
1986                 }
1987         }
1988         lwkt_reltoken(&vm_token);
1989         vm_object_drop(pmap->pm_pteobj);
1990 }
1991
1992 /*
1993  * Removes this physical page from all physical maps in which it resides.
1994  * Reflects back modify bits to the pager.
1995  *
1996  * This routine may not be called from an interrupt.
1997  *
1998  * No requirements.
1999  */
2000 static void
2001 pmap_remove_all(vm_page_t m)
2002 {
2003         pt_entry_t *pte, tpte;
2004         pv_entry_t pv;
2005
2006 #if defined(PMAP_DIAGNOSTIC)
2007         /*
2008          * XXX this makes pmap_page_protect(NONE) illegal for non-managed
2009          * pages!
2010          */
2011         if (!pmap_initialized || (m->flags & PG_FICTITIOUS)) {
2012                 panic("pmap_page_protect: illegal for unmanaged page, va: 0x%08llx", (long long)VM_PAGE_TO_PHYS(m));
2013         }
2014 #endif
2015
2016         lwkt_gettoken(&vm_token);
2017         while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
2018                 KKASSERT(pv->pv_pmap->pm_stats.resident_count > 0);
2019                 --pv->pv_pmap->pm_stats.resident_count;
2020
2021                 pte = pmap_pte(pv->pv_pmap, pv->pv_va);
2022                 KKASSERT(pte != NULL);
2023
2024                 tpte = pmap_inval_loadandclear(pte, pv->pv_pmap, pv->pv_va);
2025                 if (tpte & VPTE_WIRED)
2026                         pv->pv_pmap->pm_stats.wired_count--;
2027                 KKASSERT(pv->pv_pmap->pm_stats.wired_count >= 0);
2028
2029                 if (tpte & VPTE_A)
2030                         vm_page_flag_set(m, PG_REFERENCED);
2031
2032                 /*
2033                  * Update the vm_page_t clean and reference bits.
2034                  */
2035                 if (tpte & VPTE_M) {
2036 #if defined(PMAP_DIAGNOSTIC)
2037                         if (pmap_nw_modified(tpte)) {
2038                                 kprintf(
2039         "pmap_remove_all: modified page not writable: va: 0x%lx, pte: 0x%lx\n",
2040                                     pv->pv_va, tpte);
2041                         }
2042 #endif
2043                         if (pmap_track_modified(pv->pv_pmap, pv->pv_va))
2044                                 vm_page_dirty(m);
2045                 }
2046                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
2047                 TAILQ_REMOVE(&pv->pv_pmap->pm_pvlist, pv, pv_plist);
2048                 ++pv->pv_pmap->pm_generation;
2049                 m->md.pv_list_count--;
2050                 atomic_add_int(&m->object->agg_pv_list_count, -1);
2051                 KKASSERT(m->md.pv_list_count >= 0);
2052                 if (TAILQ_EMPTY(&m->md.pv_list))
2053                         vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE);
2054                 vm_object_hold(pv->pv_pmap->pm_pteobj);
2055                 pmap_unuse_pt(pv->pv_pmap, pv->pv_va, pv->pv_ptem);
2056                 vm_object_drop(pv->pv_pmap->pm_pteobj);
2057                 free_pv_entry(pv);
2058         }
2059         KKASSERT((m->flags & (PG_MAPPED|PG_WRITEABLE)) == 0);
2060         lwkt_reltoken(&vm_token);
2061 }
2062
2063 /*
2064  * Set the physical protection on the specified range of this map
2065  * as requested.
2066  *
2067  * This function may not be called from an interrupt if the map is
2068  * not the kernel_pmap.
2069  *
2070  * No requirements.
2071  */
2072 void
2073 pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
2074 {
2075         vm_offset_t va_next;
2076         pml4_entry_t *pml4e;
2077         pdp_entry_t *pdpe;
2078         pd_entry_t ptpaddr, *pde;
2079         pt_entry_t *pte;
2080
2081         /* JG review for NX */
2082
2083         if (pmap == NULL)
2084                 return;
2085
2086         if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
2087                 pmap_remove(pmap, sva, eva);
2088                 return;
2089         }
2090
2091         if (prot & VM_PROT_WRITE)
2092                 return;
2093
2094         lwkt_gettoken(&vm_token);
2095
2096         for (; sva < eva; sva = va_next) {
2097
2098                 pml4e = pmap_pml4e(pmap, sva);
2099                 if ((*pml4e & VPTE_V) == 0) {
2100                         va_next = (sva + NBPML4) & ~PML4MASK;
2101                         if (va_next < sva)
2102                                 va_next = eva;
2103                         continue;
2104                 }
2105
2106                 pdpe = pmap_pml4e_to_pdpe(pml4e, sva);
2107                 if ((*pdpe & VPTE_V) == 0) {
2108                         va_next = (sva + NBPDP) & ~PDPMASK;
2109                         if (va_next < sva)
2110                                 va_next = eva;
2111                         continue;
2112                 }
2113
2114                 va_next = (sva + NBPDR) & ~PDRMASK;
2115                 if (va_next < sva)
2116                         va_next = eva;
2117
2118                 pde = pmap_pdpe_to_pde(pdpe, sva);
2119                 ptpaddr = *pde;
2120
2121                 /*
2122                  * Check for large page.
2123                  */
2124                 if ((ptpaddr & VPTE_PS) != 0) {
2125                         /* JG correct? */
2126                         pmap_clean_pde(pde, pmap, sva);
2127                         pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
2128                         continue;
2129                 }
2130
2131                 /*
2132                  * Weed out invalid mappings. Note: we assume that the page
2133                  * directory table is always allocated, and in kernel virtual.
2134                  */
2135                 if (ptpaddr == 0)
2136                         continue;
2137
2138                 if (va_next > eva)
2139                         va_next = eva;
2140
2141                 for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
2142                     sva += PAGE_SIZE) {
2143                         pt_entry_t pbits;
2144                         vm_page_t m;
2145
2146                         /*
2147                          * Clean managed pages and also check the accessed
2148                          * bit.  Just remove write perms for unmanaged
2149                          * pages.  Be careful of races, turning off write
2150                          * access will force a fault rather then setting
2151                          * the modified bit at an unexpected time.
2152                          */
2153                         if (*pte & VPTE_MANAGED) {
2154                                 pbits = pmap_clean_pte(pte, pmap, sva);
2155                                 m = NULL;
2156                                 if (pbits & VPTE_A) {
2157                                         m = PHYS_TO_VM_PAGE(pbits & VPTE_FRAME);
2158                                         vm_page_flag_set(m, PG_REFERENCED);
2159                                         atomic_clear_long(pte, VPTE_A);
2160                                 }
2161                                 if (pbits & VPTE_M) {
2162                                         if (pmap_track_modified(pmap, sva)) {
2163                                                 if (m == NULL)
2164                                                         m = PHYS_TO_VM_PAGE(pbits & VPTE_FRAME);
2165                                                 vm_page_dirty(m);
2166                                         }
2167                                 }
2168                         } else {
2169                                 pbits = pmap_setro_pte(pte, pmap, sva);
2170                         }
2171                 }
2172         }
2173         lwkt_reltoken(&vm_token);
2174 }
2175
2176 /*
2177  * Enter a managed page into a pmap.  If the page is not wired related pmap
2178  * data can be destroyed at any time for later demand-operation.
2179  *
2180  * Insert the vm_page (m) at virtual address (v) in (pmap), with the
2181  * specified protection, and wire the mapping if requested.
2182  *
2183  * NOTE: This routine may not lazy-evaluate or lose information.  The
2184  * page must actually be inserted into the given map NOW.
2185  *
2186  * NOTE: When entering a page at a KVA address, the pmap must be the
2187  * kernel_pmap.
2188  *
2189  * No requirements.
2190  */
2191 void
2192 pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
2193            boolean_t wired, vm_map_entry_t entry __unused)
2194 {
2195         vm_paddr_t pa;
2196         pd_entry_t *pde;
2197         pt_entry_t *pte;
2198         vm_paddr_t opa;
2199         pt_entry_t origpte, newpte;
2200         vm_page_t mpte;
2201
2202         if (pmap == NULL)
2203                 return;
2204
2205         va = trunc_page(va);
2206
2207         vm_object_hold(pmap->pm_pteobj);
2208         lwkt_gettoken(&vm_token);
2209
2210         /*
2211          * Get the page table page.   The kernel_pmap's page table pages
2212          * are preallocated and have no associated vm_page_t.
2213          */
2214         if (pmap == &kernel_pmap)
2215                 mpte = NULL;
2216         else
2217                 mpte = pmap_allocpte(pmap, va);
2218
2219         pde = pmap_pde(pmap, va);
2220         if (pde != NULL && (*pde & VPTE_V) != 0) {
2221                 if ((*pde & VPTE_PS) != 0)
2222                         panic("pmap_enter: attempted pmap_enter on 2MB page");
2223                 pte = pmap_pde_to_pte(pde, va);
2224         } else {
2225                 panic("pmap_enter: invalid page directory va=%#lx", va);
2226         }
2227
2228         KKASSERT(pte != NULL);
2229         /*
2230          * Deal with races on the original mapping (though don't worry
2231          * about VPTE_A races) by cleaning it.  This will force a fault
2232          * if an attempt is made to write to the page.
2233          */
2234         pa = VM_PAGE_TO_PHYS(m);
2235         origpte = pmap_clean_pte(pte, pmap, va);
2236         opa = origpte & VPTE_FRAME;
2237
2238         if (origpte & VPTE_PS)
2239                 panic("pmap_enter: attempted pmap_enter on 2MB page");
2240
2241         /*
2242          * Mapping has not changed, must be protection or wiring change.
2243          */
2244         if (origpte && (opa == pa)) {
2245                 /*
2246                  * Wiring change, just update stats. We don't worry about
2247                  * wiring PT pages as they remain resident as long as there
2248                  * are valid mappings in them. Hence, if a user page is wired,
2249                  * the PT page will be also.
2250                  */
2251                 if (wired && ((origpte & VPTE_WIRED) == 0))
2252                         ++pmap->pm_stats.wired_count;
2253                 else if (!wired && (origpte & VPTE_WIRED))
2254                         --pmap->pm_stats.wired_count;
2255
2256                 /*
2257                  * Remove the extra pte reference.  Note that we cannot
2258                  * optimize the RO->RW case because we have adjusted the
2259                  * wiring count above and may need to adjust the wiring
2260                  * bits below.
2261                  */
2262                 if (mpte)
2263                         mpte->hold_count--;
2264
2265                 /*
2266                  * We might be turning off write access to the page,
2267                  * so we go ahead and sense modify status.
2268                  */
2269                 if (origpte & VPTE_MANAGED) {
2270                         if ((origpte & VPTE_M) &&
2271                             pmap_track_modified(pmap, va)) {
2272                                 vm_page_t om;
2273                                 om = PHYS_TO_VM_PAGE(opa);
2274                                 vm_page_dirty(om);
2275                         }
2276                         pa |= VPTE_MANAGED;
2277                         KKASSERT(m->flags & PG_MAPPED);
2278                 }
2279                 goto validate;
2280         }
2281         /*
2282          * Mapping has changed, invalidate old range and fall through to
2283          * handle validating new mapping.
2284          */
2285         if (opa) {
2286                 int err;
2287                 err = pmap_remove_pte(pmap, pte, va);
2288                 if (err)
2289                         panic("pmap_enter: pte vanished, va: 0x%lx", va);
2290         }
2291
2292         /*
2293          * Enter on the PV list if part of our managed memory. Note that we
2294          * raise IPL while manipulating pv_table since pmap_enter can be
2295          * called at interrupt time.
2296          */
2297         if (pmap_initialized &&
2298             (m->flags & (PG_FICTITIOUS|PG_UNMANAGED)) == 0) {
2299                 pmap_insert_entry(pmap, va, mpte, m);
2300                 pa |= VPTE_MANAGED;
2301                 vm_page_flag_set(m, PG_MAPPED);
2302         }
2303
2304         /*
2305          * Increment counters
2306          */
2307         ++pmap->pm_stats.resident_count;
2308         if (wired)
2309                 pmap->pm_stats.wired_count++;
2310
2311 validate:
2312         /*
2313          * Now validate mapping with desired protection/wiring.
2314          */
2315         newpte = (pt_entry_t) (pa | pte_prot(pmap, prot) | VPTE_V);
2316
2317         if (wired)
2318                 newpte |= VPTE_WIRED;
2319         if (pmap != &kernel_pmap)
2320                 newpte |= VPTE_U;
2321
2322         /*
2323          * If the mapping or permission bits are different from the
2324          * (now cleaned) original pte, an update is needed.  We've
2325          * already downgraded or invalidated the page so all we have
2326          * to do now is update the bits.
2327          *
2328          * XXX should we synchronize RO->RW changes to avoid another
2329          * fault?
2330          */
2331         if ((origpte & ~(VPTE_W|VPTE_M|VPTE_A)) != newpte) {
2332                 *pte = newpte | VPTE_A;
2333                 if (newpte & VPTE_W)
2334                         vm_page_flag_set(m, PG_WRITEABLE);
2335         }
2336         KKASSERT((newpte & VPTE_MANAGED) == 0 || (m->flags & PG_MAPPED));
2337         lwkt_reltoken(&vm_token);
2338         vm_object_drop(pmap->pm_pteobj);
2339 }
2340
2341 /*
2342  * This code works like pmap_enter() but assumes VM_PROT_READ and not-wired.
2343  *
2344  * Currently this routine may only be used on user pmaps, not kernel_pmap.
2345  *
2346  * No requirements.
2347  */
2348 void
2349 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m)
2350 {
2351         pt_entry_t *pte;
2352         vm_paddr_t pa;
2353         vm_page_t mpte;
2354         vm_pindex_t ptepindex;
2355         pd_entry_t *ptepa;
2356
2357         KKASSERT(pmap != &kernel_pmap);
2358
2359         KKASSERT(va >= VM_MIN_USER_ADDRESS && va < VM_MAX_USER_ADDRESS);
2360
2361         /*
2362          * Calculate pagetable page index
2363          */
2364         ptepindex = pmap_pde_pindex(va);
2365
2366         vm_object_hold(pmap->pm_pteobj);
2367         lwkt_gettoken(&vm_token);
2368
2369         do {
2370                 /*
2371                  * Get the page directory entry
2372                  */
2373                 ptepa = pmap_pde(pmap, va);
2374
2375                 /*
2376                  * If the page table page is mapped, we just increment
2377                  * the hold count, and activate it.
2378                  */
2379                 if (ptepa && (*ptepa & VPTE_V) != 0) {
2380                         if (*ptepa & VPTE_PS)
2381                                 panic("pmap_enter_quick: unexpected mapping into 2MB page");
2382                         if (pmap->pm_ptphint &&
2383                             (pmap->pm_ptphint->pindex == ptepindex)) {
2384                                 mpte = pmap->pm_ptphint;
2385                         } else {
2386                                 mpte = pmap_page_lookup( pmap->pm_pteobj, ptepindex);
2387                                 pmap->pm_ptphint = mpte;
2388                                 vm_page_wakeup(mpte);
2389                         }
2390                         if (mpte)
2391                                 mpte->hold_count++;
2392                 } else {
2393                         mpte = _pmap_allocpte(pmap, ptepindex);
2394                 }
2395         } while (mpte == NULL);
2396
2397         /*
2398          * Ok, now that the page table page has been validated, get the pte.
2399          * If the pte is already mapped undo mpte's hold_count and
2400          * just return.
2401          */
2402         pte = pmap_pte(pmap, va);
2403         if (*pte & VPTE_V) {
2404                 KKASSERT(mpte != NULL);
2405                 pmap_unwire_pte_hold(pmap, va, mpte);
2406                 pa = VM_PAGE_TO_PHYS(m);
2407                 KKASSERT(((*pte ^ pa) & VPTE_FRAME) == 0);
2408                 lwkt_reltoken(&vm_token);
2409                 vm_object_drop(pmap->pm_pteobj);
2410                 return;
2411         }
2412
2413         /*
2414          * Enter on the PV list if part of our managed memory
2415          */
2416         if ((m->flags & (PG_FICTITIOUS|PG_UNMANAGED)) == 0) {
2417                 pmap_insert_entry(pmap, va, mpte, m);
2418                 vm_page_flag_set(m, PG_MAPPED);
2419         }
2420
2421         /*
2422          * Increment counters
2423          */
2424         ++pmap->pm_stats.resident_count;
2425
2426         pa = VM_PAGE_TO_PHYS(m);
2427
2428         /*
2429          * Now validate mapping with RO protection
2430          */
2431         if (m->flags & (PG_FICTITIOUS|PG_UNMANAGED))
2432                 *pte = (vpte_t)pa | VPTE_V | VPTE_U;
2433         else
2434                 *pte = (vpte_t)pa | VPTE_V | VPTE_U | VPTE_MANAGED;
2435         /*pmap_inval_add(&info, pmap, va); shouldn't be needed 0->valid */
2436         /*pmap_inval_flush(&info); don't need for vkernel */
2437         lwkt_reltoken(&vm_token);
2438         vm_object_drop(pmap->pm_pteobj);
2439 }
2440
2441 /*
2442  * Make a temporary mapping for a physical address.  This is only intended
2443  * to be used for panic dumps.
2444  *
2445  * The caller is responsible for calling smp_invltlb().
2446  */
2447 void *
2448 pmap_kenter_temporary(vm_paddr_t pa, long i)
2449 {
2450         pmap_kenter_quick(crashdumpmap + (i * PAGE_SIZE), pa);
2451         return ((void *)crashdumpmap);
2452 }
2453
2454 #define MAX_INIT_PT (96)
2455
2456 /*
2457  * This routine preloads the ptes for a given object into the specified pmap.
2458  * This eliminates the blast of soft faults on process startup and
2459  * immediately after an mmap.
2460  *
2461  * No requirements.
2462  */
2463 static int pmap_object_init_pt_callback(vm_page_t p, void *data);
2464
2465 void
2466 pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_prot_t prot,
2467                     vm_object_t object, vm_pindex_t pindex,
2468                     vm_size_t size, int limit)
2469 {
2470         struct rb_vm_page_scan_info info;
2471         struct lwp *lp;
2472         vm_size_t psize;
2473
2474         /*
2475          * We can't preinit if read access isn't set or there is no pmap
2476          * or object.
2477          */
2478         if ((prot & VM_PROT_READ) == 0 || pmap == NULL || object == NULL)
2479                 return;
2480
2481         /*
2482          * We can't preinit if the pmap is not the current pmap
2483          */
2484         lp = curthread->td_lwp;
2485         if (lp == NULL || pmap != vmspace_pmap(lp->lwp_vmspace))
2486                 return;
2487
2488         psize = x86_64_btop(size);
2489
2490         if ((object->type != OBJT_VNODE) ||
2491                 ((limit & MAP_PREFAULT_PARTIAL) && (psize > MAX_INIT_PT) &&
2492                         (object->resident_page_count > MAX_INIT_PT))) {
2493                 return;
2494         }
2495
2496         if (psize + pindex > object->size) {
2497                 if (object->size < pindex)
2498                         return;
2499                 psize = object->size - pindex;
2500         }
2501
2502         if (psize == 0)
2503                 return;
2504
2505         /*
2506          * Use a red-black scan to traverse the requested range and load
2507          * any valid pages found into the pmap.
2508          *
2509          * We cannot safely scan the object's memq unless we are in a
2510          * critical section since interrupts can remove pages from objects.
2511          */
2512         info.start_pindex = pindex;
2513         info.end_pindex = pindex + psize - 1;
2514         info.limit = limit;
2515         info.mpte = NULL;
2516         info.addr = addr;
2517         info.pmap = pmap;
2518
2519         vm_object_hold_shared(object);
2520         vm_page_rb_tree_RB_SCAN(&object->rb_memq, rb_vm_page_scancmp,
2521                                 pmap_object_init_pt_callback, &info);
2522         vm_object_drop(object);
2523 }
2524
2525 static
2526 int
2527 pmap_object_init_pt_callback(vm_page_t p, void *data)
2528 {
2529         struct rb_vm_page_scan_info *info = data;
2530         vm_pindex_t rel_index;
2531         /*
2532          * don't allow an madvise to blow away our really
2533          * free pages allocating pv entries.
2534          */
2535         if ((info->limit & MAP_PREFAULT_MADVISE) &&
2536                 vmstats.v_free_count < vmstats.v_free_reserved) {
2537                     return(-1);
2538         }
2539
2540         /*
2541          * Ignore list markers and ignore pages we cannot instantly
2542          * busy (while holding the object token).
2543          */
2544         if (p->flags & PG_MARKER)
2545                 return 0;
2546         if (vm_page_busy_try(p, TRUE))
2547                 return 0;
2548         if (((p->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL) &&
2549             (p->flags & PG_FICTITIOUS) == 0) {
2550                 if ((p->queue - p->pc) == PQ_CACHE)
2551                         vm_page_deactivate(p);
2552                 rel_index = p->pindex - info->start_pindex;
2553                 pmap_enter_quick(info->pmap,
2554                                  info->addr + x86_64_ptob(rel_index), p);
2555         }
2556         vm_page_wakeup(p);
2557         return(0);
2558 }
2559
2560 /*
2561  * Return TRUE if the pmap is in shape to trivially
2562  * pre-fault the specified address.
2563  *
2564  * Returns FALSE if it would be non-trivial or if a
2565  * pte is already loaded into the slot.
2566  *
2567  * No requirements.
2568  */
2569 int
2570 pmap_prefault_ok(pmap_t pmap, vm_offset_t addr)
2571 {
2572         pt_entry_t *pte;
2573         pd_entry_t *pde;
2574         int ret;
2575
2576         lwkt_gettoken(&vm_token);
2577         pde = pmap_pde(pmap, addr);
2578         if (pde == NULL || *pde == 0) {
2579                 ret = 0;
2580         } else {
2581                 pte = pmap_pde_to_pte(pde, addr);
2582                 ret = (*pte) ? 0 : 1;
2583         }
2584         lwkt_reltoken(&vm_token);
2585         return (ret);
2586 }
2587
2588 /*
2589  * Change the wiring attribute for a map/virtual-address pair.
2590  *
2591  * The mapping must already exist in the pmap.
2592  * No other requirements.
2593  */
2594 void
2595 pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired,
2596                    vm_map_entry_t entry __unused)
2597 {
2598         pt_entry_t *pte;
2599
2600         if (pmap == NULL)
2601                 return;
2602
2603         lwkt_gettoken(&vm_token);
2604         pte = pmap_pte(pmap, va);
2605
2606         if (wired && !pmap_pte_w(pte))
2607                 pmap->pm_stats.wired_count++;
2608         else if (!wired && pmap_pte_w(pte))
2609                 pmap->pm_stats.wired_count--;
2610
2611         /*
2612          * Wiring is not a hardware characteristic so there is no need to
2613          * invalidate TLB.  However, in an SMP environment we must use
2614          * a locked bus cycle to update the pte (if we are not using
2615          * the pmap_inval_*() API that is)... it's ok to do this for simple
2616          * wiring changes.
2617          */
2618         if (wired)
2619                 atomic_set_long(pte, VPTE_WIRED);
2620         else
2621                 atomic_clear_long(pte, VPTE_WIRED);
2622         lwkt_reltoken(&vm_token);
2623 }
2624
2625 /*
2626  *      Copy the range specified by src_addr/len
2627  *      from the source map to the range dst_addr/len
2628  *      in the destination map.
2629  *
2630  *      This routine is only advisory and need not do anything.
2631  */
2632 void
2633 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr,
2634         vm_size_t len, vm_offset_t src_addr)
2635 {
2636         /*
2637          * XXX BUGGY.  Amoung other things srcmpte is assumed to remain
2638          * valid through blocking calls, and that's just not going to
2639          * be the case.
2640          *
2641          * FIXME!
2642          */
2643         return;
2644 }
2645
2646 /*
2647  * pmap_zero_page:
2648  *
2649  *      Zero the specified physical page.
2650  *
2651  *      This function may be called from an interrupt and no locking is
2652  *      required.
2653  */
2654 void
2655 pmap_zero_page(vm_paddr_t phys)
2656 {
2657         vm_offset_t va = PHYS_TO_DMAP(phys);
2658
2659         bzero((void *)va, PAGE_SIZE);
2660 }
2661
2662 /*
2663  * pmap_page_assertzero:
2664  *
2665  *      Assert that a page is empty, panic if it isn't.
2666  */
2667 void
2668 pmap_page_assertzero(vm_paddr_t phys)
2669 {
2670         int i;
2671
2672         crit_enter();
2673         vm_offset_t virt = PHYS_TO_DMAP(phys);
2674
2675         for (i = 0; i < PAGE_SIZE; i += sizeof(int)) {
2676             if (*(int *)((char *)virt + i) != 0) {
2677                 panic("pmap_page_assertzero() @ %p not zero!",
2678                     (void *)virt);
2679             }
2680         }
2681         crit_exit();
2682 }
2683
2684 /*
2685  * pmap_zero_page:
2686  *
2687  *      Zero part of a physical page by mapping it into memory and clearing
2688  *      its contents with bzero.
2689  *
2690  *      off and size may not cover an area beyond a single hardware page.
2691  */
2692 void
2693 pmap_zero_page_area(vm_paddr_t phys, int off, int size)
2694 {
2695         crit_enter();
2696         vm_offset_t virt = PHYS_TO_DMAP(phys);
2697         bzero((char *)virt + off, size);
2698         crit_exit();
2699 }
2700
2701 /*
2702  * pmap_copy_page:
2703  *
2704  *      Copy the physical page from the source PA to the target PA.
2705  *      This function may be called from an interrupt.  No locking
2706  *      is required.
2707  */
2708 void
2709 pmap_copy_page(vm_paddr_t src, vm_paddr_t dst)
2710 {
2711         vm_offset_t src_virt, dst_virt;
2712
2713         crit_enter();
2714         src_virt = PHYS_TO_DMAP(src);
2715         dst_virt = PHYS_TO_DMAP(dst);
2716         bcopy((void *)src_virt, (void *)dst_virt, PAGE_SIZE);
2717         crit_exit();
2718 }
2719
2720 /*
2721  * pmap_copy_page_frag:
2722  *
2723  *      Copy the physical page from the source PA to the target PA.
2724  *      This function may be called from an interrupt.  No locking
2725  *      is required.
2726  */
2727 void
2728 pmap_copy_page_frag(vm_paddr_t src, vm_paddr_t dst, size_t bytes)
2729 {
2730         vm_offset_t src_virt, dst_virt;
2731
2732         crit_enter();
2733         src_virt = PHYS_TO_DMAP(src);
2734         dst_virt = PHYS_TO_DMAP(dst);
2735         bcopy((char *)src_virt + (src & PAGE_MASK),
2736               (char *)dst_virt + (dst & PAGE_MASK),
2737               bytes);
2738         crit_exit();
2739 }
2740
2741 /*
2742  * Returns true if the pmap's pv is one of the first 16 pvs linked to
2743  * from this page.  This count may be changed upwards or downwards
2744  * in the future; it is only necessary that true be returned for a small
2745  * subset of pmaps for proper page aging.
2746  *
2747  * No other requirements.
2748  */
2749 boolean_t
2750 pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
2751 {
2752         pv_entry_t pv;
2753         int loops = 0;
2754
2755         if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
2756                 return FALSE;
2757
2758         crit_enter();
2759         lwkt_gettoken(&vm_token);
2760
2761         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
2762                 if (pv->pv_pmap == pmap) {
2763                         lwkt_reltoken(&vm_token);
2764                         crit_exit();
2765                         return TRUE;
2766                 }
2767                 loops++;
2768                 if (loops >= 16)
2769                         break;
2770         }
2771         lwkt_reltoken(&vm_token);
2772         crit_exit();
2773         return (FALSE);
2774 }
2775
2776 /*
2777  * Remove all pages from specified address space this aids process
2778  * exit speeds.  Also, this code is special cased for current
2779  * process only, but can have the more generic (and slightly slower)
2780  * mode enabled.  This is much faster than pmap_remove in the case
2781  * of running down an entire address space.
2782  *
2783  * No other requirements.
2784  */
2785 void
2786 pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
2787 {
2788         pt_entry_t *pte, tpte;
2789         pv_entry_t pv, npv;
2790         vm_page_t m;
2791         int save_generation;
2792
2793         if (pmap->pm_pteobj)
2794                 vm_object_hold(pmap->pm_pteobj);
2795         lwkt_gettoken(&vm_token);
2796
2797         for (pv = TAILQ_FIRST(&pmap->pm_pvlist); pv; pv = npv) {
2798                 if (pv->pv_va >= eva || pv->pv_va < sva) {
2799                         npv = TAILQ_NEXT(pv, pv_plist);
2800                         continue;
2801                 }
2802
2803                 KKASSERT(pmap == pv->pv_pmap);
2804
2805                 pte = pmap_pte(pmap, pv->pv_va);
2806
2807                 /*
2808                  * We cannot remove wired pages from a process' mapping
2809                  * at this time
2810                  */
2811                 if (*pte & VPTE_WIRED) {
2812                         npv = TAILQ_NEXT(pv, pv_plist);
2813                         continue;
2814                 }
2815                 tpte = pmap_inval_loadandclear(pte, pmap, pv->pv_va);
2816
2817                 m = PHYS_TO_VM_PAGE(tpte & VPTE_FRAME);
2818
2819                 KASSERT(m < &vm_page_array[vm_page_array_size],
2820                         ("pmap_remove_pages: bad tpte %lx", tpte));
2821
2822                 KKASSERT(pmap->pm_stats.resident_count > 0);
2823                 --pmap->pm_stats.resident_count;
2824
2825                 /*
2826                  * Update the vm_page_t clean and reference bits.
2827                  */
2828                 if (tpte & VPTE_M) {
2829                         vm_page_dirty(m);
2830                 }
2831
2832                 npv = TAILQ_NEXT(pv, pv_plist);
2833                 TAILQ_REMOVE(&pmap->pm_pvlist, pv, pv_plist);
2834                 save_generation = ++pmap->pm_generation;
2835
2836                 m->md.pv_list_count--;
2837                 atomic_add_int(&m->object->agg_pv_list_count, -1);
2838                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
2839                 if (TAILQ_EMPTY(&m->md.pv_list))
2840                         vm_page_flag_clear(m, PG_MAPPED | PG_WRITEABLE);
2841
2842                 pmap_unuse_pt(pmap, pv->pv_va, pv->pv_ptem);
2843                 free_pv_entry(pv);
2844
2845                 /*
2846                  * Restart the scan if we blocked during the unuse or free
2847                  * calls and other removals were made.
2848                  */
2849                 if (save_generation != pmap->pm_generation) {
2850                         kprintf("Warning: pmap_remove_pages race-A avoided\n");
2851                         npv = TAILQ_FIRST(&pmap->pm_pvlist);
2852                 }
2853         }
2854         lwkt_reltoken(&vm_token);
2855         if (pmap->pm_pteobj)
2856                 vm_object_drop(pmap->pm_pteobj);
2857 }
2858
2859 /*
2860  * pmap_testbit tests bits in active mappings of a VM page.
2861  */
2862 static boolean_t
2863 pmap_testbit(vm_page_t m, int bit)
2864 {
2865         pv_entry_t pv;
2866         pt_entry_t *pte;
2867
2868         if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
2869                 return FALSE;
2870
2871         if (TAILQ_FIRST(&m->md.pv_list) == NULL)
2872                 return FALSE;
2873
2874         crit_enter();
2875
2876         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
2877                 /*
2878                  * if the bit being tested is the modified bit, then
2879                  * mark clean_map and ptes as never
2880                  * modified.
2881                  */
2882                 if (bit & (VPTE_A|VPTE_M)) {
2883                         if (!pmap_track_modified(pv->pv_pmap, pv->pv_va))
2884                                 continue;
2885                 }
2886
2887 #if defined(PMAP_DIAGNOSTIC)
2888                 if (pv->pv_pmap == NULL) {
2889                         kprintf("Null pmap (tb) at va: 0x%lx\n", pv->pv_va);
2890                         continue;
2891                 }
2892 #endif
2893                 pte = pmap_pte(pv->pv_pmap, pv->pv_va);
2894                 if (*pte & bit) {
2895                         crit_exit();
2896                         return TRUE;
2897                 }
2898         }
2899         crit_exit();
2900         return (FALSE);
2901 }
2902
2903 /*
2904  * This routine is used to clear bits in ptes.  Certain bits require special
2905  * handling, in particular (on virtual kernels) the VPTE_M (modify) bit.
2906  *
2907  * This routine is only called with certain VPTE_* bit combinations.
2908  */
2909 static __inline void
2910 pmap_clearbit(vm_page_t m, int bit)
2911 {
2912         pv_entry_t pv;
2913         pt_entry_t *pte;
2914         pt_entry_t pbits;
2915
2916         if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
2917                 return;
2918
2919         crit_enter();
2920
2921         /*
2922          * Loop over all current mappings setting/clearing as appropos If
2923          * setting RO do we need to clear the VAC?
2924          */
2925         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
2926                 /*
2927                  * don't write protect pager mappings
2928                  */
2929                 if (bit == VPTE_W) {
2930                         if (!pmap_track_modified(pv->pv_pmap, pv->pv_va))
2931                                 continue;
2932                 }
2933
2934 #if defined(PMAP_DIAGNOSTIC)
2935                 if (pv->pv_pmap == NULL) {
2936                         kprintf("Null pmap (cb) at va: 0x%lx\n", pv->pv_va);
2937                         continue;
2938                 }
2939 #endif
2940
2941                 /*
2942                  * Careful here.  We can use a locked bus instruction to
2943                  * clear VPTE_A or VPTE_M safely but we need to synchronize
2944                  * with the target cpus when we mess with VPTE_W.
2945                  *
2946                  * On virtual kernels we must force a new fault-on-write
2947                  * in the real kernel if we clear the Modify bit ourselves,
2948                  * otherwise the real kernel will not get a new fault and
2949                  * will never set our Modify bit again.
2950                  */
2951                 pte = pmap_pte(pv->pv_pmap, pv->pv_va);
2952                 if (*pte & bit) {
2953                         if (bit == VPTE_W) {
2954                                 /*
2955                                  * We must also clear VPTE_M when clearing
2956                                  * VPTE_W
2957                                  */
2958                                 pbits = pmap_clean_pte(pte, pv->pv_pmap,
2959                                                        pv->pv_va);
2960                                 if (pbits & VPTE_M)
2961                                         vm_page_dirty(m);
2962                         } else if (bit == VPTE_M) {
2963                                 /*
2964                                  * We do not have to make the page read-only
2965                                  * when clearing the Modify bit.  The real
2966                                  * kernel will make the real PTE read-only
2967                                  * or otherwise detect the write and set
2968                                  * our VPTE_M again simply by us invalidating
2969                                  * the real kernel VA for the pmap (as we did
2970                                  * above).  This allows the real kernel to
2971                                  * handle the write fault without forwarding
2972                                  * the fault to us.
2973                                  */
2974                                 atomic_clear_long(pte, VPTE_M);
2975                         } else if ((bit & (VPTE_W|VPTE_M)) == (VPTE_W|VPTE_M)) {
2976                                 /*
2977                                  * We've been asked to clear W & M, I guess
2978                                  * the caller doesn't want us to update
2979                                  * the dirty status of the VM page.
2980                                  */
2981                                 pmap_clean_pte(pte, pv->pv_pmap, pv->pv_va);
2982                         } else {
2983                                 /*
2984                                  * We've been asked to clear bits that do
2985                                  * not interact with hardware.
2986                                  */
2987                                 atomic_clear_long(pte, bit);
2988                         }
2989                 }
2990         }
2991         crit_exit();
2992 }
2993
2994 /*
2995  * Lower the permission for all mappings to a given page.
2996  *
2997  * No other requirements.
2998  */
2999 void
3000 pmap_page_protect(vm_page_t m, vm_prot_t prot)
3001 {
3002         /* JG NX support? */
3003         if ((prot & VM_PROT_WRITE) == 0) {
3004                 lwkt_gettoken(&vm_token);
3005                 if (prot & (VM_PROT_READ | VM_PROT_EXECUTE)) {
3006                         pmap_clearbit(m, VPTE_W);
3007                         vm_page_flag_clear(m, PG_WRITEABLE);
3008                 } else {
3009                         pmap_remove_all(m);
3010                 }
3011                 lwkt_reltoken(&vm_token);
3012         }
3013 }
3014
3015 vm_paddr_t
3016 pmap_phys_address(vm_pindex_t ppn)
3017 {
3018         return (x86_64_ptob(ppn));
3019 }
3020
3021 /*
3022  * Return a count of reference bits for a page, clearing those bits.
3023  * It is not necessary for every reference bit to be cleared, but it
3024  * is necessary that 0 only be returned when there are truly no
3025  * reference bits set.
3026  *
3027  * XXX: The exact number of bits to check and clear is a matter that
3028  * should be tested and standardized at some point in the future for
3029  * optimal aging of shared pages.
3030  *
3031  * No other requirements.
3032  */
3033 int
3034 pmap_ts_referenced(vm_page_t m)
3035 {
3036         pv_entry_t pv, pvf, pvn;
3037         pt_entry_t *pte;
3038         int rtval = 0;
3039
3040         if (!pmap_initialized || (m->flags & PG_FICTITIOUS))
3041                 return (rtval);
3042
3043         crit_enter();
3044         lwkt_gettoken(&vm_token);
3045
3046         if ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
3047
3048                 pvf = pv;
3049
3050                 do {
3051                         pvn = TAILQ_NEXT(pv, pv_list);
3052
3053                         TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
3054
3055                         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
3056
3057                         if (!pmap_track_modified(pv->pv_pmap, pv->pv_va))
3058                                 continue;
3059
3060                         pte = pmap_pte(pv->pv_pmap, pv->pv_va);
3061
3062                         if (pte && (*pte & VPTE_A)) {
3063                                 atomic_clear_long(pte, VPTE_A);
3064                                 rtval++;
3065                                 if (rtval > 4) {
3066                                         break;
3067                                 }
3068                         }
3069                 } while ((pv = pvn) != NULL && pv != pvf);
3070         }
3071         lwkt_reltoken(&vm_token);
3072         crit_exit();
3073
3074         return (rtval);
3075 }
3076
3077 /*
3078  * Return whether or not the specified physical page was modified
3079  * in any physical maps.
3080  *
3081  * No other requirements.
3082  */
3083 boolean_t
3084 pmap_is_modified(vm_page_t m)
3085 {
3086         boolean_t res;
3087
3088         lwkt_gettoken(&vm_token);
3089         res = pmap_testbit(m, VPTE_M);
3090         lwkt_reltoken(&vm_token);
3091         return (res);
3092 }
3093
3094 /*
3095  * Clear the modify bits on the specified physical page.
3096  *
3097  * No other requirements.
3098  */
3099 void
3100 pmap_clear_modify(vm_page_t m)
3101 {
3102         lwkt_gettoken(&vm_token);
3103         pmap_clearbit(m, VPTE_M);
3104         lwkt_reltoken(&vm_token);
3105 }
3106
3107 /*
3108  * Clear the reference bit on the specified physical page.
3109  *
3110  * No other requirements.
3111  */
3112 void
3113 pmap_clear_reference(vm_page_t m)
3114 {
3115         lwkt_gettoken(&vm_token);
3116         pmap_clearbit(m, VPTE_A);
3117         lwkt_reltoken(&vm_token);
3118 }
3119
3120 /*
3121  * Miscellaneous support routines follow
3122  */
3123
3124 static void
3125 i386_protection_init(void)
3126 {
3127         int *kp, prot;
3128
3129         kp = protection_codes;
3130         for (prot = 0; prot < 8; prot++) {
3131                 if (prot & VM_PROT_READ)
3132                         *kp |= VPTE_R;
3133                 if (prot & VM_PROT_WRITE)
3134                         *kp |= VPTE_W;
3135                 if (prot & VM_PROT_EXECUTE)
3136                         *kp |= VPTE_X;
3137                 ++kp;
3138         }
3139 }
3140
3141 /*
3142  * Change the PAT attribute on an existing kernel memory map.  Caller
3143  * must ensure that the virtual memory in question is not accessed
3144  * during the adjustment.
3145  */
3146 void
3147 pmap_change_attr(vm_offset_t va, vm_size_t count, int mode)
3148 {
3149         /* This is a vkernel, do nothing */
3150 }
3151
3152 /*
3153  * Perform the pmap work for mincore
3154  *
3155  * No other requirements.
3156  */
3157 int
3158 pmap_mincore(pmap_t pmap, vm_offset_t addr)
3159 {
3160         pt_entry_t *ptep, pte;
3161         vm_page_t m;
3162         int val = 0;
3163
3164         lwkt_gettoken(&vm_token);
3165         ptep = pmap_pte(pmap, addr);
3166
3167         if (ptep && (pte = *ptep) != 0) {
3168                 vm_paddr_t pa;
3169
3170                 val = MINCORE_INCORE;
3171                 if ((pte & VPTE_MANAGED) == 0)
3172                         goto done;
3173
3174                 pa = pte & VPTE_FRAME;
3175
3176                 m = PHYS_TO_VM_PAGE(pa);
3177
3178                 /*
3179                  * Modified by us
3180                  */
3181                 if (pte & VPTE_M)
3182                         val |= MINCORE_MODIFIED|MINCORE_MODIFIED_OTHER;
3183                 /*
3184                  * Modified by someone
3185                  */
3186                 else if (m->dirty || pmap_is_modified(m))
3187                         val |= MINCORE_MODIFIED_OTHER;
3188                 /*
3189                  * Referenced by us
3190                  */
3191                 if (pte & VPTE_A)
3192                         val |= MINCORE_REFERENCED|MINCORE_REFERENCED_OTHER;
3193
3194                 /*
3195                  * Referenced by someone
3196                  */
3197                 else if ((m->flags & PG_REFERENCED) || pmap_ts_referenced(m)) {
3198                         val |= MINCORE_REFERENCED_OTHER;
3199                         vm_page_flag_set(m, PG_REFERENCED);
3200                 }
3201         }
3202 done:
3203         lwkt_reltoken(&vm_token);
3204         return val;
3205 }
3206
3207 /*
3208  * Replace p->p_vmspace with a new one.  If adjrefs is non-zero the new
3209  * vmspace will be ref'd and the old one will be deref'd.
3210  *
3211  * Caller must hold vmspace->vm_map.token for oldvm and newvm
3212  */
3213 void
3214 pmap_replacevm(struct proc *p, struct vmspace *newvm, int adjrefs)
3215 {
3216         struct vmspace *oldvm;
3217         struct lwp *lp;
3218
3219         crit_enter();
3220         oldvm = p->p_vmspace;
3221         if (oldvm != newvm) {
3222                 p->p_vmspace = newvm;
3223                 KKASSERT(p->p_nthreads == 1);
3224                 lp = RB_ROOT(&p->p_lwp_tree);
3225                 pmap_setlwpvm(lp, newvm);
3226                 if (adjrefs) {
3227                         sysref_get(&newvm->vm_sysref);
3228                         sysref_put(&oldvm->vm_sysref);
3229                 }
3230         }
3231         crit_exit();
3232 }
3233
3234 /*
3235  * Set the vmspace for a LWP.  The vmspace is almost universally set the
3236  * same as the process vmspace, but virtual kernels need to swap out contexts
3237  * on a per-lwp basis.
3238  */
3239 void
3240 pmap_setlwpvm(struct lwp *lp, struct vmspace *newvm)
3241 {
3242         struct vmspace *oldvm;
3243         struct pmap *pmap;
3244
3245         crit_enter();
3246         oldvm = lp->lwp_vmspace;
3247
3248         if (oldvm != newvm) {
3249                 lp->lwp_vmspace = newvm;
3250                 if (curthread->td_lwp == lp) {
3251                         pmap = vmspace_pmap(newvm);
3252                         atomic_set_cpumask(&pmap->pm_active, CPUMASK(mycpu->gd_cpuid));
3253 #if defined(SWTCH_OPTIM_STATS)
3254                         tlb_flush_count++;
3255 #endif
3256                         pmap = vmspace_pmap(oldvm);
3257                         atomic_clear_cpumask(&pmap->pm_active,
3258                                              CPUMASK(mycpu->gd_cpuid));
3259                 }
3260         }
3261         crit_exit();
3262 }
3263
3264 vm_offset_t
3265 pmap_addr_hint(vm_object_t obj, vm_offset_t addr, vm_size_t size)
3266 {
3267
3268         if ((obj == NULL) || (size < NBPDR) || (obj->type != OBJT_DEVICE)) {
3269                 return addr;
3270         }
3271
3272         addr = (addr + (NBPDR - 1)) & ~(NBPDR - 1);
3273         return addr;
3274 }
3275
3276 /*
3277  * Used by kmalloc/kfree, page already exists at va
3278  */
3279 vm_page_t
3280 pmap_kvtom(vm_offset_t va)
3281 {
3282         vpte_t *ptep;
3283
3284         KKASSERT(va >= KvaStart && va < KvaEnd);
3285         ptep = vtopte(va);
3286         return(PHYS_TO_VM_PAGE(*ptep & PG_FRAME));
3287 }
3288
3289 void
3290 pmap_object_init(vm_object_t object)
3291 {
3292         /* empty */
3293 }
3294
3295 void
3296 pmap_object_free(vm_object_t object)
3297 {
3298         /* empty */
3299 }