]> CyberLeo.Net >> Repos - FreeBSD/stable/8.git/blob - sys/i386/xen/pmap.c
MFC kern.msgbufsize: r217688-217689,r217709,r218666-218667,r218913.
[FreeBSD/stable/8.git] / sys / i386 / xen / pmap.c
1 /*-
2  * Copyright (c) 1991 Regents of the University of California.
3  * All rights reserved.
4  * Copyright (c) 1994 John S. Dyson
5  * All rights reserved.
6  * Copyright (c) 1994 David Greenman
7  * All rights reserved.
8  * Copyright (c) 2005 Alan L. Cox <alc@cs.rice.edu>
9  * All rights reserved.
10  *
11  * This code is derived from software contributed to Berkeley by
12  * the Systems Programming Group of the University of Utah Computer
13  * Science Department and William Jolitz of UUNET Technologies Inc.
14  *
15  * Redistribution and use in source and binary forms, with or without
16  * modification, are permitted provided that the following conditions
17  * are met:
18  * 1. Redistributions of source code must retain the above copyright
19  *    notice, this list of conditions and the following disclaimer.
20  * 2. Redistributions in binary form must reproduce the above copyright
21  *    notice, this list of conditions and the following disclaimer in the
22  *    documentation and/or other materials provided with the distribution.
23  * 3. All advertising materials mentioning features or use of this software
24  *    must display the following acknowledgement:
25  *      This product includes software developed by the University of
26  *      California, Berkeley and its contributors.
27  * 4. Neither the name of the University nor the names of its contributors
28  *    may be used to endorse or promote products derived from this software
29  *    without specific prior written permission.
30  *
31  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
32  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
33  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
34  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
35  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
39  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
40  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
41  * SUCH DAMAGE.
42  *
43  *      from:   @(#)pmap.c      7.7 (Berkeley)  5/12/91
44  */
45 /*-
46  * Copyright (c) 2003 Networks Associates Technology, Inc.
47  * All rights reserved.
48  *
49  * This software was developed for the FreeBSD Project by Jake Burkholder,
50  * Safeport Network Services, and Network Associates Laboratories, the
51  * Security Research Division of Network Associates, Inc. under
52  * DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA
53  * CHATS research program.
54  *
55  * Redistribution and use in source and binary forms, with or without
56  * modification, are permitted provided that the following conditions
57  * are met:
58  * 1. Redistributions of source code must retain the above copyright
59  *    notice, this list of conditions and the following disclaimer.
60  * 2. Redistributions in binary form must reproduce the above copyright
61  *    notice, this list of conditions and the following disclaimer in the
62  *    documentation and/or other materials provided with the distribution.
63  *
64  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
65  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
66  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
67  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
68  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
69  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
70  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
71  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
72  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
73  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
74  * SUCH DAMAGE.
75  */
76
77 #include <sys/cdefs.h>
78 __FBSDID("$FreeBSD$");
79
80 /*
81  *      Manages physical address maps.
82  *
83  *      In addition to hardware address maps, this
84  *      module is called upon to provide software-use-only
85  *      maps which may or may not be stored in the same
86  *      form as hardware maps.  These pseudo-maps are
87  *      used to store intermediate results from copy
88  *      operations to and from address spaces.
89  *
90  *      Since the information managed by this module is
91  *      also stored by the logical address mapping module,
92  *      this module may throw away valid virtual-to-physical
93  *      mappings at almost any time.  However, invalidations
94  *      of virtual-to-physical mappings must be done as
95  *      requested.
96  *
97  *      In order to cope with hardware architectures which
98  *      make virtual-to-physical map invalidates expensive,
99  *      this module may delay invalidate or reduced protection
100  *      operations until such time as they are actually
101  *      necessary.  This module is given full information as
102  *      to which processors are currently using which maps,
103  *      and to when physical maps must be made correct.
104  */
105
106 #define PMAP_DIAGNOSTIC
107
108 #include "opt_cpu.h"
109 #include "opt_pmap.h"
110 #include "opt_smp.h"
111 #include "opt_xbox.h"
112
113 #include <sys/param.h>
114 #include <sys/systm.h>
115 #include <sys/kernel.h>
116 #include <sys/ktr.h>
117 #include <sys/lock.h>
118 #include <sys/malloc.h>
119 #include <sys/mman.h>
120 #include <sys/msgbuf.h>
121 #include <sys/mutex.h>
122 #include <sys/proc.h>
123 #include <sys/sf_buf.h>
124 #include <sys/sx.h>
125 #include <sys/vmmeter.h>
126 #include <sys/sched.h>
127 #include <sys/sysctl.h>
128 #ifdef SMP
129 #include <sys/smp.h>
130 #endif
131
132 #include <vm/vm.h>
133 #include <vm/vm_param.h>
134 #include <vm/vm_kern.h>
135 #include <vm/vm_page.h>
136 #include <vm/vm_map.h>
137 #include <vm/vm_object.h>
138 #include <vm/vm_extern.h>
139 #include <vm/vm_pageout.h>
140 #include <vm/vm_pager.h>
141 #include <vm/uma.h>
142
143 #include <machine/cpu.h>
144 #include <machine/cputypes.h>
145 #include <machine/md_var.h>
146 #include <machine/pcb.h>
147 #include <machine/specialreg.h>
148 #ifdef SMP
149 #include <machine/smp.h>
150 #endif
151
152 #ifdef XBOX
153 #include <machine/xbox.h>
154 #endif
155
156 #include <xen/interface/xen.h>
157 #include <xen/hypervisor.h>
158 #include <machine/xen/hypercall.h>
159 #include <machine/xen/xenvar.h>
160 #include <machine/xen/xenfunc.h>
161
162 #if !defined(CPU_DISABLE_SSE) && defined(I686_CPU)
163 #define CPU_ENABLE_SSE
164 #endif
165
166 #ifndef PMAP_SHPGPERPROC
167 #define PMAP_SHPGPERPROC 200
168 #endif
169
170 #if defined(DIAGNOSTIC)
171 #define PMAP_DIAGNOSTIC
172 #endif
173
174 #if !defined(PMAP_DIAGNOSTIC)
175 #define PMAP_INLINE     __gnu89_inline
176 #else
177 #define PMAP_INLINE
178 #endif
179
180 #define PV_STATS
181 #ifdef PV_STATS
182 #define PV_STAT(x)      do { x ; } while (0)
183 #else
184 #define PV_STAT(x)      do { } while (0)
185 #endif
186
187 #define pa_index(pa)    ((pa) >> PDRSHIFT)
188 #define pa_to_pvh(pa)   (&pv_table[pa_index(pa)])
189
190 /*
191  * Get PDEs and PTEs for user/kernel address space
192  */
193 #define pmap_pde(m, v)  (&((m)->pm_pdir[(vm_offset_t)(v) >> PDRSHIFT]))
194 #define pdir_pde(m, v) (m[(vm_offset_t)(v) >> PDRSHIFT])
195
196 #define pmap_pde_v(pte)         ((*(int *)pte & PG_V) != 0)
197 #define pmap_pte_w(pte)         ((*(int *)pte & PG_W) != 0)
198 #define pmap_pte_m(pte)         ((*(int *)pte & PG_M) != 0)
199 #define pmap_pte_u(pte)         ((*(int *)pte & PG_A) != 0)
200 #define pmap_pte_v(pte)         ((*(int *)pte & PG_V) != 0)
201
202 #define pmap_pte_set_prot(pte, v) ((*(int *)pte &= ~PG_PROT), (*(int *)pte |= (v)))
203
204 #define HAMFISTED_LOCKING
205 #ifdef HAMFISTED_LOCKING
206 static struct mtx createdelete_lock;
207 #endif
208
209 struct pmap kernel_pmap_store;
210 LIST_HEAD(pmaplist, pmap);
211 static struct pmaplist allpmaps;
212 static struct mtx allpmaps_lock;
213
214 vm_offset_t virtual_avail;      /* VA of first avail page (after kernel bss) */
215 vm_offset_t virtual_end;        /* VA of last avail page (end of kernel AS) */
216 int pgeflag = 0;                /* PG_G or-in */
217 int pseflag = 0;                /* PG_PS or-in */
218
219 int nkpt;
220 vm_offset_t kernel_vm_end;
221 extern u_int32_t KERNend;
222
223 #ifdef PAE
224 pt_entry_t pg_nx;
225 #if !defined(XEN) 
226 static uma_zone_t pdptzone;
227 #endif
228 #endif
229
230 static int pat_works;                   /* Is page attribute table sane? */
231
232 /*
233  * Data for the pv entry allocation mechanism
234  */
235 static int pv_entry_count = 0, pv_entry_max = 0, pv_entry_high_water = 0;
236 static struct md_page *pv_table;
237 static int shpgperproc = PMAP_SHPGPERPROC;
238
239 struct pv_chunk *pv_chunkbase;          /* KVA block for pv_chunks */
240 int pv_maxchunks;                       /* How many chunks we have KVA for */
241 vm_offset_t pv_vafree;                  /* freelist stored in the PTE */
242
243 /*
244  * All those kernel PT submaps that BSD is so fond of
245  */
246 struct sysmaps {
247         struct  mtx lock;
248         pt_entry_t *CMAP1;
249         pt_entry_t *CMAP2;
250         caddr_t CADDR1;
251         caddr_t CADDR2;
252 };
253 static struct sysmaps sysmaps_pcpu[MAXCPU];
254 pt_entry_t *CMAP1 = 0;
255 static pt_entry_t *CMAP3;
256 caddr_t CADDR1 = 0, ptvmmap = 0;
257 static caddr_t CADDR3;
258 struct msgbuf *msgbufp = 0;
259
260 /*
261  * Crashdump maps.
262  */
263 static caddr_t crashdumpmap;
264
265 static pt_entry_t *PMAP1 = 0, *PMAP2;
266 static pt_entry_t *PADDR1 = 0, *PADDR2;
267 #ifdef SMP
268 static int PMAP1cpu;
269 static int PMAP1changedcpu;
270 SYSCTL_INT(_debug, OID_AUTO, PMAP1changedcpu, CTLFLAG_RD, 
271            &PMAP1changedcpu, 0,
272            "Number of times pmap_pte_quick changed CPU with same PMAP1");
273 #endif
274 static int PMAP1changed;
275 SYSCTL_INT(_debug, OID_AUTO, PMAP1changed, CTLFLAG_RD, 
276            &PMAP1changed, 0,
277            "Number of times pmap_pte_quick changed PMAP1");
278 static int PMAP1unchanged;
279 SYSCTL_INT(_debug, OID_AUTO, PMAP1unchanged, CTLFLAG_RD, 
280            &PMAP1unchanged, 0,
281            "Number of times pmap_pte_quick didn't change PMAP1");
282 static struct mtx PMAP2mutex;
283
284 SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters");
285 static int pg_ps_enabled;
286 SYSCTL_INT(_vm_pmap, OID_AUTO, pg_ps_enabled, CTLFLAG_RDTUN, &pg_ps_enabled, 0,
287     "Are large page mappings enabled?");
288
289 SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_max, CTLFLAG_RD, &pv_entry_max, 0,
290         "Max number of PV entries");
291 SYSCTL_INT(_vm_pmap, OID_AUTO, shpgperproc, CTLFLAG_RD, &shpgperproc, 0,
292         "Page share factor per proc");
293
294 static void     free_pv_entry(pmap_t pmap, pv_entry_t pv);
295 static pv_entry_t get_pv_entry(pmap_t locked_pmap, int try);
296
297 static vm_page_t pmap_enter_quick_locked(multicall_entry_t **mcl, int *count, pmap_t pmap, vm_offset_t va,
298     vm_page_t m, vm_prot_t prot, vm_page_t mpte);
299 static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t sva,
300     vm_page_t *free);
301 static void pmap_remove_page(struct pmap *pmap, vm_offset_t va,
302     vm_page_t *free);
303 static void pmap_remove_entry(struct pmap *pmap, vm_page_t m,
304                                         vm_offset_t va);
305 static void pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m);
306 static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va,
307     vm_page_t m);
308
309 static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags);
310
311 static vm_page_t _pmap_allocpte(pmap_t pmap, unsigned ptepindex, int flags);
312 static int _pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m, vm_page_t *free);
313 static pt_entry_t *pmap_pte_quick(pmap_t pmap, vm_offset_t va);
314 static void pmap_pte_release(pt_entry_t *pte);
315 static int pmap_unuse_pt(pmap_t, vm_offset_t, vm_page_t *);
316 static vm_offset_t pmap_kmem_choose(vm_offset_t addr);
317 static boolean_t pmap_is_prefaultable_locked(pmap_t pmap, vm_offset_t addr);
318 static void pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode);
319
320 static __inline void pagezero(void *page);
321
322 #if defined(PAE) && !defined(XEN)
323 static void *pmap_pdpt_allocf(uma_zone_t zone, int bytes, u_int8_t *flags, int wait);
324 #endif
325
326 CTASSERT(1 << PDESHIFT == sizeof(pd_entry_t));
327 CTASSERT(1 << PTESHIFT == sizeof(pt_entry_t));
328
329 /*
330  * If you get an error here, then you set KVA_PAGES wrong! See the
331  * description of KVA_PAGES in sys/i386/include/pmap.h. It must be
332  * multiple of 4 for a normal kernel, or a multiple of 8 for a PAE.
333  */
334 CTASSERT(KERNBASE % (1 << 24) == 0);
335
336
337
338 void 
339 pd_set(struct pmap *pmap, int ptepindex, vm_paddr_t val, int type)
340 {
341         vm_paddr_t pdir_ma = vtomach(&pmap->pm_pdir[ptepindex]);
342         
343         switch (type) {
344         case SH_PD_SET_VA:
345 #if 0           
346                 xen_queue_pt_update(shadow_pdir_ma,
347                                     xpmap_ptom(val & ~(PG_RW)));
348 #endif          
349                 xen_queue_pt_update(pdir_ma,
350                                     xpmap_ptom(val));   
351                 break;
352         case SH_PD_SET_VA_MA:
353 #if 0           
354                 xen_queue_pt_update(shadow_pdir_ma,
355                                     val & ~(PG_RW));
356 #endif          
357                 xen_queue_pt_update(pdir_ma, val);      
358                 break;
359         case SH_PD_SET_VA_CLEAR:
360 #if 0
361                 xen_queue_pt_update(shadow_pdir_ma, 0);
362 #endif          
363                 xen_queue_pt_update(pdir_ma, 0);        
364                 break;
365         }
366 }
367
368 /*
369  * Move the kernel virtual free pointer to the next
370  * 4MB.  This is used to help improve performance
371  * by using a large (4MB) page for much of the kernel
372  * (.text, .data, .bss)
373  */
374 static vm_offset_t
375 pmap_kmem_choose(vm_offset_t addr)
376 {
377         vm_offset_t newaddr = addr;
378
379 #ifndef DISABLE_PSE
380         if (cpu_feature & CPUID_PSE)
381                 newaddr = (addr + PDRMASK) & ~PDRMASK;
382 #endif
383         return newaddr;
384 }
385
386 /*
387  *      Bootstrap the system enough to run with virtual memory.
388  *
389  *      On the i386 this is called after mapping has already been enabled
390  *      and just syncs the pmap module with what has already been done.
391  *      [We can't call it easily with mapping off since the kernel is not
392  *      mapped with PA == VA, hence we would have to relocate every address
393  *      from the linked base (virtual) address "KERNBASE" to the actual
394  *      (physical) address starting relative to 0]
395  */
396 void
397 pmap_bootstrap(vm_paddr_t firstaddr)
398 {
399         vm_offset_t va;
400         pt_entry_t *pte, *unused;
401         struct sysmaps *sysmaps;
402         int i;
403
404         /*
405          * XXX The calculation of virtual_avail is wrong. It's NKPT*PAGE_SIZE too
406          * large. It should instead be correctly calculated in locore.s and
407          * not based on 'first' (which is a physical address, not a virtual
408          * address, for the start of unused physical memory). The kernel
409          * page tables are NOT double mapped and thus should not be included
410          * in this calculation.
411          */
412         virtual_avail = (vm_offset_t) KERNBASE + firstaddr;
413         virtual_avail = pmap_kmem_choose(virtual_avail);
414
415         virtual_end = VM_MAX_KERNEL_ADDRESS;
416
417         /*
418          * Initialize the kernel pmap (which is statically allocated).
419          */
420         PMAP_LOCK_INIT(kernel_pmap);
421         kernel_pmap->pm_pdir = (pd_entry_t *) (KERNBASE + (u_int)IdlePTD);
422 #ifdef PAE
423         kernel_pmap->pm_pdpt = (pdpt_entry_t *) (KERNBASE + (u_int)IdlePDPT);
424 #endif
425         kernel_pmap->pm_active = -1;    /* don't allow deactivation */
426         TAILQ_INIT(&kernel_pmap->pm_pvchunk);
427         LIST_INIT(&allpmaps);
428         mtx_init(&allpmaps_lock, "allpmaps", NULL, MTX_SPIN);
429         mtx_lock_spin(&allpmaps_lock);
430         LIST_INSERT_HEAD(&allpmaps, kernel_pmap, pm_list);
431         mtx_unlock_spin(&allpmaps_lock);
432         if (nkpt == 0)
433                 nkpt = NKPT;
434
435         /*
436          * Reserve some special page table entries/VA space for temporary
437          * mapping of pages.
438          */
439 #define SYSMAP(c, p, v, n)      \
440         v = (c)va; va += ((n)*PAGE_SIZE); p = pte; pte += (n);
441
442         va = virtual_avail;
443         pte = vtopte(va);
444
445         /*
446          * CMAP1/CMAP2 are used for zeroing and copying pages.
447          * CMAP3 is used for the idle process page zeroing.
448          */
449         for (i = 0; i < MAXCPU; i++) {
450                 sysmaps = &sysmaps_pcpu[i];
451                 mtx_init(&sysmaps->lock, "SYSMAPS", NULL, MTX_DEF);
452                 SYSMAP(caddr_t, sysmaps->CMAP1, sysmaps->CADDR1, 1)
453                 SYSMAP(caddr_t, sysmaps->CMAP2, sysmaps->CADDR2, 1)
454         }
455         SYSMAP(caddr_t, CMAP1, CADDR1, 1)
456         SYSMAP(caddr_t, CMAP3, CADDR3, 1)
457         PT_SET_MA(CADDR3, 0);
458
459         /*
460          * Crashdump maps.
461          */
462         SYSMAP(caddr_t, unused, crashdumpmap, MAXDUMPPGS)
463
464         /*
465          * ptvmmap is used for reading arbitrary physical pages via /dev/mem.
466          */
467         SYSMAP(caddr_t, unused, ptvmmap, 1)
468
469         /*
470          * msgbufp is used to map the system message buffer.
471          */
472         SYSMAP(struct msgbuf *, unused, msgbufp, atop(round_page(msgbufsize)))
473
474         /*
475          * ptemap is used for pmap_pte_quick
476          */
477         SYSMAP(pt_entry_t *, PMAP1, PADDR1, 1);
478         SYSMAP(pt_entry_t *, PMAP2, PADDR2, 1);
479
480         mtx_init(&PMAP2mutex, "PMAP2", NULL, MTX_DEF);
481
482         virtual_avail = va;
483         PT_SET_MA(CADDR1, 0);
484
485         /*
486          * Leave in place an identity mapping (virt == phys) for the low 1 MB
487          * physical memory region that is used by the ACPI wakeup code.  This
488          * mapping must not have PG_G set. 
489          */
490 #ifndef XEN
491         /*
492          * leave here deliberately to show that this is not supported
493          */
494 #ifdef XBOX
495         /* FIXME: This is gross, but needed for the XBOX. Since we are in such
496          * an early stadium, we cannot yet neatly map video memory ... :-(
497          * Better fixes are very welcome! */
498         if (!arch_i386_is_xbox)
499 #endif
500         for (i = 1; i < NKPT; i++)
501                 PTD[i] = 0;
502
503         /* Initialize the PAT MSR if present. */
504         pmap_init_pat();
505
506         /* Turn on PG_G on kernel page(s) */
507         pmap_set_pg();
508 #endif
509
510 #ifdef HAMFISTED_LOCKING
511         mtx_init(&createdelete_lock, "pmap create/delete", NULL, MTX_DEF);
512 #endif
513 }
514
515 /*
516  * Setup the PAT MSR.
517  */
518 void
519 pmap_init_pat(void)
520 {
521         uint64_t pat_msr;
522
523         /* Bail if this CPU doesn't implement PAT. */
524         if (!(cpu_feature & CPUID_PAT))
525                 return;
526
527         if (cpu_vendor_id != CPU_VENDOR_INTEL ||
528             (CPUID_TO_FAMILY(cpu_id) == 6 && CPUID_TO_MODEL(cpu_id) >= 0xe)) {
529                 /*
530                  * Leave the indices 0-3 at the default of WB, WT, UC, and UC-.
531                  * Program 4 and 5 as WP and WC.
532                  * Leave 6 and 7 as UC and UC-.
533                  */
534                 pat_msr = rdmsr(MSR_PAT);
535                 pat_msr &= ~(PAT_MASK(4) | PAT_MASK(5));
536                 pat_msr |= PAT_VALUE(4, PAT_WRITE_PROTECTED) |
537                     PAT_VALUE(5, PAT_WRITE_COMBINING);
538                 pat_works = 1;
539         } else {
540                 /*
541                  * Due to some Intel errata, we can only safely use the lower 4
542                  * PAT entries.  Thus, just replace PAT Index 2 with WC instead
543                  * of UC-.
544                  *
545                  *   Intel Pentium III Processor Specification Update
546                  * Errata E.27 (Upper Four PAT Entries Not Usable With Mode B
547                  * or Mode C Paging)
548                  *
549                  *   Intel Pentium IV  Processor Specification Update
550                  * Errata N46 (PAT Index MSB May Be Calculated Incorrectly)
551                  */
552                 pat_msr = rdmsr(MSR_PAT);
553                 pat_msr &= ~PAT_MASK(2);
554                 pat_msr |= PAT_VALUE(2, PAT_WRITE_COMBINING);
555                 pat_works = 0;
556         }
557         wrmsr(MSR_PAT, pat_msr);
558 }
559
560 /*
561  * Set PG_G on kernel pages.  Only the BSP calls this when SMP is turned on.
562  */
563 void
564 pmap_set_pg(void)
565 {
566         pd_entry_t pdir;
567         pt_entry_t *pte;
568         vm_offset_t va, endva;
569         int i; 
570
571         if (pgeflag == 0)
572                 return;
573
574         i = KERNLOAD/NBPDR;
575         endva = KERNBASE + KERNend;
576
577         if (pseflag) {
578                 va = KERNBASE + KERNLOAD;
579                 while (va  < endva) {
580                         pdir = kernel_pmap->pm_pdir[KPTDI+i];
581                         pdir |= pgeflag;
582                         kernel_pmap->pm_pdir[KPTDI+i] = PTD[KPTDI+i] = pdir;
583                         invltlb();      /* Play it safe, invltlb() every time */
584                         i++;
585                         va += NBPDR;
586                 }
587         } else {
588                 va = (vm_offset_t)btext;
589                 while (va < endva) {
590                         pte = vtopte(va);
591                         if (*pte & PG_V)
592                                 *pte |= pgeflag;
593                         invltlb();      /* Play it safe, invltlb() every time */
594                         va += PAGE_SIZE;
595                 }
596         }
597 }
598
599 /*
600  * Initialize a vm_page's machine-dependent fields.
601  */
602 void
603 pmap_page_init(vm_page_t m)
604 {
605
606         TAILQ_INIT(&m->md.pv_list);
607         m->md.pat_mode = PAT_WRITE_BACK;
608 }
609
610 #if defined(PAE) && !defined(XEN)
611 static void *
612 pmap_pdpt_allocf(uma_zone_t zone, int bytes, u_int8_t *flags, int wait)
613 {
614
615         /* Inform UMA that this allocator uses kernel_map/object. */
616         *flags = UMA_SLAB_KERNEL;
617         return ((void *)kmem_alloc_contig(kernel_map, bytes, wait, 0x0ULL,
618             0xffffffffULL, 1, 0, VM_MEMATTR_DEFAULT));
619 }
620 #endif
621
622 /*
623  * ABuse the pte nodes for unmapped kva to thread a kva freelist through.
624  * Requirements:
625  *  - Must deal with pages in order to ensure that none of the PG_* bits
626  *    are ever set, PG_V in particular.
627  *  - Assumes we can write to ptes without pte_store() atomic ops, even
628  *    on PAE systems.  This should be ok.
629  *  - Assumes nothing will ever test these addresses for 0 to indicate
630  *    no mapping instead of correctly checking PG_V.
631  *  - Assumes a vm_offset_t will fit in a pte (true for i386).
632  * Because PG_V is never set, there can be no mappings to invalidate.
633  */
634 static int ptelist_count = 0;
635 static vm_offset_t
636 pmap_ptelist_alloc(vm_offset_t *head)
637 {
638         vm_offset_t va;
639         vm_offset_t *phead = (vm_offset_t *)*head;
640         
641         if (ptelist_count == 0) {
642                 printf("out of memory!!!!!!\n");
643                 return (0);     /* Out of memory */
644         }
645         ptelist_count--;
646         va = phead[ptelist_count];
647         return (va);
648 }
649
650 static void
651 pmap_ptelist_free(vm_offset_t *head, vm_offset_t va)
652 {
653         vm_offset_t *phead = (vm_offset_t *)*head;
654
655         phead[ptelist_count++] = va;
656 }
657
658 static void
659 pmap_ptelist_init(vm_offset_t *head, void *base, int npages)
660 {
661         int i, nstackpages;
662         vm_offset_t va;
663         vm_page_t m;
664         
665         nstackpages = (npages + PAGE_SIZE/sizeof(vm_offset_t) - 1)/ (PAGE_SIZE/sizeof(vm_offset_t));
666         for (i = 0; i < nstackpages; i++) {
667                 va = (vm_offset_t)base + i * PAGE_SIZE;
668                 m = vm_page_alloc(NULL, i,
669                     VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED |
670                     VM_ALLOC_ZERO);
671                 pmap_qenter(va, &m, 1);
672         }
673
674         *head = (vm_offset_t)base;
675         for (i = npages - 1; i >= nstackpages; i--) {
676                 va = (vm_offset_t)base + i * PAGE_SIZE;
677                 pmap_ptelist_free(head, va);
678         }
679 }
680
681
682 /*
683  *      Initialize the pmap module.
684  *      Called by vm_init, to initialize any structures that the pmap
685  *      system needs to map virtual memory.
686  */
687 void
688 pmap_init(void)
689 {
690         vm_page_t mpte;
691         vm_size_t s;
692         int i, pv_npg;
693
694         /*
695          * Initialize the vm page array entries for the kernel pmap's
696          * page table pages.
697          */ 
698         for (i = 0; i < nkpt; i++) {
699                 mpte = PHYS_TO_VM_PAGE(xpmap_mtop(PTD[i + KPTDI] & PG_FRAME));
700                 KASSERT(mpte >= vm_page_array &&
701                     mpte < &vm_page_array[vm_page_array_size],
702                     ("pmap_init: page table page is out of range"));
703                 mpte->pindex = i + KPTDI;
704                 mpte->phys_addr = xpmap_mtop(PTD[i + KPTDI] & PG_FRAME);
705         }
706
707         /*
708          * Initialize the address space (zone) for the pv entries.  Set a
709          * high water mark so that the system can recover from excessive
710          * numbers of pv entries.
711          */
712         TUNABLE_INT_FETCH("vm.pmap.shpgperproc", &shpgperproc);
713         pv_entry_max = shpgperproc * maxproc + cnt.v_page_count;
714         TUNABLE_INT_FETCH("vm.pmap.pv_entries", &pv_entry_max);
715         pv_entry_max = roundup(pv_entry_max, _NPCPV);
716         pv_entry_high_water = 9 * (pv_entry_max / 10);
717
718         /*
719          * Are large page mappings enabled?
720          */
721         TUNABLE_INT_FETCH("vm.pmap.pg_ps_enabled", &pg_ps_enabled);
722
723         /*
724          * Calculate the size of the pv head table for superpages.
725          */
726         for (i = 0; phys_avail[i + 1]; i += 2);
727         pv_npg = round_4mpage(phys_avail[(i - 2) + 1]) / NBPDR;
728
729         /*
730          * Allocate memory for the pv head table for superpages.
731          */
732         s = (vm_size_t)(pv_npg * sizeof(struct md_page));
733         s = round_page(s);
734         pv_table = (struct md_page *)kmem_alloc(kernel_map, s);
735         for (i = 0; i < pv_npg; i++)
736                 TAILQ_INIT(&pv_table[i].pv_list);
737
738         pv_maxchunks = MAX(pv_entry_max / _NPCPV, maxproc);
739         pv_chunkbase = (struct pv_chunk *)kmem_alloc_nofault(kernel_map,
740             PAGE_SIZE * pv_maxchunks);
741         if (pv_chunkbase == NULL)
742                 panic("pmap_init: not enough kvm for pv chunks");
743         pmap_ptelist_init(&pv_vafree, pv_chunkbase, pv_maxchunks);
744 #if defined(PAE) && !defined(XEN)
745         pdptzone = uma_zcreate("PDPT", NPGPTD * sizeof(pdpt_entry_t), NULL,
746             NULL, NULL, NULL, (NPGPTD * sizeof(pdpt_entry_t)) - 1,
747             UMA_ZONE_VM | UMA_ZONE_NOFREE);
748         uma_zone_set_allocf(pdptzone, pmap_pdpt_allocf);
749 #endif
750 }
751
752
753 /***************************************************
754  * Low level helper routines.....
755  ***************************************************/
756
757 /*
758  * Determine the appropriate bits to set in a PTE or PDE for a specified
759  * caching mode.
760  */
761 int
762 pmap_cache_bits(int mode, boolean_t is_pde)
763 {
764         int pat_flag, pat_index, cache_bits;
765
766         /* The PAT bit is different for PTE's and PDE's. */
767         pat_flag = is_pde ? PG_PDE_PAT : PG_PTE_PAT;
768
769         /* If we don't support PAT, map extended modes to older ones. */
770         if (!(cpu_feature & CPUID_PAT)) {
771                 switch (mode) {
772                 case PAT_UNCACHEABLE:
773                 case PAT_WRITE_THROUGH:
774                 case PAT_WRITE_BACK:
775                         break;
776                 case PAT_UNCACHED:
777                 case PAT_WRITE_COMBINING:
778                 case PAT_WRITE_PROTECTED:
779                         mode = PAT_UNCACHEABLE;
780                         break;
781                 }
782         }
783         
784         /* Map the caching mode to a PAT index. */
785         if (pat_works) {
786                 switch (mode) {
787                         case PAT_UNCACHEABLE:
788                                 pat_index = 3;
789                                 break;
790                         case PAT_WRITE_THROUGH:
791                                 pat_index = 1;
792                                 break;
793                         case PAT_WRITE_BACK:
794                                 pat_index = 0;
795                                 break;
796                         case PAT_UNCACHED:
797                                 pat_index = 2;
798                                 break;
799                         case PAT_WRITE_COMBINING:
800                                 pat_index = 5;
801                                 break;
802                         case PAT_WRITE_PROTECTED:
803                                 pat_index = 4;
804                                 break;
805                         default:
806                                 panic("Unknown caching mode %d\n", mode);
807                 }
808         } else {
809                 switch (mode) {
810                         case PAT_UNCACHED:
811                         case PAT_UNCACHEABLE:
812                         case PAT_WRITE_PROTECTED:
813                                 pat_index = 3;
814                                 break;
815                         case PAT_WRITE_THROUGH:
816                                 pat_index = 1;
817                                 break;
818                         case PAT_WRITE_BACK:
819                                 pat_index = 0;
820                                 break;
821                         case PAT_WRITE_COMBINING:
822                                 pat_index = 2;
823                                 break;
824                         default:
825                                 panic("Unknown caching mode %d\n", mode);
826                 }
827         }       
828
829         /* Map the 3-bit index value into the PAT, PCD, and PWT bits. */
830         cache_bits = 0;
831         if (pat_index & 0x4)
832                 cache_bits |= pat_flag;
833         if (pat_index & 0x2)
834                 cache_bits |= PG_NC_PCD;
835         if (pat_index & 0x1)
836                 cache_bits |= PG_NC_PWT;
837         return (cache_bits);
838 }
839 #ifdef SMP
840 /*
841  * For SMP, these functions have to use the IPI mechanism for coherence.
842  *
843  * N.B.: Before calling any of the following TLB invalidation functions,
844  * the calling processor must ensure that all stores updating a non-
845  * kernel page table are globally performed.  Otherwise, another
846  * processor could cache an old, pre-update entry without being
847  * invalidated.  This can happen one of two ways: (1) The pmap becomes
848  * active on another processor after its pm_active field is checked by
849  * one of the following functions but before a store updating the page
850  * table is globally performed. (2) The pmap becomes active on another
851  * processor before its pm_active field is checked but due to
852  * speculative loads one of the following functions stills reads the
853  * pmap as inactive on the other processor.
854  * 
855  * The kernel page table is exempt because its pm_active field is
856  * immutable.  The kernel page table is always active on every
857  * processor.
858  */
859 void
860 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
861 {
862         cpumask_t cpumask, other_cpus;
863
864         CTR2(KTR_PMAP, "pmap_invalidate_page: pmap=%p va=0x%x",
865             pmap, va);
866         
867         sched_pin();
868         if (pmap == kernel_pmap || pmap->pm_active == all_cpus) {
869                 invlpg(va);
870                 smp_invlpg(va);
871         } else {
872                 cpumask = PCPU_GET(cpumask);
873                 other_cpus = PCPU_GET(other_cpus);
874                 if (pmap->pm_active & cpumask)
875                         invlpg(va);
876                 if (pmap->pm_active & other_cpus)
877                         smp_masked_invlpg(pmap->pm_active & other_cpus, va);
878         }
879         sched_unpin();
880         PT_UPDATES_FLUSH();
881 }
882
883 void
884 pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
885 {
886         cpumask_t cpumask, other_cpus;
887         vm_offset_t addr;
888
889         CTR3(KTR_PMAP, "pmap_invalidate_page: pmap=%p eva=0x%x sva=0x%x",
890             pmap, sva, eva);
891
892         sched_pin();
893         if (pmap == kernel_pmap || pmap->pm_active == all_cpus) {
894                 for (addr = sva; addr < eva; addr += PAGE_SIZE)
895                         invlpg(addr);
896                 smp_invlpg_range(sva, eva);
897         } else {
898                 cpumask = PCPU_GET(cpumask);
899                 other_cpus = PCPU_GET(other_cpus);
900                 if (pmap->pm_active & cpumask)
901                         for (addr = sva; addr < eva; addr += PAGE_SIZE)
902                                 invlpg(addr);
903                 if (pmap->pm_active & other_cpus)
904                         smp_masked_invlpg_range(pmap->pm_active & other_cpus,
905                             sva, eva);
906         }
907         sched_unpin();
908         PT_UPDATES_FLUSH();
909 }
910
911 void
912 pmap_invalidate_all(pmap_t pmap)
913 {
914         cpumask_t cpumask, other_cpus;
915
916         CTR1(KTR_PMAP, "pmap_invalidate_page: pmap=%p", pmap);
917
918         sched_pin();
919         if (pmap == kernel_pmap || pmap->pm_active == all_cpus) {
920                 invltlb();
921                 smp_invltlb();
922         } else {
923                 cpumask = PCPU_GET(cpumask);
924                 other_cpus = PCPU_GET(other_cpus);
925                 if (pmap->pm_active & cpumask)
926                         invltlb();
927                 if (pmap->pm_active & other_cpus)
928                         smp_masked_invltlb(pmap->pm_active & other_cpus);
929         }
930         sched_unpin();
931 }
932
933 void
934 pmap_invalidate_cache(void)
935 {
936
937         sched_pin();
938         wbinvd();
939         smp_cache_flush();
940         sched_unpin();
941 }
942 #else /* !SMP */
943 /*
944  * Normal, non-SMP, 486+ invalidation functions.
945  * We inline these within pmap.c for speed.
946  */
947 PMAP_INLINE void
948 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
949 {
950         CTR2(KTR_PMAP, "pmap_invalidate_page: pmap=%p va=0x%x",
951             pmap, va);
952
953         if (pmap == kernel_pmap || pmap->pm_active)
954                 invlpg(va);
955         PT_UPDATES_FLUSH();
956 }
957
958 PMAP_INLINE void
959 pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
960 {
961         vm_offset_t addr;
962
963         if (eva - sva > PAGE_SIZE)
964                 CTR3(KTR_PMAP, "pmap_invalidate_range: pmap=%p sva=0x%x eva=0x%x",
965                     pmap, sva, eva);
966
967         if (pmap == kernel_pmap || pmap->pm_active)
968                 for (addr = sva; addr < eva; addr += PAGE_SIZE)
969                         invlpg(addr);
970         PT_UPDATES_FLUSH();
971 }
972
973 PMAP_INLINE void
974 pmap_invalidate_all(pmap_t pmap)
975 {
976
977         CTR1(KTR_PMAP, "pmap_invalidate_all: pmap=%p", pmap);
978         
979         if (pmap == kernel_pmap || pmap->pm_active)
980                 invltlb();
981 }
982
983 PMAP_INLINE void
984 pmap_invalidate_cache(void)
985 {
986
987         wbinvd();
988 }
989 #endif /* !SMP */
990
991 void
992 pmap_invalidate_cache_range(vm_offset_t sva, vm_offset_t eva)
993 {
994
995         KASSERT((sva & PAGE_MASK) == 0,
996             ("pmap_invalidate_cache_range: sva not page-aligned"));
997         KASSERT((eva & PAGE_MASK) == 0,
998             ("pmap_invalidate_cache_range: eva not page-aligned"));
999
1000         if (cpu_feature & CPUID_SS)
1001                 ; /* If "Self Snoop" is supported, do nothing. */
1002         else if (cpu_feature & CPUID_CLFSH) {
1003
1004                 /*
1005                  * Otherwise, do per-cache line flush.  Use the mfence
1006                  * instruction to insure that previous stores are
1007                  * included in the write-back.  The processor
1008                  * propagates flush to other processors in the cache
1009                  * coherence domain.
1010                  */
1011                 mfence();
1012                 for (; sva < eva; sva += cpu_clflush_line_size)
1013                         clflush(sva);
1014                 mfence();
1015         } else {
1016
1017                 /*
1018                  * No targeted cache flush methods are supported by CPU,
1019                  * globally invalidate cache as a last resort.
1020                  */
1021                 pmap_invalidate_cache();
1022         }
1023 }
1024
1025 /*
1026  * Are we current address space or kernel?  N.B. We return FALSE when
1027  * a pmap's page table is in use because a kernel thread is borrowing
1028  * it.  The borrowed page table can change spontaneously, making any
1029  * dependence on its continued use subject to a race condition.
1030  */
1031 static __inline int
1032 pmap_is_current(pmap_t pmap)
1033 {
1034
1035         return (pmap == kernel_pmap ||
1036             (pmap == vmspace_pmap(curthread->td_proc->p_vmspace) &&
1037                 (pmap->pm_pdir[PTDPTDI] & PG_FRAME) == (PTDpde[0] & PG_FRAME)));
1038 }
1039
1040 /*
1041  * If the given pmap is not the current or kernel pmap, the returned pte must
1042  * be released by passing it to pmap_pte_release().
1043  */
1044 pt_entry_t *
1045 pmap_pte(pmap_t pmap, vm_offset_t va)
1046 {
1047         pd_entry_t newpf;
1048         pd_entry_t *pde;
1049
1050         pde = pmap_pde(pmap, va);
1051         if (*pde & PG_PS)
1052                 return (pde);
1053         if (*pde != 0) {
1054                 /* are we current address space or kernel? */
1055                 if (pmap_is_current(pmap))
1056                         return (vtopte(va));
1057                 mtx_lock(&PMAP2mutex);
1058                 newpf = *pde & PG_FRAME;
1059                 if ((*PMAP2 & PG_FRAME) != newpf) {
1060                         PT_SET_MA(PADDR2, newpf | PG_V | PG_A | PG_M);
1061                         CTR3(KTR_PMAP, "pmap_pte: pmap=%p va=0x%x newpte=0x%08x",
1062                             pmap, va, (*PMAP2 & 0xffffffff));
1063                 }
1064                 
1065                 return (PADDR2 + (i386_btop(va) & (NPTEPG - 1)));
1066         }
1067         return (0);
1068 }
1069
1070 /*
1071  * Releases a pte that was obtained from pmap_pte().  Be prepared for the pte
1072  * being NULL.
1073  */
1074 static __inline void
1075 pmap_pte_release(pt_entry_t *pte)
1076 {
1077
1078         if ((pt_entry_t *)((vm_offset_t)pte & ~PAGE_MASK) == PADDR2) {
1079                 CTR1(KTR_PMAP, "pmap_pte_release: pte=0x%jx",
1080                     *PMAP2);
1081                 vm_page_lock_queues();
1082                 PT_SET_VA(PMAP2, 0, TRUE);
1083                 vm_page_unlock_queues();
1084                 mtx_unlock(&PMAP2mutex);
1085         }
1086 }
1087
1088 static __inline void
1089 invlcaddr(void *caddr)
1090 {
1091
1092         invlpg((u_int)caddr);
1093         PT_UPDATES_FLUSH();
1094 }
1095
1096 /*
1097  * Super fast pmap_pte routine best used when scanning
1098  * the pv lists.  This eliminates many coarse-grained
1099  * invltlb calls.  Note that many of the pv list
1100  * scans are across different pmaps.  It is very wasteful
1101  * to do an entire invltlb for checking a single mapping.
1102  *
1103  * If the given pmap is not the current pmap, vm_page_queue_mtx
1104  * must be held and curthread pinned to a CPU.
1105  */
1106 static pt_entry_t *
1107 pmap_pte_quick(pmap_t pmap, vm_offset_t va)
1108 {
1109         pd_entry_t newpf;
1110         pd_entry_t *pde;
1111
1112         pde = pmap_pde(pmap, va);
1113         if (*pde & PG_PS)
1114                 return (pde);
1115         if (*pde != 0) {
1116                 /* are we current address space or kernel? */
1117                 if (pmap_is_current(pmap))
1118                         return (vtopte(va));
1119                 mtx_assert(&vm_page_queue_mtx, MA_OWNED);
1120                 KASSERT(curthread->td_pinned > 0, ("curthread not pinned"));
1121                 newpf = *pde & PG_FRAME;
1122                 if ((*PMAP1 & PG_FRAME) != newpf) {
1123                         PT_SET_MA(PADDR1, newpf | PG_V | PG_A | PG_M);
1124                         CTR3(KTR_PMAP, "pmap_pte_quick: pmap=%p va=0x%x newpte=0x%08x",
1125                             pmap, va, (u_long)*PMAP1);
1126                         
1127 #ifdef SMP
1128                         PMAP1cpu = PCPU_GET(cpuid);
1129 #endif
1130                         PMAP1changed++;
1131                 } else
1132 #ifdef SMP
1133                 if (PMAP1cpu != PCPU_GET(cpuid)) {
1134                         PMAP1cpu = PCPU_GET(cpuid);
1135                         invlcaddr(PADDR1);
1136                         PMAP1changedcpu++;
1137                 } else
1138 #endif
1139                         PMAP1unchanged++;
1140                 return (PADDR1 + (i386_btop(va) & (NPTEPG - 1)));
1141         }
1142         return (0);
1143 }
1144
1145 /*
1146  *      Routine:        pmap_extract
1147  *      Function:
1148  *              Extract the physical page address associated
1149  *              with the given map/virtual_address pair.
1150  */
1151 vm_paddr_t 
1152 pmap_extract(pmap_t pmap, vm_offset_t va)
1153 {
1154         vm_paddr_t rtval;
1155         pt_entry_t *pte;
1156         pd_entry_t pde;
1157         pt_entry_t pteval;
1158         
1159         rtval = 0;
1160         PMAP_LOCK(pmap);
1161         pde = pmap->pm_pdir[va >> PDRSHIFT];
1162         if (pde != 0) {
1163                 if ((pde & PG_PS) != 0) {
1164                         rtval = xpmap_mtop(pde & PG_PS_FRAME) | (va & PDRMASK);
1165                         PMAP_UNLOCK(pmap);
1166                         return rtval;
1167                 }
1168                 pte = pmap_pte(pmap, va);
1169                 pteval = *pte ? xpmap_mtop(*pte) : 0;
1170                 rtval = (pteval & PG_FRAME) | (va & PAGE_MASK);
1171                 pmap_pte_release(pte);
1172         }
1173         PMAP_UNLOCK(pmap);
1174         return (rtval);
1175 }
1176
1177 /*
1178  *      Routine:        pmap_extract_ma
1179  *      Function:
1180  *              Like pmap_extract, but returns machine address
1181  */
1182 vm_paddr_t 
1183 pmap_extract_ma(pmap_t pmap, vm_offset_t va)
1184 {
1185         vm_paddr_t rtval;
1186         pt_entry_t *pte;
1187         pd_entry_t pde;
1188
1189         rtval = 0;
1190         PMAP_LOCK(pmap);
1191         pde = pmap->pm_pdir[va >> PDRSHIFT];
1192         if (pde != 0) {
1193                 if ((pde & PG_PS) != 0) {
1194                         rtval = (pde & ~PDRMASK) | (va & PDRMASK);
1195                         PMAP_UNLOCK(pmap);
1196                         return rtval;
1197                 }
1198                 pte = pmap_pte(pmap, va);
1199                 rtval = (*pte & PG_FRAME) | (va & PAGE_MASK);
1200                 pmap_pte_release(pte);
1201         }
1202         PMAP_UNLOCK(pmap);
1203         return (rtval);
1204 }
1205
1206 /*
1207  *      Routine:        pmap_extract_and_hold
1208  *      Function:
1209  *              Atomically extract and hold the physical page
1210  *              with the given pmap and virtual address pair
1211  *              if that mapping permits the given protection.
1212  */
1213 vm_page_t
1214 pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
1215 {
1216         pd_entry_t pde;
1217         pt_entry_t pte;
1218         vm_page_t m;
1219
1220         m = NULL;
1221         vm_page_lock_queues();
1222         PMAP_LOCK(pmap);
1223         pde = PT_GET(pmap_pde(pmap, va));
1224         if (pde != 0) {
1225                 if (pde & PG_PS) {
1226                         if ((pde & PG_RW) || (prot & VM_PROT_WRITE) == 0) {
1227                                 m = PHYS_TO_VM_PAGE((pde & PG_PS_FRAME) |
1228                                     (va & PDRMASK));
1229                                 vm_page_hold(m);
1230                         }
1231                 } else {
1232                         sched_pin();
1233                         pte = PT_GET(pmap_pte_quick(pmap, va));
1234                         if (*PMAP1)
1235                                 PT_SET_MA(PADDR1, 0);
1236                         if ((pte & PG_V) &&
1237                             ((pte & PG_RW) || (prot & VM_PROT_WRITE) == 0)) {
1238                                 m = PHYS_TO_VM_PAGE(pte & PG_FRAME);
1239                                 vm_page_hold(m);
1240                         }
1241                         sched_unpin();
1242                 }
1243         }
1244         vm_page_unlock_queues();
1245         PMAP_UNLOCK(pmap);
1246         return (m);
1247 }
1248
1249 /***************************************************
1250  * Low level mapping routines.....
1251  ***************************************************/
1252
1253 /*
1254  * Add a wired page to the kva.
1255  * Note: not SMP coherent.
1256  */
1257 void 
1258 pmap_kenter(vm_offset_t va, vm_paddr_t pa)
1259 {
1260         PT_SET_MA(va, xpmap_ptom(pa)| PG_RW | PG_V | pgeflag);
1261 }
1262
1263 void 
1264 pmap_kenter_ma(vm_offset_t va, vm_paddr_t ma)
1265 {
1266         pt_entry_t *pte;
1267
1268         pte = vtopte(va);
1269         pte_store_ma(pte, ma | PG_RW | PG_V | pgeflag);
1270 }
1271
1272
1273 static __inline void 
1274 pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode)
1275 {
1276         PT_SET_MA(va, pa | PG_RW | PG_V | pgeflag | pmap_cache_bits(mode, 0));
1277 }
1278
1279 /*
1280  * Remove a page from the kernel pagetables.
1281  * Note: not SMP coherent.
1282  */
1283 PMAP_INLINE void
1284 pmap_kremove(vm_offset_t va)
1285 {
1286         pt_entry_t *pte;
1287
1288         pte = vtopte(va);
1289         PT_CLEAR_VA(pte, FALSE);
1290 }
1291
1292 /*
1293  *      Used to map a range of physical addresses into kernel
1294  *      virtual address space.
1295  *
1296  *      The value passed in '*virt' is a suggested virtual address for
1297  *      the mapping. Architectures which can support a direct-mapped
1298  *      physical to virtual region can return the appropriate address
1299  *      within that region, leaving '*virt' unchanged. Other
1300  *      architectures should map the pages starting at '*virt' and
1301  *      update '*virt' with the first usable address after the mapped
1302  *      region.
1303  */
1304 vm_offset_t
1305 pmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end, int prot)
1306 {
1307         vm_offset_t va, sva;
1308
1309         va = sva = *virt;
1310         CTR4(KTR_PMAP, "pmap_map: va=0x%x start=0x%jx end=0x%jx prot=0x%x",
1311             va, start, end, prot);
1312         while (start < end) {
1313                 pmap_kenter(va, start);
1314                 va += PAGE_SIZE;
1315                 start += PAGE_SIZE;
1316         }
1317         pmap_invalidate_range(kernel_pmap, sva, va);
1318         *virt = va;
1319         return (sva);
1320 }
1321
1322
1323 /*
1324  * Add a list of wired pages to the kva
1325  * this routine is only used for temporary
1326  * kernel mappings that do not need to have
1327  * page modification or references recorded.
1328  * Note that old mappings are simply written
1329  * over.  The page *must* be wired.
1330  * Note: SMP coherent.  Uses a ranged shootdown IPI.
1331  */
1332 void
1333 pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count)
1334 {
1335         pt_entry_t *endpte, *pte;
1336         vm_paddr_t pa;
1337         vm_offset_t va = sva;
1338         int mclcount = 0;
1339         multicall_entry_t mcl[16];
1340         multicall_entry_t *mclp = mcl;
1341         int error;
1342
1343         CTR2(KTR_PMAP, "pmap_qenter:sva=0x%x count=%d", va, count);
1344         pte = vtopte(sva);
1345         endpte = pte + count;
1346         while (pte < endpte) {
1347                 pa = xpmap_ptom(VM_PAGE_TO_PHYS(*ma)) | pgeflag | PG_RW | PG_V | PG_M | PG_A;
1348
1349                 mclp->op = __HYPERVISOR_update_va_mapping;
1350                 mclp->args[0] = va;
1351                 mclp->args[1] = (uint32_t)(pa & 0xffffffff);
1352                 mclp->args[2] = (uint32_t)(pa >> 32);
1353                 mclp->args[3] = (*pte & PG_V) ? UVMF_INVLPG|UVMF_ALL : 0;
1354         
1355                 va += PAGE_SIZE;
1356                 pte++;
1357                 ma++;
1358                 mclp++;
1359                 mclcount++;
1360                 if (mclcount == 16) {
1361                         error = HYPERVISOR_multicall(mcl, mclcount);
1362                         mclp = mcl;
1363                         mclcount = 0;
1364                         KASSERT(error == 0, ("bad multicall %d", error));
1365                 }               
1366         }
1367         if (mclcount) {
1368                 error = HYPERVISOR_multicall(mcl, mclcount);
1369                 KASSERT(error == 0, ("bad multicall %d", error));
1370         }
1371         
1372 #ifdef INVARIANTS
1373         for (pte = vtopte(sva), mclcount = 0; mclcount < count; mclcount++, pte++)
1374                 KASSERT(*pte, ("pte not set for va=0x%x", sva + mclcount*PAGE_SIZE));
1375 #endif  
1376 }
1377
1378
1379 /*
1380  * This routine tears out page mappings from the
1381  * kernel -- it is meant only for temporary mappings.
1382  * Note: SMP coherent.  Uses a ranged shootdown IPI.
1383  */
1384 void
1385 pmap_qremove(vm_offset_t sva, int count)
1386 {
1387         vm_offset_t va;
1388
1389         CTR2(KTR_PMAP, "pmap_qremove: sva=0x%x count=%d", sva, count);
1390         va = sva;
1391         vm_page_lock_queues();
1392         critical_enter();
1393         while (count-- > 0) {
1394                 pmap_kremove(va);
1395                 va += PAGE_SIZE;
1396         }
1397         PT_UPDATES_FLUSH();
1398         pmap_invalidate_range(kernel_pmap, sva, va);
1399         critical_exit();
1400         vm_page_unlock_queues();
1401 }
1402
1403 /***************************************************
1404  * Page table page management routines.....
1405  ***************************************************/
1406 static __inline void
1407 pmap_free_zero_pages(vm_page_t free)
1408 {
1409         vm_page_t m;
1410
1411         while (free != NULL) {
1412                 m = free;
1413                 free = m->right;
1414                 vm_page_free_zero(m);
1415         }
1416 }
1417
1418 /*
1419  * This routine unholds page table pages, and if the hold count
1420  * drops to zero, then it decrements the wire count.
1421  */
1422 static __inline int
1423 pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m, vm_page_t *free)
1424 {
1425
1426         --m->wire_count;
1427         if (m->wire_count == 0)
1428                 return _pmap_unwire_pte_hold(pmap, m, free);
1429         else
1430                 return 0;
1431 }
1432
1433 static int 
1434 _pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m, vm_page_t *free)
1435 {
1436         vm_offset_t pteva;
1437
1438         PT_UPDATES_FLUSH();
1439         /*
1440          * unmap the page table page
1441          */
1442         xen_pt_unpin(pmap->pm_pdir[m->pindex]);
1443         /*
1444          * page *might* contain residual mapping :-/  
1445          */
1446         PD_CLEAR_VA(pmap, m->pindex, TRUE);
1447         pmap_zero_page(m);
1448         --pmap->pm_stats.resident_count;
1449
1450         /*
1451          * This is a release store so that the ordinary store unmapping
1452          * the page table page is globally performed before TLB shoot-
1453          * down is begun.
1454          */
1455         atomic_subtract_rel_int(&cnt.v_wire_count, 1);
1456
1457         /*
1458          * Do an invltlb to make the invalidated mapping
1459          * take effect immediately.
1460          */
1461         pteva = VM_MAXUSER_ADDRESS + i386_ptob(m->pindex);
1462         pmap_invalidate_page(pmap, pteva);
1463
1464         /* 
1465          * Put page on a list so that it is released after
1466          * *ALL* TLB shootdown is done
1467          */
1468         m->right = *free;
1469         *free = m;
1470
1471         return 1;
1472 }
1473
1474 /*
1475  * After removing a page table entry, this routine is used to
1476  * conditionally free the page, and manage the hold/wire counts.
1477  */
1478 static int
1479 pmap_unuse_pt(pmap_t pmap, vm_offset_t va, vm_page_t *free)
1480 {
1481         pd_entry_t ptepde;
1482         vm_page_t mpte;
1483
1484         if (va >= VM_MAXUSER_ADDRESS)
1485                 return 0;
1486         ptepde = PT_GET(pmap_pde(pmap, va));
1487         mpte = PHYS_TO_VM_PAGE(ptepde & PG_FRAME);
1488         return pmap_unwire_pte_hold(pmap, mpte, free);
1489 }
1490
1491 void
1492 pmap_pinit0(pmap_t pmap)
1493 {
1494
1495         PMAP_LOCK_INIT(pmap);
1496         pmap->pm_pdir = (pd_entry_t *)(KERNBASE + (vm_offset_t)IdlePTD);
1497 #ifdef PAE
1498         pmap->pm_pdpt = (pdpt_entry_t *)(KERNBASE + (vm_offset_t)IdlePDPT);
1499 #endif
1500         pmap->pm_active = 0;
1501         PCPU_SET(curpmap, pmap);
1502         TAILQ_INIT(&pmap->pm_pvchunk);
1503         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
1504         mtx_lock_spin(&allpmaps_lock);
1505         LIST_INSERT_HEAD(&allpmaps, pmap, pm_list);
1506         mtx_unlock_spin(&allpmaps_lock);
1507 }
1508
1509 /*
1510  * Initialize a preallocated and zeroed pmap structure,
1511  * such as one in a vmspace structure.
1512  */
1513 int
1514 pmap_pinit(pmap_t pmap)
1515 {
1516         vm_page_t m, ptdpg[NPGPTD + 1];
1517         int npgptd = NPGPTD + 1;
1518         static int color;
1519         int i;
1520
1521 #ifdef HAMFISTED_LOCKING
1522         mtx_lock(&createdelete_lock);
1523 #endif
1524
1525         PMAP_LOCK_INIT(pmap);
1526
1527         /*
1528          * No need to allocate page table space yet but we do need a valid
1529          * page directory table.
1530          */
1531         if (pmap->pm_pdir == NULL) {
1532                 pmap->pm_pdir = (pd_entry_t *)kmem_alloc_nofault(kernel_map,
1533                     NBPTD);
1534                 if (pmap->pm_pdir == NULL) {
1535                         PMAP_LOCK_DESTROY(pmap);
1536 #ifdef HAMFISTED_LOCKING
1537                         mtx_unlock(&createdelete_lock);
1538 #endif
1539                         return (0);
1540                 }
1541 #if defined(XEN) && defined(PAE)        
1542                 pmap->pm_pdpt = (pd_entry_t *)kmem_alloc_nofault(kernel_map, 1);
1543 #endif
1544                 
1545 #if defined(PAE) && !defined(XEN)
1546                 pmap->pm_pdpt = uma_zalloc(pdptzone, M_WAITOK | M_ZERO);
1547                 KASSERT(((vm_offset_t)pmap->pm_pdpt &
1548                     ((NPGPTD * sizeof(pdpt_entry_t)) - 1)) == 0,
1549                     ("pmap_pinit: pdpt misaligned"));
1550                 KASSERT(pmap_kextract((vm_offset_t)pmap->pm_pdpt) < (4ULL<<30),
1551                     ("pmap_pinit: pdpt above 4g"));
1552 #endif
1553         }
1554
1555         /*
1556          * allocate the page directory page(s)
1557          */
1558         for (i = 0; i < npgptd;) {
1559                 m = vm_page_alloc(NULL, color++,
1560                     VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED |
1561                     VM_ALLOC_ZERO);
1562                 if (m == NULL)
1563                         VM_WAIT;
1564                 else {
1565                         ptdpg[i++] = m;
1566                 }
1567         }
1568         pmap_qenter((vm_offset_t)pmap->pm_pdir, ptdpg, NPGPTD);
1569         for (i = 0; i < NPGPTD; i++) {
1570                 if ((ptdpg[i]->flags & PG_ZERO) == 0)
1571                         pagezero(&pmap->pm_pdir[i*NPTEPG]);
1572         }
1573
1574         mtx_lock_spin(&allpmaps_lock);
1575         LIST_INSERT_HEAD(&allpmaps, pmap, pm_list);
1576         mtx_unlock_spin(&allpmaps_lock);
1577         /* Wire in kernel global address entries. */
1578
1579         bcopy(PTD + KPTDI, pmap->pm_pdir + KPTDI, nkpt * sizeof(pd_entry_t));
1580 #ifdef PAE
1581 #ifdef XEN
1582         pmap_qenter((vm_offset_t)pmap->pm_pdpt, &ptdpg[NPGPTD], 1);
1583         if ((ptdpg[NPGPTD]->flags & PG_ZERO) == 0)
1584                 bzero(pmap->pm_pdpt, PAGE_SIZE);
1585 #endif  
1586         for (i = 0; i < NPGPTD; i++) {
1587                 vm_paddr_t ma;
1588                 
1589                 ma = xpmap_ptom(VM_PAGE_TO_PHYS(ptdpg[i]));
1590                 pmap->pm_pdpt[i] = ma | PG_V;
1591
1592         }
1593 #endif  
1594 #ifdef XEN
1595         for (i = 0; i < NPGPTD; i++) {
1596                 pt_entry_t *pd;
1597                 vm_paddr_t ma;
1598                 
1599                 ma = xpmap_ptom(VM_PAGE_TO_PHYS(ptdpg[i]));
1600                 pd = pmap->pm_pdir + (i * NPDEPG);
1601                 PT_SET_MA(pd, *vtopte((vm_offset_t)pd) & ~(PG_M|PG_A|PG_U|PG_RW));
1602 #if 0           
1603                 xen_pgd_pin(ma);
1604 #endif          
1605         }
1606         
1607 #ifdef PAE      
1608         PT_SET_MA(pmap->pm_pdpt, *vtopte((vm_offset_t)pmap->pm_pdpt) & ~PG_RW);
1609 #endif
1610         vm_page_lock_queues();
1611         xen_flush_queue();
1612         xen_pgdpt_pin(xpmap_ptom(VM_PAGE_TO_PHYS(ptdpg[NPGPTD])));
1613         for (i = 0; i < NPGPTD; i++) {
1614                 vm_paddr_t ma = xpmap_ptom(VM_PAGE_TO_PHYS(ptdpg[i]));
1615                 PT_SET_VA_MA(&pmap->pm_pdir[PTDPTDI + i], ma | PG_V | PG_A, FALSE);
1616         }
1617         xen_flush_queue();
1618         vm_page_unlock_queues();
1619 #endif
1620         pmap->pm_active = 0;
1621         TAILQ_INIT(&pmap->pm_pvchunk);
1622         bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
1623
1624 #ifdef HAMFISTED_LOCKING
1625         mtx_unlock(&createdelete_lock);
1626 #endif
1627         return (1);
1628 }
1629
1630 /*
1631  * this routine is called if the page table page is not
1632  * mapped correctly.
1633  */
1634 static vm_page_t
1635 _pmap_allocpte(pmap_t pmap, unsigned int ptepindex, int flags)
1636 {
1637         vm_paddr_t ptema;
1638         vm_page_t m;
1639
1640         KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT ||
1641             (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK,
1642             ("_pmap_allocpte: flags is neither M_NOWAIT nor M_WAITOK"));
1643
1644         /*
1645          * Allocate a page table page.
1646          */
1647         if ((m = vm_page_alloc(NULL, ptepindex, VM_ALLOC_NOOBJ |
1648             VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL) {
1649                 if (flags & M_WAITOK) {
1650                         PMAP_UNLOCK(pmap);
1651                         vm_page_unlock_queues();
1652                         VM_WAIT;
1653                         vm_page_lock_queues();
1654                         PMAP_LOCK(pmap);
1655                 }
1656
1657                 /*
1658                  * Indicate the need to retry.  While waiting, the page table
1659                  * page may have been allocated.
1660                  */
1661                 return (NULL);
1662         }
1663         if ((m->flags & PG_ZERO) == 0)
1664                 pmap_zero_page(m);
1665
1666         /*
1667          * Map the pagetable page into the process address space, if
1668          * it isn't already there.
1669          */
1670         pmap->pm_stats.resident_count++;
1671
1672         ptema = xpmap_ptom(VM_PAGE_TO_PHYS(m));
1673         xen_pt_pin(ptema);
1674         PT_SET_VA_MA(&pmap->pm_pdir[ptepindex],
1675                 (ptema | PG_U | PG_RW | PG_V | PG_A | PG_M), TRUE);
1676         
1677         KASSERT(pmap->pm_pdir[ptepindex],
1678             ("_pmap_allocpte: ptepindex=%d did not get mapped", ptepindex));
1679         return (m);
1680 }
1681
1682 static vm_page_t
1683 pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags)
1684 {
1685         unsigned ptepindex;
1686         pd_entry_t ptema;
1687         vm_page_t m;
1688
1689         KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT ||
1690             (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK,
1691             ("pmap_allocpte: flags is neither M_NOWAIT nor M_WAITOK"));
1692
1693         /*
1694          * Calculate pagetable page index
1695          */
1696         ptepindex = va >> PDRSHIFT;
1697 retry:
1698         /*
1699          * Get the page directory entry
1700          */
1701         ptema = pmap->pm_pdir[ptepindex];
1702
1703         /*
1704          * This supports switching from a 4MB page to a
1705          * normal 4K page.
1706          */
1707         if (ptema & PG_PS) {
1708                 /*
1709                  * XXX 
1710                  */
1711                 pmap->pm_pdir[ptepindex] = 0;
1712                 ptema = 0;
1713                 pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
1714                 pmap_invalidate_all(kernel_pmap);
1715         }
1716
1717         /*
1718          * If the page table page is mapped, we just increment the
1719          * hold count, and activate it.
1720          */
1721         if (ptema & PG_V) {
1722                 m = PHYS_TO_VM_PAGE(xpmap_mtop(ptema) & PG_FRAME);
1723                 m->wire_count++;
1724         } else {
1725                 /*
1726                  * Here if the pte page isn't mapped, or if it has
1727                  * been deallocated. 
1728                  */
1729                 CTR3(KTR_PMAP, "pmap_allocpte: pmap=%p va=0x%08x flags=0x%x",
1730                     pmap, va, flags);
1731                 m = _pmap_allocpte(pmap, ptepindex, flags);
1732                 if (m == NULL && (flags & M_WAITOK))
1733                         goto retry;
1734
1735                 KASSERT(pmap->pm_pdir[ptepindex], ("ptepindex=%d did not get mapped", ptepindex));
1736         }
1737         return (m);
1738 }
1739
1740
1741 /***************************************************
1742 * Pmap allocation/deallocation routines.
1743  ***************************************************/
1744
1745 #ifdef SMP
1746 /*
1747  * Deal with a SMP shootdown of other users of the pmap that we are
1748  * trying to dispose of.  This can be a bit hairy.
1749  */
1750 static cpumask_t *lazymask;
1751 static u_int lazyptd;
1752 static volatile u_int lazywait;
1753
1754 void pmap_lazyfix_action(void);
1755
1756 void
1757 pmap_lazyfix_action(void)
1758 {
1759         cpumask_t mymask = PCPU_GET(cpumask);
1760
1761 #ifdef COUNT_IPIS
1762         (*ipi_lazypmap_counts[PCPU_GET(cpuid)])++;
1763 #endif
1764         if (rcr3() == lazyptd)
1765                 load_cr3(PCPU_GET(curpcb)->pcb_cr3);
1766         atomic_clear_int(lazymask, mymask);
1767         atomic_store_rel_int(&lazywait, 1);
1768 }
1769
1770 static void
1771 pmap_lazyfix_self(cpumask_t mymask)
1772 {
1773
1774         if (rcr3() == lazyptd)
1775                 load_cr3(PCPU_GET(curpcb)->pcb_cr3);
1776         atomic_clear_int(lazymask, mymask);
1777 }
1778
1779
1780 static void
1781 pmap_lazyfix(pmap_t pmap)
1782 {
1783         cpumask_t mymask, mask;
1784         u_int spins;
1785
1786         while ((mask = pmap->pm_active) != 0) {
1787                 spins = 50000000;
1788                 mask = mask & -mask;    /* Find least significant set bit */
1789                 mtx_lock_spin(&smp_ipi_mtx);
1790 #ifdef PAE
1791                 lazyptd = vtophys(pmap->pm_pdpt);
1792 #else
1793                 lazyptd = vtophys(pmap->pm_pdir);
1794 #endif
1795                 mymask = PCPU_GET(cpumask);
1796                 if (mask == mymask) {
1797                         lazymask = &pmap->pm_active;
1798                         pmap_lazyfix_self(mymask);
1799                 } else {
1800                         atomic_store_rel_int((u_int *)&lazymask,
1801                             (u_int)&pmap->pm_active);
1802                         atomic_store_rel_int(&lazywait, 0);
1803                         ipi_selected(mask, IPI_LAZYPMAP);
1804                         while (lazywait == 0) {
1805                                 ia32_pause();
1806                                 if (--spins == 0)
1807                                         break;
1808                         }
1809                 }
1810                 mtx_unlock_spin(&smp_ipi_mtx);
1811                 if (spins == 0)
1812                         printf("pmap_lazyfix: spun for 50000000\n");
1813         }
1814 }
1815
1816 #else   /* SMP */
1817
1818 /*
1819  * Cleaning up on uniprocessor is easy.  For various reasons, we're
1820  * unlikely to have to even execute this code, including the fact
1821  * that the cleanup is deferred until the parent does a wait(2), which
1822  * means that another userland process has run.
1823  */
1824 static void
1825 pmap_lazyfix(pmap_t pmap)
1826 {
1827         u_int cr3;
1828
1829         cr3 = vtophys(pmap->pm_pdir);
1830         if (cr3 == rcr3()) {
1831                 load_cr3(PCPU_GET(curpcb)->pcb_cr3);
1832                 pmap->pm_active &= ~(PCPU_GET(cpumask));
1833         }
1834 }
1835 #endif  /* SMP */
1836
1837 /*
1838  * Release any resources held by the given physical map.
1839  * Called when a pmap initialized by pmap_pinit is being released.
1840  * Should only be called if the map contains no valid mappings.
1841  */
1842 void
1843 pmap_release(pmap_t pmap)
1844 {
1845         vm_page_t m, ptdpg[2*NPGPTD+1];
1846         vm_paddr_t ma;
1847         int i;
1848 #ifdef XEN
1849 #ifdef PAE      
1850         int npgptd = NPGPTD + 1;
1851 #else
1852         int npgptd = NPGPTD;
1853 #endif
1854 #else 
1855         int npgptd = NPGPTD;
1856 #endif  
1857         KASSERT(pmap->pm_stats.resident_count == 0,
1858             ("pmap_release: pmap resident count %ld != 0",
1859             pmap->pm_stats.resident_count));
1860         PT_UPDATES_FLUSH();
1861
1862 #ifdef HAMFISTED_LOCKING
1863         mtx_lock(&createdelete_lock);
1864 #endif
1865
1866         pmap_lazyfix(pmap);
1867         mtx_lock_spin(&allpmaps_lock);
1868         LIST_REMOVE(pmap, pm_list);
1869         mtx_unlock_spin(&allpmaps_lock);
1870
1871         for (i = 0; i < NPGPTD; i++)
1872                 ptdpg[i] = PHYS_TO_VM_PAGE(vtophys(pmap->pm_pdir + (i*NPDEPG)) & PG_FRAME);
1873         pmap_qremove((vm_offset_t)pmap->pm_pdir, NPGPTD);
1874 #if defined(PAE) && defined(XEN)
1875         ptdpg[NPGPTD] = PHYS_TO_VM_PAGE(vtophys(pmap->pm_pdpt));
1876 #endif  
1877
1878         for (i = 0; i < npgptd; i++) {
1879                 m = ptdpg[i];
1880                 ma = xpmap_ptom(VM_PAGE_TO_PHYS(m));
1881                 /* unpinning L1 and L2 treated the same */
1882 #if 0
1883                 xen_pgd_unpin(ma);
1884 #else
1885                 if (i == NPGPTD)
1886                         xen_pgd_unpin(ma);
1887 #endif
1888 #ifdef PAE
1889                 if (i < NPGPTD)
1890                         KASSERT(xpmap_ptom(VM_PAGE_TO_PHYS(m)) == (pmap->pm_pdpt[i] & PG_FRAME),
1891                             ("pmap_release: got wrong ptd page"));
1892 #endif
1893                 m->wire_count--;
1894                 atomic_subtract_int(&cnt.v_wire_count, 1);
1895                 vm_page_free(m);
1896         }
1897 #ifdef PAE
1898         pmap_qremove((vm_offset_t)pmap->pm_pdpt, 1);
1899 #endif
1900         PMAP_LOCK_DESTROY(pmap);
1901
1902 #ifdef HAMFISTED_LOCKING
1903         mtx_unlock(&createdelete_lock);
1904 #endif
1905 }
1906 \f
1907 static int
1908 kvm_size(SYSCTL_HANDLER_ARGS)
1909 {
1910         unsigned long ksize = VM_MAX_KERNEL_ADDRESS - KERNBASE;
1911
1912         return sysctl_handle_long(oidp, &ksize, 0, req);
1913 }
1914 SYSCTL_PROC(_vm, OID_AUTO, kvm_size, CTLTYPE_LONG|CTLFLAG_RD, 
1915     0, 0, kvm_size, "IU", "Size of KVM");
1916
1917 static int
1918 kvm_free(SYSCTL_HANDLER_ARGS)
1919 {
1920         unsigned long kfree = VM_MAX_KERNEL_ADDRESS - kernel_vm_end;
1921
1922         return sysctl_handle_long(oidp, &kfree, 0, req);
1923 }
1924 SYSCTL_PROC(_vm, OID_AUTO, kvm_free, CTLTYPE_LONG|CTLFLAG_RD, 
1925     0, 0, kvm_free, "IU", "Amount of KVM free");
1926
1927 /*
1928  * grow the number of kernel page table entries, if needed
1929  */
1930 void
1931 pmap_growkernel(vm_offset_t addr)
1932 {
1933         struct pmap *pmap;
1934         vm_paddr_t ptppaddr;
1935         vm_page_t nkpg;
1936         pd_entry_t newpdir;
1937
1938         mtx_assert(&kernel_map->system_mtx, MA_OWNED);
1939         if (kernel_vm_end == 0) {
1940                 kernel_vm_end = KERNBASE;
1941                 nkpt = 0;
1942                 while (pdir_pde(PTD, kernel_vm_end)) {
1943                         kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
1944                         nkpt++;
1945                         if (kernel_vm_end - 1 >= kernel_map->max_offset) {
1946                                 kernel_vm_end = kernel_map->max_offset;
1947                                 break;
1948                         }
1949                 }
1950         }
1951         addr = roundup2(addr, PAGE_SIZE * NPTEPG);
1952         if (addr - 1 >= kernel_map->max_offset)
1953                 addr = kernel_map->max_offset;
1954         while (kernel_vm_end < addr) {
1955                 if (pdir_pde(PTD, kernel_vm_end)) {
1956                         kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
1957                         if (kernel_vm_end - 1 >= kernel_map->max_offset) {
1958                                 kernel_vm_end = kernel_map->max_offset;
1959                                 break;
1960                         }
1961                         continue;
1962                 }
1963
1964                 /*
1965                  * This index is bogus, but out of the way
1966                  */
1967                 nkpg = vm_page_alloc(NULL, nkpt,
1968                     VM_ALLOC_NOOBJ | VM_ALLOC_SYSTEM | VM_ALLOC_WIRED);
1969                 if (!nkpg)
1970                         panic("pmap_growkernel: no memory to grow kernel");
1971
1972                 nkpt++;
1973
1974                 pmap_zero_page(nkpg);
1975                 ptppaddr = VM_PAGE_TO_PHYS(nkpg);
1976                 newpdir = (pd_entry_t) (ptppaddr | PG_V | PG_RW | PG_A | PG_M);
1977                 vm_page_lock_queues();
1978                 PD_SET_VA(kernel_pmap, (kernel_vm_end >> PDRSHIFT), newpdir, TRUE);
1979                 mtx_lock_spin(&allpmaps_lock);
1980                 LIST_FOREACH(pmap, &allpmaps, pm_list)
1981                         PD_SET_VA(pmap, (kernel_vm_end >> PDRSHIFT), newpdir, TRUE);
1982
1983                 mtx_unlock_spin(&allpmaps_lock);
1984                 vm_page_unlock_queues();
1985
1986                 kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
1987                 if (kernel_vm_end - 1 >= kernel_map->max_offset) {
1988                         kernel_vm_end = kernel_map->max_offset;
1989                         break;
1990                 }
1991         }
1992 }
1993
1994
1995 /***************************************************
1996  * page management routines.
1997  ***************************************************/
1998
1999 CTASSERT(sizeof(struct pv_chunk) == PAGE_SIZE);
2000 CTASSERT(_NPCM == 11);
2001
2002 static __inline struct pv_chunk *
2003 pv_to_chunk(pv_entry_t pv)
2004 {
2005
2006         return (struct pv_chunk *)((uintptr_t)pv & ~(uintptr_t)PAGE_MASK);
2007 }
2008
2009 #define PV_PMAP(pv) (pv_to_chunk(pv)->pc_pmap)
2010
2011 #define PC_FREE0_9      0xfffffffful    /* Free values for index 0 through 9 */
2012 #define PC_FREE10       0x0000fffful    /* Free values for index 10 */
2013
2014 static uint32_t pc_freemask[11] = {
2015         PC_FREE0_9, PC_FREE0_9, PC_FREE0_9,
2016         PC_FREE0_9, PC_FREE0_9, PC_FREE0_9,
2017         PC_FREE0_9, PC_FREE0_9, PC_FREE0_9,
2018         PC_FREE0_9, PC_FREE10
2019 };
2020
2021 SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_count, CTLFLAG_RD, &pv_entry_count, 0,
2022         "Current number of pv entries");
2023
2024 #ifdef PV_STATS
2025 static int pc_chunk_count, pc_chunk_allocs, pc_chunk_frees, pc_chunk_tryfail;
2026
2027 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_count, CTLFLAG_RD, &pc_chunk_count, 0,
2028         "Current number of pv entry chunks");
2029 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_allocs, CTLFLAG_RD, &pc_chunk_allocs, 0,
2030         "Current number of pv entry chunks allocated");
2031 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_frees, CTLFLAG_RD, &pc_chunk_frees, 0,
2032         "Current number of pv entry chunks frees");
2033 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_tryfail, CTLFLAG_RD, &pc_chunk_tryfail, 0,
2034         "Number of times tried to get a chunk page but failed.");
2035
2036 static long pv_entry_frees, pv_entry_allocs;
2037 static int pv_entry_spare;
2038
2039 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_frees, CTLFLAG_RD, &pv_entry_frees, 0,
2040         "Current number of pv entry frees");
2041 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD, &pv_entry_allocs, 0,
2042         "Current number of pv entry allocs");
2043 SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD, &pv_entry_spare, 0,
2044         "Current number of spare pv entries");
2045
2046 static int pmap_collect_inactive, pmap_collect_active;
2047
2048 SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_collect_inactive, CTLFLAG_RD, &pmap_collect_inactive, 0,
2049         "Current number times pmap_collect called on inactive queue");
2050 SYSCTL_INT(_vm_pmap, OID_AUTO, pmap_collect_active, CTLFLAG_RD, &pmap_collect_active, 0,
2051         "Current number times pmap_collect called on active queue");
2052 #endif
2053
2054 /*
2055  * We are in a serious low memory condition.  Resort to
2056  * drastic measures to free some pages so we can allocate
2057  * another pv entry chunk.  This is normally called to
2058  * unmap inactive pages, and if necessary, active pages.
2059  */
2060 static void
2061 pmap_collect(pmap_t locked_pmap, struct vpgqueues *vpq)
2062 {
2063         pmap_t pmap;
2064         pt_entry_t *pte, tpte;
2065         pv_entry_t next_pv, pv;
2066         vm_offset_t va;
2067         vm_page_t m, free;
2068
2069         sched_pin();
2070         TAILQ_FOREACH(m, &vpq->pl, pageq) {
2071                 if (m->hold_count || m->busy)
2072                         continue;
2073                 TAILQ_FOREACH_SAFE(pv, &m->md.pv_list, pv_list, next_pv) {
2074                         va = pv->pv_va;
2075                         pmap = PV_PMAP(pv);
2076                         /* Avoid deadlock and lock recursion. */
2077                         if (pmap > locked_pmap)
2078                                 PMAP_LOCK(pmap);
2079                         else if (pmap != locked_pmap && !PMAP_TRYLOCK(pmap))
2080                                 continue;
2081                         pmap->pm_stats.resident_count--;
2082                         pte = pmap_pte_quick(pmap, va);
2083                         tpte = pte_load_clear(pte);
2084                         KASSERT((tpte & PG_W) == 0,
2085                             ("pmap_collect: wired pte %#jx", (uintmax_t)tpte));
2086                         if (tpte & PG_A)
2087                                 vm_page_flag_set(m, PG_REFERENCED);
2088                         if (tpte & PG_M) {
2089                                 KASSERT((tpte & PG_RW),
2090         ("pmap_collect: modified page not writable: va: %#x, pte: %#jx",
2091                                     va, (uintmax_t)tpte));
2092                                 vm_page_dirty(m);
2093                         }
2094                         free = NULL;
2095                         pmap_unuse_pt(pmap, va, &free);
2096                         pmap_invalidate_page(pmap, va);
2097                         pmap_free_zero_pages(free);
2098                         TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
2099                         if (TAILQ_EMPTY(&m->md.pv_list))
2100                                 vm_page_flag_clear(m, PG_WRITEABLE);
2101                         free_pv_entry(pmap, pv);
2102                         if (pmap != locked_pmap)
2103                                 PMAP_UNLOCK(pmap);
2104                 }
2105         }
2106         sched_unpin();
2107 }
2108
2109
2110 /*
2111  * free the pv_entry back to the free list
2112  */
2113 static void
2114 free_pv_entry(pmap_t pmap, pv_entry_t pv)
2115 {
2116         vm_page_t m;
2117         struct pv_chunk *pc;
2118         int idx, field, bit;
2119
2120         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
2121         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2122         PV_STAT(pv_entry_frees++);
2123         PV_STAT(pv_entry_spare++);
2124         pv_entry_count--;
2125         pc = pv_to_chunk(pv);
2126         idx = pv - &pc->pc_pventry[0];
2127         field = idx / 32;
2128         bit = idx % 32;
2129         pc->pc_map[field] |= 1ul << bit;
2130         /* move to head of list */
2131         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
2132         TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
2133         for (idx = 0; idx < _NPCM; idx++)
2134                 if (pc->pc_map[idx] != pc_freemask[idx])
2135                         return;
2136         PV_STAT(pv_entry_spare -= _NPCPV);
2137         PV_STAT(pc_chunk_count--);
2138         PV_STAT(pc_chunk_frees++);
2139         /* entire chunk is free, return it */
2140         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
2141         m = PHYS_TO_VM_PAGE(pmap_kextract((vm_offset_t)pc));
2142         pmap_qremove((vm_offset_t)pc, 1);
2143         vm_page_unwire(m, 0);
2144         vm_page_free(m);
2145         pmap_ptelist_free(&pv_vafree, (vm_offset_t)pc);
2146 }
2147
2148 /*
2149  * get a new pv_entry, allocating a block from the system
2150  * when needed.
2151  */
2152 static pv_entry_t
2153 get_pv_entry(pmap_t pmap, int try)
2154 {
2155         static const struct timeval printinterval = { 60, 0 };
2156         static struct timeval lastprint;
2157         static vm_pindex_t colour;
2158         struct vpgqueues *pq;
2159         int bit, field;
2160         pv_entry_t pv;
2161         struct pv_chunk *pc;
2162         vm_page_t m;
2163
2164         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2165         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
2166         PV_STAT(pv_entry_allocs++);
2167         pv_entry_count++;
2168         if (pv_entry_count > pv_entry_high_water)
2169                 if (ratecheck(&lastprint, &printinterval))
2170                         printf("Approaching the limit on PV entries, consider "
2171                             "increasing either the vm.pmap.shpgperproc or the "
2172                             "vm.pmap.pv_entry_max tunable.\n");
2173         pq = NULL;
2174 retry:
2175         pc = TAILQ_FIRST(&pmap->pm_pvchunk);
2176         if (pc != NULL) {
2177                 for (field = 0; field < _NPCM; field++) {
2178                         if (pc->pc_map[field]) {
2179                                 bit = bsfl(pc->pc_map[field]);
2180                                 break;
2181                         }
2182                 }
2183                 if (field < _NPCM) {
2184                         pv = &pc->pc_pventry[field * 32 + bit];
2185                         pc->pc_map[field] &= ~(1ul << bit);
2186                         /* If this was the last item, move it to tail */
2187                         for (field = 0; field < _NPCM; field++)
2188                                 if (pc->pc_map[field] != 0) {
2189                                         PV_STAT(pv_entry_spare--);
2190                                         return (pv);    /* not full, return */
2191                                 }
2192                         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
2193                         TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list);
2194                         PV_STAT(pv_entry_spare--);
2195                         return (pv);
2196                 }
2197         }
2198         /*
2199          * Access to the ptelist "pv_vafree" is synchronized by the page
2200          * queues lock.  If "pv_vafree" is currently non-empty, it will
2201          * remain non-empty until pmap_ptelist_alloc() completes.
2202          */
2203         if (pv_vafree == 0 || (m = vm_page_alloc(NULL, colour, (pq ==
2204             &vm_page_queues[PQ_ACTIVE] ? VM_ALLOC_SYSTEM : VM_ALLOC_NORMAL) |
2205             VM_ALLOC_NOOBJ | VM_ALLOC_WIRED)) == NULL) {
2206                 if (try) {
2207                         pv_entry_count--;
2208                         PV_STAT(pc_chunk_tryfail++);
2209                         return (NULL);
2210                 }
2211                 /*
2212                  * Reclaim pv entries: At first, destroy mappings to
2213                  * inactive pages.  After that, if a pv chunk entry
2214                  * is still needed, destroy mappings to active pages.
2215                  */
2216                 if (pq == NULL) {
2217                         PV_STAT(pmap_collect_inactive++);
2218                         pq = &vm_page_queues[PQ_INACTIVE];
2219                 } else if (pq == &vm_page_queues[PQ_INACTIVE]) {
2220                         PV_STAT(pmap_collect_active++);
2221                         pq = &vm_page_queues[PQ_ACTIVE];
2222                 } else
2223                         panic("get_pv_entry: increase vm.pmap.shpgperproc");
2224                 pmap_collect(pmap, pq);
2225                 goto retry;
2226         }
2227         PV_STAT(pc_chunk_count++);
2228         PV_STAT(pc_chunk_allocs++);
2229         colour++;
2230         pc = (struct pv_chunk *)pmap_ptelist_alloc(&pv_vafree);
2231         pmap_qenter((vm_offset_t)pc, &m, 1);
2232         if ((m->flags & PG_ZERO) == 0)
2233                 pagezero(pc);
2234         pc->pc_pmap = pmap;
2235         pc->pc_map[0] = pc_freemask[0] & ~1ul;  /* preallocated bit 0 */
2236         for (field = 1; field < _NPCM; field++)
2237                 pc->pc_map[field] = pc_freemask[field];
2238         pv = &pc->pc_pventry[0];
2239         TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
2240         PV_STAT(pv_entry_spare += _NPCPV - 1);
2241         return (pv);
2242 }
2243
2244 static void
2245 pmap_remove_entry(pmap_t pmap, vm_page_t m, vm_offset_t va)
2246 {
2247         pv_entry_t pv;
2248
2249         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2250         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
2251         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
2252                 if (pmap == PV_PMAP(pv) && va == pv->pv_va)
2253                         break;
2254         }
2255         KASSERT(pv != NULL, ("pmap_remove_entry: pv not found"));
2256         TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
2257         if (TAILQ_EMPTY(&m->md.pv_list))
2258                 vm_page_flag_clear(m, PG_WRITEABLE);
2259         free_pv_entry(pmap, pv);
2260 }
2261
2262 /*
2263  * Create a pv entry for page at pa for
2264  * (pmap, va).
2265  */
2266 static void
2267 pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m)
2268 {
2269         pv_entry_t pv;
2270
2271         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2272         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
2273         pv = get_pv_entry(pmap, FALSE);
2274         pv->pv_va = va;
2275         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
2276 }
2277
2278 /*
2279  * Conditionally create a pv entry.
2280  */
2281 static boolean_t
2282 pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m)
2283 {
2284         pv_entry_t pv;
2285
2286         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2287         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
2288         if (pv_entry_count < pv_entry_high_water && 
2289             (pv = get_pv_entry(pmap, TRUE)) != NULL) {
2290                 pv->pv_va = va;
2291                 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
2292                 return (TRUE);
2293         } else
2294                 return (FALSE);
2295 }
2296
2297 /*
2298  * pmap_remove_pte: do the things to unmap a page in a process
2299  */
2300 static int
2301 pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va, vm_page_t *free)
2302 {
2303         pt_entry_t oldpte;
2304         vm_page_t m;
2305
2306         CTR3(KTR_PMAP, "pmap_remove_pte: pmap=%p *ptq=0x%x va=0x%x",
2307             pmap, (u_long)*ptq, va);
2308         
2309         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
2310         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2311         oldpte = *ptq;
2312         PT_SET_VA_MA(ptq, 0, TRUE);
2313         if (oldpte & PG_W)
2314                 pmap->pm_stats.wired_count -= 1;
2315         /*
2316          * Machines that don't support invlpg, also don't support
2317          * PG_G.
2318          */
2319         if (oldpte & PG_G)
2320                 pmap_invalidate_page(kernel_pmap, va);
2321         pmap->pm_stats.resident_count -= 1;
2322         if (oldpte & PG_MANAGED) {
2323                 m = PHYS_TO_VM_PAGE(xpmap_mtop(oldpte) & PG_FRAME);
2324                 if (oldpte & PG_M) {
2325                         KASSERT((oldpte & PG_RW),
2326         ("pmap_remove_pte: modified page not writable: va: %#x, pte: %#jx",
2327                             va, (uintmax_t)oldpte));
2328                         vm_page_dirty(m);
2329                 }
2330                 if (oldpte & PG_A)
2331                         vm_page_flag_set(m, PG_REFERENCED);
2332                 pmap_remove_entry(pmap, m, va);
2333         }
2334         return (pmap_unuse_pt(pmap, va, free));
2335 }
2336
2337 /*
2338  * Remove a single page from a process address space
2339  */
2340 static void
2341 pmap_remove_page(pmap_t pmap, vm_offset_t va, vm_page_t *free)
2342 {
2343         pt_entry_t *pte;
2344
2345         CTR2(KTR_PMAP, "pmap_remove_page: pmap=%p va=0x%x",
2346             pmap, va);
2347         
2348         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
2349         KASSERT(curthread->td_pinned > 0, ("curthread not pinned"));
2350         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2351         if ((pte = pmap_pte_quick(pmap, va)) == NULL || (*pte & PG_V) == 0)
2352                 return;
2353         pmap_remove_pte(pmap, pte, va, free);
2354         pmap_invalidate_page(pmap, va);
2355         if (*PMAP1)
2356                 PT_SET_MA(PADDR1, 0);
2357
2358 }
2359
2360 /*
2361  *      Remove the given range of addresses from the specified map.
2362  *
2363  *      It is assumed that the start and end are properly
2364  *      rounded to the page size.
2365  */
2366 void
2367 pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
2368 {
2369         vm_offset_t pdnxt;
2370         pd_entry_t ptpaddr;
2371         pt_entry_t *pte;
2372         vm_page_t free = NULL;
2373         int anyvalid;
2374         
2375         CTR3(KTR_PMAP, "pmap_remove: pmap=%p sva=0x%x eva=0x%x",
2376             pmap, sva, eva);
2377         
2378         /*
2379          * Perform an unsynchronized read.  This is, however, safe.
2380          */
2381         if (pmap->pm_stats.resident_count == 0)
2382                 return;
2383
2384         anyvalid = 0;
2385
2386         vm_page_lock_queues();
2387         sched_pin();
2388         PMAP_LOCK(pmap);
2389
2390         /*
2391          * special handling of removing one page.  a very
2392          * common operation and easy to short circuit some
2393          * code.
2394          */
2395         if ((sva + PAGE_SIZE == eva) && 
2396             ((pmap->pm_pdir[(sva >> PDRSHIFT)] & PG_PS) == 0)) {
2397                 pmap_remove_page(pmap, sva, &free);
2398                 goto out;
2399         }
2400
2401         for (; sva < eva; sva = pdnxt) {
2402                 unsigned pdirindex;
2403
2404                 /*
2405                  * Calculate index for next page table.
2406                  */
2407                 pdnxt = (sva + NBPDR) & ~PDRMASK;
2408                 if (pmap->pm_stats.resident_count == 0)
2409                         break;
2410
2411                 pdirindex = sva >> PDRSHIFT;
2412                 ptpaddr = pmap->pm_pdir[pdirindex];
2413
2414                 /*
2415                  * Weed out invalid mappings. Note: we assume that the page
2416                  * directory table is always allocated, and in kernel virtual.
2417                  */
2418                 if (ptpaddr == 0)
2419                         continue;
2420
2421                 /*
2422                  * Check for large page.
2423                  */
2424                 if ((ptpaddr & PG_PS) != 0) {
2425                         PD_CLEAR_VA(pmap, pdirindex, TRUE);
2426                         pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE;
2427                         anyvalid = 1;
2428                         continue;
2429                 }
2430
2431                 /*
2432                  * Limit our scan to either the end of the va represented
2433                  * by the current page table page, or to the end of the
2434                  * range being removed.
2435                  */
2436                 if (pdnxt > eva)
2437                         pdnxt = eva;
2438
2439                 for (pte = pmap_pte_quick(pmap, sva); sva != pdnxt; pte++,
2440                     sva += PAGE_SIZE) {
2441                         if ((*pte & PG_V) == 0)
2442                                 continue;
2443
2444                         /*
2445                          * The TLB entry for a PG_G mapping is invalidated
2446                          * by pmap_remove_pte().
2447                          */
2448                         if ((*pte & PG_G) == 0)
2449                                 anyvalid = 1;
2450                         if (pmap_remove_pte(pmap, pte, sva, &free))
2451                                 break;
2452                 }
2453         }
2454         PT_UPDATES_FLUSH();
2455         if (*PMAP1)
2456                 PT_SET_VA_MA(PMAP1, 0, TRUE);
2457 out:
2458         if (anyvalid)
2459                 pmap_invalidate_all(pmap);
2460         sched_unpin();
2461         vm_page_unlock_queues();
2462         PMAP_UNLOCK(pmap);
2463         pmap_free_zero_pages(free);
2464 }
2465
2466 /*
2467  *      Routine:        pmap_remove_all
2468  *      Function:
2469  *              Removes this physical page from
2470  *              all physical maps in which it resides.
2471  *              Reflects back modify bits to the pager.
2472  *
2473  *      Notes:
2474  *              Original versions of this routine were very
2475  *              inefficient because they iteratively called
2476  *              pmap_remove (slow...)
2477  */
2478
2479 void
2480 pmap_remove_all(vm_page_t m)
2481 {
2482         pv_entry_t pv;
2483         pmap_t pmap;
2484         pt_entry_t *pte, tpte;
2485         vm_page_t free;
2486
2487 #if defined(PMAP_DIAGNOSTIC)
2488         /*
2489          * XXX This makes pmap_remove_all() illegal for non-managed pages!
2490          */
2491         if (m->flags & PG_FICTITIOUS) {
2492                 panic("pmap_remove_all: illegal for unmanaged page, va: 0x%jx",
2493                     VM_PAGE_TO_PHYS(m) & 0xffffffff);
2494         }
2495 #endif
2496         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
2497         sched_pin();
2498         while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
2499                 pmap = PV_PMAP(pv);
2500                 PMAP_LOCK(pmap);
2501                 pmap->pm_stats.resident_count--;
2502                 pte = pmap_pte_quick(pmap, pv->pv_va);
2503
2504                 tpte = *pte;
2505                 PT_SET_VA_MA(pte, 0, TRUE);
2506                 if (tpte & PG_W)
2507                         pmap->pm_stats.wired_count--;
2508                 if (tpte & PG_A)
2509                         vm_page_flag_set(m, PG_REFERENCED);
2510
2511                 /*
2512                  * Update the vm_page_t clean and reference bits.
2513                  */
2514                 if (tpte & PG_M) {
2515                         KASSERT((tpte & PG_RW),
2516         ("pmap_remove_all: modified page not writable: va: %#x, pte: %#jx",
2517                             pv->pv_va, (uintmax_t)tpte));
2518                         vm_page_dirty(m);
2519                 }
2520                 free = NULL;
2521                 pmap_unuse_pt(pmap, pv->pv_va, &free);
2522                 pmap_invalidate_page(pmap, pv->pv_va);
2523                 pmap_free_zero_pages(free);
2524                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
2525                 free_pv_entry(pmap, pv);
2526                 PMAP_UNLOCK(pmap);
2527         }
2528         vm_page_flag_clear(m, PG_WRITEABLE);
2529         PT_UPDATES_FLUSH();
2530         if (*PMAP1)
2531                 PT_SET_MA(PADDR1, 0);
2532         sched_unpin();
2533 }
2534
2535 /*
2536  *      Set the physical protection on the
2537  *      specified range of this map as requested.
2538  */
2539 void
2540 pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
2541 {
2542         vm_offset_t pdnxt;
2543         pd_entry_t ptpaddr;
2544         pt_entry_t *pte;
2545         int anychanged;
2546
2547         CTR4(KTR_PMAP, "pmap_protect: pmap=%p sva=0x%x eva=0x%x prot=0x%x",
2548             pmap, sva, eva, prot);
2549         
2550         if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
2551                 pmap_remove(pmap, sva, eva);
2552                 return;
2553         }
2554
2555 #ifdef PAE
2556         if ((prot & (VM_PROT_WRITE|VM_PROT_EXECUTE)) ==
2557             (VM_PROT_WRITE|VM_PROT_EXECUTE))
2558                 return;
2559 #else
2560         if (prot & VM_PROT_WRITE)
2561                 return;
2562 #endif
2563
2564         anychanged = 0;
2565
2566         vm_page_lock_queues();
2567         sched_pin();
2568         PMAP_LOCK(pmap);
2569         for (; sva < eva; sva = pdnxt) {
2570                 pt_entry_t obits, pbits;
2571                 unsigned pdirindex;
2572
2573                 pdnxt = (sva + NBPDR) & ~PDRMASK;
2574
2575                 pdirindex = sva >> PDRSHIFT;
2576                 ptpaddr = pmap->pm_pdir[pdirindex];
2577
2578                 /*
2579                  * Weed out invalid mappings. Note: we assume that the page
2580                  * directory table is always allocated, and in kernel virtual.
2581                  */
2582                 if (ptpaddr == 0)
2583                         continue;
2584
2585                 /*
2586                  * Check for large page.
2587                  */
2588                 if ((ptpaddr & PG_PS) != 0) {
2589                         if ((prot & VM_PROT_WRITE) == 0)
2590                                 pmap->pm_pdir[pdirindex] &= ~(PG_M|PG_RW);
2591 #ifdef PAE
2592                         if ((prot & VM_PROT_EXECUTE) == 0)
2593                                 pmap->pm_pdir[pdirindex] |= pg_nx;
2594 #endif
2595                         anychanged = 1;
2596                         continue;
2597                 }
2598
2599                 if (pdnxt > eva)
2600                         pdnxt = eva;
2601
2602                 for (pte = pmap_pte_quick(pmap, sva); sva != pdnxt; pte++,
2603                     sva += PAGE_SIZE) {
2604                         vm_page_t m;
2605
2606 retry:
2607                         /*
2608                          * Regardless of whether a pte is 32 or 64 bits in
2609                          * size, PG_RW, PG_A, and PG_M are among the least
2610                          * significant 32 bits.
2611                          */
2612                         obits = pbits = *pte;
2613                         if ((pbits & PG_V) == 0)
2614                                 continue;
2615                         if (pbits & PG_MANAGED) {
2616                                 m = NULL;
2617                                 if (pbits & PG_A) {
2618                                         m = PHYS_TO_VM_PAGE(xpmap_mtop(pbits) & PG_FRAME);
2619                                         vm_page_flag_set(m, PG_REFERENCED);
2620                                         pbits &= ~PG_A;
2621                                 }
2622                                 if ((pbits & PG_M) != 0) {
2623                                         if (m == NULL)
2624                                                 m = PHYS_TO_VM_PAGE(xpmap_mtop(pbits) & PG_FRAME);
2625                                         vm_page_dirty(m);
2626                                 }
2627                         }
2628
2629                         if ((prot & VM_PROT_WRITE) == 0)
2630                                 pbits &= ~(PG_RW | PG_M);
2631 #ifdef PAE
2632                         if ((prot & VM_PROT_EXECUTE) == 0)
2633                                 pbits |= pg_nx;
2634 #endif
2635
2636                         if (pbits != obits) {
2637 #ifdef XEN
2638                                 obits = *pte;
2639                                 PT_SET_VA_MA(pte, pbits, TRUE);
2640                                 if (*pte != pbits)
2641                                         goto retry;
2642 #else                           
2643 #ifdef PAE
2644                                 if (!atomic_cmpset_64(pte, obits, pbits))
2645                                         goto retry;
2646 #else
2647                                 if (!atomic_cmpset_int((u_int *)pte, obits,
2648                                     pbits))
2649                                         goto retry;
2650 #endif
2651 #endif
2652                                 if (obits & PG_G)
2653                                         pmap_invalidate_page(pmap, sva);
2654                                 else
2655                                         anychanged = 1;
2656                         }
2657                 }
2658         }
2659         PT_UPDATES_FLUSH();
2660         if (*PMAP1)
2661                 PT_SET_VA_MA(PMAP1, 0, TRUE);
2662         if (anychanged)
2663                 pmap_invalidate_all(pmap);
2664         sched_unpin();
2665         vm_page_unlock_queues();
2666         PMAP_UNLOCK(pmap);
2667 }
2668
2669 /*
2670  *      Insert the given physical page (p) at
2671  *      the specified virtual address (v) in the
2672  *      target physical map with the protection requested.
2673  *
2674  *      If specified, the page will be wired down, meaning
2675  *      that the related pte can not be reclaimed.
2676  *
2677  *      NB:  This is the only routine which MAY NOT lazy-evaluate
2678  *      or lose information.  That is, this routine must actually
2679  *      insert this page into the given map NOW.
2680  */
2681 void
2682 pmap_enter(pmap_t pmap, vm_offset_t va, vm_prot_t access, vm_page_t m,
2683     vm_prot_t prot, boolean_t wired)
2684 {
2685         vm_paddr_t pa;
2686         pd_entry_t *pde;
2687         pt_entry_t *pte;
2688         vm_paddr_t opa;
2689         pt_entry_t origpte, newpte;
2690         vm_page_t mpte, om;
2691         boolean_t invlva;
2692
2693         CTR6(KTR_PMAP, "pmap_enter: pmap=%08p va=0x%08x access=0x%x ma=0x%08x prot=0x%x wired=%d",
2694             pmap, va, access, xpmap_ptom(VM_PAGE_TO_PHYS(m)), prot, wired);
2695         va = trunc_page(va);
2696 #ifdef PMAP_DIAGNOSTIC
2697         if (va > VM_MAX_KERNEL_ADDRESS)
2698                 panic("pmap_enter: toobig");
2699         if ((va >= UPT_MIN_ADDRESS) && (va < UPT_MAX_ADDRESS))
2700                 panic("pmap_enter: invalid to pmap_enter page table pages (va: 0x%x)", va);
2701 #endif
2702
2703         mpte = NULL;
2704
2705         vm_page_lock_queues();
2706         PMAP_LOCK(pmap);
2707         sched_pin();
2708
2709         /*
2710          * In the case that a page table page is not
2711          * resident, we are creating it here.
2712          */
2713         if (va < VM_MAXUSER_ADDRESS) {
2714                 mpte = pmap_allocpte(pmap, va, M_WAITOK);
2715         }
2716 #if 0 && defined(PMAP_DIAGNOSTIC)
2717         else {
2718                 pd_entry_t *pdeaddr = pmap_pde(pmap, va);
2719                 origpte = *pdeaddr;
2720                 if ((origpte & PG_V) == 0) { 
2721                         panic("pmap_enter: invalid kernel page table page, pdir=%p, pde=%p, va=%p\n",
2722                                 pmap->pm_pdir[PTDPTDI], origpte, va);
2723                 }
2724         }
2725 #endif
2726
2727         pde = pmap_pde(pmap, va);
2728         if ((*pde & PG_PS) != 0)
2729                 panic("pmap_enter: attempted pmap_enter on 4MB page");
2730         pte = pmap_pte_quick(pmap, va);
2731
2732         /*
2733          * Page Directory table entry not valid, we need a new PT page
2734          */
2735         if (pte == NULL) {
2736                 panic("pmap_enter: invalid page directory pdir=%#jx, va=%#x\n",
2737                         (uintmax_t)pmap->pm_pdir[va >> PDRSHIFT], va);
2738         }
2739
2740         pa = VM_PAGE_TO_PHYS(m);
2741         om = NULL;
2742         opa = origpte = 0;
2743
2744 #if 0
2745         KASSERT((*pte & PG_V) || (*pte == 0), ("address set but not valid pte=%p *pte=0x%016jx",
2746                 pte, *pte));
2747 #endif
2748         origpte = *pte;
2749         if (origpte)
2750                 origpte = xpmap_mtop(origpte);
2751         opa = origpte & PG_FRAME;
2752
2753         /*
2754          * Mapping has not changed, must be protection or wiring change.
2755          */
2756         if (origpte && (opa == pa)) {
2757                 /*
2758                  * Wiring change, just update stats. We don't worry about
2759                  * wiring PT pages as they remain resident as long as there
2760                  * are valid mappings in them. Hence, if a user page is wired,
2761                  * the PT page will be also.
2762                  */
2763                 if (wired && ((origpte & PG_W) == 0))
2764                         pmap->pm_stats.wired_count++;
2765                 else if (!wired && (origpte & PG_W))
2766                         pmap->pm_stats.wired_count--;
2767
2768                 /*
2769                  * Remove extra pte reference
2770                  */
2771                 if (mpte)
2772                         mpte->wire_count--;
2773
2774                 /*
2775                  * We might be turning off write access to the page,
2776                  * so we go ahead and sense modify status.
2777                  */
2778                 if (origpte & PG_MANAGED) {
2779                         om = m;
2780                         pa |= PG_MANAGED;
2781                 }
2782                 goto validate;
2783         } 
2784         /*
2785          * Mapping has changed, invalidate old range and fall through to
2786          * handle validating new mapping.
2787          */
2788         if (opa) {
2789                 if (origpte & PG_W)
2790                         pmap->pm_stats.wired_count--;
2791                 if (origpte & PG_MANAGED) {
2792                         om = PHYS_TO_VM_PAGE(opa);
2793                         pmap_remove_entry(pmap, om, va);
2794                 } else if (va < VM_MAXUSER_ADDRESS) 
2795                         printf("va=0x%x is unmanaged :-( \n", va);
2796                         
2797                 if (mpte != NULL) {
2798                         mpte->wire_count--;
2799                         KASSERT(mpte->wire_count > 0,
2800                             ("pmap_enter: missing reference to page table page,"
2801                              " va: 0x%x", va));
2802                 }
2803         } else
2804                 pmap->pm_stats.resident_count++;
2805
2806         /*
2807          * Enter on the PV list if part of our managed memory.
2808          */
2809         if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) {
2810                 KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva,
2811                     ("pmap_enter: managed mapping within the clean submap"));
2812                 pmap_insert_entry(pmap, va, m);
2813                 pa |= PG_MANAGED;
2814         }
2815
2816         /*
2817          * Increment counters
2818          */
2819         if (wired)
2820                 pmap->pm_stats.wired_count++;
2821
2822 validate:
2823         /*
2824          * Now validate mapping with desired protection/wiring.
2825          */
2826         newpte = (pt_entry_t)(pa | PG_V);
2827         if ((prot & VM_PROT_WRITE) != 0) {
2828                 newpte |= PG_RW;
2829                 vm_page_flag_set(m, PG_WRITEABLE);
2830         }
2831 #ifdef PAE
2832         if ((prot & VM_PROT_EXECUTE) == 0)
2833                 newpte |= pg_nx;
2834 #endif
2835         if (wired)
2836                 newpte |= PG_W;
2837         if (va < VM_MAXUSER_ADDRESS)
2838                 newpte |= PG_U;
2839         if (pmap == kernel_pmap)
2840                 newpte |= pgeflag;
2841
2842         critical_enter();
2843         /*
2844          * if the mapping or permission bits are different, we need
2845          * to update the pte.
2846          */
2847         if ((origpte & ~(PG_M|PG_A)) != newpte) {
2848                 if (origpte) {
2849                         invlva = FALSE;
2850                         origpte = *pte;
2851                         PT_SET_VA(pte, newpte | PG_A, FALSE);
2852                         if (origpte & PG_A) {
2853                                 if (origpte & PG_MANAGED)
2854                                         vm_page_flag_set(om, PG_REFERENCED);
2855                                 if (opa != VM_PAGE_TO_PHYS(m))
2856                                         invlva = TRUE;
2857 #ifdef PAE
2858                                 if ((origpte & PG_NX) == 0 &&
2859                                     (newpte & PG_NX) != 0)
2860                                         invlva = TRUE;
2861 #endif
2862                         }
2863                         if (origpte & PG_M) {
2864                                 KASSERT((origpte & PG_RW),
2865         ("pmap_enter: modified page not writable: va: %#x, pte: %#jx",
2866                                     va, (uintmax_t)origpte));
2867                                 if ((origpte & PG_MANAGED) != 0)
2868                                         vm_page_dirty(om);
2869                                 if ((prot & VM_PROT_WRITE) == 0)
2870                                         invlva = TRUE;
2871                         }
2872                         if (invlva)
2873                                 pmap_invalidate_page(pmap, va);
2874                 } else{
2875                         PT_SET_VA(pte, newpte | PG_A, FALSE);
2876                 }
2877                 
2878         }
2879         PT_UPDATES_FLUSH();
2880         critical_exit();
2881         if (*PMAP1)
2882                 PT_SET_VA_MA(PMAP1, 0, TRUE);
2883         sched_unpin();
2884         vm_page_unlock_queues();
2885         PMAP_UNLOCK(pmap);
2886 }
2887
2888 /*
2889  * Maps a sequence of resident pages belonging to the same object.
2890  * The sequence begins with the given page m_start.  This page is
2891  * mapped at the given virtual address start.  Each subsequent page is
2892  * mapped at a virtual address that is offset from start by the same
2893  * amount as the page is offset from m_start within the object.  The
2894  * last page in the sequence is the page with the largest offset from
2895  * m_start that can be mapped at a virtual address less than the given
2896  * virtual address end.  Not every virtual page between start and end
2897  * is mapped; only those for which a resident page exists with the
2898  * corresponding offset from m_start are mapped.
2899  */
2900 void
2901 pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end,
2902     vm_page_t m_start, vm_prot_t prot)
2903 {
2904         vm_page_t m, mpte;
2905         vm_pindex_t diff, psize;
2906         multicall_entry_t mcl[16];
2907         multicall_entry_t *mclp = mcl;
2908         int error, count = 0;
2909         
2910         VM_OBJECT_LOCK_ASSERT(m_start->object, MA_OWNED);
2911         psize = atop(end - start);
2912             
2913         mpte = NULL;
2914         m = m_start;
2915         PMAP_LOCK(pmap);
2916         while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
2917                 mpte = pmap_enter_quick_locked(&mclp, &count, pmap, start + ptoa(diff), m,
2918                     prot, mpte);
2919                 m = TAILQ_NEXT(m, listq);
2920                 if (count == 16) {
2921                         error = HYPERVISOR_multicall(mcl, count);
2922                         KASSERT(error == 0, ("bad multicall %d", error));
2923                         mclp = mcl;
2924                         count = 0;
2925                 }
2926         }
2927         if (count) {
2928                 error = HYPERVISOR_multicall(mcl, count);
2929                 KASSERT(error == 0, ("bad multicall %d", error));
2930         }
2931         
2932         PMAP_UNLOCK(pmap);
2933 }
2934
2935 /*
2936  * this code makes some *MAJOR* assumptions:
2937  * 1. Current pmap & pmap exists.
2938  * 2. Not wired.
2939  * 3. Read access.
2940  * 4. No page table pages.
2941  * but is *MUCH* faster than pmap_enter...
2942  */
2943
2944 void
2945 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
2946 {
2947         multicall_entry_t mcl, *mclp;
2948         int count = 0;
2949         mclp = &mcl;
2950         
2951         CTR4(KTR_PMAP, "pmap_enter_quick: pmap=%p va=0x%x m=%p prot=0x%x",
2952             pmap, va, m, prot);
2953         
2954         PMAP_LOCK(pmap);
2955         (void) pmap_enter_quick_locked(&mclp, &count, pmap, va, m, prot, NULL);
2956         if (count)
2957                 HYPERVISOR_multicall(&mcl, count);
2958         PMAP_UNLOCK(pmap);
2959 }
2960
2961 #ifdef notyet
2962 void
2963 pmap_enter_quick_range(pmap_t pmap, vm_offset_t *addrs, vm_page_t *pages, vm_prot_t *prots, int count)
2964 {
2965         int i, error, index = 0;
2966         multicall_entry_t mcl[16];
2967         multicall_entry_t *mclp = mcl;
2968                 
2969         PMAP_LOCK(pmap);
2970         for (i = 0; i < count; i++, addrs++, pages++, prots++) {
2971                 if (!pmap_is_prefaultable_locked(pmap, *addrs))
2972                         continue;
2973
2974                 (void) pmap_enter_quick_locked(&mclp, &index, pmap, *addrs, *pages, *prots, NULL);
2975                 if (index == 16) {
2976                         error = HYPERVISOR_multicall(mcl, index);
2977                         mclp = mcl;
2978                         index = 0;
2979                         KASSERT(error == 0, ("bad multicall %d", error));
2980                 }
2981         }
2982         if (index) {
2983                 error = HYPERVISOR_multicall(mcl, index);
2984                 KASSERT(error == 0, ("bad multicall %d", error));
2985         }
2986         
2987         PMAP_UNLOCK(pmap);
2988 }
2989 #endif
2990
2991 static vm_page_t
2992 pmap_enter_quick_locked(multicall_entry_t **mclpp, int *count, pmap_t pmap, vm_offset_t va, vm_page_t m,
2993     vm_prot_t prot, vm_page_t mpte)
2994 {
2995         pt_entry_t *pte;
2996         vm_paddr_t pa;
2997         vm_page_t free;
2998         multicall_entry_t *mcl = *mclpp;
2999         
3000         KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
3001             (m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0,
3002             ("pmap_enter_quick_locked: managed mapping within the clean submap"));
3003         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
3004         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
3005
3006         /*
3007          * In the case that a page table page is not
3008          * resident, we are creating it here.
3009          */
3010         if (va < VM_MAXUSER_ADDRESS) {
3011                 unsigned ptepindex;
3012                 pd_entry_t ptema;
3013
3014                 /*
3015                  * Calculate pagetable page index
3016                  */
3017                 ptepindex = va >> PDRSHIFT;
3018                 if (mpte && (mpte->pindex == ptepindex)) {
3019                         mpte->wire_count++;
3020                 } else {
3021                         /*
3022                          * Get the page directory entry
3023                          */
3024                         ptema = pmap->pm_pdir[ptepindex];
3025
3026                         /*
3027                          * If the page table page is mapped, we just increment
3028                          * the hold count, and activate it.
3029                          */
3030                         if (ptema & PG_V) {
3031                                 if (ptema & PG_PS)
3032                                         panic("pmap_enter_quick: unexpected mapping into 4MB page");
3033                                 mpte = PHYS_TO_VM_PAGE(xpmap_mtop(ptema) & PG_FRAME);
3034                                 mpte->wire_count++;
3035                         } else {
3036                                 mpte = _pmap_allocpte(pmap, ptepindex,
3037                                     M_NOWAIT);
3038                                 if (mpte == NULL)
3039                                         return (mpte);
3040                         }
3041                 }
3042         } else {
3043                 mpte = NULL;
3044         }
3045
3046         /*
3047          * This call to vtopte makes the assumption that we are
3048          * entering the page into the current pmap.  In order to support
3049          * quick entry into any pmap, one would likely use pmap_pte_quick.
3050          * But that isn't as quick as vtopte.
3051          */
3052         KASSERT(pmap_is_current(pmap), ("entering pages in non-current pmap"));
3053         pte = vtopte(va);
3054         if (*pte & PG_V) {
3055                 if (mpte != NULL) {
3056                         mpte->wire_count--;
3057                         mpte = NULL;
3058                 }
3059                 return (mpte);
3060         }
3061
3062         /*
3063          * Enter on the PV list if part of our managed memory.
3064          */
3065         if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0 &&
3066             !pmap_try_insert_pv_entry(pmap, va, m)) {
3067                 if (mpte != NULL) {
3068                         free = NULL;
3069                         if (pmap_unwire_pte_hold(pmap, mpte, &free)) {
3070                                 pmap_invalidate_page(pmap, va);
3071                                 pmap_free_zero_pages(free);
3072                         }
3073                         
3074                         mpte = NULL;
3075                 }
3076                 return (mpte);
3077         }
3078
3079         /*
3080          * Increment counters
3081          */
3082         pmap->pm_stats.resident_count++;
3083
3084         pa = VM_PAGE_TO_PHYS(m);
3085 #ifdef PAE
3086         if ((prot & VM_PROT_EXECUTE) == 0)
3087                 pa |= pg_nx;
3088 #endif
3089
3090 #if 0
3091         /*
3092          * Now validate mapping with RO protection
3093          */
3094         if (m->flags & (PG_FICTITIOUS|PG_UNMANAGED))
3095                 pte_store(pte, pa | PG_V | PG_U);
3096         else
3097                 pte_store(pte, pa | PG_V | PG_U | PG_MANAGED);
3098 #else
3099         /*
3100          * Now validate mapping with RO protection
3101          */
3102         if (m->flags & (PG_FICTITIOUS|PG_UNMANAGED))
3103                 pa =    xpmap_ptom(pa | PG_V | PG_U);
3104         else
3105                 pa = xpmap_ptom(pa | PG_V | PG_U | PG_MANAGED);
3106
3107         mcl->op = __HYPERVISOR_update_va_mapping;
3108         mcl->args[0] = va;
3109         mcl->args[1] = (uint32_t)(pa & 0xffffffff);
3110         mcl->args[2] = (uint32_t)(pa >> 32);
3111         mcl->args[3] = 0;
3112         *mclpp = mcl + 1;
3113         *count = *count + 1;
3114 #endif  
3115         return mpte;
3116 }
3117
3118 /*
3119  * Make a temporary mapping for a physical address.  This is only intended
3120  * to be used for panic dumps.
3121  */
3122 void *
3123 pmap_kenter_temporary(vm_paddr_t pa, int i)
3124 {
3125         vm_offset_t va;
3126         vm_paddr_t ma = xpmap_ptom(pa);
3127
3128         va = (vm_offset_t)crashdumpmap + (i * PAGE_SIZE);
3129         PT_SET_MA(va, (ma & ~PAGE_MASK) | PG_V | pgeflag);
3130         invlpg(va);
3131         return ((void *)crashdumpmap);
3132 }
3133
3134 /*
3135  * This code maps large physical mmap regions into the
3136  * processor address space.  Note that some shortcuts
3137  * are taken, but the code works.
3138  */
3139 void
3140 pmap_object_init_pt(pmap_t pmap, vm_offset_t addr,
3141                     vm_object_t object, vm_pindex_t pindex,
3142                     vm_size_t size)
3143 {
3144         vm_page_t p;
3145
3146         VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
3147         KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG,
3148             ("pmap_object_init_pt: non-device object"));
3149         if (pseflag && 
3150             ((addr & (NBPDR - 1)) == 0) && ((size & (NBPDR - 1)) == 0)) {
3151                 int i;
3152                 vm_page_t m[1];
3153                 unsigned int ptepindex;
3154                 int npdes;
3155                 pd_entry_t ptepa;
3156
3157                 PMAP_LOCK(pmap);
3158                 if (pmap->pm_pdir[ptepindex = (addr >> PDRSHIFT)])
3159                         goto out;
3160                 PMAP_UNLOCK(pmap);
3161 retry:
3162                 p = vm_page_lookup(object, pindex);
3163                 if (p != NULL) {
3164                         if (vm_page_sleep_if_busy(p, FALSE, "init4p"))
3165                                 goto retry;
3166                 } else {
3167                         p = vm_page_alloc(object, pindex, VM_ALLOC_NORMAL);
3168                         if (p == NULL)
3169                                 return;
3170                         m[0] = p;
3171
3172                         if (vm_pager_get_pages(object, m, 1, 0) != VM_PAGER_OK) {
3173                                 vm_page_lock_queues();
3174                                 vm_page_free(p);
3175                                 vm_page_unlock_queues();
3176                                 return;
3177                         }
3178
3179                         p = vm_page_lookup(object, pindex);
3180                         vm_page_wakeup(p);
3181                 }
3182
3183                 ptepa = VM_PAGE_TO_PHYS(p);
3184                 if (ptepa & (NBPDR - 1))
3185                         return;
3186
3187                 p->valid = VM_PAGE_BITS_ALL;
3188
3189                 PMAP_LOCK(pmap);
3190                 pmap->pm_stats.resident_count += size >> PAGE_SHIFT;
3191                 npdes = size >> PDRSHIFT;
3192                 critical_enter();
3193                 for(i = 0; i < npdes; i++) {
3194                         PD_SET_VA(pmap, ptepindex,
3195                             ptepa | PG_U | PG_M | PG_RW | PG_V | PG_PS, FALSE);
3196                         ptepa += NBPDR;
3197                         ptepindex += 1;
3198                 }
3199                 pmap_invalidate_all(pmap);
3200                 critical_exit();
3201 out:
3202                 PMAP_UNLOCK(pmap);
3203         }
3204 }
3205
3206 /*
3207  *      Routine:        pmap_change_wiring
3208  *      Function:       Change the wiring attribute for a map/virtual-address
3209  *                      pair.
3210  *      In/out conditions:
3211  *                      The mapping must already exist in the pmap.
3212  */
3213 void
3214 pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired)
3215 {
3216         pt_entry_t *pte;
3217
3218         vm_page_lock_queues();
3219         PMAP_LOCK(pmap);
3220         pte = pmap_pte(pmap, va);
3221
3222         if (wired && !pmap_pte_w(pte)) {
3223                 PT_SET_VA_MA((pte), *(pte) | PG_W, TRUE);
3224                 pmap->pm_stats.wired_count++;
3225         } else if (!wired && pmap_pte_w(pte)) {
3226                 PT_SET_VA_MA((pte), *(pte) & ~PG_W, TRUE);
3227                 pmap->pm_stats.wired_count--;
3228         }
3229         
3230         /*
3231          * Wiring is not a hardware characteristic so there is no need to
3232          * invalidate TLB.
3233          */
3234         pmap_pte_release(pte);
3235         PMAP_UNLOCK(pmap);
3236         vm_page_unlock_queues();
3237 }
3238
3239
3240
3241 /*
3242  *      Copy the range specified by src_addr/len
3243  *      from the source map to the range dst_addr/len
3244  *      in the destination map.
3245  *
3246  *      This routine is only advisory and need not do anything.
3247  */
3248
3249 void
3250 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
3251           vm_offset_t src_addr)
3252 {
3253         vm_page_t   free;
3254         vm_offset_t addr;
3255         vm_offset_t end_addr = src_addr + len;
3256         vm_offset_t pdnxt;
3257
3258         if (dst_addr != src_addr)
3259                 return;
3260
3261         if (!pmap_is_current(src_pmap)) {
3262                 CTR2(KTR_PMAP,
3263                     "pmap_copy, skipping: pdir[PTDPTDI]=0x%jx PTDpde[0]=0x%jx",
3264                     (src_pmap->pm_pdir[PTDPTDI] & PG_FRAME), (PTDpde[0] & PG_FRAME));
3265                 
3266                 return;
3267         }
3268         CTR5(KTR_PMAP, "pmap_copy:  dst_pmap=%p src_pmap=%p dst_addr=0x%x len=%d src_addr=0x%x",
3269             dst_pmap, src_pmap, dst_addr, len, src_addr);
3270         
3271 #ifdef HAMFISTED_LOCKING
3272         mtx_lock(&createdelete_lock);
3273 #endif
3274
3275         vm_page_lock_queues();
3276         if (dst_pmap < src_pmap) {
3277                 PMAP_LOCK(dst_pmap);
3278                 PMAP_LOCK(src_pmap);
3279         } else {
3280                 PMAP_LOCK(src_pmap);
3281                 PMAP_LOCK(dst_pmap);
3282         }
3283         sched_pin();
3284         for (addr = src_addr; addr < end_addr; addr = pdnxt) {
3285                 pt_entry_t *src_pte, *dst_pte;
3286                 vm_page_t dstmpte, srcmpte;
3287                 pd_entry_t srcptepaddr;
3288                 unsigned ptepindex;
3289
3290                 if (addr >= UPT_MIN_ADDRESS)
3291                         panic("pmap_copy: invalid to pmap_copy page tables");
3292
3293                 pdnxt = (addr + NBPDR) & ~PDRMASK;
3294                 ptepindex = addr >> PDRSHIFT;
3295
3296                 srcptepaddr = PT_GET(&src_pmap->pm_pdir[ptepindex]);
3297                 if (srcptepaddr == 0)
3298                         continue;
3299                         
3300                 if (srcptepaddr & PG_PS) {
3301                         if (dst_pmap->pm_pdir[ptepindex] == 0) {
3302                                 PD_SET_VA(dst_pmap, ptepindex, srcptepaddr & ~PG_W, TRUE);
3303                                 dst_pmap->pm_stats.resident_count +=
3304                                     NBPDR / PAGE_SIZE;
3305                         }
3306                         continue;
3307                 }
3308
3309                 srcmpte = PHYS_TO_VM_PAGE(srcptepaddr & PG_FRAME);
3310                 if (srcmpte->wire_count == 0)
3311                         panic("pmap_copy: source page table page is unused");
3312
3313                 if (pdnxt > end_addr)
3314                         pdnxt = end_addr;
3315
3316                 src_pte = vtopte(addr);
3317                 while (addr < pdnxt) {
3318                         pt_entry_t ptetemp;
3319                         ptetemp = *src_pte;
3320                         /*
3321                          * we only virtual copy managed pages
3322                          */
3323                         if ((ptetemp & PG_MANAGED) != 0) {
3324                                 dstmpte = pmap_allocpte(dst_pmap, addr,
3325                                     M_NOWAIT);
3326                                 if (dstmpte == NULL)
3327                                         break;
3328                                 dst_pte = pmap_pte_quick(dst_pmap, addr);
3329                                 if (*dst_pte == 0 &&
3330                                     pmap_try_insert_pv_entry(dst_pmap, addr,
3331                                     PHYS_TO_VM_PAGE(xpmap_mtop(ptetemp) & PG_FRAME))) {
3332                                         /*
3333                                          * Clear the wired, modified, and
3334                                          * accessed (referenced) bits
3335                                          * during the copy.
3336                                          */
3337                                         KASSERT(ptetemp != 0, ("src_pte not set"));
3338                                         PT_SET_VA_MA(dst_pte, ptetemp & ~(PG_W | PG_M | PG_A), TRUE /* XXX debug */);
3339                                         KASSERT(*dst_pte == (ptetemp & ~(PG_W | PG_M | PG_A)),
3340                                             ("no pmap copy expected: 0x%jx saw: 0x%jx",
3341                                                 ptetemp &  ~(PG_W | PG_M | PG_A), *dst_pte));
3342                                         dst_pmap->pm_stats.resident_count++;
3343                                 } else {
3344                                         free = NULL;
3345                                         if (pmap_unwire_pte_hold(dst_pmap,
3346                                             dstmpte, &free)) {
3347                                                 pmap_invalidate_page(dst_pmap,
3348                                                     addr);
3349                                                 pmap_free_zero_pages(free);
3350                                         }
3351                                 }
3352                                 if (dstmpte->wire_count >= srcmpte->wire_count)
3353                                         break;
3354                         }
3355                         addr += PAGE_SIZE;
3356                         src_pte++;
3357                 }
3358         }
3359         PT_UPDATES_FLUSH();
3360         sched_unpin();
3361         vm_page_unlock_queues();
3362         PMAP_UNLOCK(src_pmap);
3363         PMAP_UNLOCK(dst_pmap);
3364
3365 #ifdef HAMFISTED_LOCKING
3366         mtx_unlock(&createdelete_lock);
3367 #endif
3368 }       
3369
3370 static __inline void
3371 pagezero(void *page)
3372 {
3373 #if defined(I686_CPU)
3374         if (cpu_class == CPUCLASS_686) {
3375 #if defined(CPU_ENABLE_SSE)
3376                 if (cpu_feature & CPUID_SSE2)
3377                         sse2_pagezero(page);
3378                 else
3379 #endif
3380                         i686_pagezero(page);
3381         } else
3382 #endif
3383                 bzero(page, PAGE_SIZE);
3384 }
3385
3386 /*
3387  *      pmap_zero_page zeros the specified hardware page by mapping 
3388  *      the page into KVM and using bzero to clear its contents.
3389  */
3390 void
3391 pmap_zero_page(vm_page_t m)
3392 {
3393         struct sysmaps *sysmaps;
3394
3395         sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
3396         mtx_lock(&sysmaps->lock);
3397         if (*sysmaps->CMAP2)
3398                 panic("pmap_zero_page: CMAP2 busy");
3399         sched_pin();
3400         PT_SET_MA(sysmaps->CADDR2, PG_V | PG_RW | xpmap_ptom(VM_PAGE_TO_PHYS(m)) | PG_A | PG_M);
3401         pagezero(sysmaps->CADDR2);
3402         PT_SET_MA(sysmaps->CADDR2, 0);
3403         sched_unpin();
3404         mtx_unlock(&sysmaps->lock);
3405 }
3406
3407 /*
3408  *      pmap_zero_page_area zeros the specified hardware page by mapping 
3409  *      the page into KVM and using bzero to clear its contents.
3410  *
3411  *      off and size may not cover an area beyond a single hardware page.
3412  */
3413 void
3414 pmap_zero_page_area(vm_page_t m, int off, int size)
3415 {
3416         struct sysmaps *sysmaps;
3417
3418         sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
3419         mtx_lock(&sysmaps->lock);
3420         if (*sysmaps->CMAP2)
3421                 panic("pmap_zero_page: CMAP2 busy");
3422         sched_pin();
3423         PT_SET_MA(sysmaps->CADDR2, PG_V | PG_RW | xpmap_ptom(VM_PAGE_TO_PHYS(m)) | PG_A | PG_M);
3424
3425         if (off == 0 && size == PAGE_SIZE) 
3426                 pagezero(sysmaps->CADDR2);
3427         else
3428                 bzero((char *)sysmaps->CADDR2 + off, size);
3429         PT_SET_MA(sysmaps->CADDR2, 0);
3430         sched_unpin();
3431         mtx_unlock(&sysmaps->lock);
3432 }
3433
3434 /*
3435  *      pmap_zero_page_idle zeros the specified hardware page by mapping 
3436  *      the page into KVM and using bzero to clear its contents.  This
3437  *      is intended to be called from the vm_pagezero process only and
3438  *      outside of Giant.
3439  */
3440 void
3441 pmap_zero_page_idle(vm_page_t m)
3442 {
3443
3444         if (*CMAP3)
3445                 panic("pmap_zero_page: CMAP3 busy");
3446         sched_pin();
3447         PT_SET_MA(CADDR3, PG_V | PG_RW | xpmap_ptom(VM_PAGE_TO_PHYS(m)) | PG_A | PG_M);
3448         pagezero(CADDR3);
3449         PT_SET_MA(CADDR3, 0);
3450         sched_unpin();
3451 }
3452
3453 /*
3454  *      pmap_copy_page copies the specified (machine independent)
3455  *      page by mapping the page into virtual memory and using
3456  *      bcopy to copy the page, one machine dependent page at a
3457  *      time.
3458  */
3459 void
3460 pmap_copy_page(vm_page_t src, vm_page_t dst)
3461 {
3462         struct sysmaps *sysmaps;
3463
3464         sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
3465         mtx_lock(&sysmaps->lock);
3466         if (*sysmaps->CMAP1)
3467                 panic("pmap_copy_page: CMAP1 busy");
3468         if (*sysmaps->CMAP2)
3469                 panic("pmap_copy_page: CMAP2 busy");
3470         sched_pin();
3471         PT_SET_MA(sysmaps->CADDR1, PG_V | xpmap_ptom(VM_PAGE_TO_PHYS(src)) | PG_A);
3472         PT_SET_MA(sysmaps->CADDR2, PG_V | PG_RW | xpmap_ptom(VM_PAGE_TO_PHYS(dst)) | PG_A | PG_M);
3473         bcopy(sysmaps->CADDR1, sysmaps->CADDR2, PAGE_SIZE);
3474         PT_SET_MA(sysmaps->CADDR1, 0);
3475         PT_SET_MA(sysmaps->CADDR2, 0);
3476         sched_unpin();
3477         mtx_unlock(&sysmaps->lock);
3478 }
3479
3480 /*
3481  * Returns true if the pmap's pv is one of the first
3482  * 16 pvs linked to from this page.  This count may
3483  * be changed upwards or downwards in the future; it
3484  * is only necessary that true be returned for a small
3485  * subset of pmaps for proper page aging.
3486  */
3487 boolean_t
3488 pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
3489 {
3490         pv_entry_t pv;
3491         int loops = 0;
3492
3493         if (m->flags & PG_FICTITIOUS)
3494                 return (FALSE);
3495
3496         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
3497         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
3498                 if (PV_PMAP(pv) == pmap) {
3499                         return TRUE;
3500                 }
3501                 loops++;
3502                 if (loops >= 16)
3503                         break;
3504         }
3505         return (FALSE);
3506 }
3507
3508 /*
3509  *      pmap_page_wired_mappings:
3510  *
3511  *      Return the number of managed mappings to the given physical page
3512  *      that are wired.
3513  */
3514 int
3515 pmap_page_wired_mappings(vm_page_t m)
3516 {
3517         pv_entry_t pv;
3518         pt_entry_t *pte;
3519         pmap_t pmap;
3520         int count;
3521
3522         count = 0;
3523         if ((m->flags & PG_FICTITIOUS) != 0)
3524                 return (count);
3525         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
3526         sched_pin();
3527         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
3528                 pmap = PV_PMAP(pv);
3529                 PMAP_LOCK(pmap);
3530                 pte = pmap_pte_quick(pmap, pv->pv_va);
3531                 if ((*pte & PG_W) != 0)
3532                         count++;
3533                 PMAP_UNLOCK(pmap);
3534         }
3535         sched_unpin();
3536         return (count);
3537 }
3538
3539 /*
3540  * Returns TRUE if the given page is mapped individually or as part of
3541  * a 4mpage.  Otherwise, returns FALSE.
3542  */
3543 boolean_t
3544 pmap_page_is_mapped(vm_page_t m)
3545 {
3546         struct md_page *pvh;
3547
3548         if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) != 0)
3549                 return (FALSE);
3550         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
3551         if (TAILQ_EMPTY(&m->md.pv_list)) {
3552                 pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
3553                 return (!TAILQ_EMPTY(&pvh->pv_list));
3554         } else
3555                 return (TRUE);
3556 }
3557
3558 /*
3559  * Remove all pages from specified address space
3560  * this aids process exit speeds.  Also, this code
3561  * is special cased for current process only, but
3562  * can have the more generic (and slightly slower)
3563  * mode enabled.  This is much faster than pmap_remove
3564  * in the case of running down an entire address space.
3565  */
3566 void
3567 pmap_remove_pages(pmap_t pmap)
3568 {
3569         pt_entry_t *pte, tpte;
3570         vm_page_t m, free = NULL;
3571         pv_entry_t pv;
3572         struct pv_chunk *pc, *npc;
3573         int field, idx;
3574         int32_t bit;
3575         uint32_t inuse, bitmask;
3576         int allfree;
3577
3578         CTR1(KTR_PMAP, "pmap_remove_pages: pmap=%p", pmap);
3579         
3580         if (pmap != vmspace_pmap(curthread->td_proc->p_vmspace)) {
3581                 printf("warning: pmap_remove_pages called with non-current pmap\n");
3582                 return;
3583         }
3584         vm_page_lock_queues();
3585         KASSERT(pmap_is_current(pmap), ("removing pages from non-current pmap"));
3586         PMAP_LOCK(pmap);
3587         sched_pin();
3588         TAILQ_FOREACH_SAFE(pc, &pmap->pm_pvchunk, pc_list, npc) {
3589                 allfree = 1;
3590                 for (field = 0; field < _NPCM; field++) {
3591                         inuse = (~(pc->pc_map[field])) & pc_freemask[field];
3592                         while (inuse != 0) {
3593                                 bit = bsfl(inuse);
3594                                 bitmask = 1UL << bit;
3595                                 idx = field * 32 + bit;
3596                                 pv = &pc->pc_pventry[idx];
3597                                 inuse &= ~bitmask;
3598
3599                                 pte = vtopte(pv->pv_va);
3600                                 tpte = *pte ? xpmap_mtop(*pte) : 0;
3601
3602                                 if (tpte == 0) {
3603                                         printf(
3604                                             "TPTE at %p  IS ZERO @ VA %08x\n",
3605                                             pte, pv->pv_va);
3606                                         panic("bad pte");
3607                                 }
3608
3609 /*
3610  * We cannot remove wired pages from a process' mapping at this time
3611  */
3612                                 if (tpte & PG_W) {
3613                                         allfree = 0;
3614                                         continue;
3615                                 }
3616
3617                                 m = PHYS_TO_VM_PAGE(tpte & PG_FRAME);
3618                                 KASSERT(m->phys_addr == (tpte & PG_FRAME),
3619                                     ("vm_page_t %p phys_addr mismatch %016jx %016jx",
3620                                     m, (uintmax_t)m->phys_addr,
3621                                     (uintmax_t)tpte));
3622
3623                                 KASSERT(m < &vm_page_array[vm_page_array_size],
3624                                         ("pmap_remove_pages: bad tpte %#jx",
3625                                         (uintmax_t)tpte));
3626
3627
3628                                 PT_CLEAR_VA(pte, FALSE);
3629                                 
3630                                 /*
3631                                  * Update the vm_page_t clean/reference bits.
3632                                  */
3633                                 if (tpte & PG_M)
3634                                         vm_page_dirty(m);
3635
3636                                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
3637                                 if (TAILQ_EMPTY(&m->md.pv_list))
3638                                         vm_page_flag_clear(m, PG_WRITEABLE);
3639
3640                                 pmap_unuse_pt(pmap, pv->pv_va, &free);
3641
3642                                 /* Mark free */
3643                                 PV_STAT(pv_entry_frees++);
3644                                 PV_STAT(pv_entry_spare++);
3645                                 pv_entry_count--;
3646                                 pc->pc_map[field] |= bitmask;
3647                                 pmap->pm_stats.resident_count--;                        
3648                         }
3649                 }
3650                 PT_UPDATES_FLUSH();
3651                 if (allfree) {
3652                         PV_STAT(pv_entry_spare -= _NPCPV);
3653                         PV_STAT(pc_chunk_count--);
3654                         PV_STAT(pc_chunk_frees++);
3655                         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
3656                         m = PHYS_TO_VM_PAGE(pmap_kextract((vm_offset_t)pc));
3657                         pmap_qremove((vm_offset_t)pc, 1);
3658                         vm_page_unwire(m, 0);
3659                         vm_page_free(m);
3660                         pmap_ptelist_free(&pv_vafree, (vm_offset_t)pc);
3661                 }
3662         }
3663         PT_UPDATES_FLUSH();
3664         if (*PMAP1)
3665                 PT_SET_MA(PADDR1, 0);
3666
3667         sched_unpin();
3668         pmap_invalidate_all(pmap);
3669         vm_page_unlock_queues();
3670         PMAP_UNLOCK(pmap);
3671         pmap_free_zero_pages(free);
3672 }
3673
3674 /*
3675  *      pmap_is_modified:
3676  *
3677  *      Return whether or not the specified physical page was modified
3678  *      in any physical maps.
3679  */
3680 boolean_t
3681 pmap_is_modified(vm_page_t m)
3682 {
3683         pv_entry_t pv;
3684         pt_entry_t *pte;
3685         pmap_t pmap;
3686         boolean_t rv;
3687
3688         rv = FALSE;
3689         if (m->flags & PG_FICTITIOUS)
3690                 return (rv);
3691
3692         sched_pin();
3693         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
3694         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
3695                 pmap = PV_PMAP(pv);
3696                 PMAP_LOCK(pmap);
3697                 pte = pmap_pte_quick(pmap, pv->pv_va);
3698                 rv = (*pte & PG_M) != 0;
3699                 PMAP_UNLOCK(pmap);
3700                 if (rv)
3701                         break;
3702         }
3703         if (*PMAP1)
3704                 PT_SET_MA(PADDR1, 0);
3705         sched_unpin();
3706         return (rv);
3707 }
3708
3709 /*
3710  *      pmap_is_prefaultable:
3711  *
3712  *      Return whether or not the specified virtual address is elgible
3713  *      for prefault.
3714  */
3715 static boolean_t
3716 pmap_is_prefaultable_locked(pmap_t pmap, vm_offset_t addr)
3717 {
3718         pt_entry_t *pte;
3719         boolean_t rv = FALSE;
3720
3721         return (rv);
3722         
3723         if (pmap_is_current(pmap) && *pmap_pde(pmap, addr)) {
3724                 pte = vtopte(addr);
3725                 rv = (*pte == 0);
3726         }
3727         return (rv);
3728 }
3729
3730 boolean_t
3731 pmap_is_prefaultable(pmap_t pmap, vm_offset_t addr)
3732 {
3733         boolean_t rv;
3734         
3735         PMAP_LOCK(pmap);
3736         rv = pmap_is_prefaultable_locked(pmap, addr);
3737         PMAP_UNLOCK(pmap);
3738         return (rv);
3739 }
3740
3741 void
3742 pmap_map_readonly(pmap_t pmap, vm_offset_t va, int len)
3743 {
3744         int i, npages = round_page(len) >> PAGE_SHIFT;
3745         for (i = 0; i < npages; i++) {
3746                 pt_entry_t *pte;
3747                 pte = pmap_pte(pmap, (vm_offset_t)(va + i*PAGE_SIZE));
3748                 vm_page_lock_queues();
3749                 pte_store(pte, xpmap_mtop(*pte & ~(PG_RW|PG_M)));
3750                 vm_page_unlock_queues();
3751                 PMAP_MARK_PRIV(xpmap_mtop(*pte));
3752                 pmap_pte_release(pte);
3753         }
3754 }
3755
3756 void
3757 pmap_map_readwrite(pmap_t pmap, vm_offset_t va, int len)
3758 {
3759         int i, npages = round_page(len) >> PAGE_SHIFT;
3760         for (i = 0; i < npages; i++) {
3761                 pt_entry_t *pte;
3762                 pte = pmap_pte(pmap, (vm_offset_t)(va + i*PAGE_SIZE));
3763                 PMAP_MARK_UNPRIV(xpmap_mtop(*pte));
3764                 vm_page_lock_queues();
3765                 pte_store(pte, xpmap_mtop(*pte) | (PG_RW|PG_M));
3766                 vm_page_unlock_queues();
3767                 pmap_pte_release(pte);
3768         }
3769 }
3770
3771 /*
3772  * Clear the write and modified bits in each of the given page's mappings.
3773  */
3774 void
3775 pmap_remove_write(vm_page_t m)
3776 {
3777         pv_entry_t pv;
3778         pmap_t pmap;
3779         pt_entry_t oldpte, *pte;
3780
3781         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
3782         if ((m->flags & PG_FICTITIOUS) != 0 ||
3783             (m->flags & PG_WRITEABLE) == 0)
3784                 return;
3785         sched_pin();
3786         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
3787                 pmap = PV_PMAP(pv);
3788                 PMAP_LOCK(pmap);
3789                 pte = pmap_pte_quick(pmap, pv->pv_va);
3790 retry:
3791                 oldpte = *pte;
3792                 if ((oldpte & PG_RW) != 0) {
3793                         vm_paddr_t newpte = oldpte & ~(PG_RW | PG_M);
3794                         
3795                         /*
3796                          * Regardless of whether a pte is 32 or 64 bits
3797                          * in size, PG_RW and PG_M are among the least
3798                          * significant 32 bits.
3799                          */
3800                         PT_SET_VA_MA(pte, newpte, TRUE);
3801                         if (*pte != newpte)
3802                                 goto retry;
3803                         
3804                         if ((oldpte & PG_M) != 0)
3805                                 vm_page_dirty(m);
3806                         pmap_invalidate_page(pmap, pv->pv_va);
3807                 }
3808                 PMAP_UNLOCK(pmap);
3809         }
3810         vm_page_flag_clear(m, PG_WRITEABLE);
3811         PT_UPDATES_FLUSH();
3812         if (*PMAP1)
3813                 PT_SET_MA(PADDR1, 0);
3814         sched_unpin();
3815 }
3816
3817 /*
3818  *      pmap_ts_referenced:
3819  *
3820  *      Return a count of reference bits for a page, clearing those bits.
3821  *      It is not necessary for every reference bit to be cleared, but it
3822  *      is necessary that 0 only be returned when there are truly no
3823  *      reference bits set.
3824  *
3825  *      XXX: The exact number of bits to check and clear is a matter that
3826  *      should be tested and standardized at some point in the future for
3827  *      optimal aging of shared pages.
3828  */
3829 int
3830 pmap_ts_referenced(vm_page_t m)
3831 {
3832         pv_entry_t pv, pvf, pvn;
3833         pmap_t pmap;
3834         pt_entry_t *pte;
3835         int rtval = 0;
3836
3837         if (m->flags & PG_FICTITIOUS)
3838                 return (rtval);
3839         sched_pin();
3840         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
3841         if ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
3842                 pvf = pv;
3843                 do {
3844                         pvn = TAILQ_NEXT(pv, pv_list);
3845                         TAILQ_REMOVE(&m->md.pv_list, pv, pv_list);
3846                         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list);
3847                         pmap = PV_PMAP(pv);
3848                         PMAP_LOCK(pmap);
3849                         pte = pmap_pte_quick(pmap, pv->pv_va);
3850                         if ((*pte & PG_A) != 0) {
3851                                 PT_SET_VA_MA(pte, *pte & ~PG_A, FALSE);
3852                                 pmap_invalidate_page(pmap, pv->pv_va);
3853                                 rtval++;
3854                                 if (rtval > 4)
3855                                         pvn = NULL;
3856                         }
3857                         PMAP_UNLOCK(pmap);
3858                 } while ((pv = pvn) != NULL && pv != pvf);
3859         }
3860         PT_UPDATES_FLUSH();
3861         if (*PMAP1)
3862                 PT_SET_MA(PADDR1, 0);
3863
3864         sched_unpin();
3865         return (rtval);
3866 }
3867
3868 /*
3869  *      Clear the modify bits on the specified physical page.
3870  */
3871 void
3872 pmap_clear_modify(vm_page_t m)
3873 {
3874         pv_entry_t pv;
3875         pmap_t pmap;
3876         pt_entry_t *pte;
3877
3878         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
3879         if ((m->flags & PG_FICTITIOUS) != 0)
3880                 return;
3881         sched_pin();
3882         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
3883                 pmap = PV_PMAP(pv);
3884                 PMAP_LOCK(pmap);
3885                 pte = pmap_pte_quick(pmap, pv->pv_va);
3886                 if ((*pte & PG_M) != 0) {
3887                         /*
3888                          * Regardless of whether a pte is 32 or 64 bits
3889                          * in size, PG_M is among the least significant
3890                          * 32 bits. 
3891                          */
3892                         PT_SET_VA_MA(pte, *pte & ~PG_M, FALSE);
3893                         pmap_invalidate_page(pmap, pv->pv_va);
3894                 }
3895                 PMAP_UNLOCK(pmap);
3896         }
3897         sched_unpin();
3898 }
3899
3900 /*
3901  *      pmap_clear_reference:
3902  *
3903  *      Clear the reference bit on the specified physical page.
3904  */
3905 void
3906 pmap_clear_reference(vm_page_t m)
3907 {
3908         pv_entry_t pv;
3909         pmap_t pmap;
3910         pt_entry_t *pte;
3911
3912         mtx_assert(&vm_page_queue_mtx, MA_OWNED);
3913         if ((m->flags & PG_FICTITIOUS) != 0)
3914                 return;
3915         sched_pin();
3916         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
3917                 pmap = PV_PMAP(pv);
3918                 PMAP_LOCK(pmap);
3919                 pte = pmap_pte_quick(pmap, pv->pv_va);
3920                 if ((*pte & PG_A) != 0) {
3921                         /*
3922                          * Regardless of whether a pte is 32 or 64 bits
3923                          * in size, PG_A is among the least significant
3924                          * 32 bits. 
3925                          */
3926                         PT_SET_VA_MA(pte, *pte & ~PG_A, FALSE);
3927                         pmap_invalidate_page(pmap, pv->pv_va);
3928                 }
3929                 PMAP_UNLOCK(pmap);
3930         }
3931         sched_unpin();
3932 }
3933
3934 /*
3935  * Miscellaneous support routines follow
3936  */
3937
3938 /*
3939  * Map a set of physical memory pages into the kernel virtual
3940  * address space. Return a pointer to where it is mapped. This
3941  * routine is intended to be used for mapping device memory,
3942  * NOT real memory.
3943  */
3944 void *
3945 pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, int mode)
3946 {
3947         vm_offset_t va, offset;
3948         vm_size_t tmpsize;
3949
3950         offset = pa & PAGE_MASK;
3951         size = roundup(offset + size, PAGE_SIZE);
3952         pa = pa & PG_FRAME;
3953
3954         if (pa < KERNLOAD && pa + size <= KERNLOAD)
3955                 va = KERNBASE + pa;
3956         else
3957                 va = kmem_alloc_nofault(kernel_map, size);
3958         if (!va)
3959                 panic("pmap_mapdev: Couldn't alloc kernel virtual memory");
3960
3961         for (tmpsize = 0; tmpsize < size; tmpsize += PAGE_SIZE)
3962                 pmap_kenter_attr(va + tmpsize, pa + tmpsize, mode);
3963         pmap_invalidate_range(kernel_pmap, va, va + tmpsize);
3964         pmap_invalidate_cache_range(va, va + size);
3965         return ((void *)(va + offset));
3966 }
3967
3968 void *
3969 pmap_mapdev(vm_paddr_t pa, vm_size_t size)
3970 {
3971
3972         return (pmap_mapdev_attr(pa, size, PAT_UNCACHEABLE));
3973 }
3974
3975 void *
3976 pmap_mapbios(vm_paddr_t pa, vm_size_t size)
3977 {
3978
3979         return (pmap_mapdev_attr(pa, size, PAT_WRITE_BACK));
3980 }
3981
3982 void
3983 pmap_unmapdev(vm_offset_t va, vm_size_t size)
3984 {
3985         vm_offset_t base, offset, tmpva;
3986
3987         if (va >= KERNBASE && va + size <= KERNBASE + KERNLOAD)
3988                 return;
3989         base = trunc_page(va);
3990         offset = va & PAGE_MASK;
3991         size = roundup(offset + size, PAGE_SIZE);
3992         critical_enter();
3993         for (tmpva = base; tmpva < (base + size); tmpva += PAGE_SIZE)
3994                 pmap_kremove(tmpva);
3995         pmap_invalidate_range(kernel_pmap, va, tmpva);
3996         critical_exit();
3997         kmem_free(kernel_map, base, size);
3998 }
3999
4000 /*
4001  * Sets the memory attribute for the specified page.
4002  */
4003 void
4004 pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
4005 {
4006         struct sysmaps *sysmaps;
4007         vm_offset_t sva, eva;
4008
4009         m->md.pat_mode = ma;
4010         if ((m->flags & PG_FICTITIOUS) != 0)
4011                 return;
4012
4013         /*
4014          * If "m" is a normal page, flush it from the cache.
4015          * See pmap_invalidate_cache_range().
4016          *
4017          * First, try to find an existing mapping of the page by sf
4018          * buffer. sf_buf_invalidate_cache() modifies mapping and
4019          * flushes the cache.
4020          */    
4021         if (sf_buf_invalidate_cache(m))
4022                 return;
4023
4024         /*
4025          * If page is not mapped by sf buffer, but CPU does not
4026          * support self snoop, map the page transient and do
4027          * invalidation. In the worst case, whole cache is flushed by
4028          * pmap_invalidate_cache_range().
4029          */
4030         if ((cpu_feature & (CPUID_SS|CPUID_CLFSH)) == CPUID_CLFSH) {
4031                 sysmaps = &sysmaps_pcpu[PCPU_GET(cpuid)];
4032                 mtx_lock(&sysmaps->lock);
4033                 if (*sysmaps->CMAP2)
4034                         panic("pmap_page_set_memattr: CMAP2 busy");
4035                 sched_pin();
4036                 PT_SET_MA(sysmaps->CADDR2, PG_V | PG_RW |
4037                     xpmap_ptom(VM_PAGE_TO_PHYS(m)) | PG_A | PG_M |
4038                     pmap_cache_bits(m->md.pat_mode, 0));
4039                 invlcaddr(sysmaps->CADDR2);
4040                 sva = (vm_offset_t)sysmaps->CADDR2;
4041                 eva = sva + PAGE_SIZE;
4042         } else
4043                 sva = eva = 0; /* gcc */
4044         pmap_invalidate_cache_range(sva, eva);
4045         if (sva != 0) {
4046                 PT_SET_MA(sysmaps->CADDR2, 0);
4047                 sched_unpin();
4048                 mtx_unlock(&sysmaps->lock);
4049         }
4050 }
4051
4052 int
4053 pmap_change_attr(va, size, mode)
4054         vm_offset_t va;
4055         vm_size_t size;
4056         int mode;
4057 {
4058         vm_offset_t base, offset, tmpva;
4059         pt_entry_t *pte;
4060         u_int opte, npte;
4061         pd_entry_t *pde;
4062         boolean_t changed;
4063
4064         base = trunc_page(va);
4065         offset = va & PAGE_MASK;
4066         size = roundup(offset + size, PAGE_SIZE);
4067
4068         /* Only supported on kernel virtual addresses. */
4069         if (base <= VM_MAXUSER_ADDRESS)
4070                 return (EINVAL);
4071
4072         /* 4MB pages and pages that aren't mapped aren't supported. */
4073         for (tmpva = base; tmpva < (base + size); tmpva += PAGE_SIZE) {
4074                 pde = pmap_pde(kernel_pmap, tmpva);
4075                 if (*pde & PG_PS)
4076                         return (EINVAL);
4077                 if ((*pde & PG_V) == 0)
4078                         return (EINVAL);
4079                 pte = vtopte(va);
4080                 if ((*pte & PG_V) == 0)
4081                         return (EINVAL);
4082         }
4083
4084         changed = FALSE;
4085
4086         /*
4087          * Ok, all the pages exist and are 4k, so run through them updating
4088          * their cache mode.
4089          */
4090         for (tmpva = base; size > 0; ) {
4091                 pte = vtopte(tmpva);
4092
4093                 /*
4094                  * The cache mode bits are all in the low 32-bits of the
4095                  * PTE, so we can just spin on updating the low 32-bits.
4096                  */
4097                 do {
4098                         opte = *(u_int *)pte;
4099                         npte = opte & ~(PG_PTE_PAT | PG_NC_PCD | PG_NC_PWT);
4100                         npte |= pmap_cache_bits(mode, 0);
4101                         PT_SET_VA_MA(pte, npte, TRUE);
4102                 } while (npte != opte && (*pte != npte));
4103                 if (npte != opte)
4104                         changed = TRUE;
4105                 tmpva += PAGE_SIZE;
4106                 size -= PAGE_SIZE;
4107         }
4108
4109         /*
4110          * Flush CPU caches to make sure any data isn't cached that shouldn't
4111          * be, etc.
4112          */
4113         if (changed) {
4114                 pmap_invalidate_range(kernel_pmap, base, tmpva);
4115                 pmap_invalidate_cache_range(base, tmpva);
4116         }
4117         return (0);
4118 }
4119
4120 /*
4121  * perform the pmap work for mincore
4122  */
4123 int
4124 pmap_mincore(pmap_t pmap, vm_offset_t addr)
4125 {
4126         pt_entry_t *ptep, pte;
4127         vm_page_t m;
4128         int val = 0;
4129         
4130         PMAP_LOCK(pmap);
4131         ptep = pmap_pte(pmap, addr);
4132         pte = (ptep != NULL) ? PT_GET(ptep) : 0;
4133         pmap_pte_release(ptep);
4134         PMAP_UNLOCK(pmap);
4135
4136         if (pte != 0) {
4137                 vm_paddr_t pa;
4138
4139                 val = MINCORE_INCORE;
4140                 if ((pte & PG_MANAGED) == 0)
4141                         return val;
4142
4143                 pa = pte & PG_FRAME;
4144
4145                 m = PHYS_TO_VM_PAGE(pa);
4146
4147                 /*
4148                  * Modified by us
4149                  */
4150                 if (pte & PG_M)
4151                         val |= MINCORE_MODIFIED|MINCORE_MODIFIED_OTHER;
4152                 else {
4153                         /*
4154                          * Modified by someone else
4155                          */
4156                         vm_page_lock_queues();
4157                         if (m->dirty || pmap_is_modified(m))
4158                                 val |= MINCORE_MODIFIED_OTHER;
4159                         vm_page_unlock_queues();
4160                 }
4161                 /*
4162                  * Referenced by us
4163                  */
4164                 if (pte & PG_A)
4165                         val |= MINCORE_REFERENCED|MINCORE_REFERENCED_OTHER;
4166                 else {
4167                         /*
4168                          * Referenced by someone else
4169                          */
4170                         vm_page_lock_queues();
4171                         if ((m->flags & PG_REFERENCED) ||
4172                             pmap_ts_referenced(m)) {
4173                                 val |= MINCORE_REFERENCED_OTHER;
4174                                 vm_page_flag_set(m, PG_REFERENCED);
4175                         }
4176                         vm_page_unlock_queues();
4177                 }
4178         } 
4179         return val;
4180 }
4181
4182 void
4183 pmap_activate(struct thread *td)
4184 {
4185         pmap_t  pmap, oldpmap;
4186         u_int32_t  cr3;
4187
4188         critical_enter();
4189         pmap = vmspace_pmap(td->td_proc->p_vmspace);
4190         oldpmap = PCPU_GET(curpmap);
4191 #if defined(SMP)
4192         atomic_clear_int(&oldpmap->pm_active, PCPU_GET(cpumask));
4193         atomic_set_int(&pmap->pm_active, PCPU_GET(cpumask));
4194 #else
4195         oldpmap->pm_active &= ~1;
4196         pmap->pm_active |= 1;
4197 #endif
4198 #ifdef PAE
4199         cr3 = vtophys(pmap->pm_pdpt);
4200 #else
4201         cr3 = vtophys(pmap->pm_pdir);
4202 #endif
4203         /*
4204          * pmap_activate is for the current thread on the current cpu
4205          */
4206         td->td_pcb->pcb_cr3 = cr3;
4207         PT_UPDATES_FLUSH();
4208         load_cr3(cr3);
4209         PCPU_SET(curpmap, pmap);
4210         critical_exit();
4211 }
4212
4213 void
4214 pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz)
4215 {
4216 }
4217
4218 /*
4219  *      Increase the starting virtual address of the given mapping if a
4220  *      different alignment might result in more superpage mappings.
4221  */
4222 void
4223 pmap_align_superpage(vm_object_t object, vm_ooffset_t offset,
4224     vm_offset_t *addr, vm_size_t size)
4225 {
4226         vm_offset_t superpage_offset;
4227
4228         if (size < NBPDR)
4229                 return;
4230         if (object != NULL && (object->flags & OBJ_COLORED) != 0)
4231                 offset += ptoa(object->pg_color);
4232         superpage_offset = offset & PDRMASK;
4233         if (size - ((NBPDR - superpage_offset) & PDRMASK) < NBPDR ||
4234             (*addr & PDRMASK) == superpage_offset)
4235                 return;
4236         if ((*addr & PDRMASK) < superpage_offset)
4237                 *addr = (*addr & ~PDRMASK) + superpage_offset;
4238         else
4239                 *addr = ((*addr + PDRMASK) & ~PDRMASK) + superpage_offset;
4240 }
4241
4242 #ifdef XEN
4243
4244 void
4245 pmap_suspend()
4246 {
4247         pmap_t pmap;
4248         int i, pdir, offset;
4249         vm_paddr_t pdirma;
4250         mmu_update_t mu[4];
4251
4252         /*
4253          * We need to remove the recursive mapping structure from all
4254          * our pmaps so that Xen doesn't get confused when it restores
4255          * the page tables. The recursive map lives at page directory
4256          * index PTDPTDI. We assume that the suspend code has stopped
4257          * the other vcpus (if any).
4258          */
4259         LIST_FOREACH(pmap, &allpmaps, pm_list) {
4260                 for (i = 0; i < 4; i++) {
4261                         /*
4262                          * Figure out which page directory (L2) page
4263                          * contains this bit of the recursive map and
4264                          * the offset within that page of the map
4265                          * entry
4266                          */
4267                         pdir = (PTDPTDI + i) / NPDEPG;
4268                         offset = (PTDPTDI + i) % NPDEPG;
4269                         pdirma = pmap->pm_pdpt[pdir] & PG_FRAME;
4270                         mu[i].ptr = pdirma + offset * sizeof(pd_entry_t);
4271                         mu[i].val = 0;
4272                 }
4273                 HYPERVISOR_mmu_update(mu, 4, NULL, DOMID_SELF);
4274         }
4275 }
4276
4277 void
4278 pmap_resume()
4279 {
4280         pmap_t pmap;
4281         int i, pdir, offset;
4282         vm_paddr_t pdirma;
4283         mmu_update_t mu[4];
4284
4285         /*
4286          * Restore the recursive map that we removed on suspend.
4287          */
4288         LIST_FOREACH(pmap, &allpmaps, pm_list) {
4289                 for (i = 0; i < 4; i++) {
4290                         /*
4291                          * Figure out which page directory (L2) page
4292                          * contains this bit of the recursive map and
4293                          * the offset within that page of the map
4294                          * entry
4295                          */
4296                         pdir = (PTDPTDI + i) / NPDEPG;
4297                         offset = (PTDPTDI + i) % NPDEPG;
4298                         pdirma = pmap->pm_pdpt[pdir] & PG_FRAME;
4299                         mu[i].ptr = pdirma + offset * sizeof(pd_entry_t);
4300                         mu[i].val = (pmap->pm_pdpt[i] & PG_FRAME) | PG_V;
4301                 }
4302                 HYPERVISOR_mmu_update(mu, 4, NULL, DOMID_SELF);
4303         }
4304 }
4305
4306 #endif
4307
4308 #if defined(PMAP_DEBUG)
4309 pmap_pid_dump(int pid)
4310 {
4311         pmap_t pmap;
4312         struct proc *p;
4313         int npte = 0;
4314         int index;
4315
4316         sx_slock(&allproc_lock);
4317         FOREACH_PROC_IN_SYSTEM(p) {
4318                 if (p->p_pid != pid)
4319                         continue;
4320
4321                 if (p->p_vmspace) {
4322                         int i,j;
4323                         index = 0;
4324                         pmap = vmspace_pmap(p->p_vmspace);
4325                         for (i = 0; i < NPDEPTD; i++) {
4326                                 pd_entry_t *pde;
4327                                 pt_entry_t *pte;
4328                                 vm_offset_t base = i << PDRSHIFT;
4329                                 
4330                                 pde = &pmap->pm_pdir[i];
4331                                 if (pde && pmap_pde_v(pde)) {
4332                                         for (j = 0; j < NPTEPG; j++) {
4333                                                 vm_offset_t va = base + (j << PAGE_SHIFT);
4334                                                 if (va >= (vm_offset_t) VM_MIN_KERNEL_ADDRESS) {
4335                                                         if (index) {
4336                                                                 index = 0;
4337                                                                 printf("\n");
4338                                                         }
4339                                                         sx_sunlock(&allproc_lock);
4340                                                         return npte;
4341                                                 }
4342                                                 pte = pmap_pte(pmap, va);
4343                                                 if (pte && pmap_pte_v(pte)) {
4344                                                         pt_entry_t pa;
4345                                                         vm_page_t m;
4346                                                         pa = PT_GET(pte);
4347                                                         m = PHYS_TO_VM_PAGE(pa & PG_FRAME);
4348                                                         printf("va: 0x%x, pt: 0x%x, h: %d, w: %d, f: 0x%x",
4349                                                                 va, pa, m->hold_count, m->wire_count, m->flags);
4350                                                         npte++;
4351                                                         index++;
4352                                                         if (index >= 2) {
4353                                                                 index = 0;
4354                                                                 printf("\n");
4355                                                         } else {
4356                                                                 printf(" ");
4357                                                         }
4358                                                 }
4359                                         }
4360                                 }
4361                         }
4362                 }
4363         }
4364         sx_sunlock(&allproc_lock);
4365         return npte;
4366 }
4367 #endif
4368
4369 #if defined(DEBUG)
4370
4371 static void     pads(pmap_t pm);
4372 void            pmap_pvdump(vm_paddr_t pa);
4373
4374 /* print address space of pmap*/
4375 static void
4376 pads(pmap_t pm)
4377 {
4378         int i, j;
4379         vm_paddr_t va;
4380         pt_entry_t *ptep;
4381
4382         if (pm == kernel_pmap)
4383                 return;
4384         for (i = 0; i < NPDEPTD; i++)
4385                 if (pm->pm_pdir[i])
4386                         for (j = 0; j < NPTEPG; j++) {
4387                                 va = (i << PDRSHIFT) + (j << PAGE_SHIFT);
4388                                 if (pm == kernel_pmap && va < KERNBASE)
4389                                         continue;
4390                                 if (pm != kernel_pmap && va > UPT_MAX_ADDRESS)
4391                                         continue;
4392                                 ptep = pmap_pte(pm, va);
4393                                 if (pmap_pte_v(ptep))
4394                                         printf("%x:%x ", va, *ptep);
4395                         };
4396
4397 }
4398
4399 void
4400 pmap_pvdump(vm_paddr_t pa)
4401 {
4402         pv_entry_t pv;
4403         pmap_t pmap;
4404         vm_page_t m;
4405
4406         printf("pa %x", pa);
4407         m = PHYS_TO_VM_PAGE(pa);
4408         TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
4409                 pmap = PV_PMAP(pv);
4410                 printf(" -> pmap %p, va %x", (void *)pmap, pv->pv_va);
4411                 pads(pmap);
4412         }
4413         printf(" ");
4414 }
4415 #endif