1 /*-
2 * SPDX-License-Identifier: BSD-4-Clause
3 *
4 * Copyright (c) 1991 Regents of the University of California.
5 * All rights reserved.
6 * Copyright (c) 1994 John S. Dyson
7 * All rights reserved.
8 * Copyright (c) 1994 David Greenman
9 * All rights reserved.
10 * Copyright (c) 2003 Peter Wemm
11 * All rights reserved.
12 * Copyright (c) 2005-2010 Alan L. Cox <alc@cs.rice.edu>
13 * All rights reserved.
14 *
15 * This code is derived from software contributed to Berkeley by
16 * the Systems Programming Group of the University of Utah Computer
17 * Science Department and William Jolitz of UUNET Technologies Inc.
18 *
19 * Redistribution and use in source and binary forms, with or without
20 * modification, are permitted provided that the following conditions
21 * are met:
22 * 1. Redistributions of source code must retain the above copyright
23 * notice, this list of conditions and the following disclaimer.
24 * 2. Redistributions in binary form must reproduce the above copyright
25 * notice, this list of conditions and the following disclaimer in the
26 * documentation and/or other materials provided with the distribution.
27 * 3. All advertising materials mentioning features or use of this software
28 * must display the following acknowledgement:
29 * This product includes software developed by the University of
30 * California, Berkeley and its contributors.
31 * 4. Neither the name of the University nor the names of its contributors
32 * may be used to endorse or promote products derived from this software
33 * without specific prior written permission.
34 *
35 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
36 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
38 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
39 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
40 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
41 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
42 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
43 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
44 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
45 * SUCH DAMAGE.
46 *
47 * from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
48 */
49 /*-
50 * Copyright (c) 2003 Networks Associates Technology, Inc.
51 * Copyright (c) 2014-2020 The FreeBSD Foundation
52 * All rights reserved.
53 *
54 * This software was developed for the FreeBSD Project by Jake Burkholder,
55 * Safeport Network Services, and Network Associates Laboratories, the
56 * Security Research Division of Network Associates, Inc. under
57 * DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA
58 * CHATS research program.
59 *
60 * Portions of this software were developed by
61 * Konstantin Belousov <kib@FreeBSD.org> under sponsorship from
62 * the FreeBSD Foundation.
63 *
64 * Redistribution and use in source and binary forms, with or without
65 * modification, are permitted provided that the following conditions
66 * are met:
67 * 1. Redistributions of source code must retain the above copyright
68 * notice, this list of conditions and the following disclaimer.
69 * 2. Redistributions in binary form must reproduce the above copyright
70 * notice, this list of conditions and the following disclaimer in the
71 * documentation and/or other materials provided with the distribution.
72 *
73 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
74 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
75 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
76 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
77 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
78 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
79 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
80 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
81 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
82 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
83 * SUCH DAMAGE.
84 */
85
86 #define AMD64_NPT_AWARE
87
88 #include <sys/cdefs.h>
89 /*
90 * Manages physical address maps.
91 *
92 * Since the information managed by this module is
93 * also stored by the logical address mapping module,
94 * this module may throw away valid virtual-to-physical
95 * mappings at almost any time. However, invalidations
96 * of virtual-to-physical mappings must be done as
97 * requested.
98 *
99 * In order to cope with hardware architectures which
100 * make virtual-to-physical map invalidates expensive,
101 * this module may delay invalidate or reduced protection
102 * operations until such time as they are actually
103 * necessary. This module is given full information as
104 * to which processors are currently using which maps,
105 * and to when physical maps must be made correct.
106 */
107
108 #include "opt_ddb.h"
109 #include "opt_pmap.h"
110 #include "opt_vm.h"
111
112 #include <sys/param.h>
113 #include <sys/asan.h>
114 #include <sys/bitstring.h>
115 #include <sys/bus.h>
116 #include <sys/systm.h>
117 #include <sys/counter.h>
118 #include <sys/kernel.h>
119 #include <sys/ktr.h>
120 #include <sys/lock.h>
121 #include <sys/malloc.h>
122 #include <sys/mman.h>
123 #include <sys/msan.h>
124 #include <sys/mutex.h>
125 #include <sys/proc.h>
126 #include <sys/rangeset.h>
127 #include <sys/rwlock.h>
128 #include <sys/sbuf.h>
129 #include <sys/smr.h>
130 #include <sys/sx.h>
131 #include <sys/turnstile.h>
132 #include <sys/vmem.h>
133 #include <sys/vmmeter.h>
134 #include <sys/sched.h>
135 #include <sys/sysctl.h>
136 #include <sys/smp.h>
137 #ifdef DDB
138 #include <sys/kdb.h>
139 #include <ddb/ddb.h>
140 #endif
141
142 #include <vm/vm.h>
143 #include <vm/vm_param.h>
144 #include <vm/vm_kern.h>
145 #include <vm/vm_page.h>
146 #include <vm/vm_map.h>
147 #include <vm/vm_object.h>
148 #include <vm/vm_extern.h>
149 #include <vm/vm_pageout.h>
150 #include <vm/vm_pager.h>
151 #include <vm/vm_phys.h>
152 #include <vm/vm_radix.h>
153 #include <vm/vm_reserv.h>
154 #include <vm/vm_dumpset.h>
155 #include <vm/uma.h>
156
157 #include <machine/asan.h>
158 #include <machine/intr_machdep.h>
159 #include <x86/apicvar.h>
160 #include <x86/ifunc.h>
161 #include <machine/cpu.h>
162 #include <machine/cputypes.h>
163 #include <machine/md_var.h>
164 #include <machine/msan.h>
165 #include <machine/pcb.h>
166 #include <machine/specialreg.h>
167 #ifdef SMP
168 #include <machine/smp.h>
169 #endif
170 #include <machine/sysarch.h>
171 #include <machine/tss.h>
172
173 #ifdef NUMA
174 #define PMAP_MEMDOM MAXMEMDOM
175 #else
176 #define PMAP_MEMDOM 1
177 #endif
178
179 static __inline boolean_t
pmap_type_guest(pmap_t pmap)180 pmap_type_guest(pmap_t pmap)
181 {
182
183 return ((pmap->pm_type == PT_EPT) || (pmap->pm_type == PT_RVI));
184 }
185
186 static __inline boolean_t
pmap_emulate_ad_bits(pmap_t pmap)187 pmap_emulate_ad_bits(pmap_t pmap)
188 {
189
190 return ((pmap->pm_flags & PMAP_EMULATE_AD_BITS) != 0);
191 }
192
193 static __inline pt_entry_t
pmap_valid_bit(pmap_t pmap)194 pmap_valid_bit(pmap_t pmap)
195 {
196 pt_entry_t mask;
197
198 switch (pmap->pm_type) {
199 case PT_X86:
200 case PT_RVI:
201 mask = X86_PG_V;
202 break;
203 case PT_EPT:
204 if (pmap_emulate_ad_bits(pmap))
205 mask = EPT_PG_EMUL_V;
206 else
207 mask = EPT_PG_READ;
208 break;
209 default:
210 panic("pmap_valid_bit: invalid pm_type %d", pmap->pm_type);
211 }
212
213 return (mask);
214 }
215
216 static __inline pt_entry_t
pmap_rw_bit(pmap_t pmap)217 pmap_rw_bit(pmap_t pmap)
218 {
219 pt_entry_t mask;
220
221 switch (pmap->pm_type) {
222 case PT_X86:
223 case PT_RVI:
224 mask = X86_PG_RW;
225 break;
226 case PT_EPT:
227 if (pmap_emulate_ad_bits(pmap))
228 mask = EPT_PG_EMUL_RW;
229 else
230 mask = EPT_PG_WRITE;
231 break;
232 default:
233 panic("pmap_rw_bit: invalid pm_type %d", pmap->pm_type);
234 }
235
236 return (mask);
237 }
238
239 static pt_entry_t pg_g;
240
241 static __inline pt_entry_t
pmap_global_bit(pmap_t pmap)242 pmap_global_bit(pmap_t pmap)
243 {
244 pt_entry_t mask;
245
246 switch (pmap->pm_type) {
247 case PT_X86:
248 mask = pg_g;
249 break;
250 case PT_RVI:
251 case PT_EPT:
252 mask = 0;
253 break;
254 default:
255 panic("pmap_global_bit: invalid pm_type %d", pmap->pm_type);
256 }
257
258 return (mask);
259 }
260
261 static __inline pt_entry_t
pmap_accessed_bit(pmap_t pmap)262 pmap_accessed_bit(pmap_t pmap)
263 {
264 pt_entry_t mask;
265
266 switch (pmap->pm_type) {
267 case PT_X86:
268 case PT_RVI:
269 mask = X86_PG_A;
270 break;
271 case PT_EPT:
272 if (pmap_emulate_ad_bits(pmap))
273 mask = EPT_PG_READ;
274 else
275 mask = EPT_PG_A;
276 break;
277 default:
278 panic("pmap_accessed_bit: invalid pm_type %d", pmap->pm_type);
279 }
280
281 return (mask);
282 }
283
284 static __inline pt_entry_t
pmap_modified_bit(pmap_t pmap)285 pmap_modified_bit(pmap_t pmap)
286 {
287 pt_entry_t mask;
288
289 switch (pmap->pm_type) {
290 case PT_X86:
291 case PT_RVI:
292 mask = X86_PG_M;
293 break;
294 case PT_EPT:
295 if (pmap_emulate_ad_bits(pmap))
296 mask = EPT_PG_WRITE;
297 else
298 mask = EPT_PG_M;
299 break;
300 default:
301 panic("pmap_modified_bit: invalid pm_type %d", pmap->pm_type);
302 }
303
304 return (mask);
305 }
306
307 static __inline pt_entry_t
pmap_pku_mask_bit(pmap_t pmap)308 pmap_pku_mask_bit(pmap_t pmap)
309 {
310
311 return (pmap->pm_type == PT_X86 ? X86_PG_PKU_MASK : 0);
312 }
313
314 static __inline boolean_t
safe_to_clear_referenced(pmap_t pmap,pt_entry_t pte)315 safe_to_clear_referenced(pmap_t pmap, pt_entry_t pte)
316 {
317
318 if (!pmap_emulate_ad_bits(pmap))
319 return (TRUE);
320
321 KASSERT(pmap->pm_type == PT_EPT, ("invalid pm_type %d", pmap->pm_type));
322
323 /*
324 * XWR = 010 or 110 will cause an unconditional EPT misconfiguration
325 * so we don't let the referenced (aka EPT_PG_READ) bit to be cleared
326 * if the EPT_PG_WRITE bit is set.
327 */
328 if ((pte & EPT_PG_WRITE) != 0)
329 return (FALSE);
330
331 /*
332 * XWR = 100 is allowed only if the PMAP_SUPPORTS_EXEC_ONLY is set.
333 */
334 if ((pte & EPT_PG_EXECUTE) == 0 ||
335 ((pmap->pm_flags & PMAP_SUPPORTS_EXEC_ONLY) != 0))
336 return (TRUE);
337 else
338 return (FALSE);
339 }
340
341 #ifdef PV_STATS
342 #define PV_STAT(x) do { x ; } while (0)
343 #else
344 #define PV_STAT(x) do { } while (0)
345 #endif
346
347 #undef pa_index
348 #ifdef NUMA
349 #define pa_index(pa) ({ \
350 KASSERT((pa) <= vm_phys_segs[vm_phys_nsegs - 1].end, \
351 ("address %lx beyond the last segment", (pa))); \
352 (pa) >> PDRSHIFT; \
353 })
354 #define pa_to_pmdp(pa) (&pv_table[pa_index(pa)])
355 #define pa_to_pvh(pa) (&(pa_to_pmdp(pa)->pv_page))
356 #define PHYS_TO_PV_LIST_LOCK(pa) ({ \
357 struct rwlock *_lock; \
358 if (__predict_false((pa) > pmap_last_pa)) \
359 _lock = &pv_dummy_large.pv_lock; \
360 else \
361 _lock = &(pa_to_pmdp(pa)->pv_lock); \
362 _lock; \
363 })
364 #else
365 #define pa_index(pa) ((pa) >> PDRSHIFT)
366 #define pa_to_pvh(pa) (&pv_table[pa_index(pa)])
367
368 #define NPV_LIST_LOCKS MAXCPU
369
370 #define PHYS_TO_PV_LIST_LOCK(pa) \
371 (&pv_list_locks[pa_index(pa) % NPV_LIST_LOCKS])
372 #endif
373
374 #define CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa) do { \
375 struct rwlock **_lockp = (lockp); \
376 struct rwlock *_new_lock; \
377 \
378 _new_lock = PHYS_TO_PV_LIST_LOCK(pa); \
379 if (_new_lock != *_lockp) { \
380 if (*_lockp != NULL) \
381 rw_wunlock(*_lockp); \
382 *_lockp = _new_lock; \
383 rw_wlock(*_lockp); \
384 } \
385 } while (0)
386
387 #define CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m) \
388 CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, VM_PAGE_TO_PHYS(m))
389
390 #define RELEASE_PV_LIST_LOCK(lockp) do { \
391 struct rwlock **_lockp = (lockp); \
392 \
393 if (*_lockp != NULL) { \
394 rw_wunlock(*_lockp); \
395 *_lockp = NULL; \
396 } \
397 } while (0)
398
399 #define VM_PAGE_TO_PV_LIST_LOCK(m) \
400 PHYS_TO_PV_LIST_LOCK(VM_PAGE_TO_PHYS(m))
401
402 /*
403 * Statically allocate kernel pmap memory. However, memory for
404 * pm_pcids is obtained after the dynamic allocator is operational.
405 * Initialize it with a non-canonical pointer to catch early accesses
406 * regardless of the active mapping.
407 */
408 struct pmap kernel_pmap_store = {
409 .pm_pcidp = (void *)0xdeadbeefdeadbeef,
410 };
411
412 vm_offset_t virtual_avail; /* VA of first avail page (after kernel bss) */
413 vm_offset_t virtual_end; /* VA of last avail page (end of kernel AS) */
414
415 int nkpt;
416 SYSCTL_INT(_machdep, OID_AUTO, nkpt, CTLFLAG_RD, &nkpt, 0,
417 "Number of kernel page table pages allocated on bootup");
418
419 static int ndmpdp;
420 vm_paddr_t dmaplimit;
421 vm_offset_t kernel_vm_end = VM_MIN_KERNEL_ADDRESS;
422 pt_entry_t pg_nx;
423
424 static SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
425 "VM/pmap parameters");
426
427 static int __read_frequently pg_ps_enabled = 1;
428 SYSCTL_INT(_vm_pmap, OID_AUTO, pg_ps_enabled, CTLFLAG_RDTUN | CTLFLAG_NOFETCH,
429 &pg_ps_enabled, 0, "Are large page mappings enabled?");
430
431 int __read_frequently la57 = 0;
432 SYSCTL_INT(_vm_pmap, OID_AUTO, la57, CTLFLAG_RDTUN | CTLFLAG_NOFETCH,
433 &la57, 0,
434 "5-level paging for host is enabled");
435
436 /*
437 * The default value is needed in order to preserve compatibility with
438 * some userspace programs that put tags into sign-extended bits.
439 */
440 int prefer_uva_la48 = 1;
441 SYSCTL_INT(_vm_pmap, OID_AUTO, prefer_uva_la48, CTLFLAG_RDTUN,
442 &prefer_uva_la48, 0,
443 "Userspace maps are limited to LA48 unless otherwise configured");
444
445 static bool
pmap_is_la57(pmap_t pmap)446 pmap_is_la57(pmap_t pmap)
447 {
448 if (pmap->pm_type == PT_X86)
449 return (la57);
450 return (false); /* XXXKIB handle EPT */
451 }
452
453 #define PAT_INDEX_SIZE 8
454 static int pat_index[PAT_INDEX_SIZE]; /* cache mode to PAT index conversion */
455
456 static u_int64_t KPTphys; /* phys addr of kernel level 1 */
457 static u_int64_t KPDphys; /* phys addr of kernel level 2 */
458 static u_int64_t KPDPphys; /* phys addr of kernel level 3 */
459 u_int64_t KPML4phys; /* phys addr of kernel level 4 */
460 u_int64_t KPML5phys; /* phys addr of kernel level 5,
461 if supported */
462
463 #ifdef KASAN
464 static uint64_t KASANPDPphys;
465 #endif
466 #ifdef KMSAN
467 static uint64_t KMSANSHADPDPphys;
468 static uint64_t KMSANORIGPDPphys;
469
470 /*
471 * To support systems with large amounts of memory, it is necessary to extend
472 * the maximum size of the direct map. This could eat into the space reserved
473 * for the shadow map.
474 */
475 _Static_assert(DMPML4I + NDMPML4E <= KMSANSHADPML4I, "direct map overflow");
476 #endif
477
478 static pml4_entry_t *kernel_pml4;
479 static u_int64_t DMPDphys; /* phys addr of direct mapped level 2 */
480 static u_int64_t DMPDPphys; /* phys addr of direct mapped level 3 */
481 static int ndmpdpphys; /* number of DMPDPphys pages */
482
483 vm_paddr_t kernphys; /* phys addr of start of bootstrap data */
484 vm_paddr_t KERNend; /* and the end */
485
486 /*
487 * pmap_mapdev support pre initialization (i.e. console)
488 */
489 #define PMAP_PREINIT_MAPPING_COUNT 8
490 static struct pmap_preinit_mapping {
491 vm_paddr_t pa;
492 vm_offset_t va;
493 vm_size_t sz;
494 int mode;
495 } pmap_preinit_mapping[PMAP_PREINIT_MAPPING_COUNT];
496 static int pmap_initialized;
497
498 /*
499 * Data for the pv entry allocation mechanism.
500 * Updates to pv_invl_gen are protected by the pv list lock but reads are not.
501 */
502 #ifdef NUMA
503 static __inline int
pc_to_domain(struct pv_chunk * pc)504 pc_to_domain(struct pv_chunk *pc)
505 {
506
507 return (vm_phys_domain(DMAP_TO_PHYS((vm_offset_t)pc)));
508 }
509 #else
510 static __inline int
pc_to_domain(struct pv_chunk * pc __unused)511 pc_to_domain(struct pv_chunk *pc __unused)
512 {
513
514 return (0);
515 }
516 #endif
517
518 struct pv_chunks_list {
519 struct mtx pvc_lock;
520 TAILQ_HEAD(pch, pv_chunk) pvc_list;
521 int active_reclaims;
522 } __aligned(CACHE_LINE_SIZE);
523
524 struct pv_chunks_list __exclusive_cache_line pv_chunks[PMAP_MEMDOM];
525
526 #ifdef NUMA
527 struct pmap_large_md_page {
528 struct rwlock pv_lock;
529 struct md_page pv_page;
530 u_long pv_invl_gen;
531 };
532 __exclusive_cache_line static struct pmap_large_md_page pv_dummy_large;
533 #define pv_dummy pv_dummy_large.pv_page
534 __read_mostly static struct pmap_large_md_page *pv_table;
535 __read_mostly vm_paddr_t pmap_last_pa;
536 #else
537 static struct rwlock __exclusive_cache_line pv_list_locks[NPV_LIST_LOCKS];
538 static u_long pv_invl_gen[NPV_LIST_LOCKS];
539 static struct md_page *pv_table;
540 static struct md_page pv_dummy;
541 #endif
542
543 /*
544 * All those kernel PT submaps that BSD is so fond of
545 */
546 pt_entry_t *CMAP1 = NULL;
547 caddr_t CADDR1 = 0;
548 static vm_offset_t qframe = 0;
549 static struct mtx qframe_mtx;
550
551 static int pmap_flags = PMAP_PDE_SUPERPAGE; /* flags for x86 pmaps */
552
553 static vmem_t *large_vmem;
554 static u_int lm_ents;
555 #define PMAP_ADDRESS_IN_LARGEMAP(va) ((va) >= LARGEMAP_MIN_ADDRESS && \
556 (va) < LARGEMAP_MIN_ADDRESS + NBPML4 * (u_long)lm_ents)
557
558 int pmap_pcid_enabled = 1;
559 SYSCTL_INT(_vm_pmap, OID_AUTO, pcid_enabled, CTLFLAG_RDTUN | CTLFLAG_NOFETCH,
560 &pmap_pcid_enabled, 0, "Is TLB Context ID enabled ?");
561 int invpcid_works = 0;
562 SYSCTL_INT(_vm_pmap, OID_AUTO, invpcid_works, CTLFLAG_RD, &invpcid_works, 0,
563 "Is the invpcid instruction available ?");
564 int invlpgb_works;
565 SYSCTL_INT(_vm_pmap, OID_AUTO, invlpgb_works, CTLFLAG_RD, &invlpgb_works, 0,
566 "Is the invlpgb instruction available?");
567 int invlpgb_maxcnt;
568 int pmap_pcid_invlpg_workaround = 0;
569 SYSCTL_INT(_vm_pmap, OID_AUTO, pcid_invlpg_workaround,
570 CTLFLAG_RDTUN | CTLFLAG_NOFETCH,
571 &pmap_pcid_invlpg_workaround, 0,
572 "Enable small core PCID/INVLPG workaround");
573 int pmap_pcid_invlpg_workaround_uena = 1;
574
575 int __read_frequently pti = 0;
576 SYSCTL_INT(_vm_pmap, OID_AUTO, pti, CTLFLAG_RDTUN | CTLFLAG_NOFETCH,
577 &pti, 0,
578 "Page Table Isolation enabled");
579 static vm_object_t pti_obj;
580 static pml4_entry_t *pti_pml4;
581 static vm_pindex_t pti_pg_idx;
582 static bool pti_finalized;
583
584 struct pmap_pkru_range {
585 struct rs_el pkru_rs_el;
586 u_int pkru_keyidx;
587 int pkru_flags;
588 };
589
590 static uma_zone_t pmap_pkru_ranges_zone;
591 static bool pmap_pkru_same(pmap_t pmap, vm_offset_t sva, vm_offset_t eva);
592 static pt_entry_t pmap_pkru_get(pmap_t pmap, vm_offset_t va);
593 static void pmap_pkru_on_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva);
594 static void *pkru_dup_range(void *ctx, void *data);
595 static void pkru_free_range(void *ctx, void *node);
596 static int pmap_pkru_copy(pmap_t dst_pmap, pmap_t src_pmap);
597 static int pmap_pkru_deassign(pmap_t pmap, vm_offset_t sva, vm_offset_t eva);
598 static void pmap_pkru_deassign_all(pmap_t pmap);
599
600 static COUNTER_U64_DEFINE_EARLY(pcid_save_cnt);
601 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pcid_save_cnt, CTLFLAG_RD,
602 &pcid_save_cnt, "Count of saved TLB context on switch");
603
604 static LIST_HEAD(, pmap_invl_gen) pmap_invl_gen_tracker =
605 LIST_HEAD_INITIALIZER(&pmap_invl_gen_tracker);
606 static struct mtx invl_gen_mtx;
607 /* Fake lock object to satisfy turnstiles interface. */
608 static struct lock_object invl_gen_ts = {
609 .lo_name = "invlts",
610 };
611 static struct pmap_invl_gen pmap_invl_gen_head = {
612 .gen = 1,
613 .next = NULL,
614 };
615 static u_long pmap_invl_gen = 1;
616 static int pmap_invl_waiters;
617 static struct callout pmap_invl_callout;
618 static bool pmap_invl_callout_inited;
619
620 #define PMAP_ASSERT_NOT_IN_DI() \
621 KASSERT(pmap_not_in_di(), ("DI already started"))
622
623 static bool
pmap_di_locked(void)624 pmap_di_locked(void)
625 {
626 int tun;
627
628 if ((cpu_feature2 & CPUID2_CX16) == 0)
629 return (true);
630 tun = 0;
631 TUNABLE_INT_FETCH("vm.pmap.di_locked", &tun);
632 return (tun != 0);
633 }
634
635 static int
sysctl_pmap_di_locked(SYSCTL_HANDLER_ARGS)636 sysctl_pmap_di_locked(SYSCTL_HANDLER_ARGS)
637 {
638 int locked;
639
640 locked = pmap_di_locked();
641 return (sysctl_handle_int(oidp, &locked, 0, req));
642 }
643 SYSCTL_PROC(_vm_pmap, OID_AUTO, di_locked, CTLTYPE_INT | CTLFLAG_RDTUN |
644 CTLFLAG_MPSAFE, 0, 0, sysctl_pmap_di_locked, "",
645 "Locked delayed invalidation");
646
647 static bool pmap_not_in_di_l(void);
648 static bool pmap_not_in_di_u(void);
649 DEFINE_IFUNC(, bool, pmap_not_in_di, (void))
650 {
651
652 return (pmap_di_locked() ? pmap_not_in_di_l : pmap_not_in_di_u);
653 }
654
655 static bool
pmap_not_in_di_l(void)656 pmap_not_in_di_l(void)
657 {
658 struct pmap_invl_gen *invl_gen;
659
660 invl_gen = &curthread->td_md.md_invl_gen;
661 return (invl_gen->gen == 0);
662 }
663
664 static void
pmap_thread_init_invl_gen_l(struct thread * td)665 pmap_thread_init_invl_gen_l(struct thread *td)
666 {
667 struct pmap_invl_gen *invl_gen;
668
669 invl_gen = &td->td_md.md_invl_gen;
670 invl_gen->gen = 0;
671 }
672
673 static void
pmap_delayed_invl_wait_block(u_long * m_gen,u_long * invl_gen)674 pmap_delayed_invl_wait_block(u_long *m_gen, u_long *invl_gen)
675 {
676 struct turnstile *ts;
677
678 ts = turnstile_trywait(&invl_gen_ts);
679 if (*m_gen > atomic_load_long(invl_gen))
680 turnstile_wait(ts, NULL, TS_SHARED_QUEUE);
681 else
682 turnstile_cancel(ts);
683 }
684
685 static void
pmap_delayed_invl_finish_unblock(u_long new_gen)686 pmap_delayed_invl_finish_unblock(u_long new_gen)
687 {
688 struct turnstile *ts;
689
690 turnstile_chain_lock(&invl_gen_ts);
691 ts = turnstile_lookup(&invl_gen_ts);
692 if (new_gen != 0)
693 pmap_invl_gen = new_gen;
694 if (ts != NULL) {
695 turnstile_broadcast(ts, TS_SHARED_QUEUE);
696 turnstile_unpend(ts);
697 }
698 turnstile_chain_unlock(&invl_gen_ts);
699 }
700
701 /*
702 * Start a new Delayed Invalidation (DI) block of code, executed by
703 * the current thread. Within a DI block, the current thread may
704 * destroy both the page table and PV list entries for a mapping and
705 * then release the corresponding PV list lock before ensuring that
706 * the mapping is flushed from the TLBs of any processors with the
707 * pmap active.
708 */
709 static void
pmap_delayed_invl_start_l(void)710 pmap_delayed_invl_start_l(void)
711 {
712 struct pmap_invl_gen *invl_gen;
713 u_long currgen;
714
715 invl_gen = &curthread->td_md.md_invl_gen;
716 PMAP_ASSERT_NOT_IN_DI();
717 mtx_lock(&invl_gen_mtx);
718 if (LIST_EMPTY(&pmap_invl_gen_tracker))
719 currgen = pmap_invl_gen;
720 else
721 currgen = LIST_FIRST(&pmap_invl_gen_tracker)->gen;
722 invl_gen->gen = currgen + 1;
723 LIST_INSERT_HEAD(&pmap_invl_gen_tracker, invl_gen, link);
724 mtx_unlock(&invl_gen_mtx);
725 }
726
727 /*
728 * Finish the DI block, previously started by the current thread. All
729 * required TLB flushes for the pages marked by
730 * pmap_delayed_invl_page() must be finished before this function is
731 * called.
732 *
733 * This function works by bumping the global DI generation number to
734 * the generation number of the current thread's DI, unless there is a
735 * pending DI that started earlier. In the latter case, bumping the
736 * global DI generation number would incorrectly signal that the
737 * earlier DI had finished. Instead, this function bumps the earlier
738 * DI's generation number to match the generation number of the
739 * current thread's DI.
740 */
741 static void
pmap_delayed_invl_finish_l(void)742 pmap_delayed_invl_finish_l(void)
743 {
744 struct pmap_invl_gen *invl_gen, *next;
745
746 invl_gen = &curthread->td_md.md_invl_gen;
747 KASSERT(invl_gen->gen != 0, ("missed invl_start"));
748 mtx_lock(&invl_gen_mtx);
749 next = LIST_NEXT(invl_gen, link);
750 if (next == NULL)
751 pmap_delayed_invl_finish_unblock(invl_gen->gen);
752 else
753 next->gen = invl_gen->gen;
754 LIST_REMOVE(invl_gen, link);
755 mtx_unlock(&invl_gen_mtx);
756 invl_gen->gen = 0;
757 }
758
759 static bool
pmap_not_in_di_u(void)760 pmap_not_in_di_u(void)
761 {
762 struct pmap_invl_gen *invl_gen;
763
764 invl_gen = &curthread->td_md.md_invl_gen;
765 return (((uintptr_t)invl_gen->next & PMAP_INVL_GEN_NEXT_INVALID) != 0);
766 }
767
768 static void
pmap_thread_init_invl_gen_u(struct thread * td)769 pmap_thread_init_invl_gen_u(struct thread *td)
770 {
771 struct pmap_invl_gen *invl_gen;
772
773 invl_gen = &td->td_md.md_invl_gen;
774 invl_gen->gen = 0;
775 invl_gen->next = (void *)PMAP_INVL_GEN_NEXT_INVALID;
776 }
777
778 static bool
pmap_di_load_invl(struct pmap_invl_gen * ptr,struct pmap_invl_gen * out)779 pmap_di_load_invl(struct pmap_invl_gen *ptr, struct pmap_invl_gen *out)
780 {
781 uint64_t new_high, new_low, old_high, old_low;
782 char res;
783
784 old_low = new_low = 0;
785 old_high = new_high = (uintptr_t)0;
786
787 __asm volatile("lock;cmpxchg16b\t%1"
788 : "=@cce" (res), "+m" (*ptr), "+a" (old_low), "+d" (old_high)
789 : "b"(new_low), "c" (new_high)
790 : "memory", "cc");
791 if (res == 0) {
792 if ((old_high & PMAP_INVL_GEN_NEXT_INVALID) != 0)
793 return (false);
794 out->gen = old_low;
795 out->next = (void *)old_high;
796 } else {
797 out->gen = new_low;
798 out->next = (void *)new_high;
799 }
800 return (true);
801 }
802
803 static bool
pmap_di_store_invl(struct pmap_invl_gen * ptr,struct pmap_invl_gen * old_val,struct pmap_invl_gen * new_val)804 pmap_di_store_invl(struct pmap_invl_gen *ptr, struct pmap_invl_gen *old_val,
805 struct pmap_invl_gen *new_val)
806 {
807 uint64_t new_high, new_low, old_high, old_low;
808 char res;
809
810 new_low = new_val->gen;
811 new_high = (uintptr_t)new_val->next;
812 old_low = old_val->gen;
813 old_high = (uintptr_t)old_val->next;
814
815 __asm volatile("lock;cmpxchg16b\t%1"
816 : "=@cce" (res), "+m" (*ptr), "+a" (old_low), "+d" (old_high)
817 : "b"(new_low), "c" (new_high)
818 : "memory", "cc");
819 return (res);
820 }
821
822 static COUNTER_U64_DEFINE_EARLY(pv_page_count);
823 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pv_page_count, CTLFLAG_RD,
824 &pv_page_count, "Current number of allocated pv pages");
825
826 static COUNTER_U64_DEFINE_EARLY(user_pt_page_count);
827 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, user_pt_page_count, CTLFLAG_RD,
828 &user_pt_page_count,
829 "Current number of allocated page table pages for userspace");
830
831 static COUNTER_U64_DEFINE_EARLY(kernel_pt_page_count);
832 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, kernel_pt_page_count, CTLFLAG_RD,
833 &kernel_pt_page_count,
834 "Current number of allocated page table pages for the kernel");
835
836 #ifdef PV_STATS
837
838 static COUNTER_U64_DEFINE_EARLY(invl_start_restart);
839 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, invl_start_restart,
840 CTLFLAG_RD, &invl_start_restart,
841 "Number of delayed TLB invalidation request restarts");
842
843 static COUNTER_U64_DEFINE_EARLY(invl_finish_restart);
844 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, invl_finish_restart, CTLFLAG_RD,
845 &invl_finish_restart,
846 "Number of delayed TLB invalidation completion restarts");
847
848 static int invl_max_qlen;
849 SYSCTL_INT(_vm_pmap, OID_AUTO, invl_max_qlen, CTLFLAG_RD,
850 &invl_max_qlen, 0,
851 "Maximum delayed TLB invalidation request queue length");
852 #endif
853
854 #define di_delay locks_delay
855
856 static void
pmap_delayed_invl_start_u(void)857 pmap_delayed_invl_start_u(void)
858 {
859 struct pmap_invl_gen *invl_gen, *p, prev, new_prev;
860 struct thread *td;
861 struct lock_delay_arg lda;
862 uintptr_t prevl;
863 u_char pri;
864 #ifdef PV_STATS
865 int i, ii;
866 #endif
867
868 td = curthread;
869 invl_gen = &td->td_md.md_invl_gen;
870 PMAP_ASSERT_NOT_IN_DI();
871 lock_delay_arg_init(&lda, &di_delay);
872 invl_gen->saved_pri = 0;
873 pri = td->td_base_pri;
874 if (pri > PVM) {
875 thread_lock(td);
876 pri = td->td_base_pri;
877 if (pri > PVM) {
878 invl_gen->saved_pri = pri;
879 sched_prio(td, PVM);
880 }
881 thread_unlock(td);
882 }
883 again:
884 PV_STAT(i = 0);
885 for (p = &pmap_invl_gen_head;; p = prev.next) {
886 PV_STAT(i++);
887 prevl = (uintptr_t)atomic_load_ptr(&p->next);
888 if ((prevl & PMAP_INVL_GEN_NEXT_INVALID) != 0) {
889 PV_STAT(counter_u64_add(invl_start_restart, 1));
890 lock_delay(&lda);
891 goto again;
892 }
893 if (prevl == 0)
894 break;
895 prev.next = (void *)prevl;
896 }
897 #ifdef PV_STATS
898 if ((ii = invl_max_qlen) < i)
899 atomic_cmpset_int(&invl_max_qlen, ii, i);
900 #endif
901
902 if (!pmap_di_load_invl(p, &prev) || prev.next != NULL) {
903 PV_STAT(counter_u64_add(invl_start_restart, 1));
904 lock_delay(&lda);
905 goto again;
906 }
907
908 new_prev.gen = prev.gen;
909 new_prev.next = invl_gen;
910 invl_gen->gen = prev.gen + 1;
911
912 /* Formal fence between store to invl->gen and updating *p. */
913 atomic_thread_fence_rel();
914
915 /*
916 * After inserting an invl_gen element with invalid bit set,
917 * this thread blocks any other thread trying to enter the
918 * delayed invalidation block. Do not allow to remove us from
919 * the CPU, because it causes starvation for other threads.
920 */
921 critical_enter();
922
923 /*
924 * ABA for *p is not possible there, since p->gen can only
925 * increase. So if the *p thread finished its di, then
926 * started a new one and got inserted into the list at the
927 * same place, its gen will appear greater than the previously
928 * read gen.
929 */
930 if (!pmap_di_store_invl(p, &prev, &new_prev)) {
931 critical_exit();
932 PV_STAT(counter_u64_add(invl_start_restart, 1));
933 lock_delay(&lda);
934 goto again;
935 }
936
937 /*
938 * There we clear PMAP_INVL_GEN_NEXT_INVALID in
939 * invl_gen->next, allowing other threads to iterate past us.
940 * pmap_di_store_invl() provides fence between the generation
941 * write and the update of next.
942 */
943 invl_gen->next = NULL;
944 critical_exit();
945 }
946
947 static bool
pmap_delayed_invl_finish_u_crit(struct pmap_invl_gen * invl_gen,struct pmap_invl_gen * p)948 pmap_delayed_invl_finish_u_crit(struct pmap_invl_gen *invl_gen,
949 struct pmap_invl_gen *p)
950 {
951 struct pmap_invl_gen prev, new_prev;
952 u_long mygen;
953
954 /*
955 * Load invl_gen->gen after setting invl_gen->next
956 * PMAP_INVL_GEN_NEXT_INVALID. This prevents larger
957 * generations to propagate to our invl_gen->gen. Lock prefix
958 * in atomic_set_ptr() worked as seq_cst fence.
959 */
960 mygen = atomic_load_long(&invl_gen->gen);
961
962 if (!pmap_di_load_invl(p, &prev) || prev.next != invl_gen)
963 return (false);
964
965 KASSERT(prev.gen < mygen,
966 ("invalid di gen sequence %lu %lu", prev.gen, mygen));
967 new_prev.gen = mygen;
968 new_prev.next = (void *)((uintptr_t)invl_gen->next &
969 ~PMAP_INVL_GEN_NEXT_INVALID);
970
971 /* Formal fence between load of prev and storing update to it. */
972 atomic_thread_fence_rel();
973
974 return (pmap_di_store_invl(p, &prev, &new_prev));
975 }
976
977 static void
pmap_delayed_invl_finish_u(void)978 pmap_delayed_invl_finish_u(void)
979 {
980 struct pmap_invl_gen *invl_gen, *p;
981 struct thread *td;
982 struct lock_delay_arg lda;
983 uintptr_t prevl;
984
985 td = curthread;
986 invl_gen = &td->td_md.md_invl_gen;
987 KASSERT(invl_gen->gen != 0, ("missed invl_start: gen 0"));
988 KASSERT(((uintptr_t)invl_gen->next & PMAP_INVL_GEN_NEXT_INVALID) == 0,
989 ("missed invl_start: INVALID"));
990 lock_delay_arg_init(&lda, &di_delay);
991
992 again:
993 for (p = &pmap_invl_gen_head; p != NULL; p = (void *)prevl) {
994 prevl = (uintptr_t)atomic_load_ptr(&p->next);
995 if ((prevl & PMAP_INVL_GEN_NEXT_INVALID) != 0) {
996 PV_STAT(counter_u64_add(invl_finish_restart, 1));
997 lock_delay(&lda);
998 goto again;
999 }
1000 if ((void *)prevl == invl_gen)
1001 break;
1002 }
1003
1004 /*
1005 * It is legitimate to not find ourself on the list if a
1006 * thread before us finished its DI and started it again.
1007 */
1008 if (__predict_false(p == NULL)) {
1009 PV_STAT(counter_u64_add(invl_finish_restart, 1));
1010 lock_delay(&lda);
1011 goto again;
1012 }
1013
1014 critical_enter();
1015 atomic_set_ptr((uintptr_t *)&invl_gen->next,
1016 PMAP_INVL_GEN_NEXT_INVALID);
1017 if (!pmap_delayed_invl_finish_u_crit(invl_gen, p)) {
1018 atomic_clear_ptr((uintptr_t *)&invl_gen->next,
1019 PMAP_INVL_GEN_NEXT_INVALID);
1020 critical_exit();
1021 PV_STAT(counter_u64_add(invl_finish_restart, 1));
1022 lock_delay(&lda);
1023 goto again;
1024 }
1025 critical_exit();
1026 if (atomic_load_int(&pmap_invl_waiters) > 0)
1027 pmap_delayed_invl_finish_unblock(0);
1028 if (invl_gen->saved_pri != 0) {
1029 thread_lock(td);
1030 sched_prio(td, invl_gen->saved_pri);
1031 thread_unlock(td);
1032 }
1033 }
1034
1035 #ifdef DDB
DB_SHOW_COMMAND(di_queue,pmap_di_queue)1036 DB_SHOW_COMMAND(di_queue, pmap_di_queue)
1037 {
1038 struct pmap_invl_gen *p, *pn;
1039 struct thread *td;
1040 uintptr_t nextl;
1041 bool first;
1042
1043 for (p = &pmap_invl_gen_head, first = true; p != NULL; p = pn,
1044 first = false) {
1045 nextl = (uintptr_t)atomic_load_ptr(&p->next);
1046 pn = (void *)(nextl & ~PMAP_INVL_GEN_NEXT_INVALID);
1047 td = first ? NULL : __containerof(p, struct thread,
1048 td_md.md_invl_gen);
1049 db_printf("gen %lu inv %d td %p tid %d\n", p->gen,
1050 (nextl & PMAP_INVL_GEN_NEXT_INVALID) != 0, td,
1051 td != NULL ? td->td_tid : -1);
1052 }
1053 }
1054 #endif
1055
1056 #ifdef PV_STATS
1057 static COUNTER_U64_DEFINE_EARLY(invl_wait);
1058 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, invl_wait,
1059 CTLFLAG_RD, &invl_wait,
1060 "Number of times DI invalidation blocked pmap_remove_all/write");
1061
1062 static COUNTER_U64_DEFINE_EARLY(invl_wait_slow);
1063 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, invl_wait_slow, CTLFLAG_RD,
1064 &invl_wait_slow, "Number of slow invalidation waits for lockless DI");
1065
1066 #endif
1067
1068 #ifdef NUMA
1069 static u_long *
pmap_delayed_invl_genp(vm_page_t m)1070 pmap_delayed_invl_genp(vm_page_t m)
1071 {
1072 vm_paddr_t pa;
1073 u_long *gen;
1074
1075 pa = VM_PAGE_TO_PHYS(m);
1076 if (__predict_false((pa) > pmap_last_pa))
1077 gen = &pv_dummy_large.pv_invl_gen;
1078 else
1079 gen = &(pa_to_pmdp(pa)->pv_invl_gen);
1080
1081 return (gen);
1082 }
1083 #else
1084 static u_long *
pmap_delayed_invl_genp(vm_page_t m)1085 pmap_delayed_invl_genp(vm_page_t m)
1086 {
1087
1088 return (&pv_invl_gen[pa_index(VM_PAGE_TO_PHYS(m)) % NPV_LIST_LOCKS]);
1089 }
1090 #endif
1091
1092 static void
pmap_delayed_invl_callout_func(void * arg __unused)1093 pmap_delayed_invl_callout_func(void *arg __unused)
1094 {
1095
1096 if (atomic_load_int(&pmap_invl_waiters) == 0)
1097 return;
1098 pmap_delayed_invl_finish_unblock(0);
1099 }
1100
1101 static void
pmap_delayed_invl_callout_init(void * arg __unused)1102 pmap_delayed_invl_callout_init(void *arg __unused)
1103 {
1104
1105 if (pmap_di_locked())
1106 return;
1107 callout_init(&pmap_invl_callout, 1);
1108 pmap_invl_callout_inited = true;
1109 }
1110 SYSINIT(pmap_di_callout, SI_SUB_CPU + 1, SI_ORDER_ANY,
1111 pmap_delayed_invl_callout_init, NULL);
1112
1113 /*
1114 * Ensure that all currently executing DI blocks, that need to flush
1115 * TLB for the given page m, actually flushed the TLB at the time the
1116 * function returned. If the page m has an empty PV list and we call
1117 * pmap_delayed_invl_wait(), upon its return we know that no CPU has a
1118 * valid mapping for the page m in either its page table or TLB.
1119 *
1120 * This function works by blocking until the global DI generation
1121 * number catches up with the generation number associated with the
1122 * given page m and its PV list. Since this function's callers
1123 * typically own an object lock and sometimes own a page lock, it
1124 * cannot sleep. Instead, it blocks on a turnstile to relinquish the
1125 * processor.
1126 */
1127 static void
pmap_delayed_invl_wait_l(vm_page_t m)1128 pmap_delayed_invl_wait_l(vm_page_t m)
1129 {
1130 u_long *m_gen;
1131 #ifdef PV_STATS
1132 bool accounted = false;
1133 #endif
1134
1135 m_gen = pmap_delayed_invl_genp(m);
1136 while (*m_gen > pmap_invl_gen) {
1137 #ifdef PV_STATS
1138 if (!accounted) {
1139 counter_u64_add(invl_wait, 1);
1140 accounted = true;
1141 }
1142 #endif
1143 pmap_delayed_invl_wait_block(m_gen, &pmap_invl_gen);
1144 }
1145 }
1146
1147 static void
pmap_delayed_invl_wait_u(vm_page_t m)1148 pmap_delayed_invl_wait_u(vm_page_t m)
1149 {
1150 u_long *m_gen;
1151 struct lock_delay_arg lda;
1152 bool fast;
1153
1154 fast = true;
1155 m_gen = pmap_delayed_invl_genp(m);
1156 lock_delay_arg_init(&lda, &di_delay);
1157 while (*m_gen > atomic_load_long(&pmap_invl_gen_head.gen)) {
1158 if (fast || !pmap_invl_callout_inited) {
1159 PV_STAT(counter_u64_add(invl_wait, 1));
1160 lock_delay(&lda);
1161 fast = false;
1162 } else {
1163 /*
1164 * The page's invalidation generation number
1165 * is still below the current thread's number.
1166 * Prepare to block so that we do not waste
1167 * CPU cycles or worse, suffer livelock.
1168 *
1169 * Since it is impossible to block without
1170 * racing with pmap_delayed_invl_finish_u(),
1171 * prepare for the race by incrementing
1172 * pmap_invl_waiters and arming a 1-tick
1173 * callout which will unblock us if we lose
1174 * the race.
1175 */
1176 atomic_add_int(&pmap_invl_waiters, 1);
1177
1178 /*
1179 * Re-check the current thread's invalidation
1180 * generation after incrementing
1181 * pmap_invl_waiters, so that there is no race
1182 * with pmap_delayed_invl_finish_u() setting
1183 * the page generation and checking
1184 * pmap_invl_waiters. The only race allowed
1185 * is for a missed unblock, which is handled
1186 * by the callout.
1187 */
1188 if (*m_gen >
1189 atomic_load_long(&pmap_invl_gen_head.gen)) {
1190 callout_reset(&pmap_invl_callout, 1,
1191 pmap_delayed_invl_callout_func, NULL);
1192 PV_STAT(counter_u64_add(invl_wait_slow, 1));
1193 pmap_delayed_invl_wait_block(m_gen,
1194 &pmap_invl_gen_head.gen);
1195 }
1196 atomic_add_int(&pmap_invl_waiters, -1);
1197 }
1198 }
1199 }
1200
1201 DEFINE_IFUNC(, void, pmap_thread_init_invl_gen, (struct thread *))
1202 {
1203
1204 return (pmap_di_locked() ? pmap_thread_init_invl_gen_l :
1205 pmap_thread_init_invl_gen_u);
1206 }
1207
1208 DEFINE_IFUNC(static, void, pmap_delayed_invl_start, (void))
1209 {
1210
1211 return (pmap_di_locked() ? pmap_delayed_invl_start_l :
1212 pmap_delayed_invl_start_u);
1213 }
1214
1215 DEFINE_IFUNC(static, void, pmap_delayed_invl_finish, (void))
1216 {
1217
1218 return (pmap_di_locked() ? pmap_delayed_invl_finish_l :
1219 pmap_delayed_invl_finish_u);
1220 }
1221
1222 DEFINE_IFUNC(static, void, pmap_delayed_invl_wait, (vm_page_t))
1223 {
1224
1225 return (pmap_di_locked() ? pmap_delayed_invl_wait_l :
1226 pmap_delayed_invl_wait_u);
1227 }
1228
1229 /*
1230 * Mark the page m's PV list as participating in the current thread's
1231 * DI block. Any threads concurrently using m's PV list to remove or
1232 * restrict all mappings to m will wait for the current thread's DI
1233 * block to complete before proceeding.
1234 *
1235 * The function works by setting the DI generation number for m's PV
1236 * list to at least the DI generation number of the current thread.
1237 * This forces a caller of pmap_delayed_invl_wait() to block until
1238 * current thread calls pmap_delayed_invl_finish().
1239 */
1240 static void
pmap_delayed_invl_page(vm_page_t m)1241 pmap_delayed_invl_page(vm_page_t m)
1242 {
1243 u_long gen, *m_gen;
1244
1245 rw_assert(VM_PAGE_TO_PV_LIST_LOCK(m), RA_WLOCKED);
1246 gen = curthread->td_md.md_invl_gen.gen;
1247 if (gen == 0)
1248 return;
1249 m_gen = pmap_delayed_invl_genp(m);
1250 if (*m_gen < gen)
1251 *m_gen = gen;
1252 }
1253
1254 /*
1255 * Crashdump maps.
1256 */
1257 static caddr_t crashdumpmap;
1258
1259 /*
1260 * Internal flags for pmap_enter()'s helper functions.
1261 */
1262 #define PMAP_ENTER_NORECLAIM 0x1000000 /* Don't reclaim PV entries. */
1263 #define PMAP_ENTER_NOREPLACE 0x2000000 /* Don't replace mappings. */
1264
1265 /*
1266 * Internal flags for pmap_mapdev_internal() and
1267 * pmap_change_props_locked().
1268 */
1269 #define MAPDEV_FLUSHCACHE 0x00000001 /* Flush cache after mapping. */
1270 #define MAPDEV_SETATTR 0x00000002 /* Modify existing attrs. */
1271 #define MAPDEV_ASSERTVALID 0x00000004 /* Assert mapping validity. */
1272
1273 TAILQ_HEAD(pv_chunklist, pv_chunk);
1274
1275 static void free_pv_chunk(struct pv_chunk *pc);
1276 static void free_pv_chunk_batch(struct pv_chunklist *batch);
1277 static void free_pv_entry(pmap_t pmap, pv_entry_t pv);
1278 static pv_entry_t get_pv_entry(pmap_t pmap, struct rwlock **lockp);
1279 static int popcnt_pc_map_pq(uint64_t *map);
1280 static vm_page_t reclaim_pv_chunk(pmap_t locked_pmap, struct rwlock **lockp);
1281 static void reserve_pv_entries(pmap_t pmap, int needed,
1282 struct rwlock **lockp);
1283 static void pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
1284 struct rwlock **lockp);
1285 static bool pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, pd_entry_t pde,
1286 u_int flags, struct rwlock **lockp);
1287 #if VM_NRESERVLEVEL > 0
1288 static void pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
1289 struct rwlock **lockp);
1290 #endif
1291 static void pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va);
1292 static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap,
1293 vm_offset_t va);
1294
1295 static void pmap_abort_ptp(pmap_t pmap, vm_offset_t va, vm_page_t mpte);
1296 static int pmap_change_props_locked(vm_offset_t va, vm_size_t size,
1297 vm_prot_t prot, int mode, int flags);
1298 static boolean_t pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va);
1299 static boolean_t pmap_demote_pde_locked(pmap_t pmap, pd_entry_t *pde,
1300 vm_offset_t va, struct rwlock **lockp);
1301 static boolean_t pmap_demote_pdpe(pmap_t pmap, pdp_entry_t *pdpe,
1302 vm_offset_t va);
1303 static int pmap_enter_2mpage(pmap_t pmap, vm_offset_t va, vm_page_t m,
1304 vm_prot_t prot, struct rwlock **lockp);
1305 static int pmap_enter_pde(pmap_t pmap, vm_offset_t va, pd_entry_t newpde,
1306 u_int flags, vm_page_t m, struct rwlock **lockp);
1307 static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va,
1308 vm_page_t m, vm_prot_t prot, vm_page_t mpte, struct rwlock **lockp);
1309 static void pmap_fill_ptp(pt_entry_t *firstpte, pt_entry_t newpte);
1310 static int pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte, bool promoted,
1311 bool allpte_PG_A_set);
1312 static void pmap_invalidate_cache_range_selfsnoop(vm_offset_t sva,
1313 vm_offset_t eva);
1314 static void pmap_invalidate_cache_range_all(vm_offset_t sva,
1315 vm_offset_t eva);
1316 static void pmap_invalidate_pde_page(pmap_t pmap, vm_offset_t va,
1317 pd_entry_t pde);
1318 static void pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode);
1319 static vm_page_t pmap_large_map_getptp_unlocked(void);
1320 static vm_paddr_t pmap_large_map_kextract(vm_offset_t va);
1321 #if VM_NRESERVLEVEL > 0
1322 static bool pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va,
1323 vm_page_t mpte, struct rwlock **lockp);
1324 #endif
1325 static boolean_t pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva,
1326 vm_prot_t prot);
1327 static void pmap_pte_props(pt_entry_t *pte, u_long bits, u_long mask);
1328 static void pmap_pti_add_kva_locked(vm_offset_t sva, vm_offset_t eva,
1329 bool exec);
1330 static pdp_entry_t *pmap_pti_pdpe(vm_offset_t va);
1331 static pd_entry_t *pmap_pti_pde(vm_offset_t va);
1332 static void pmap_pti_wire_pte(void *pte);
1333 static int pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva,
1334 struct spglist *free, struct rwlock **lockp);
1335 static int pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t sva,
1336 pd_entry_t ptepde, struct spglist *free, struct rwlock **lockp);
1337 static vm_page_t pmap_remove_pt_page(pmap_t pmap, vm_offset_t va);
1338 static void pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde,
1339 struct spglist *free);
1340 static bool pmap_remove_ptes(pmap_t pmap, vm_offset_t sva, vm_offset_t eva,
1341 pd_entry_t *pde, struct spglist *free,
1342 struct rwlock **lockp);
1343 static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va,
1344 vm_page_t m, struct rwlock **lockp);
1345 static void pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde,
1346 pd_entry_t newpde);
1347 static void pmap_update_pde_invalidate(pmap_t, vm_offset_t va, pd_entry_t pde);
1348
1349 static pd_entry_t *pmap_alloc_pde(pmap_t pmap, vm_offset_t va, vm_page_t *pdpgp,
1350 struct rwlock **lockp);
1351 static vm_page_t pmap_allocpte_alloc(pmap_t pmap, vm_pindex_t ptepindex,
1352 struct rwlock **lockp, vm_offset_t va);
1353 static vm_page_t pmap_allocpte_nosleep(pmap_t pmap, vm_pindex_t ptepindex,
1354 struct rwlock **lockp, vm_offset_t va);
1355 static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va,
1356 struct rwlock **lockp);
1357
1358 static void _pmap_unwire_ptp(pmap_t pmap, vm_offset_t va, vm_page_t m,
1359 struct spglist *free);
1360 static int pmap_unuse_pt(pmap_t, vm_offset_t, pd_entry_t, struct spglist *);
1361
1362 static vm_page_t pmap_alloc_pt_page(pmap_t, vm_pindex_t, int);
1363 static void pmap_free_pt_page(pmap_t, vm_page_t, bool);
1364
1365 /********************/
1366 /* Inline functions */
1367 /********************/
1368
1369 /*
1370 * Return a non-clipped indexes for a given VA, which are page table
1371 * pages indexes at the corresponding level.
1372 */
1373 static __inline vm_pindex_t
pmap_pde_pindex(vm_offset_t va)1374 pmap_pde_pindex(vm_offset_t va)
1375 {
1376 return (va >> PDRSHIFT);
1377 }
1378
1379 static __inline vm_pindex_t
pmap_pdpe_pindex(vm_offset_t va)1380 pmap_pdpe_pindex(vm_offset_t va)
1381 {
1382 return (NUPDE + (va >> PDPSHIFT));
1383 }
1384
1385 static __inline vm_pindex_t
pmap_pml4e_pindex(vm_offset_t va)1386 pmap_pml4e_pindex(vm_offset_t va)
1387 {
1388 return (NUPDE + NUPDPE + (va >> PML4SHIFT));
1389 }
1390
1391 static __inline vm_pindex_t
pmap_pml5e_pindex(vm_offset_t va)1392 pmap_pml5e_pindex(vm_offset_t va)
1393 {
1394 return (NUPDE + NUPDPE + NUPML4E + (va >> PML5SHIFT));
1395 }
1396
1397 static __inline pml4_entry_t *
pmap_pml5e(pmap_t pmap,vm_offset_t va)1398 pmap_pml5e(pmap_t pmap, vm_offset_t va)
1399 {
1400
1401 MPASS(pmap_is_la57(pmap));
1402 return (&pmap->pm_pmltop[pmap_pml5e_index(va)]);
1403 }
1404
1405 static __inline pml4_entry_t *
pmap_pml5e_u(pmap_t pmap,vm_offset_t va)1406 pmap_pml5e_u(pmap_t pmap, vm_offset_t va)
1407 {
1408
1409 MPASS(pmap_is_la57(pmap));
1410 return (&pmap->pm_pmltopu[pmap_pml5e_index(va)]);
1411 }
1412
1413 static __inline pml4_entry_t *
pmap_pml5e_to_pml4e(pml5_entry_t * pml5e,vm_offset_t va)1414 pmap_pml5e_to_pml4e(pml5_entry_t *pml5e, vm_offset_t va)
1415 {
1416 pml4_entry_t *pml4e;
1417
1418 /* XXX MPASS(pmap_is_la57(pmap); */
1419 pml4e = (pml4_entry_t *)PHYS_TO_DMAP(*pml5e & PG_FRAME);
1420 return (&pml4e[pmap_pml4e_index(va)]);
1421 }
1422
1423 /* Return a pointer to the PML4 slot that corresponds to a VA */
1424 static __inline pml4_entry_t *
pmap_pml4e(pmap_t pmap,vm_offset_t va)1425 pmap_pml4e(pmap_t pmap, vm_offset_t va)
1426 {
1427 pml5_entry_t *pml5e;
1428 pml4_entry_t *pml4e;
1429 pt_entry_t PG_V;
1430
1431 if (pmap_is_la57(pmap)) {
1432 pml5e = pmap_pml5e(pmap, va);
1433 PG_V = pmap_valid_bit(pmap);
1434 if ((*pml5e & PG_V) == 0)
1435 return (NULL);
1436 pml4e = (pml4_entry_t *)PHYS_TO_DMAP(*pml5e & PG_FRAME);
1437 } else {
1438 pml4e = pmap->pm_pmltop;
1439 }
1440 return (&pml4e[pmap_pml4e_index(va)]);
1441 }
1442
1443 static __inline pml4_entry_t *
pmap_pml4e_u(pmap_t pmap,vm_offset_t va)1444 pmap_pml4e_u(pmap_t pmap, vm_offset_t va)
1445 {
1446 MPASS(!pmap_is_la57(pmap));
1447 return (&pmap->pm_pmltopu[pmap_pml4e_index(va)]);
1448 }
1449
1450 /* Return a pointer to the PDP slot that corresponds to a VA */
1451 static __inline pdp_entry_t *
pmap_pml4e_to_pdpe(pml4_entry_t * pml4e,vm_offset_t va)1452 pmap_pml4e_to_pdpe(pml4_entry_t *pml4e, vm_offset_t va)
1453 {
1454 pdp_entry_t *pdpe;
1455
1456 pdpe = (pdp_entry_t *)PHYS_TO_DMAP(*pml4e & PG_FRAME);
1457 return (&pdpe[pmap_pdpe_index(va)]);
1458 }
1459
1460 /* Return a pointer to the PDP slot that corresponds to a VA */
1461 static __inline pdp_entry_t *
pmap_pdpe(pmap_t pmap,vm_offset_t va)1462 pmap_pdpe(pmap_t pmap, vm_offset_t va)
1463 {
1464 pml4_entry_t *pml4e;
1465 pt_entry_t PG_V;
1466
1467 PG_V = pmap_valid_bit(pmap);
1468 pml4e = pmap_pml4e(pmap, va);
1469 if (pml4e == NULL || (*pml4e & PG_V) == 0)
1470 return (NULL);
1471 return (pmap_pml4e_to_pdpe(pml4e, va));
1472 }
1473
1474 /* Return a pointer to the PD slot that corresponds to a VA */
1475 static __inline pd_entry_t *
pmap_pdpe_to_pde(pdp_entry_t * pdpe,vm_offset_t va)1476 pmap_pdpe_to_pde(pdp_entry_t *pdpe, vm_offset_t va)
1477 {
1478 pd_entry_t *pde;
1479
1480 KASSERT((*pdpe & PG_PS) == 0,
1481 ("%s: pdpe %#lx is a leaf", __func__, *pdpe));
1482 pde = (pd_entry_t *)PHYS_TO_DMAP(*pdpe & PG_FRAME);
1483 return (&pde[pmap_pde_index(va)]);
1484 }
1485
1486 /* Return a pointer to the PD slot that corresponds to a VA */
1487 static __inline pd_entry_t *
pmap_pde(pmap_t pmap,vm_offset_t va)1488 pmap_pde(pmap_t pmap, vm_offset_t va)
1489 {
1490 pdp_entry_t *pdpe;
1491 pt_entry_t PG_V;
1492
1493 PG_V = pmap_valid_bit(pmap);
1494 pdpe = pmap_pdpe(pmap, va);
1495 if (pdpe == NULL || (*pdpe & PG_V) == 0)
1496 return (NULL);
1497 KASSERT((*pdpe & PG_PS) == 0,
1498 ("pmap_pde for 1G page, pmap %p va %#lx", pmap, va));
1499 return (pmap_pdpe_to_pde(pdpe, va));
1500 }
1501
1502 /* Return a pointer to the PT slot that corresponds to a VA */
1503 static __inline pt_entry_t *
pmap_pde_to_pte(pd_entry_t * pde,vm_offset_t va)1504 pmap_pde_to_pte(pd_entry_t *pde, vm_offset_t va)
1505 {
1506 pt_entry_t *pte;
1507
1508 KASSERT((*pde & PG_PS) == 0,
1509 ("%s: pde %#lx is a leaf", __func__, *pde));
1510 pte = (pt_entry_t *)PHYS_TO_DMAP(*pde & PG_FRAME);
1511 return (&pte[pmap_pte_index(va)]);
1512 }
1513
1514 /* Return a pointer to the PT slot that corresponds to a VA */
1515 static __inline pt_entry_t *
pmap_pte(pmap_t pmap,vm_offset_t va)1516 pmap_pte(pmap_t pmap, vm_offset_t va)
1517 {
1518 pd_entry_t *pde;
1519 pt_entry_t PG_V;
1520
1521 PG_V = pmap_valid_bit(pmap);
1522 pde = pmap_pde(pmap, va);
1523 if (pde == NULL || (*pde & PG_V) == 0)
1524 return (NULL);
1525 if ((*pde & PG_PS) != 0) /* compat with i386 pmap_pte() */
1526 return ((pt_entry_t *)pde);
1527 return (pmap_pde_to_pte(pde, va));
1528 }
1529
1530 static __inline void
pmap_resident_count_adj(pmap_t pmap,int count)1531 pmap_resident_count_adj(pmap_t pmap, int count)
1532 {
1533
1534 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1535 KASSERT(pmap->pm_stats.resident_count + count >= 0,
1536 ("pmap %p resident count underflow %ld %d", pmap,
1537 pmap->pm_stats.resident_count, count));
1538 pmap->pm_stats.resident_count += count;
1539 }
1540
1541 static __inline void
pmap_pt_page_count_pinit(pmap_t pmap,int count)1542 pmap_pt_page_count_pinit(pmap_t pmap, int count)
1543 {
1544 KASSERT(pmap->pm_stats.resident_count + count >= 0,
1545 ("pmap %p resident count underflow %ld %d", pmap,
1546 pmap->pm_stats.resident_count, count));
1547 pmap->pm_stats.resident_count += count;
1548 }
1549
1550 static __inline void
pmap_pt_page_count_adj(pmap_t pmap,int count)1551 pmap_pt_page_count_adj(pmap_t pmap, int count)
1552 {
1553 if (pmap == kernel_pmap)
1554 counter_u64_add(kernel_pt_page_count, count);
1555 else {
1556 if (pmap != NULL)
1557 pmap_resident_count_adj(pmap, count);
1558 counter_u64_add(user_pt_page_count, count);
1559 }
1560 }
1561
1562 pt_entry_t vtoptem __read_mostly = ((1ul << (NPTEPGSHIFT + NPDEPGSHIFT +
1563 NPDPEPGSHIFT + NPML4EPGSHIFT)) - 1) << 3;
1564 vm_offset_t PTmap __read_mostly = (vm_offset_t)P4Tmap;
1565
1566 pt_entry_t *
vtopte(vm_offset_t va)1567 vtopte(vm_offset_t va)
1568 {
1569 KASSERT(va >= VM_MAXUSER_ADDRESS, ("vtopte on a uva/gpa 0x%0lx", va));
1570
1571 return ((pt_entry_t *)(PTmap + ((va >> (PAGE_SHIFT - 3)) & vtoptem)));
1572 }
1573
1574 pd_entry_t vtopdem __read_mostly = ((1ul << (NPDEPGSHIFT + NPDPEPGSHIFT +
1575 NPML4EPGSHIFT)) - 1) << 3;
1576 vm_offset_t PDmap __read_mostly = (vm_offset_t)P4Dmap;
1577
1578 static __inline pd_entry_t *
vtopde(vm_offset_t va)1579 vtopde(vm_offset_t va)
1580 {
1581 KASSERT(va >= VM_MAXUSER_ADDRESS, ("vtopde on a uva/gpa 0x%0lx", va));
1582
1583 return ((pt_entry_t *)(PDmap + ((va >> (PDRSHIFT - 3)) & vtopdem)));
1584 }
1585
1586 static u_int64_t
allocpages(vm_paddr_t * firstaddr,int n)1587 allocpages(vm_paddr_t *firstaddr, int n)
1588 {
1589 u_int64_t ret;
1590
1591 ret = *firstaddr;
1592 bzero((void *)ret, n * PAGE_SIZE);
1593 *firstaddr += n * PAGE_SIZE;
1594 return (ret);
1595 }
1596
1597 CTASSERT(powerof2(NDMPML4E));
1598
1599 /* number of kernel PDP slots */
1600 #define NKPDPE(ptpgs) howmany(ptpgs, NPDEPG)
1601
1602 static void
nkpt_init(vm_paddr_t addr)1603 nkpt_init(vm_paddr_t addr)
1604 {
1605 int pt_pages;
1606
1607 #ifdef NKPT
1608 pt_pages = NKPT;
1609 #else
1610 pt_pages = howmany(addr - kernphys, NBPDR) + 1; /* +1 for 2M hole @0 */
1611 pt_pages += NKPDPE(pt_pages);
1612
1613 /*
1614 * Add some slop beyond the bare minimum required for bootstrapping
1615 * the kernel.
1616 *
1617 * This is quite important when allocating KVA for kernel modules.
1618 * The modules are required to be linked in the negative 2GB of
1619 * the address space. If we run out of KVA in this region then
1620 * pmap_growkernel() will need to allocate page table pages to map
1621 * the entire 512GB of KVA space which is an unnecessary tax on
1622 * physical memory.
1623 *
1624 * Secondly, device memory mapped as part of setting up the low-
1625 * level console(s) is taken from KVA, starting at virtual_avail.
1626 * This is because cninit() is called after pmap_bootstrap() but
1627 * before vm_mem_init() and pmap_init(). 20MB for a frame buffer
1628 * is not uncommon.
1629 */
1630 pt_pages += 32; /* 64MB additional slop. */
1631 #endif
1632 nkpt = pt_pages;
1633 }
1634
1635 /*
1636 * Returns the proper write/execute permission for a physical page that is
1637 * part of the initial boot allocations.
1638 *
1639 * If the page has kernel text, it is marked as read-only. If the page has
1640 * kernel read-only data, it is marked as read-only/not-executable. If the
1641 * page has only read-write data, it is marked as read-write/not-executable.
1642 * If the page is below/above the kernel range, it is marked as read-write.
1643 *
1644 * This function operates on 2M pages, since we map the kernel space that
1645 * way.
1646 */
1647 static inline pt_entry_t
bootaddr_rwx(vm_paddr_t pa)1648 bootaddr_rwx(vm_paddr_t pa)
1649 {
1650 /*
1651 * The kernel is loaded at a 2MB-aligned address, and memory below that
1652 * need not be executable. The .bss section is padded to a 2MB
1653 * boundary, so memory following the kernel need not be executable
1654 * either. Preloaded kernel modules have their mapping permissions
1655 * fixed up by the linker.
1656 */
1657 if (pa < trunc_2mpage(kernphys + btext - KERNSTART) ||
1658 pa >= trunc_2mpage(kernphys + _end - KERNSTART))
1659 return (X86_PG_RW | pg_nx);
1660
1661 /*
1662 * The linker should ensure that the read-only and read-write
1663 * portions don't share the same 2M page, so this shouldn't
1664 * impact read-only data. However, in any case, any page with
1665 * read-write data needs to be read-write.
1666 */
1667 if (pa >= trunc_2mpage(kernphys + brwsection - KERNSTART))
1668 return (X86_PG_RW | pg_nx);
1669
1670 /*
1671 * Mark any 2M page containing kernel text as read-only. Mark
1672 * other pages with read-only data as read-only and not executable.
1673 * (It is likely a small portion of the read-only data section will
1674 * be marked as read-only, but executable. This should be acceptable
1675 * since the read-only protection will keep the data from changing.)
1676 * Note that fixups to the .text section will still work until we
1677 * set CR0.WP.
1678 */
1679 if (pa < round_2mpage(kernphys + etext - KERNSTART))
1680 return (0);
1681 return (pg_nx);
1682 }
1683
1684 static void
create_pagetables(vm_paddr_t * firstaddr)1685 create_pagetables(vm_paddr_t *firstaddr)
1686 {
1687 pd_entry_t *pd_p;
1688 pdp_entry_t *pdp_p;
1689 pml4_entry_t *p4_p;
1690 uint64_t DMPDkernphys;
1691 vm_paddr_t pax;
1692 #ifdef KASAN
1693 pt_entry_t *pt_p;
1694 uint64_t KASANPDphys, KASANPTphys, KASANphys;
1695 vm_offset_t kasankernbase;
1696 int kasankpdpi, kasankpdi, nkasanpte;
1697 #endif
1698 int i, j, ndm1g, nkpdpe, nkdmpde;
1699
1700 TSENTER();
1701 /* Allocate page table pages for the direct map */
1702 ndmpdp = howmany(ptoa(Maxmem), NBPDP);
1703 if (ndmpdp < 4) /* Minimum 4GB of dirmap */
1704 ndmpdp = 4;
1705 ndmpdpphys = howmany(ndmpdp, NPDPEPG);
1706 if (ndmpdpphys > NDMPML4E) {
1707 /*
1708 * Each NDMPML4E allows 512 GB, so limit to that,
1709 * and then readjust ndmpdp and ndmpdpphys.
1710 */
1711 printf("NDMPML4E limits system to %d GB\n", NDMPML4E * 512);
1712 Maxmem = atop(NDMPML4E * NBPML4);
1713 ndmpdpphys = NDMPML4E;
1714 ndmpdp = NDMPML4E * NPDEPG;
1715 }
1716 DMPDPphys = allocpages(firstaddr, ndmpdpphys);
1717 ndm1g = 0;
1718 if ((amd_feature & AMDID_PAGE1GB) != 0) {
1719 /*
1720 * Calculate the number of 1G pages that will fully fit in
1721 * Maxmem.
1722 */
1723 ndm1g = ptoa(Maxmem) >> PDPSHIFT;
1724
1725 /*
1726 * Allocate 2M pages for the kernel. These will be used in
1727 * place of the one or more 1G pages from ndm1g that maps
1728 * kernel memory into DMAP.
1729 */
1730 nkdmpde = howmany((vm_offset_t)brwsection - KERNSTART +
1731 kernphys - rounddown2(kernphys, NBPDP), NBPDP);
1732 DMPDkernphys = allocpages(firstaddr, nkdmpde);
1733 }
1734 if (ndm1g < ndmpdp)
1735 DMPDphys = allocpages(firstaddr, ndmpdp - ndm1g);
1736 dmaplimit = (vm_paddr_t)ndmpdp << PDPSHIFT;
1737
1738 /* Allocate pages. */
1739 KPML4phys = allocpages(firstaddr, 1);
1740 KPDPphys = allocpages(firstaddr, NKPML4E);
1741 #ifdef KASAN
1742 KASANPDPphys = allocpages(firstaddr, NKASANPML4E);
1743 KASANPDphys = allocpages(firstaddr, 1);
1744 #endif
1745 #ifdef KMSAN
1746 /*
1747 * The KMSAN shadow maps are initially left unpopulated, since there is
1748 * no need to shadow memory above KERNBASE.
1749 */
1750 KMSANSHADPDPphys = allocpages(firstaddr, NKMSANSHADPML4E);
1751 KMSANORIGPDPphys = allocpages(firstaddr, NKMSANORIGPML4E);
1752 #endif
1753
1754 /*
1755 * Allocate the initial number of kernel page table pages required to
1756 * bootstrap. We defer this until after all memory-size dependent
1757 * allocations are done (e.g. direct map), so that we don't have to
1758 * build in too much slop in our estimate.
1759 *
1760 * Note that when NKPML4E > 1, we have an empty page underneath
1761 * all but the KPML4I'th one, so we need NKPML4E-1 extra (zeroed)
1762 * pages. (pmap_enter requires a PD page to exist for each KPML4E.)
1763 */
1764 nkpt_init(*firstaddr);
1765 nkpdpe = NKPDPE(nkpt);
1766
1767 KPTphys = allocpages(firstaddr, nkpt);
1768 KPDphys = allocpages(firstaddr, nkpdpe);
1769
1770 #ifdef KASAN
1771 nkasanpte = howmany(nkpt, KASAN_SHADOW_SCALE);
1772 KASANPTphys = allocpages(firstaddr, nkasanpte);
1773 KASANphys = allocpages(firstaddr, nkasanpte * NPTEPG);
1774 #endif
1775
1776 /*
1777 * Connect the zero-filled PT pages to their PD entries. This
1778 * implicitly maps the PT pages at their correct locations within
1779 * the PTmap.
1780 */
1781 pd_p = (pd_entry_t *)KPDphys;
1782 for (i = 0; i < nkpt; i++)
1783 pd_p[i] = (KPTphys + ptoa(i)) | X86_PG_RW | X86_PG_V;
1784
1785 /*
1786 * Map from start of the kernel in physical memory (staging
1787 * area) to the end of loader preallocated memory using 2MB
1788 * pages. This replaces some of the PD entries created above.
1789 * For compatibility, identity map 2M at the start.
1790 */
1791 pd_p[0] = X86_PG_V | PG_PS | pg_g | X86_PG_M | X86_PG_A |
1792 X86_PG_RW | pg_nx;
1793 for (i = 1, pax = kernphys; pax < KERNend; i++, pax += NBPDR) {
1794 /* Preset PG_M and PG_A because demotion expects it. */
1795 pd_p[i] = pax | X86_PG_V | PG_PS | pg_g | X86_PG_M |
1796 X86_PG_A | bootaddr_rwx(pax);
1797 }
1798
1799 /*
1800 * Because we map the physical blocks in 2M pages, adjust firstaddr
1801 * to record the physical blocks we've actually mapped into kernel
1802 * virtual address space.
1803 */
1804 if (*firstaddr < round_2mpage(KERNend))
1805 *firstaddr = round_2mpage(KERNend);
1806
1807 /* And connect up the PD to the PDP (leaving room for L4 pages) */
1808 pdp_p = (pdp_entry_t *)(KPDPphys + ptoa(KPML4I - KPML4BASE));
1809 for (i = 0; i < nkpdpe; i++)
1810 pdp_p[i + KPDPI] = (KPDphys + ptoa(i)) | X86_PG_RW | X86_PG_V;
1811
1812 #ifdef KASAN
1813 kasankernbase = kasan_md_addr_to_shad(KERNBASE);
1814 kasankpdpi = pmap_pdpe_index(kasankernbase);
1815 kasankpdi = pmap_pde_index(kasankernbase);
1816
1817 pdp_p = (pdp_entry_t *)KASANPDPphys;
1818 pdp_p[kasankpdpi] = (KASANPDphys | X86_PG_RW | X86_PG_V | pg_nx);
1819
1820 pd_p = (pd_entry_t *)KASANPDphys;
1821 for (i = 0; i < nkasanpte; i++)
1822 pd_p[i + kasankpdi] = (KASANPTphys + ptoa(i)) | X86_PG_RW |
1823 X86_PG_V | pg_nx;
1824
1825 pt_p = (pt_entry_t *)KASANPTphys;
1826 for (i = 0; i < nkasanpte * NPTEPG; i++)
1827 pt_p[i] = (KASANphys + ptoa(i)) | X86_PG_RW | X86_PG_V |
1828 X86_PG_M | X86_PG_A | pg_nx;
1829 #endif
1830
1831 /*
1832 * Now, set up the direct map region using 2MB and/or 1GB pages. If
1833 * the end of physical memory is not aligned to a 1GB page boundary,
1834 * then the residual physical memory is mapped with 2MB pages. Later,
1835 * if pmap_mapdev{_attr}() uses the direct map for non-write-back
1836 * memory, pmap_change_attr() will demote any 2MB or 1GB page mappings
1837 * that are partially used.
1838 */
1839 pd_p = (pd_entry_t *)DMPDphys;
1840 for (i = NPDEPG * ndm1g, j = 0; i < NPDEPG * ndmpdp; i++, j++) {
1841 pd_p[j] = (vm_paddr_t)i << PDRSHIFT;
1842 /* Preset PG_M and PG_A because demotion expects it. */
1843 pd_p[j] |= X86_PG_RW | X86_PG_V | PG_PS | pg_g |
1844 X86_PG_M | X86_PG_A | pg_nx;
1845 }
1846 pdp_p = (pdp_entry_t *)DMPDPphys;
1847 for (i = 0; i < ndm1g; i++) {
1848 pdp_p[i] = (vm_paddr_t)i << PDPSHIFT;
1849 /* Preset PG_M and PG_A because demotion expects it. */
1850 pdp_p[i] |= X86_PG_RW | X86_PG_V | PG_PS | pg_g |
1851 X86_PG_M | X86_PG_A | pg_nx;
1852 }
1853 for (j = 0; i < ndmpdp; i++, j++) {
1854 pdp_p[i] = DMPDphys + ptoa(j);
1855 pdp_p[i] |= X86_PG_RW | X86_PG_V | pg_nx;
1856 }
1857
1858 /*
1859 * Instead of using a 1G page for the memory containing the kernel,
1860 * use 2M pages with read-only and no-execute permissions. (If using 1G
1861 * pages, this will partially overwrite the PDPEs above.)
1862 */
1863 if (ndm1g > 0) {
1864 pd_p = (pd_entry_t *)DMPDkernphys;
1865 for (i = 0, pax = rounddown2(kernphys, NBPDP);
1866 i < NPDEPG * nkdmpde; i++, pax += NBPDR) {
1867 pd_p[i] = pax | X86_PG_V | PG_PS | pg_g | X86_PG_M |
1868 X86_PG_A | pg_nx | bootaddr_rwx(pax);
1869 }
1870 j = rounddown2(kernphys, NBPDP) >> PDPSHIFT;
1871 for (i = 0; i < nkdmpde; i++) {
1872 pdp_p[i + j] = (DMPDkernphys + ptoa(i)) |
1873 X86_PG_RW | X86_PG_V | pg_nx;
1874 }
1875 }
1876
1877 /* And recursively map PML4 to itself in order to get PTmap */
1878 p4_p = (pml4_entry_t *)KPML4phys;
1879 p4_p[PML4PML4I] = KPML4phys;
1880 p4_p[PML4PML4I] |= X86_PG_RW | X86_PG_V | pg_nx;
1881
1882 #ifdef KASAN
1883 /* Connect the KASAN shadow map slots up to the PML4. */
1884 for (i = 0; i < NKASANPML4E; i++) {
1885 p4_p[KASANPML4I + i] = KASANPDPphys + ptoa(i);
1886 p4_p[KASANPML4I + i] |= X86_PG_RW | X86_PG_V | pg_nx;
1887 }
1888 #endif
1889
1890 #ifdef KMSAN
1891 /* Connect the KMSAN shadow map slots up to the PML4. */
1892 for (i = 0; i < NKMSANSHADPML4E; i++) {
1893 p4_p[KMSANSHADPML4I + i] = KMSANSHADPDPphys + ptoa(i);
1894 p4_p[KMSANSHADPML4I + i] |= X86_PG_RW | X86_PG_V | pg_nx;
1895 }
1896
1897 /* Connect the KMSAN origin map slots up to the PML4. */
1898 for (i = 0; i < NKMSANORIGPML4E; i++) {
1899 p4_p[KMSANORIGPML4I + i] = KMSANORIGPDPphys + ptoa(i);
1900 p4_p[KMSANORIGPML4I + i] |= X86_PG_RW | X86_PG_V | pg_nx;
1901 }
1902 #endif
1903
1904 /* Connect the Direct Map slots up to the PML4. */
1905 for (i = 0; i < ndmpdpphys; i++) {
1906 p4_p[DMPML4I + i] = DMPDPphys + ptoa(i);
1907 p4_p[DMPML4I + i] |= X86_PG_RW | X86_PG_V | pg_nx;
1908 }
1909
1910 /* Connect the KVA slots up to the PML4 */
1911 for (i = 0; i < NKPML4E; i++) {
1912 p4_p[KPML4BASE + i] = KPDPphys + ptoa(i);
1913 p4_p[KPML4BASE + i] |= X86_PG_RW | X86_PG_V;
1914 }
1915
1916 kernel_pml4 = (pml4_entry_t *)PHYS_TO_DMAP(KPML4phys);
1917 TSEXIT();
1918 }
1919
1920 /*
1921 * Bootstrap the system enough to run with virtual memory.
1922 *
1923 * On amd64 this is called after mapping has already been enabled
1924 * and just syncs the pmap module with what has already been done.
1925 * [We can't call it easily with mapping off since the kernel is not
1926 * mapped with PA == VA, hence we would have to relocate every address
1927 * from the linked base (virtual) address "KERNBASE" to the actual
1928 * (physical) address starting relative to 0]
1929 */
1930 void
pmap_bootstrap(vm_paddr_t * firstaddr)1931 pmap_bootstrap(vm_paddr_t *firstaddr)
1932 {
1933 vm_offset_t va;
1934 pt_entry_t *pte, *pcpu_pte;
1935 struct region_descriptor r_gdt;
1936 uint64_t cr4, pcpu0_phys;
1937 u_long res;
1938 int i;
1939
1940 TSENTER();
1941 KERNend = *firstaddr;
1942 res = atop(KERNend - (vm_paddr_t)kernphys);
1943
1944 if (!pti)
1945 pg_g = X86_PG_G;
1946
1947 /*
1948 * Create an initial set of page tables to run the kernel in.
1949 */
1950 create_pagetables(firstaddr);
1951
1952 pcpu0_phys = allocpages(firstaddr, 1);
1953
1954 /*
1955 * Add a physical memory segment (vm_phys_seg) corresponding to the
1956 * preallocated kernel page table pages so that vm_page structures
1957 * representing these pages will be created. The vm_page structures
1958 * are required for promotion of the corresponding kernel virtual
1959 * addresses to superpage mappings.
1960 */
1961 vm_phys_early_add_seg(KPTphys, KPTphys + ptoa(nkpt));
1962
1963 /*
1964 * Account for the virtual addresses mapped by create_pagetables().
1965 */
1966 virtual_avail = (vm_offset_t)KERNSTART + round_2mpage(KERNend -
1967 (vm_paddr_t)kernphys);
1968 virtual_end = VM_MAX_KERNEL_ADDRESS;
1969
1970 /*
1971 * Enable PG_G global pages, then switch to the kernel page
1972 * table from the bootstrap page table. After the switch, it
1973 * is possible to enable SMEP and SMAP since PG_U bits are
1974 * correct now.
1975 */
1976 cr4 = rcr4();
1977 cr4 |= CR4_PGE;
1978 load_cr4(cr4);
1979 load_cr3(KPML4phys);
1980 if (cpu_stdext_feature & CPUID_STDEXT_SMEP)
1981 cr4 |= CR4_SMEP;
1982 if (cpu_stdext_feature & CPUID_STDEXT_SMAP)
1983 cr4 |= CR4_SMAP;
1984 load_cr4(cr4);
1985
1986 /*
1987 * Initialize the kernel pmap (which is statically allocated).
1988 * Count bootstrap data as being resident in case any of this data is
1989 * later unmapped (using pmap_remove()) and freed.
1990 */
1991 PMAP_LOCK_INIT(kernel_pmap);
1992 kernel_pmap->pm_pmltop = kernel_pml4;
1993 kernel_pmap->pm_cr3 = KPML4phys;
1994 kernel_pmap->pm_ucr3 = PMAP_NO_CR3;
1995 TAILQ_INIT(&kernel_pmap->pm_pvchunk);
1996 kernel_pmap->pm_stats.resident_count = res;
1997 vm_radix_init(&kernel_pmap->pm_root);
1998 kernel_pmap->pm_flags = pmap_flags;
1999 if ((cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0) {
2000 rangeset_init(&kernel_pmap->pm_pkru, pkru_dup_range,
2001 pkru_free_range, kernel_pmap, M_NOWAIT);
2002 }
2003
2004 /*
2005 * The kernel pmap is always active on all CPUs. Once CPUs are
2006 * enumerated, the mask will be set equal to all_cpus.
2007 */
2008 CPU_FILL(&kernel_pmap->pm_active);
2009
2010 /*
2011 * Initialize the TLB invalidations generation number lock.
2012 */
2013 mtx_init(&invl_gen_mtx, "invlgn", NULL, MTX_DEF);
2014
2015 /*
2016 * Reserve some special page table entries/VA space for temporary
2017 * mapping of pages.
2018 */
2019 #define SYSMAP(c, p, v, n) \
2020 v = (c)va; va += ((n)*PAGE_SIZE); p = pte; pte += (n);
2021
2022 va = virtual_avail;
2023 pte = vtopte(va);
2024
2025 /*
2026 * Crashdump maps. The first page is reused as CMAP1 for the
2027 * memory test.
2028 */
2029 SYSMAP(caddr_t, CMAP1, crashdumpmap, MAXDUMPPGS)
2030 CADDR1 = crashdumpmap;
2031
2032 SYSMAP(struct pcpu *, pcpu_pte, __pcpu, MAXCPU);
2033 virtual_avail = va;
2034
2035 /*
2036 * Map the BSP PCPU now, the rest of the PCPUs are mapped by
2037 * amd64_mp_alloc_pcpu()/start_all_aps() when we know the
2038 * number of CPUs and NUMA affinity.
2039 */
2040 pcpu_pte[0] = pcpu0_phys | X86_PG_V | X86_PG_RW | pg_g | pg_nx |
2041 X86_PG_M | X86_PG_A;
2042 for (i = 1; i < MAXCPU; i++)
2043 pcpu_pte[i] = 0;
2044
2045 /*
2046 * Re-initialize PCPU area for BSP after switching.
2047 * Make hardware use gdt and common_tss from the new PCPU.
2048 */
2049 STAILQ_INIT(&cpuhead);
2050 wrmsr(MSR_GSBASE, (uint64_t)&__pcpu[0]);
2051 pcpu_init(&__pcpu[0], 0, sizeof(struct pcpu));
2052 amd64_bsp_pcpu_init1(&__pcpu[0]);
2053 amd64_bsp_ist_init(&__pcpu[0]);
2054 __pcpu[0].pc_common_tss.tss_iobase = sizeof(struct amd64tss) +
2055 IOPERM_BITMAP_SIZE;
2056 memcpy(__pcpu[0].pc_gdt, temp_bsp_pcpu.pc_gdt, NGDT *
2057 sizeof(struct user_segment_descriptor));
2058 gdt_segs[GPROC0_SEL].ssd_base = (uintptr_t)&__pcpu[0].pc_common_tss;
2059 ssdtosyssd(&gdt_segs[GPROC0_SEL],
2060 (struct system_segment_descriptor *)&__pcpu[0].pc_gdt[GPROC0_SEL]);
2061 r_gdt.rd_limit = NGDT * sizeof(struct user_segment_descriptor) - 1;
2062 r_gdt.rd_base = (long)__pcpu[0].pc_gdt;
2063 lgdt(&r_gdt);
2064 wrmsr(MSR_GSBASE, (uint64_t)&__pcpu[0]);
2065 ltr(GSEL(GPROC0_SEL, SEL_KPL));
2066 __pcpu[0].pc_dynamic = temp_bsp_pcpu.pc_dynamic;
2067 __pcpu[0].pc_acpi_id = temp_bsp_pcpu.pc_acpi_id;
2068
2069 /*
2070 * Initialize the PAT MSR.
2071 * pmap_init_pat() clears and sets CR4_PGE, which, as a
2072 * side-effect, invalidates stale PG_G TLB entries that might
2073 * have been created in our pre-boot environment.
2074 */
2075 pmap_init_pat();
2076
2077 /* Initialize TLB Context Id. */
2078 if (pmap_pcid_enabled) {
2079 kernel_pmap->pm_pcidp = (void *)(uintptr_t)
2080 offsetof(struct pcpu, pc_kpmap_store);
2081
2082 PCPU_SET(kpmap_store.pm_pcid, PMAP_PCID_KERN);
2083 PCPU_SET(kpmap_store.pm_gen, 1);
2084
2085 /*
2086 * PMAP_PCID_KERN + 1 is used for initialization of
2087 * proc0 pmap. The pmap' pcid state might be used by
2088 * EFIRT entry before first context switch, so it
2089 * needs to be valid.
2090 */
2091 PCPU_SET(pcid_next, PMAP_PCID_KERN + 2);
2092 PCPU_SET(pcid_gen, 1);
2093
2094 /*
2095 * pcpu area for APs is zeroed during AP startup.
2096 * pc_pcid_next and pc_pcid_gen are initialized by AP
2097 * during pcpu setup.
2098 */
2099 load_cr4(rcr4() | CR4_PCIDE);
2100 }
2101 TSEXIT();
2102 }
2103
2104 /*
2105 * Setup the PAT MSR.
2106 */
2107 void
pmap_init_pat(void)2108 pmap_init_pat(void)
2109 {
2110 uint64_t pat_msr;
2111 u_long cr0, cr4;
2112 int i;
2113
2114 /* Bail if this CPU doesn't implement PAT. */
2115 if ((cpu_feature & CPUID_PAT) == 0)
2116 panic("no PAT??");
2117
2118 /* Set default PAT index table. */
2119 for (i = 0; i < PAT_INDEX_SIZE; i++)
2120 pat_index[i] = -1;
2121 pat_index[PAT_WRITE_BACK] = 0;
2122 pat_index[PAT_WRITE_THROUGH] = 1;
2123 pat_index[PAT_UNCACHEABLE] = 3;
2124 pat_index[PAT_WRITE_COMBINING] = 6;
2125 pat_index[PAT_WRITE_PROTECTED] = 5;
2126 pat_index[PAT_UNCACHED] = 2;
2127
2128 /*
2129 * Initialize default PAT entries.
2130 * Leave the indices 0-3 at the default of WB, WT, UC-, and UC.
2131 * Program 5 and 6 as WP and WC.
2132 *
2133 * Leave 4 and 7 as WB and UC. Note that a recursive page table
2134 * mapping for a 2M page uses a PAT value with the bit 3 set due
2135 * to its overload with PG_PS.
2136 */
2137 pat_msr = PAT_VALUE(0, PAT_WRITE_BACK) |
2138 PAT_VALUE(1, PAT_WRITE_THROUGH) |
2139 PAT_VALUE(2, PAT_UNCACHED) |
2140 PAT_VALUE(3, PAT_UNCACHEABLE) |
2141 PAT_VALUE(4, PAT_WRITE_BACK) |
2142 PAT_VALUE(5, PAT_WRITE_PROTECTED) |
2143 PAT_VALUE(6, PAT_WRITE_COMBINING) |
2144 PAT_VALUE(7, PAT_UNCACHEABLE);
2145
2146 /* Disable PGE. */
2147 cr4 = rcr4();
2148 load_cr4(cr4 & ~CR4_PGE);
2149
2150 /* Disable caches (CD = 1, NW = 0). */
2151 cr0 = rcr0();
2152 load_cr0((cr0 & ~CR0_NW) | CR0_CD);
2153
2154 /* Flushes caches and TLBs. */
2155 wbinvd();
2156 invltlb();
2157
2158 /* Update PAT and index table. */
2159 wrmsr(MSR_PAT, pat_msr);
2160
2161 /* Flush caches and TLBs again. */
2162 wbinvd();
2163 invltlb();
2164
2165 /* Restore caches and PGE. */
2166 load_cr0(cr0);
2167 load_cr4(cr4);
2168 }
2169
2170 vm_page_t
pmap_page_alloc_below_4g(bool zeroed)2171 pmap_page_alloc_below_4g(bool zeroed)
2172 {
2173 return (vm_page_alloc_noobj_contig((zeroed ? VM_ALLOC_ZERO : 0),
2174 1, 0, (1ULL << 32), PAGE_SIZE, 0, VM_MEMATTR_DEFAULT));
2175 }
2176
2177 extern const char la57_trampoline[], la57_trampoline_gdt_desc[],
2178 la57_trampoline_gdt[], la57_trampoline_end[];
2179
2180 static void
pmap_bootstrap_la57(void * arg __unused)2181 pmap_bootstrap_la57(void *arg __unused)
2182 {
2183 char *v_code;
2184 pml5_entry_t *v_pml5;
2185 pml4_entry_t *v_pml4;
2186 pdp_entry_t *v_pdp;
2187 pd_entry_t *v_pd;
2188 pt_entry_t *v_pt;
2189 vm_page_t m_code, m_pml4, m_pdp, m_pd, m_pt, m_pml5;
2190 void (*la57_tramp)(uint64_t pml5);
2191 struct region_descriptor r_gdt;
2192
2193 if ((cpu_stdext_feature2 & CPUID_STDEXT2_LA57) == 0)
2194 return;
2195 TUNABLE_INT_FETCH("vm.pmap.la57", &la57);
2196 if (!la57)
2197 return;
2198
2199 r_gdt.rd_limit = NGDT * sizeof(struct user_segment_descriptor) - 1;
2200 r_gdt.rd_base = (long)__pcpu[0].pc_gdt;
2201
2202 m_code = pmap_page_alloc_below_4g(true);
2203 v_code = (char *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_code));
2204 m_pml5 = pmap_page_alloc_below_4g(true);
2205 KPML5phys = VM_PAGE_TO_PHYS(m_pml5);
2206 v_pml5 = (pml5_entry_t *)PHYS_TO_DMAP(KPML5phys);
2207 m_pml4 = pmap_page_alloc_below_4g(true);
2208 v_pml4 = (pdp_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_pml4));
2209 m_pdp = pmap_page_alloc_below_4g(true);
2210 v_pdp = (pdp_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_pdp));
2211 m_pd = pmap_page_alloc_below_4g(true);
2212 v_pd = (pdp_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_pd));
2213 m_pt = pmap_page_alloc_below_4g(true);
2214 v_pt = (pt_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m_pt));
2215
2216 /*
2217 * Map m_code 1:1, it appears below 4G in KVA due to physical
2218 * address being below 4G. Since kernel KVA is in upper half,
2219 * the pml4e should be zero and free for temporary use.
2220 */
2221 kernel_pmap->pm_pmltop[pmap_pml4e_index(VM_PAGE_TO_PHYS(m_code))] =
2222 VM_PAGE_TO_PHYS(m_pdp) | X86_PG_V | X86_PG_RW | X86_PG_A |
2223 X86_PG_M;
2224 v_pdp[pmap_pdpe_index(VM_PAGE_TO_PHYS(m_code))] =
2225 VM_PAGE_TO_PHYS(m_pd) | X86_PG_V | X86_PG_RW | X86_PG_A |
2226 X86_PG_M;
2227 v_pd[pmap_pde_index(VM_PAGE_TO_PHYS(m_code))] =
2228 VM_PAGE_TO_PHYS(m_pt) | X86_PG_V | X86_PG_RW | X86_PG_A |
2229 X86_PG_M;
2230 v_pt[pmap_pte_index(VM_PAGE_TO_PHYS(m_code))] =
2231 VM_PAGE_TO_PHYS(m_code) | X86_PG_V | X86_PG_RW | X86_PG_A |
2232 X86_PG_M;
2233
2234 /*
2235 * Add pml5 entry at top of KVA pointing to existing pml4 table,
2236 * entering all existing kernel mappings into level 5 table.
2237 */
2238 v_pml5[pmap_pml5e_index(UPT_MAX_ADDRESS)] = KPML4phys | X86_PG_V |
2239 X86_PG_RW | X86_PG_A | X86_PG_M;
2240
2241 /*
2242 * Add pml5 entry for 1:1 trampoline mapping after LA57 is turned on.
2243 */
2244 v_pml5[pmap_pml5e_index(VM_PAGE_TO_PHYS(m_code))] =
2245 VM_PAGE_TO_PHYS(m_pml4) | X86_PG_V | X86_PG_RW | X86_PG_A |
2246 X86_PG_M;
2247 v_pml4[pmap_pml4e_index(VM_PAGE_TO_PHYS(m_code))] =
2248 VM_PAGE_TO_PHYS(m_pdp) | X86_PG_V | X86_PG_RW | X86_PG_A |
2249 X86_PG_M;
2250
2251 /*
2252 * Copy and call the 48->57 trampoline, hope we return there, alive.
2253 */
2254 bcopy(la57_trampoline, v_code, la57_trampoline_end - la57_trampoline);
2255 *(u_long *)(v_code + 2 + (la57_trampoline_gdt_desc - la57_trampoline)) =
2256 la57_trampoline_gdt - la57_trampoline + VM_PAGE_TO_PHYS(m_code);
2257 la57_tramp = (void (*)(uint64_t))VM_PAGE_TO_PHYS(m_code);
2258 pmap_invalidate_all(kernel_pmap);
2259 if (bootverbose) {
2260 printf("entering LA57 trampoline at %#lx\n",
2261 (vm_offset_t)la57_tramp);
2262 }
2263 la57_tramp(KPML5phys);
2264
2265 /*
2266 * gdt was necessary reset, switch back to our gdt.
2267 */
2268 lgdt(&r_gdt);
2269 wrmsr(MSR_GSBASE, (uint64_t)&__pcpu[0]);
2270 load_ds(_udatasel);
2271 load_es(_udatasel);
2272 load_fs(_ufssel);
2273 ssdtosyssd(&gdt_segs[GPROC0_SEL],
2274 (struct system_segment_descriptor *)&__pcpu[0].pc_gdt[GPROC0_SEL]);
2275 ltr(GSEL(GPROC0_SEL, SEL_KPL));
2276 lidt(&r_idt);
2277
2278 if (bootverbose)
2279 printf("LA57 trampoline returned, CR4 %#lx\n", rcr4());
2280
2281 /*
2282 * Now unmap the trampoline, and free the pages.
2283 * Clear pml5 entry used for 1:1 trampoline mapping.
2284 */
2285 pte_clear(&v_pml5[pmap_pml5e_index(VM_PAGE_TO_PHYS(m_code))]);
2286 invlpg((vm_offset_t)v_code);
2287 vm_page_free(m_code);
2288 vm_page_free(m_pdp);
2289 vm_page_free(m_pd);
2290 vm_page_free(m_pt);
2291
2292 /*
2293 * Recursively map PML5 to itself in order to get PTmap and
2294 * PDmap.
2295 */
2296 v_pml5[PML5PML5I] = KPML5phys | X86_PG_RW | X86_PG_V | pg_nx;
2297
2298 vtoptem = ((1ul << (NPTEPGSHIFT + NPDEPGSHIFT + NPDPEPGSHIFT +
2299 NPML4EPGSHIFT + NPML5EPGSHIFT)) - 1) << 3;
2300 PTmap = (vm_offset_t)P5Tmap;
2301 vtopdem = ((1ul << (NPDEPGSHIFT + NPDPEPGSHIFT +
2302 NPML4EPGSHIFT + NPML5EPGSHIFT)) - 1) << 3;
2303 PDmap = (vm_offset_t)P5Dmap;
2304
2305 kernel_pmap->pm_cr3 = KPML5phys;
2306 kernel_pmap->pm_pmltop = v_pml5;
2307 pmap_pt_page_count_adj(kernel_pmap, 1);
2308 }
2309 SYSINIT(la57, SI_SUB_KMEM, SI_ORDER_ANY, pmap_bootstrap_la57, NULL);
2310
2311 /*
2312 * Initialize a vm_page's machine-dependent fields.
2313 */
2314 void
pmap_page_init(vm_page_t m)2315 pmap_page_init(vm_page_t m)
2316 {
2317
2318 TAILQ_INIT(&m->md.pv_list);
2319 m->md.pat_mode = PAT_WRITE_BACK;
2320 }
2321
2322 static int pmap_allow_2m_x_ept;
2323 SYSCTL_INT(_vm_pmap, OID_AUTO, allow_2m_x_ept, CTLFLAG_RWTUN | CTLFLAG_NOFETCH,
2324 &pmap_allow_2m_x_ept, 0,
2325 "Allow executable superpage mappings in EPT");
2326
2327 void
pmap_allow_2m_x_ept_recalculate(void)2328 pmap_allow_2m_x_ept_recalculate(void)
2329 {
2330 /*
2331 * SKL002, SKL012S. Since the EPT format is only used by
2332 * Intel CPUs, the vendor check is merely a formality.
2333 */
2334 if (!(cpu_vendor_id != CPU_VENDOR_INTEL ||
2335 (cpu_ia32_arch_caps & IA32_ARCH_CAP_IF_PSCHANGE_MC_NO) != 0 ||
2336 (CPUID_TO_FAMILY(cpu_id) == 0x6 &&
2337 (CPUID_TO_MODEL(cpu_id) == 0x26 || /* Atoms */
2338 CPUID_TO_MODEL(cpu_id) == 0x27 ||
2339 CPUID_TO_MODEL(cpu_id) == 0x35 ||
2340 CPUID_TO_MODEL(cpu_id) == 0x36 ||
2341 CPUID_TO_MODEL(cpu_id) == 0x37 ||
2342 CPUID_TO_MODEL(cpu_id) == 0x86 ||
2343 CPUID_TO_MODEL(cpu_id) == 0x1c ||
2344 CPUID_TO_MODEL(cpu_id) == 0x4a ||
2345 CPUID_TO_MODEL(cpu_id) == 0x4c ||
2346 CPUID_TO_MODEL(cpu_id) == 0x4d ||
2347 CPUID_TO_MODEL(cpu_id) == 0x5a ||
2348 CPUID_TO_MODEL(cpu_id) == 0x5c ||
2349 CPUID_TO_MODEL(cpu_id) == 0x5d ||
2350 CPUID_TO_MODEL(cpu_id) == 0x5f ||
2351 CPUID_TO_MODEL(cpu_id) == 0x6e ||
2352 CPUID_TO_MODEL(cpu_id) == 0x7a ||
2353 CPUID_TO_MODEL(cpu_id) == 0x57 || /* Knights */
2354 CPUID_TO_MODEL(cpu_id) == 0x85))))
2355 pmap_allow_2m_x_ept = 1;
2356 #ifndef BURN_BRIDGES
2357 TUNABLE_INT_FETCH("hw.allow_2m_x_ept", &pmap_allow_2m_x_ept);
2358 #endif
2359 TUNABLE_INT_FETCH("vm.pmap.allow_2m_x_ept", &pmap_allow_2m_x_ept);
2360 }
2361
2362 static bool
pmap_allow_2m_x_page(pmap_t pmap,bool executable)2363 pmap_allow_2m_x_page(pmap_t pmap, bool executable)
2364 {
2365
2366 return (pmap->pm_type != PT_EPT || !executable ||
2367 !pmap_allow_2m_x_ept);
2368 }
2369
2370 #ifdef NUMA
2371 static void
pmap_init_pv_table(void)2372 pmap_init_pv_table(void)
2373 {
2374 struct pmap_large_md_page *pvd;
2375 vm_size_t s;
2376 long start, end, highest, pv_npg;
2377 int domain, i, j, pages;
2378
2379 /*
2380 * For correctness we depend on the size being evenly divisible into a
2381 * page. As a tradeoff between performance and total memory use, the
2382 * entry is 64 bytes (aka one cacheline) in size. Not being smaller
2383 * avoids false-sharing, but not being 128 bytes potentially allows for
2384 * avoidable traffic due to adjacent cacheline prefetcher.
2385 *
2386 * Assert the size so that accidental changes fail to compile.
2387 */
2388 CTASSERT((sizeof(*pvd) == 64));
2389
2390 /*
2391 * Calculate the size of the array.
2392 */
2393 pmap_last_pa = vm_phys_segs[vm_phys_nsegs - 1].end;
2394 pv_npg = howmany(pmap_last_pa, NBPDR);
2395 s = (vm_size_t)pv_npg * sizeof(struct pmap_large_md_page);
2396 s = round_page(s);
2397 pv_table = (struct pmap_large_md_page *)kva_alloc(s);
2398 if (pv_table == NULL)
2399 panic("%s: kva_alloc failed\n", __func__);
2400
2401 /*
2402 * Iterate physical segments to allocate space for respective pages.
2403 */
2404 highest = -1;
2405 s = 0;
2406 for (i = 0; i < vm_phys_nsegs; i++) {
2407 end = vm_phys_segs[i].end / NBPDR;
2408 domain = vm_phys_segs[i].domain;
2409
2410 if (highest >= end)
2411 continue;
2412
2413 start = highest + 1;
2414 pvd = &pv_table[start];
2415
2416 pages = end - start + 1;
2417 s = round_page(pages * sizeof(*pvd));
2418 highest = start + (s / sizeof(*pvd)) - 1;
2419
2420 for (j = 0; j < s; j += PAGE_SIZE) {
2421 vm_page_t m = vm_page_alloc_noobj_domain(domain, 0);
2422 if (m == NULL)
2423 panic("failed to allocate PV table page");
2424 pmap_qenter((vm_offset_t)pvd + j, &m, 1);
2425 }
2426
2427 for (j = 0; j < s / sizeof(*pvd); j++) {
2428 rw_init_flags(&pvd->pv_lock, "pmap pv list", RW_NEW);
2429 TAILQ_INIT(&pvd->pv_page.pv_list);
2430 pvd->pv_page.pv_gen = 0;
2431 pvd->pv_page.pat_mode = 0;
2432 pvd->pv_invl_gen = 0;
2433 pvd++;
2434 }
2435 }
2436 pvd = &pv_dummy_large;
2437 rw_init_flags(&pvd->pv_lock, "pmap pv list dummy", RW_NEW);
2438 TAILQ_INIT(&pvd->pv_page.pv_list);
2439 pvd->pv_page.pv_gen = 0;
2440 pvd->pv_page.pat_mode = 0;
2441 pvd->pv_invl_gen = 0;
2442 }
2443 #else
2444 static void
pmap_init_pv_table(void)2445 pmap_init_pv_table(void)
2446 {
2447 vm_size_t s;
2448 long i, pv_npg;
2449
2450 /*
2451 * Initialize the pool of pv list locks.
2452 */
2453 for (i = 0; i < NPV_LIST_LOCKS; i++)
2454 rw_init(&pv_list_locks[i], "pmap pv list");
2455
2456 /*
2457 * Calculate the size of the pv head table for superpages.
2458 */
2459 pv_npg = howmany(vm_phys_segs[vm_phys_nsegs - 1].end, NBPDR);
2460
2461 /*
2462 * Allocate memory for the pv head table for superpages.
2463 */
2464 s = (vm_size_t)pv_npg * sizeof(struct md_page);
2465 s = round_page(s);
2466 pv_table = kmem_malloc(s, M_WAITOK | M_ZERO);
2467 for (i = 0; i < pv_npg; i++)
2468 TAILQ_INIT(&pv_table[i].pv_list);
2469 TAILQ_INIT(&pv_dummy.pv_list);
2470 }
2471 #endif
2472
2473 /*
2474 * Initialize the pmap module.
2475 *
2476 * Called by vm_mem_init(), to initialize any structures that the pmap
2477 * system needs to map virtual memory.
2478 */
2479 void
pmap_init(void)2480 pmap_init(void)
2481 {
2482 struct pmap_preinit_mapping *ppim;
2483 vm_page_t m, mpte;
2484 int error, i, ret, skz63;
2485
2486 /* L1TF, reserve page @0 unconditionally */
2487 vm_page_blacklist_add(0, bootverbose);
2488
2489 /* Detect bare-metal Skylake Server and Skylake-X. */
2490 if (vm_guest == VM_GUEST_NO && cpu_vendor_id == CPU_VENDOR_INTEL &&
2491 CPUID_TO_FAMILY(cpu_id) == 0x6 && CPUID_TO_MODEL(cpu_id) == 0x55) {
2492 /*
2493 * Skylake-X errata SKZ63. Processor May Hang When
2494 * Executing Code In an HLE Transaction Region between
2495 * 40000000H and 403FFFFFH.
2496 *
2497 * Mark the pages in the range as preallocated. It
2498 * seems to be impossible to distinguish between
2499 * Skylake Server and Skylake X.
2500 */
2501 skz63 = 1;
2502 TUNABLE_INT_FETCH("hw.skz63_enable", &skz63);
2503 if (skz63 != 0) {
2504 if (bootverbose)
2505 printf("SKZ63: skipping 4M RAM starting "
2506 "at physical 1G\n");
2507 for (i = 0; i < atop(0x400000); i++) {
2508 ret = vm_page_blacklist_add(0x40000000 +
2509 ptoa(i), FALSE);
2510 if (!ret && bootverbose)
2511 printf("page at %#lx already used\n",
2512 0x40000000 + ptoa(i));
2513 }
2514 }
2515 }
2516
2517 /* IFU */
2518 pmap_allow_2m_x_ept_recalculate();
2519
2520 /*
2521 * Initialize the vm page array entries for the kernel pmap's
2522 * page table pages.
2523 */
2524 PMAP_LOCK(kernel_pmap);
2525 for (i = 0; i < nkpt; i++) {
2526 mpte = PHYS_TO_VM_PAGE(KPTphys + (i << PAGE_SHIFT));
2527 KASSERT(mpte >= vm_page_array &&
2528 mpte < &vm_page_array[vm_page_array_size],
2529 ("pmap_init: page table page is out of range"));
2530 mpte->pindex = pmap_pde_pindex(KERNBASE) + i;
2531 mpte->phys_addr = KPTphys + (i << PAGE_SHIFT);
2532 mpte->ref_count = 1;
2533
2534 /*
2535 * Collect the page table pages that were replaced by a 2MB
2536 * page in create_pagetables(). They are zero filled.
2537 */
2538 if ((i == 0 ||
2539 kernphys + ((vm_paddr_t)(i - 1) << PDRSHIFT) < KERNend) &&
2540 pmap_insert_pt_page(kernel_pmap, mpte, false, false))
2541 panic("pmap_init: pmap_insert_pt_page failed");
2542 }
2543 PMAP_UNLOCK(kernel_pmap);
2544 vm_wire_add(nkpt);
2545
2546 /*
2547 * If the kernel is running on a virtual machine, then it must assume
2548 * that MCA is enabled by the hypervisor. Moreover, the kernel must
2549 * be prepared for the hypervisor changing the vendor and family that
2550 * are reported by CPUID. Consequently, the workaround for AMD Family
2551 * 10h Erratum 383 is enabled if the processor's feature set does not
2552 * include at least one feature that is only supported by older Intel
2553 * or newer AMD processors.
2554 */
2555 if (vm_guest != VM_GUEST_NO && (cpu_feature & CPUID_SS) == 0 &&
2556 (cpu_feature2 & (CPUID2_SSSE3 | CPUID2_SSE41 | CPUID2_AESNI |
2557 CPUID2_AVX | CPUID2_XSAVE)) == 0 && (amd_feature2 & (AMDID2_XOP |
2558 AMDID2_FMA4)) == 0)
2559 workaround_erratum383 = 1;
2560
2561 /*
2562 * Are large page mappings enabled?
2563 */
2564 TUNABLE_INT_FETCH("vm.pmap.pg_ps_enabled", &pg_ps_enabled);
2565 if (pg_ps_enabled) {
2566 KASSERT(MAXPAGESIZES > 1 && pagesizes[1] == 0,
2567 ("pmap_init: can't assign to pagesizes[1]"));
2568 pagesizes[1] = NBPDR;
2569 if ((amd_feature & AMDID_PAGE1GB) != 0) {
2570 KASSERT(MAXPAGESIZES > 2 && pagesizes[2] == 0,
2571 ("pmap_init: can't assign to pagesizes[2]"));
2572 pagesizes[2] = NBPDP;
2573 }
2574 }
2575
2576 /*
2577 * Initialize pv chunk lists.
2578 */
2579 for (i = 0; i < PMAP_MEMDOM; i++) {
2580 mtx_init(&pv_chunks[i].pvc_lock, "pmap pv chunk list", NULL, MTX_DEF);
2581 TAILQ_INIT(&pv_chunks[i].pvc_list);
2582 }
2583 pmap_init_pv_table();
2584
2585 pmap_initialized = 1;
2586 for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) {
2587 ppim = pmap_preinit_mapping + i;
2588 if (ppim->va == 0)
2589 continue;
2590 /* Make the direct map consistent */
2591 if (ppim->pa < dmaplimit && ppim->pa + ppim->sz <= dmaplimit) {
2592 (void)pmap_change_attr(PHYS_TO_DMAP(ppim->pa),
2593 ppim->sz, ppim->mode);
2594 }
2595 if (!bootverbose)
2596 continue;
2597 printf("PPIM %u: PA=%#lx, VA=%#lx, size=%#lx, mode=%#x\n", i,
2598 ppim->pa, ppim->va, ppim->sz, ppim->mode);
2599 }
2600
2601 mtx_init(&qframe_mtx, "qfrmlk", NULL, MTX_SPIN);
2602 error = vmem_alloc(kernel_arena, PAGE_SIZE, M_BESTFIT | M_WAITOK,
2603 (vmem_addr_t *)&qframe);
2604 if (error != 0)
2605 panic("qframe allocation failed");
2606
2607 lm_ents = 8;
2608 TUNABLE_INT_FETCH("vm.pmap.large_map_pml4_entries", &lm_ents);
2609 if (lm_ents > LMEPML4I - LMSPML4I + 1)
2610 lm_ents = LMEPML4I - LMSPML4I + 1;
2611 #ifdef KMSAN
2612 if (lm_ents > KMSANORIGPML4I - LMSPML4I) {
2613 printf(
2614 "pmap: shrinking large map for KMSAN (%d slots to %ld slots)\n",
2615 lm_ents, KMSANORIGPML4I - LMSPML4I);
2616 lm_ents = KMSANORIGPML4I - LMSPML4I;
2617 }
2618 #endif
2619 if (bootverbose)
2620 printf("pmap: large map %u PML4 slots (%lu GB)\n",
2621 lm_ents, (u_long)lm_ents * (NBPML4 / 1024 / 1024 / 1024));
2622 if (lm_ents != 0) {
2623 large_vmem = vmem_create("large", LARGEMAP_MIN_ADDRESS,
2624 (vmem_size_t)lm_ents * NBPML4, PAGE_SIZE, 0, M_WAITOK);
2625 if (large_vmem == NULL) {
2626 printf("pmap: cannot create large map\n");
2627 lm_ents = 0;
2628 }
2629 for (i = 0; i < lm_ents; i++) {
2630 m = pmap_large_map_getptp_unlocked();
2631 /* XXXKIB la57 */
2632 kernel_pml4[LMSPML4I + i] = X86_PG_V |
2633 X86_PG_RW | X86_PG_A | X86_PG_M | pg_nx |
2634 VM_PAGE_TO_PHYS(m);
2635 }
2636 }
2637 }
2638
2639 SYSCTL_UINT(_vm_pmap, OID_AUTO, large_map_pml4_entries,
2640 CTLFLAG_RDTUN | CTLFLAG_NOFETCH, &lm_ents, 0,
2641 "Maximum number of PML4 entries for use by large map (tunable). "
2642 "Each entry corresponds to 512GB of address space.");
2643
2644 static SYSCTL_NODE(_vm_pmap, OID_AUTO, pde, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
2645 "2MB page mapping counters");
2646
2647 static COUNTER_U64_DEFINE_EARLY(pmap_pde_demotions);
2648 SYSCTL_COUNTER_U64(_vm_pmap_pde, OID_AUTO, demotions,
2649 CTLFLAG_RD, &pmap_pde_demotions, "2MB page demotions");
2650
2651 static COUNTER_U64_DEFINE_EARLY(pmap_pde_mappings);
2652 SYSCTL_COUNTER_U64(_vm_pmap_pde, OID_AUTO, mappings, CTLFLAG_RD,
2653 &pmap_pde_mappings, "2MB page mappings");
2654
2655 static COUNTER_U64_DEFINE_EARLY(pmap_pde_p_failures);
2656 SYSCTL_COUNTER_U64(_vm_pmap_pde, OID_AUTO, p_failures, CTLFLAG_RD,
2657 &pmap_pde_p_failures, "2MB page promotion failures");
2658
2659 static COUNTER_U64_DEFINE_EARLY(pmap_pde_promotions);
2660 SYSCTL_COUNTER_U64(_vm_pmap_pde, OID_AUTO, promotions, CTLFLAG_RD,
2661 &pmap_pde_promotions, "2MB page promotions");
2662
2663 static SYSCTL_NODE(_vm_pmap, OID_AUTO, pdpe, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
2664 "1GB page mapping counters");
2665
2666 static COUNTER_U64_DEFINE_EARLY(pmap_pdpe_demotions);
2667 SYSCTL_COUNTER_U64(_vm_pmap_pdpe, OID_AUTO, demotions, CTLFLAG_RD,
2668 &pmap_pdpe_demotions, "1GB page demotions");
2669
2670 /***************************************************
2671 * Low level helper routines.....
2672 ***************************************************/
2673
2674 static pt_entry_t
pmap_swap_pat(pmap_t pmap,pt_entry_t entry)2675 pmap_swap_pat(pmap_t pmap, pt_entry_t entry)
2676 {
2677 int x86_pat_bits = X86_PG_PTE_PAT | X86_PG_PDE_PAT;
2678
2679 switch (pmap->pm_type) {
2680 case PT_X86:
2681 case PT_RVI:
2682 /* Verify that both PAT bits are not set at the same time */
2683 KASSERT((entry & x86_pat_bits) != x86_pat_bits,
2684 ("Invalid PAT bits in entry %#lx", entry));
2685
2686 /* Swap the PAT bits if one of them is set */
2687 if ((entry & x86_pat_bits) != 0)
2688 entry ^= x86_pat_bits;
2689 break;
2690 case PT_EPT:
2691 /*
2692 * Nothing to do - the memory attributes are represented
2693 * the same way for regular pages and superpages.
2694 */
2695 break;
2696 default:
2697 panic("pmap_switch_pat_bits: bad pm_type %d", pmap->pm_type);
2698 }
2699
2700 return (entry);
2701 }
2702
2703 boolean_t
pmap_is_valid_memattr(pmap_t pmap __unused,vm_memattr_t mode)2704 pmap_is_valid_memattr(pmap_t pmap __unused, vm_memattr_t mode)
2705 {
2706
2707 return (mode >= 0 && mode < PAT_INDEX_SIZE &&
2708 pat_index[(int)mode] >= 0);
2709 }
2710
2711 /*
2712 * Determine the appropriate bits to set in a PTE or PDE for a specified
2713 * caching mode.
2714 */
2715 int
pmap_cache_bits(pmap_t pmap,int mode,boolean_t is_pde)2716 pmap_cache_bits(pmap_t pmap, int mode, boolean_t is_pde)
2717 {
2718 int cache_bits, pat_flag, pat_idx;
2719
2720 if (!pmap_is_valid_memattr(pmap, mode))
2721 panic("Unknown caching mode %d\n", mode);
2722
2723 switch (pmap->pm_type) {
2724 case PT_X86:
2725 case PT_RVI:
2726 /* The PAT bit is different for PTE's and PDE's. */
2727 pat_flag = is_pde ? X86_PG_PDE_PAT : X86_PG_PTE_PAT;
2728
2729 /* Map the caching mode to a PAT index. */
2730 pat_idx = pat_index[mode];
2731
2732 /* Map the 3-bit index value into the PAT, PCD, and PWT bits. */
2733 cache_bits = 0;
2734 if (pat_idx & 0x4)
2735 cache_bits |= pat_flag;
2736 if (pat_idx & 0x2)
2737 cache_bits |= PG_NC_PCD;
2738 if (pat_idx & 0x1)
2739 cache_bits |= PG_NC_PWT;
2740 break;
2741
2742 case PT_EPT:
2743 cache_bits = EPT_PG_IGNORE_PAT | EPT_PG_MEMORY_TYPE(mode);
2744 break;
2745
2746 default:
2747 panic("unsupported pmap type %d", pmap->pm_type);
2748 }
2749
2750 return (cache_bits);
2751 }
2752
2753 static int
pmap_cache_mask(pmap_t pmap,boolean_t is_pde)2754 pmap_cache_mask(pmap_t pmap, boolean_t is_pde)
2755 {
2756 int mask;
2757
2758 switch (pmap->pm_type) {
2759 case PT_X86:
2760 case PT_RVI:
2761 mask = is_pde ? X86_PG_PDE_CACHE : X86_PG_PTE_CACHE;
2762 break;
2763 case PT_EPT:
2764 mask = EPT_PG_IGNORE_PAT | EPT_PG_MEMORY_TYPE(0x7);
2765 break;
2766 default:
2767 panic("pmap_cache_mask: invalid pm_type %d", pmap->pm_type);
2768 }
2769
2770 return (mask);
2771 }
2772
2773 static int
pmap_pat_index(pmap_t pmap,pt_entry_t pte,bool is_pde)2774 pmap_pat_index(pmap_t pmap, pt_entry_t pte, bool is_pde)
2775 {
2776 int pat_flag, pat_idx;
2777
2778 pat_idx = 0;
2779 switch (pmap->pm_type) {
2780 case PT_X86:
2781 case PT_RVI:
2782 /* The PAT bit is different for PTE's and PDE's. */
2783 pat_flag = is_pde ? X86_PG_PDE_PAT : X86_PG_PTE_PAT;
2784
2785 if ((pte & pat_flag) != 0)
2786 pat_idx |= 0x4;
2787 if ((pte & PG_NC_PCD) != 0)
2788 pat_idx |= 0x2;
2789 if ((pte & PG_NC_PWT) != 0)
2790 pat_idx |= 0x1;
2791 break;
2792 case PT_EPT:
2793 if ((pte & EPT_PG_IGNORE_PAT) != 0)
2794 panic("EPT PTE %#lx has no PAT memory type", pte);
2795 pat_idx = (pte & EPT_PG_MEMORY_TYPE(0x7)) >> 3;
2796 break;
2797 }
2798
2799 /* See pmap_init_pat(). */
2800 if (pat_idx == 4)
2801 pat_idx = 0;
2802 if (pat_idx == 7)
2803 pat_idx = 3;
2804
2805 return (pat_idx);
2806 }
2807
2808 bool
pmap_ps_enabled(pmap_t pmap)2809 pmap_ps_enabled(pmap_t pmap)
2810 {
2811
2812 return (pg_ps_enabled && (pmap->pm_flags & PMAP_PDE_SUPERPAGE) != 0);
2813 }
2814
2815 static void
pmap_update_pde_store(pmap_t pmap,pd_entry_t * pde,pd_entry_t newpde)2816 pmap_update_pde_store(pmap_t pmap, pd_entry_t *pde, pd_entry_t newpde)
2817 {
2818
2819 switch (pmap->pm_type) {
2820 case PT_X86:
2821 break;
2822 case PT_RVI:
2823 case PT_EPT:
2824 /*
2825 * XXX
2826 * This is a little bogus since the generation number is
2827 * supposed to be bumped up when a region of the address
2828 * space is invalidated in the page tables.
2829 *
2830 * In this case the old PDE entry is valid but yet we want
2831 * to make sure that any mappings using the old entry are
2832 * invalidated in the TLB.
2833 *
2834 * The reason this works as expected is because we rendezvous
2835 * "all" host cpus and force any vcpu context to exit as a
2836 * side-effect.
2837 */
2838 atomic_add_long(&pmap->pm_eptgen, 1);
2839 break;
2840 default:
2841 panic("pmap_update_pde_store: bad pm_type %d", pmap->pm_type);
2842 }
2843 pde_store(pde, newpde);
2844 }
2845
2846 /*
2847 * After changing the page size for the specified virtual address in the page
2848 * table, flush the corresponding entries from the processor's TLB. Only the
2849 * calling processor's TLB is affected.
2850 *
2851 * The calling thread must be pinned to a processor.
2852 */
2853 static void
pmap_update_pde_invalidate(pmap_t pmap,vm_offset_t va,pd_entry_t newpde)2854 pmap_update_pde_invalidate(pmap_t pmap, vm_offset_t va, pd_entry_t newpde)
2855 {
2856 pt_entry_t PG_G;
2857
2858 if (pmap_type_guest(pmap))
2859 return;
2860
2861 KASSERT(pmap->pm_type == PT_X86,
2862 ("pmap_update_pde_invalidate: invalid type %d", pmap->pm_type));
2863
2864 PG_G = pmap_global_bit(pmap);
2865
2866 if ((newpde & PG_PS) == 0)
2867 /* Demotion: flush a specific 2MB page mapping. */
2868 pmap_invlpg(pmap, va);
2869 else if ((newpde & PG_G) == 0)
2870 /*
2871 * Promotion: flush every 4KB page mapping from the TLB
2872 * because there are too many to flush individually.
2873 */
2874 invltlb();
2875 else {
2876 /*
2877 * Promotion: flush every 4KB page mapping from the TLB,
2878 * including any global (PG_G) mappings.
2879 */
2880 invltlb_glob();
2881 }
2882 }
2883
2884 /*
2885 * The amd64 pmap uses different approaches to TLB invalidation
2886 * depending on the kernel configuration, available hardware features,
2887 * and known hardware errata. The kernel configuration option that
2888 * has the greatest operational impact on TLB invalidation is PTI,
2889 * which is enabled automatically on affected Intel CPUs. The most
2890 * impactful hardware features are first PCID, and then INVPCID
2891 * instruction presence. PCID usage is quite different for PTI
2892 * vs. non-PTI.
2893 *
2894 * * Kernel Page Table Isolation (PTI or KPTI) is used to mitigate
2895 * the Meltdown bug in some Intel CPUs. Under PTI, each user address
2896 * space is served by two page tables, user and kernel. The user
2897 * page table only maps user space and a kernel trampoline. The
2898 * kernel trampoline includes the entirety of the kernel text but
2899 * only the kernel data that is needed to switch from user to kernel
2900 * mode. The kernel page table maps the user and kernel address
2901 * spaces in their entirety. It is identical to the per-process
2902 * page table used in non-PTI mode.
2903 *
2904 * User page tables are only used when the CPU is in user mode.
2905 * Consequently, some TLB invalidations can be postponed until the
2906 * switch from kernel to user mode. In contrast, the user
2907 * space part of the kernel page table is used for copyout(9), so
2908 * TLB invalidations on this page table cannot be similarly postponed.
2909 *
2910 * The existence of a user mode page table for the given pmap is
2911 * indicated by a pm_ucr3 value that differs from PMAP_NO_CR3, in
2912 * which case pm_ucr3 contains the %cr3 register value for the user
2913 * mode page table's root.
2914 *
2915 * * The pm_active bitmask indicates which CPUs currently have the
2916 * pmap active. A CPU's bit is set on context switch to the pmap, and
2917 * cleared on switching off this CPU. For the kernel page table,
2918 * the pm_active field is immutable and contains all CPUs. The
2919 * kernel page table is always logically active on every processor,
2920 * but not necessarily in use by the hardware, e.g., in PTI mode.
2921 *
2922 * When requesting invalidation of virtual addresses with
2923 * pmap_invalidate_XXX() functions, the pmap sends shootdown IPIs to
2924 * all CPUs recorded as active in pm_active. Updates to and reads
2925 * from pm_active are not synchronized, and so they may race with
2926 * each other. Shootdown handlers are prepared to handle the race.
2927 *
2928 * * PCID is an optional feature of the long mode x86 MMU where TLB
2929 * entries are tagged with the 'Process ID' of the address space
2930 * they belong to. This feature provides a limited namespace for
2931 * process identifiers, 12 bits, supporting 4095 simultaneous IDs
2932 * total.
2933 *
2934 * Allocation of a PCID to a pmap is done by an algorithm described
2935 * in section 15.12, "Other TLB Consistency Algorithms", of
2936 * Vahalia's book "Unix Internals". A PCID cannot be allocated for
2937 * the whole lifetime of a pmap in pmap_pinit() due to the limited
2938 * namespace. Instead, a per-CPU, per-pmap PCID is assigned when
2939 * the CPU is about to start caching TLB entries from a pmap,
2940 * i.e., on the context switch that activates the pmap on the CPU.
2941 *
2942 * The PCID allocator maintains a per-CPU, per-pmap generation
2943 * count, pm_gen, which is incremented each time a new PCID is
2944 * allocated. On TLB invalidation, the generation counters for the
2945 * pmap are zeroed, which signals the context switch code that the
2946 * previously allocated PCID is no longer valid. Effectively,
2947 * zeroing any of these counters triggers a TLB shootdown for the
2948 * given CPU/address space, due to the allocation of a new PCID.
2949 *
2950 * Zeroing can be performed remotely. Consequently, if a pmap is
2951 * inactive on a CPU, then a TLB shootdown for that pmap and CPU can
2952 * be initiated by an ordinary memory access to reset the target
2953 * CPU's generation count within the pmap. The CPU initiating the
2954 * TLB shootdown does not need to send an IPI to the target CPU.
2955 *
2956 * * PTI + PCID. The available PCIDs are divided into two sets: PCIDs
2957 * for complete (kernel) page tables, and PCIDs for user mode page
2958 * tables. A user PCID value is obtained from the kernel PCID value
2959 * by setting the highest bit, 11, to 1 (0x800 == PMAP_PCID_USER_PT).
2960 *
2961 * User space page tables are activated on return to user mode, by
2962 * loading pm_ucr3 into %cr3. If the PCPU(ucr3_load_mask) requests
2963 * clearing bit 63 of the loaded ucr3, this effectively causes
2964 * complete invalidation of the user mode TLB entries for the
2965 * current pmap. In which case, local invalidations of individual
2966 * pages in the user page table are skipped.
2967 *
2968 * * Local invalidation, all modes. If the requested invalidation is
2969 * for a specific address or the total invalidation of a currently
2970 * active pmap, then the TLB is flushed using INVLPG for a kernel
2971 * page table, and INVPCID(INVPCID_CTXGLOB)/invltlb_glob() for a
2972 * user space page table(s).
2973 *
2974 * If the INVPCID instruction is available, it is used to flush user
2975 * entries from the kernel page table.
2976 *
2977 * When PCID is enabled, the INVLPG instruction invalidates all TLB
2978 * entries for the given page that either match the current PCID or
2979 * are global. Since TLB entries for the same page under different
2980 * PCIDs are unaffected, kernel pages which reside in all address
2981 * spaces could be problematic. We avoid the problem by creating
2982 * all kernel PTEs with the global flag (PG_G) set, when PTI is
2983 * disabled.
2984 *
2985 * * mode: PTI disabled, PCID present. The kernel reserves PCID 0 for its
2986 * address space, all other 4095 PCIDs are used for user mode spaces
2987 * as described above. A context switch allocates a new PCID if
2988 * the recorded PCID is zero or the recorded generation does not match
2989 * the CPU's generation, effectively flushing the TLB for this address space.
2990 * Total remote invalidation is performed by zeroing pm_gen for all CPUs.
2991 * local user page: INVLPG
2992 * local kernel page: INVLPG
2993 * local user total: INVPCID(CTX)
2994 * local kernel total: INVPCID(CTXGLOB) or invltlb_glob()
2995 * remote user page, inactive pmap: zero pm_gen
2996 * remote user page, active pmap: zero pm_gen + IPI:INVLPG
2997 * (Both actions are required to handle the aforementioned pm_active races.)
2998 * remote kernel page: IPI:INVLPG
2999 * remote user total, inactive pmap: zero pm_gen
3000 * remote user total, active pmap: zero pm_gen + IPI:(INVPCID(CTX) or
3001 * reload %cr3)
3002 * (See note above about pm_active races.)
3003 * remote kernel total: IPI:(INVPCID(CTXGLOB) or invltlb_glob())
3004 *
3005 * PTI enabled, PCID present.
3006 * local user page: INVLPG for kpt, INVPCID(ADDR) or (INVLPG for ucr3)
3007 * for upt
3008 * local kernel page: INVLPG
3009 * local user total: INVPCID(CTX) or reload %cr3 for kpt, clear PCID_SAVE
3010 * on loading UCR3 into %cr3 for upt
3011 * local kernel total: INVPCID(CTXGLOB) or invltlb_glob()
3012 * remote user page, inactive pmap: zero pm_gen
3013 * remote user page, active pmap: zero pm_gen + IPI:(INVLPG for kpt,
3014 * INVPCID(ADDR) for upt)
3015 * remote kernel page: IPI:INVLPG
3016 * remote user total, inactive pmap: zero pm_gen
3017 * remote user total, active pmap: zero pm_gen + IPI:(INVPCID(CTX) for kpt,
3018 * clear PCID_SAVE on loading UCR3 into $cr3 for upt)
3019 * remote kernel total: IPI:(INVPCID(CTXGLOB) or invltlb_glob())
3020 *
3021 * No PCID.
3022 * local user page: INVLPG
3023 * local kernel page: INVLPG
3024 * local user total: reload %cr3
3025 * local kernel total: invltlb_glob()
3026 * remote user page, inactive pmap: -
3027 * remote user page, active pmap: IPI:INVLPG
3028 * remote kernel page: IPI:INVLPG
3029 * remote user total, inactive pmap: -
3030 * remote user total, active pmap: IPI:(reload %cr3)
3031 * remote kernel total: IPI:invltlb_glob()
3032 * Since on return to user mode, the reload of %cr3 with ucr3 causes
3033 * TLB invalidation, no specific action is required for user page table.
3034 *
3035 * EPT. EPT pmaps do not map KVA, all mappings are userspace.
3036 * XXX TODO
3037 */
3038
3039 #ifdef SMP
3040 /*
3041 * Interrupt the cpus that are executing in the guest context.
3042 * This will force the vcpu to exit and the cached EPT mappings
3043 * will be invalidated by the host before the next vmresume.
3044 */
3045 static __inline void
pmap_invalidate_ept(pmap_t pmap)3046 pmap_invalidate_ept(pmap_t pmap)
3047 {
3048 smr_seq_t goal;
3049 int ipinum;
3050
3051 sched_pin();
3052 KASSERT(!CPU_ISSET(curcpu, &pmap->pm_active),
3053 ("pmap_invalidate_ept: absurd pm_active"));
3054
3055 /*
3056 * The TLB mappings associated with a vcpu context are not
3057 * flushed each time a different vcpu is chosen to execute.
3058 *
3059 * This is in contrast with a process's vtop mappings that
3060 * are flushed from the TLB on each context switch.
3061 *
3062 * Therefore we need to do more than just a TLB shootdown on
3063 * the active cpus in 'pmap->pm_active'. To do this we keep
3064 * track of the number of invalidations performed on this pmap.
3065 *
3066 * Each vcpu keeps a cache of this counter and compares it
3067 * just before a vmresume. If the counter is out-of-date an
3068 * invept will be done to flush stale mappings from the TLB.
3069 *
3070 * To ensure that all vCPU threads have observed the new counter
3071 * value before returning, we use SMR. Ordering is important here:
3072 * the VMM enters an SMR read section before loading the counter
3073 * and after updating the pm_active bit set. Thus, pm_active is
3074 * a superset of active readers, and any reader that has observed
3075 * the goal has observed the new counter value.
3076 */
3077 atomic_add_long(&pmap->pm_eptgen, 1);
3078
3079 goal = smr_advance(pmap->pm_eptsmr);
3080
3081 /*
3082 * Force the vcpu to exit and trap back into the hypervisor.
3083 */
3084 ipinum = pmap->pm_flags & PMAP_NESTED_IPIMASK;
3085 ipi_selected(pmap->pm_active, ipinum);
3086 sched_unpin();
3087
3088 /*
3089 * Ensure that all active vCPUs will observe the new generation counter
3090 * value before executing any more guest instructions.
3091 */
3092 smr_wait(pmap->pm_eptsmr, goal);
3093 }
3094
3095 static inline void
pmap_invalidate_preipi_pcid(pmap_t pmap)3096 pmap_invalidate_preipi_pcid(pmap_t pmap)
3097 {
3098 struct pmap_pcid *pcidp;
3099 u_int cpuid, i;
3100
3101 sched_pin();
3102
3103 cpuid = PCPU_GET(cpuid);
3104 if (pmap != PCPU_GET(curpmap))
3105 cpuid = 0xffffffff; /* An impossible value */
3106
3107 CPU_FOREACH(i) {
3108 if (cpuid != i) {
3109 pcidp = zpcpu_get_cpu(pmap->pm_pcidp, i);
3110 pcidp->pm_gen = 0;
3111 }
3112 }
3113
3114 /*
3115 * The fence is between stores to pm_gen and the read of the
3116 * pm_active mask. We need to ensure that it is impossible
3117 * for us to miss the bit update in pm_active and
3118 * simultaneously observe a non-zero pm_gen in
3119 * pmap_activate_sw(), otherwise TLB update is missed.
3120 * Without the fence, IA32 allows such an outcome. Note that
3121 * pm_active is updated by a locked operation, which provides
3122 * the reciprocal fence.
3123 */
3124 atomic_thread_fence_seq_cst();
3125 }
3126
3127 static void
pmap_invalidate_preipi_nopcid(pmap_t pmap __unused)3128 pmap_invalidate_preipi_nopcid(pmap_t pmap __unused)
3129 {
3130 sched_pin();
3131 }
3132
3133 DEFINE_IFUNC(static, void, pmap_invalidate_preipi, (pmap_t))
3134 {
3135 return (pmap_pcid_enabled ? pmap_invalidate_preipi_pcid :
3136 pmap_invalidate_preipi_nopcid);
3137 }
3138
3139 static inline void
pmap_invalidate_page_pcid_cb(pmap_t pmap,vm_offset_t va,const bool invpcid_works1)3140 pmap_invalidate_page_pcid_cb(pmap_t pmap, vm_offset_t va,
3141 const bool invpcid_works1)
3142 {
3143 struct invpcid_descr d;
3144 uint64_t kcr3, ucr3;
3145 uint32_t pcid;
3146
3147 /*
3148 * Because pm_pcid is recalculated on a context switch, we
3149 * must ensure there is no preemption, not just pinning.
3150 * Otherwise, we might use a stale value below.
3151 */
3152 CRITICAL_ASSERT(curthread);
3153
3154 /*
3155 * No need to do anything with user page tables invalidation
3156 * if there is no user page table, or invalidation is deferred
3157 * until the return to userspace. ucr3_load_mask is stable
3158 * because we have preemption disabled.
3159 */
3160 if (pmap->pm_ucr3 == PMAP_NO_CR3 ||
3161 PCPU_GET(ucr3_load_mask) != PMAP_UCR3_NOMASK)
3162 return;
3163
3164 pcid = pmap_get_pcid(pmap);
3165 if (invpcid_works1) {
3166 d.pcid = pcid | PMAP_PCID_USER_PT;
3167 d.pad = 0;
3168 d.addr = va;
3169 invpcid(&d, INVPCID_ADDR);
3170 } else {
3171 kcr3 = pmap->pm_cr3 | pcid | CR3_PCID_SAVE;
3172 ucr3 = pmap->pm_ucr3 | pcid | PMAP_PCID_USER_PT | CR3_PCID_SAVE;
3173 pmap_pti_pcid_invlpg(ucr3, kcr3, va);
3174 }
3175 }
3176
3177 static void
pmap_invalidate_page_pcid_invpcid_cb(pmap_t pmap,vm_offset_t va)3178 pmap_invalidate_page_pcid_invpcid_cb(pmap_t pmap, vm_offset_t va)
3179 {
3180 pmap_invalidate_page_pcid_cb(pmap, va, true);
3181 }
3182
3183 static void
pmap_invalidate_page_pcid_noinvpcid_cb(pmap_t pmap,vm_offset_t va)3184 pmap_invalidate_page_pcid_noinvpcid_cb(pmap_t pmap, vm_offset_t va)
3185 {
3186 pmap_invalidate_page_pcid_cb(pmap, va, false);
3187 }
3188
3189 static void
pmap_invalidate_page_nopcid_cb(pmap_t pmap __unused,vm_offset_t va __unused)3190 pmap_invalidate_page_nopcid_cb(pmap_t pmap __unused, vm_offset_t va __unused)
3191 {
3192 }
3193
3194 DEFINE_IFUNC(static, void, pmap_invalidate_page_cb, (pmap_t, vm_offset_t))
3195 {
3196 if (pmap_pcid_enabled)
3197 return (invpcid_works ? pmap_invalidate_page_pcid_invpcid_cb :
3198 pmap_invalidate_page_pcid_noinvpcid_cb);
3199 return (pmap_invalidate_page_nopcid_cb);
3200 }
3201
3202 static void
pmap_invalidate_page_curcpu_cb(pmap_t pmap,vm_offset_t va,vm_offset_t addr2 __unused)3203 pmap_invalidate_page_curcpu_cb(pmap_t pmap, vm_offset_t va,
3204 vm_offset_t addr2 __unused)
3205 {
3206 if (pmap == kernel_pmap) {
3207 pmap_invlpg(kernel_pmap, va);
3208 } else if (pmap == PCPU_GET(curpmap)) {
3209 invlpg(va);
3210 pmap_invalidate_page_cb(pmap, va);
3211 }
3212 }
3213
3214 void
pmap_invalidate_page(pmap_t pmap,vm_offset_t va)3215 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
3216 {
3217 if (pmap_type_guest(pmap)) {
3218 pmap_invalidate_ept(pmap);
3219 return;
3220 }
3221
3222 KASSERT(pmap->pm_type == PT_X86,
3223 ("pmap_invalidate_page: invalid type %d", pmap->pm_type));
3224
3225 pmap_invalidate_preipi(pmap);
3226 smp_masked_invlpg(va, pmap, pmap_invalidate_page_curcpu_cb);
3227 }
3228
3229 /* 4k PTEs -- Chosen to exceed the total size of Broadwell L2 TLB */
3230 #define PMAP_INVLPG_THRESHOLD (4 * 1024 * PAGE_SIZE)
3231
3232 static void
pmap_invalidate_range_pcid_cb(pmap_t pmap,vm_offset_t sva,vm_offset_t eva,const bool invpcid_works1)3233 pmap_invalidate_range_pcid_cb(pmap_t pmap, vm_offset_t sva, vm_offset_t eva,
3234 const bool invpcid_works1)
3235 {
3236 struct invpcid_descr d;
3237 uint64_t kcr3, ucr3;
3238 uint32_t pcid;
3239
3240 CRITICAL_ASSERT(curthread);
3241
3242 if (pmap != PCPU_GET(curpmap) ||
3243 pmap->pm_ucr3 == PMAP_NO_CR3 ||
3244 PCPU_GET(ucr3_load_mask) != PMAP_UCR3_NOMASK)
3245 return;
3246
3247 pcid = pmap_get_pcid(pmap);
3248 if (invpcid_works1) {
3249 d.pcid = pcid | PMAP_PCID_USER_PT;
3250 d.pad = 0;
3251 for (d.addr = sva; d.addr < eva; d.addr += PAGE_SIZE)
3252 invpcid(&d, INVPCID_ADDR);
3253 } else {
3254 kcr3 = pmap->pm_cr3 | pcid | CR3_PCID_SAVE;
3255 ucr3 = pmap->pm_ucr3 | pcid | PMAP_PCID_USER_PT | CR3_PCID_SAVE;
3256 pmap_pti_pcid_invlrng(ucr3, kcr3, sva, eva);
3257 }
3258 }
3259
3260 static void
pmap_invalidate_range_pcid_invpcid_cb(pmap_t pmap,vm_offset_t sva,vm_offset_t eva)3261 pmap_invalidate_range_pcid_invpcid_cb(pmap_t pmap, vm_offset_t sva,
3262 vm_offset_t eva)
3263 {
3264 pmap_invalidate_range_pcid_cb(pmap, sva, eva, true);
3265 }
3266
3267 static void
pmap_invalidate_range_pcid_noinvpcid_cb(pmap_t pmap,vm_offset_t sva,vm_offset_t eva)3268 pmap_invalidate_range_pcid_noinvpcid_cb(pmap_t pmap, vm_offset_t sva,
3269 vm_offset_t eva)
3270 {
3271 pmap_invalidate_range_pcid_cb(pmap, sva, eva, false);
3272 }
3273
3274 static void
pmap_invalidate_range_nopcid_cb(pmap_t pmap __unused,vm_offset_t sva __unused,vm_offset_t eva __unused)3275 pmap_invalidate_range_nopcid_cb(pmap_t pmap __unused, vm_offset_t sva __unused,
3276 vm_offset_t eva __unused)
3277 {
3278 }
3279
3280 DEFINE_IFUNC(static, void, pmap_invalidate_range_cb, (pmap_t, vm_offset_t,
3281 vm_offset_t))
3282 {
3283 if (pmap_pcid_enabled)
3284 return (invpcid_works ? pmap_invalidate_range_pcid_invpcid_cb :
3285 pmap_invalidate_range_pcid_noinvpcid_cb);
3286 return (pmap_invalidate_range_nopcid_cb);
3287 }
3288
3289 static void
pmap_invalidate_range_curcpu_cb(pmap_t pmap,vm_offset_t sva,vm_offset_t eva)3290 pmap_invalidate_range_curcpu_cb(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
3291 {
3292 vm_offset_t addr;
3293
3294 if (pmap == kernel_pmap) {
3295 if (PCPU_GET(pcid_invlpg_workaround)) {
3296 struct invpcid_descr d = { 0 };
3297
3298 invpcid(&d, INVPCID_CTXGLOB);
3299 } else {
3300 for (addr = sva; addr < eva; addr += PAGE_SIZE)
3301 invlpg(addr);
3302 }
3303 } else if (pmap == PCPU_GET(curpmap)) {
3304 for (addr = sva; addr < eva; addr += PAGE_SIZE)
3305 invlpg(addr);
3306 pmap_invalidate_range_cb(pmap, sva, eva);
3307 }
3308 }
3309
3310 void
pmap_invalidate_range(pmap_t pmap,vm_offset_t sva,vm_offset_t eva)3311 pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
3312 {
3313 if (eva - sva >= PMAP_INVLPG_THRESHOLD) {
3314 pmap_invalidate_all(pmap);
3315 return;
3316 }
3317
3318 if (pmap_type_guest(pmap)) {
3319 pmap_invalidate_ept(pmap);
3320 return;
3321 }
3322
3323 KASSERT(pmap->pm_type == PT_X86,
3324 ("pmap_invalidate_range: invalid type %d", pmap->pm_type));
3325
3326 pmap_invalidate_preipi(pmap);
3327 smp_masked_invlpg_range(sva, eva, pmap,
3328 pmap_invalidate_range_curcpu_cb);
3329 }
3330
3331 static inline void
pmap_invalidate_all_pcid_cb(pmap_t pmap,bool invpcid_works1)3332 pmap_invalidate_all_pcid_cb(pmap_t pmap, bool invpcid_works1)
3333 {
3334 struct invpcid_descr d;
3335 uint64_t kcr3;
3336 uint32_t pcid;
3337
3338 if (pmap == kernel_pmap) {
3339 if (invpcid_works1) {
3340 bzero(&d, sizeof(d));
3341 invpcid(&d, INVPCID_CTXGLOB);
3342 } else {
3343 invltlb_glob();
3344 }
3345 } else if (pmap == PCPU_GET(curpmap)) {
3346 CRITICAL_ASSERT(curthread);
3347
3348 pcid = pmap_get_pcid(pmap);
3349 if (invpcid_works1) {
3350 d.pcid = pcid;
3351 d.pad = 0;
3352 d.addr = 0;
3353 invpcid(&d, INVPCID_CTX);
3354 } else {
3355 kcr3 = pmap->pm_cr3 | pcid;
3356 load_cr3(kcr3);
3357 }
3358 if (pmap->pm_ucr3 != PMAP_NO_CR3)
3359 PCPU_SET(ucr3_load_mask, ~CR3_PCID_SAVE);
3360 }
3361 }
3362
3363 static void
pmap_invalidate_all_pcid_invpcid_cb(pmap_t pmap)3364 pmap_invalidate_all_pcid_invpcid_cb(pmap_t pmap)
3365 {
3366 pmap_invalidate_all_pcid_cb(pmap, true);
3367 }
3368
3369 static void
pmap_invalidate_all_pcid_noinvpcid_cb(pmap_t pmap)3370 pmap_invalidate_all_pcid_noinvpcid_cb(pmap_t pmap)
3371 {
3372 pmap_invalidate_all_pcid_cb(pmap, false);
3373 }
3374
3375 static void
pmap_invalidate_all_nopcid_cb(pmap_t pmap)3376 pmap_invalidate_all_nopcid_cb(pmap_t pmap)
3377 {
3378 if (pmap == kernel_pmap)
3379 invltlb_glob();
3380 else if (pmap == PCPU_GET(curpmap))
3381 invltlb();
3382 }
3383
3384 DEFINE_IFUNC(static, void, pmap_invalidate_all_cb, (pmap_t))
3385 {
3386 if (pmap_pcid_enabled)
3387 return (invpcid_works ? pmap_invalidate_all_pcid_invpcid_cb :
3388 pmap_invalidate_all_pcid_noinvpcid_cb);
3389 return (pmap_invalidate_all_nopcid_cb);
3390 }
3391
3392 static void
pmap_invalidate_all_curcpu_cb(pmap_t pmap,vm_offset_t addr1 __unused,vm_offset_t addr2 __unused)3393 pmap_invalidate_all_curcpu_cb(pmap_t pmap, vm_offset_t addr1 __unused,
3394 vm_offset_t addr2 __unused)
3395 {
3396 pmap_invalidate_all_cb(pmap);
3397 }
3398
3399 void
pmap_invalidate_all(pmap_t pmap)3400 pmap_invalidate_all(pmap_t pmap)
3401 {
3402 if (pmap_type_guest(pmap)) {
3403 pmap_invalidate_ept(pmap);
3404 return;
3405 }
3406
3407 KASSERT(pmap->pm_type == PT_X86,
3408 ("pmap_invalidate_all: invalid type %d", pmap->pm_type));
3409
3410 pmap_invalidate_preipi(pmap);
3411 smp_masked_invltlb(pmap, pmap_invalidate_all_curcpu_cb);
3412 }
3413
3414 static void
pmap_invalidate_cache_curcpu_cb(pmap_t pmap __unused,vm_offset_t va __unused,vm_offset_t addr2 __unused)3415 pmap_invalidate_cache_curcpu_cb(pmap_t pmap __unused, vm_offset_t va __unused,
3416 vm_offset_t addr2 __unused)
3417 {
3418 wbinvd();
3419 }
3420
3421 void
pmap_invalidate_cache(void)3422 pmap_invalidate_cache(void)
3423 {
3424 sched_pin();
3425 smp_cache_flush(pmap_invalidate_cache_curcpu_cb);
3426 }
3427
3428 struct pde_action {
3429 cpuset_t invalidate; /* processors that invalidate their TLB */
3430 pmap_t pmap;
3431 vm_offset_t va;
3432 pd_entry_t *pde;
3433 pd_entry_t newpde;
3434 u_int store; /* processor that updates the PDE */
3435 };
3436
3437 static void
pmap_update_pde_action(void * arg)3438 pmap_update_pde_action(void *arg)
3439 {
3440 struct pde_action *act = arg;
3441
3442 if (act->store == PCPU_GET(cpuid))
3443 pmap_update_pde_store(act->pmap, act->pde, act->newpde);
3444 }
3445
3446 static void
pmap_update_pde_teardown(void * arg)3447 pmap_update_pde_teardown(void *arg)
3448 {
3449 struct pde_action *act = arg;
3450
3451 if (CPU_ISSET(PCPU_GET(cpuid), &act->invalidate))
3452 pmap_update_pde_invalidate(act->pmap, act->va, act->newpde);
3453 }
3454
3455 /*
3456 * Change the page size for the specified virtual address in a way that
3457 * prevents any possibility of the TLB ever having two entries that map the
3458 * same virtual address using different page sizes. This is the recommended
3459 * workaround for Erratum 383 on AMD Family 10h processors. It prevents a
3460 * machine check exception for a TLB state that is improperly diagnosed as a
3461 * hardware error.
3462 */
3463 static void
pmap_update_pde(pmap_t pmap,vm_offset_t va,pd_entry_t * pde,pd_entry_t newpde)3464 pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, pd_entry_t newpde)
3465 {
3466 struct pde_action act;
3467 cpuset_t active, other_cpus;
3468 u_int cpuid;
3469
3470 sched_pin();
3471 cpuid = PCPU_GET(cpuid);
3472 other_cpus = all_cpus;
3473 CPU_CLR(cpuid, &other_cpus);
3474 if (pmap == kernel_pmap || pmap_type_guest(pmap))
3475 active = all_cpus;
3476 else {
3477 active = pmap->pm_active;
3478 }
3479 if (CPU_OVERLAP(&active, &other_cpus)) {
3480 act.store = cpuid;
3481 act.invalidate = active;
3482 act.va = va;
3483 act.pmap = pmap;
3484 act.pde = pde;
3485 act.newpde = newpde;
3486 CPU_SET(cpuid, &active);
3487 smp_rendezvous_cpus(active,
3488 smp_no_rendezvous_barrier, pmap_update_pde_action,
3489 pmap_update_pde_teardown, &act);
3490 } else {
3491 pmap_update_pde_store(pmap, pde, newpde);
3492 if (CPU_ISSET(cpuid, &active))
3493 pmap_update_pde_invalidate(pmap, va, newpde);
3494 }
3495 sched_unpin();
3496 }
3497 #else /* !SMP */
3498 /*
3499 * Normal, non-SMP, invalidation functions.
3500 */
3501 void
pmap_invalidate_page(pmap_t pmap,vm_offset_t va)3502 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
3503 {
3504 struct invpcid_descr d;
3505 struct pmap_pcid *pcidp;
3506 uint64_t kcr3, ucr3;
3507 uint32_t pcid;
3508
3509 if (pmap->pm_type == PT_RVI || pmap->pm_type == PT_EPT) {
3510 pmap->pm_eptgen++;
3511 return;
3512 }
3513 KASSERT(pmap->pm_type == PT_X86,
3514 ("pmap_invalidate_range: unknown type %d", pmap->pm_type));
3515
3516 if (pmap == kernel_pmap || pmap == PCPU_GET(curpmap)) {
3517 invlpg(va);
3518 if (pmap == PCPU_GET(curpmap) && pmap_pcid_enabled &&
3519 pmap->pm_ucr3 != PMAP_NO_CR3) {
3520 critical_enter();
3521 pcid = pmap_get_pcid(pmap);
3522 if (invpcid_works) {
3523 d.pcid = pcid | PMAP_PCID_USER_PT;
3524 d.pad = 0;
3525 d.addr = va;
3526 invpcid(&d, INVPCID_ADDR);
3527 } else {
3528 kcr3 = pmap->pm_cr3 | pcid | CR3_PCID_SAVE;
3529 ucr3 = pmap->pm_ucr3 | pcid |
3530 PMAP_PCID_USER_PT | CR3_PCID_SAVE;
3531 pmap_pti_pcid_invlpg(ucr3, kcr3, va);
3532 }
3533 critical_exit();
3534 }
3535 } else if (pmap_pcid_enabled) {
3536 pcidp = zpcpu_get(pmap->pm_pcidp);
3537 pcidp->pm_gen = 0;
3538 }
3539 }
3540
3541 void
pmap_invalidate_range(pmap_t pmap,vm_offset_t sva,vm_offset_t eva)3542 pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
3543 {
3544 struct invpcid_descr d;
3545 struct pmap_pcid *pcidp;
3546 vm_offset_t addr;
3547 uint64_t kcr3, ucr3;
3548 uint32_t pcid;
3549
3550 if (pmap->pm_type == PT_RVI || pmap->pm_type == PT_EPT) {
3551 pmap->pm_eptgen++;
3552 return;
3553 }
3554 KASSERT(pmap->pm_type == PT_X86,
3555 ("pmap_invalidate_range: unknown type %d", pmap->pm_type));
3556
3557 if (pmap == kernel_pmap || pmap == PCPU_GET(curpmap)) {
3558 for (addr = sva; addr < eva; addr += PAGE_SIZE)
3559 invlpg(addr);
3560 if (pmap == PCPU_GET(curpmap) && pmap_pcid_enabled &&
3561 pmap->pm_ucr3 != PMAP_NO_CR3) {
3562 critical_enter();
3563 pcid = pmap_get_pcid(pmap);
3564 if (invpcid_works) {
3565 d.pcid = pcid | PMAP_PCID_USER_PT;
3566 d.pad = 0;
3567 d.addr = sva;
3568 for (; d.addr < eva; d.addr += PAGE_SIZE)
3569 invpcid(&d, INVPCID_ADDR);
3570 } else {
3571 kcr3 = pmap->pm_cr3 | pcid | CR3_PCID_SAVE;
3572 ucr3 = pmap->pm_ucr3 | pcid |
3573 PMAP_PCID_USER_PT | CR3_PCID_SAVE;
3574 pmap_pti_pcid_invlrng(ucr3, kcr3, sva, eva);
3575 }
3576 critical_exit();
3577 }
3578 } else if (pmap_pcid_enabled) {
3579 pcidp = zpcpu_get(pmap->pm_pcidp);
3580 pcidp->pm_gen = 0;
3581 }
3582 }
3583
3584 void
pmap_invalidate_all(pmap_t pmap)3585 pmap_invalidate_all(pmap_t pmap)
3586 {
3587 struct invpcid_descr d;
3588 struct pmap_pcid *pcidp;
3589 uint64_t kcr3, ucr3;
3590 uint32_t pcid;
3591
3592 if (pmap->pm_type == PT_RVI || pmap->pm_type == PT_EPT) {
3593 pmap->pm_eptgen++;
3594 return;
3595 }
3596 KASSERT(pmap->pm_type == PT_X86,
3597 ("pmap_invalidate_all: unknown type %d", pmap->pm_type));
3598
3599 if (pmap == kernel_pmap) {
3600 if (pmap_pcid_enabled && invpcid_works) {
3601 bzero(&d, sizeof(d));
3602 invpcid(&d, INVPCID_CTXGLOB);
3603 } else {
3604 invltlb_glob();
3605 }
3606 } else if (pmap == PCPU_GET(curpmap)) {
3607 if (pmap_pcid_enabled) {
3608 critical_enter();
3609 pcid = pmap_get_pcid(pmap);
3610 if (invpcid_works) {
3611 d.pcid = pcid;
3612 d.pad = 0;
3613 d.addr = 0;
3614 invpcid(&d, INVPCID_CTX);
3615 if (pmap->pm_ucr3 != PMAP_NO_CR3) {
3616 d.pcid |= PMAP_PCID_USER_PT;
3617 invpcid(&d, INVPCID_CTX);
3618 }
3619 } else {
3620 kcr3 = pmap->pm_cr3 | pcid;
3621 if (pmap->pm_ucr3 != PMAP_NO_CR3) {
3622 ucr3 = pmap->pm_ucr3 | pcid |
3623 PMAP_PCID_USER_PT;
3624 pmap_pti_pcid_invalidate(ucr3, kcr3);
3625 } else
3626 load_cr3(kcr3);
3627 }
3628 critical_exit();
3629 } else {
3630 invltlb();
3631 }
3632 } else if (pmap_pcid_enabled) {
3633 pcidp = zpcpu_get(pmap->pm_pcidp);
3634 pcidp->pm_gen = 0;
3635 }
3636 }
3637
3638 void
pmap_invalidate_cache(void)3639 pmap_invalidate_cache(void)
3640 {
3641
3642 wbinvd();
3643 }
3644
3645 static void
pmap_update_pde(pmap_t pmap,vm_offset_t va,pd_entry_t * pde,pd_entry_t newpde)3646 pmap_update_pde(pmap_t pmap, vm_offset_t va, pd_entry_t *pde, pd_entry_t newpde)
3647 {
3648 struct pmap_pcid *pcidp;
3649
3650 pmap_update_pde_store(pmap, pde, newpde);
3651 if (pmap == kernel_pmap || pmap == PCPU_GET(curpmap))
3652 pmap_update_pde_invalidate(pmap, va, newpde);
3653 else {
3654 pcidp = zpcpu_get(pmap->pm_pcidp);
3655 pcidp->pm_gen = 0;
3656 }
3657 }
3658 #endif /* !SMP */
3659
3660 static void
pmap_invalidate_pde_page(pmap_t pmap,vm_offset_t va,pd_entry_t pde)3661 pmap_invalidate_pde_page(pmap_t pmap, vm_offset_t va, pd_entry_t pde)
3662 {
3663
3664 /*
3665 * When the PDE has PG_PROMOTED set, the 2MB page mapping was created
3666 * by a promotion that did not invalidate the 512 4KB page mappings
3667 * that might exist in the TLB. Consequently, at this point, the TLB
3668 * may hold both 4KB and 2MB page mappings for the address range [va,
3669 * va + NBPDR). Therefore, the entire range must be invalidated here.
3670 * In contrast, when PG_PROMOTED is clear, the TLB will not hold any
3671 * 4KB page mappings for the address range [va, va + NBPDR), and so a
3672 * single INVLPG suffices to invalidate the 2MB page mapping from the
3673 * TLB.
3674 */
3675 if ((pde & PG_PROMOTED) != 0)
3676 pmap_invalidate_range(pmap, va, va + NBPDR - 1);
3677 else
3678 pmap_invalidate_page(pmap, va);
3679 }
3680
3681 DEFINE_IFUNC(, void, pmap_invalidate_cache_range,
3682 (vm_offset_t sva, vm_offset_t eva))
3683 {
3684
3685 if ((cpu_feature & CPUID_SS) != 0)
3686 return (pmap_invalidate_cache_range_selfsnoop);
3687 if ((cpu_feature & CPUID_CLFSH) != 0)
3688 return (pmap_force_invalidate_cache_range);
3689 return (pmap_invalidate_cache_range_all);
3690 }
3691
3692 #define PMAP_CLFLUSH_THRESHOLD (2 * 1024 * 1024)
3693
3694 static void
pmap_invalidate_cache_range_check_align(vm_offset_t sva,vm_offset_t eva)3695 pmap_invalidate_cache_range_check_align(vm_offset_t sva, vm_offset_t eva)
3696 {
3697
3698 KASSERT((sva & PAGE_MASK) == 0,
3699 ("pmap_invalidate_cache_range: sva not page-aligned"));
3700 KASSERT((eva & PAGE_MASK) == 0,
3701 ("pmap_invalidate_cache_range: eva not page-aligned"));
3702 }
3703
3704 static void
pmap_invalidate_cache_range_selfsnoop(vm_offset_t sva,vm_offset_t eva)3705 pmap_invalidate_cache_range_selfsnoop(vm_offset_t sva, vm_offset_t eva)
3706 {
3707
3708 pmap_invalidate_cache_range_check_align(sva, eva);
3709 }
3710
3711 void
pmap_force_invalidate_cache_range(vm_offset_t sva,vm_offset_t eva)3712 pmap_force_invalidate_cache_range(vm_offset_t sva, vm_offset_t eva)
3713 {
3714
3715 sva &= ~(vm_offset_t)(cpu_clflush_line_size - 1);
3716
3717 /*
3718 * XXX: Some CPUs fault, hang, or trash the local APIC
3719 * registers if we use CLFLUSH on the local APIC range. The
3720 * local APIC is always uncached, so we don't need to flush
3721 * for that range anyway.
3722 */
3723 if (pmap_kextract(sva) == lapic_paddr)
3724 return;
3725
3726 if ((cpu_stdext_feature & CPUID_STDEXT_CLFLUSHOPT) != 0) {
3727 /*
3728 * Do per-cache line flush. Use a locked
3729 * instruction to insure that previous stores are
3730 * included in the write-back. The processor
3731 * propagates flush to other processors in the cache
3732 * coherence domain.
3733 */
3734 atomic_thread_fence_seq_cst();
3735 for (; sva < eva; sva += cpu_clflush_line_size)
3736 clflushopt(sva);
3737 atomic_thread_fence_seq_cst();
3738 } else {
3739 /*
3740 * Writes are ordered by CLFLUSH on Intel CPUs.
3741 */
3742 if (cpu_vendor_id != CPU_VENDOR_INTEL)
3743 mfence();
3744 for (; sva < eva; sva += cpu_clflush_line_size)
3745 clflush(sva);
3746 if (cpu_vendor_id != CPU_VENDOR_INTEL)
3747 mfence();
3748 }
3749 }
3750
3751 static void
pmap_invalidate_cache_range_all(vm_offset_t sva,vm_offset_t eva)3752 pmap_invalidate_cache_range_all(vm_offset_t sva, vm_offset_t eva)
3753 {
3754
3755 pmap_invalidate_cache_range_check_align(sva, eva);
3756 pmap_invalidate_cache();
3757 }
3758
3759 /*
3760 * Remove the specified set of pages from the data and instruction caches.
3761 *
3762 * In contrast to pmap_invalidate_cache_range(), this function does not
3763 * rely on the CPU's self-snoop feature, because it is intended for use
3764 * when moving pages into a different cache domain.
3765 */
3766 void
pmap_invalidate_cache_pages(vm_page_t * pages,int count)3767 pmap_invalidate_cache_pages(vm_page_t *pages, int count)
3768 {
3769 vm_offset_t daddr, eva;
3770 int i;
3771 bool useclflushopt;
3772
3773 useclflushopt = (cpu_stdext_feature & CPUID_STDEXT_CLFLUSHOPT) != 0;
3774 if (count >= PMAP_CLFLUSH_THRESHOLD / PAGE_SIZE ||
3775 ((cpu_feature & CPUID_CLFSH) == 0 && !useclflushopt))
3776 pmap_invalidate_cache();
3777 else {
3778 if (useclflushopt)
3779 atomic_thread_fence_seq_cst();
3780 else if (cpu_vendor_id != CPU_VENDOR_INTEL)
3781 mfence();
3782 for (i = 0; i < count; i++) {
3783 daddr = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pages[i]));
3784 eva = daddr + PAGE_SIZE;
3785 for (; daddr < eva; daddr += cpu_clflush_line_size) {
3786 if (useclflushopt)
3787 clflushopt(daddr);
3788 else
3789 clflush(daddr);
3790 }
3791 }
3792 if (useclflushopt)
3793 atomic_thread_fence_seq_cst();
3794 else if (cpu_vendor_id != CPU_VENDOR_INTEL)
3795 mfence();
3796 }
3797 }
3798
3799 void
pmap_flush_cache_range(vm_offset_t sva,vm_offset_t eva)3800 pmap_flush_cache_range(vm_offset_t sva, vm_offset_t eva)
3801 {
3802
3803 pmap_invalidate_cache_range_check_align(sva, eva);
3804
3805 if ((cpu_stdext_feature & CPUID_STDEXT_CLWB) == 0) {
3806 pmap_force_invalidate_cache_range(sva, eva);
3807 return;
3808 }
3809
3810 /* See comment in pmap_force_invalidate_cache_range(). */
3811 if (pmap_kextract(sva) == lapic_paddr)
3812 return;
3813
3814 atomic_thread_fence_seq_cst();
3815 for (; sva < eva; sva += cpu_clflush_line_size)
3816 clwb(sva);
3817 atomic_thread_fence_seq_cst();
3818 }
3819
3820 void
pmap_flush_cache_phys_range(vm_paddr_t spa,vm_paddr_t epa,vm_memattr_t mattr)3821 pmap_flush_cache_phys_range(vm_paddr_t spa, vm_paddr_t epa, vm_memattr_t mattr)
3822 {
3823 pt_entry_t *pte;
3824 vm_offset_t vaddr;
3825 int error __diagused;
3826 int pte_bits;
3827
3828 KASSERT((spa & PAGE_MASK) == 0,
3829 ("pmap_flush_cache_phys_range: spa not page-aligned"));
3830 KASSERT((epa & PAGE_MASK) == 0,
3831 ("pmap_flush_cache_phys_range: epa not page-aligned"));
3832
3833 if (spa < dmaplimit) {
3834 pmap_flush_cache_range(PHYS_TO_DMAP(spa), PHYS_TO_DMAP(MIN(
3835 dmaplimit, epa)));
3836 if (dmaplimit >= epa)
3837 return;
3838 spa = dmaplimit;
3839 }
3840
3841 pte_bits = pmap_cache_bits(kernel_pmap, mattr, 0) | X86_PG_RW |
3842 X86_PG_V;
3843 error = vmem_alloc(kernel_arena, PAGE_SIZE, M_BESTFIT | M_WAITOK,
3844 &vaddr);
3845 KASSERT(error == 0, ("vmem_alloc failed: %d", error));
3846 pte = vtopte(vaddr);
3847 for (; spa < epa; spa += PAGE_SIZE) {
3848 sched_pin();
3849 pte_store(pte, spa | pte_bits);
3850 pmap_invlpg(kernel_pmap, vaddr);
3851 /* XXXKIB atomic inside flush_cache_range are excessive */
3852 pmap_flush_cache_range(vaddr, vaddr + PAGE_SIZE);
3853 sched_unpin();
3854 }
3855 vmem_free(kernel_arena, vaddr, PAGE_SIZE);
3856 }
3857
3858 /*
3859 * Routine: pmap_extract
3860 * Function:
3861 * Extract the physical page address associated
3862 * with the given map/virtual_address pair.
3863 */
3864 vm_paddr_t
pmap_extract(pmap_t pmap,vm_offset_t va)3865 pmap_extract(pmap_t pmap, vm_offset_t va)
3866 {
3867 pdp_entry_t *pdpe;
3868 pd_entry_t *pde;
3869 pt_entry_t *pte, PG_V;
3870 vm_paddr_t pa;
3871
3872 pa = 0;
3873 PG_V = pmap_valid_bit(pmap);
3874 PMAP_LOCK(pmap);
3875 pdpe = pmap_pdpe(pmap, va);
3876 if (pdpe != NULL && (*pdpe & PG_V) != 0) {
3877 if ((*pdpe & PG_PS) != 0)
3878 pa = (*pdpe & PG_PS_FRAME) | (va & PDPMASK);
3879 else {
3880 pde = pmap_pdpe_to_pde(pdpe, va);
3881 if ((*pde & PG_V) != 0) {
3882 if ((*pde & PG_PS) != 0) {
3883 pa = (*pde & PG_PS_FRAME) |
3884 (va & PDRMASK);
3885 } else {
3886 pte = pmap_pde_to_pte(pde, va);
3887 pa = (*pte & PG_FRAME) |
3888 (va & PAGE_MASK);
3889 }
3890 }
3891 }
3892 }
3893 PMAP_UNLOCK(pmap);
3894 return (pa);
3895 }
3896
3897 /*
3898 * Routine: pmap_extract_and_hold
3899 * Function:
3900 * Atomically extract and hold the physical page
3901 * with the given pmap and virtual address pair
3902 * if that mapping permits the given protection.
3903 */
3904 vm_page_t
pmap_extract_and_hold(pmap_t pmap,vm_offset_t va,vm_prot_t prot)3905 pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
3906 {
3907 pdp_entry_t pdpe, *pdpep;
3908 pd_entry_t pde, *pdep;
3909 pt_entry_t pte, PG_RW, PG_V;
3910 vm_page_t m;
3911
3912 m = NULL;
3913 PG_RW = pmap_rw_bit(pmap);
3914 PG_V = pmap_valid_bit(pmap);
3915 PMAP_LOCK(pmap);
3916
3917 pdpep = pmap_pdpe(pmap, va);
3918 if (pdpep == NULL || ((pdpe = *pdpep) & PG_V) == 0)
3919 goto out;
3920 if ((pdpe & PG_PS) != 0) {
3921 if ((pdpe & PG_RW) == 0 && (prot & VM_PROT_WRITE) != 0)
3922 goto out;
3923 m = PHYS_TO_VM_PAGE((pdpe & PG_PS_FRAME) | (va & PDPMASK));
3924 goto check_page;
3925 }
3926
3927 pdep = pmap_pdpe_to_pde(pdpep, va);
3928 if (pdep == NULL || ((pde = *pdep) & PG_V) == 0)
3929 goto out;
3930 if ((pde & PG_PS) != 0) {
3931 if ((pde & PG_RW) == 0 && (prot & VM_PROT_WRITE) != 0)
3932 goto out;
3933 m = PHYS_TO_VM_PAGE((pde & PG_PS_FRAME) | (va & PDRMASK));
3934 goto check_page;
3935 }
3936
3937 pte = *pmap_pde_to_pte(pdep, va);
3938 if ((pte & PG_V) == 0 ||
3939 ((pte & PG_RW) == 0 && (prot & VM_PROT_WRITE) != 0))
3940 goto out;
3941 m = PHYS_TO_VM_PAGE(pte & PG_FRAME);
3942
3943 check_page:
3944 if (m != NULL && !vm_page_wire_mapped(m))
3945 m = NULL;
3946 out:
3947 PMAP_UNLOCK(pmap);
3948 return (m);
3949 }
3950
3951 vm_paddr_t
pmap_kextract(vm_offset_t va)3952 pmap_kextract(vm_offset_t va)
3953 {
3954 pd_entry_t pde;
3955 vm_paddr_t pa;
3956
3957 if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS) {
3958 pa = DMAP_TO_PHYS(va);
3959 } else if (PMAP_ADDRESS_IN_LARGEMAP(va)) {
3960 pa = pmap_large_map_kextract(va);
3961 } else {
3962 pde = *vtopde(va);
3963 if (pde & PG_PS) {
3964 pa = (pde & PG_PS_FRAME) | (va & PDRMASK);
3965 } else {
3966 /*
3967 * Beware of a concurrent promotion that changes the
3968 * PDE at this point! For example, vtopte() must not
3969 * be used to access the PTE because it would use the
3970 * new PDE. It is, however, safe to use the old PDE
3971 * because the page table page is preserved by the
3972 * promotion.
3973 */
3974 pa = *pmap_pde_to_pte(&pde, va);
3975 pa = (pa & PG_FRAME) | (va & PAGE_MASK);
3976 }
3977 }
3978 return (pa);
3979 }
3980
3981 /***************************************************
3982 * Low level mapping routines.....
3983 ***************************************************/
3984
3985 /*
3986 * Add a wired page to the kva.
3987 * Note: not SMP coherent.
3988 */
3989 void
pmap_kenter(vm_offset_t va,vm_paddr_t pa)3990 pmap_kenter(vm_offset_t va, vm_paddr_t pa)
3991 {
3992 pt_entry_t *pte;
3993
3994 pte = vtopte(va);
3995 pte_store(pte, pa | pg_g | pg_nx | X86_PG_A | X86_PG_M |
3996 X86_PG_RW | X86_PG_V);
3997 }
3998
3999 static __inline void
pmap_kenter_attr(vm_offset_t va,vm_paddr_t pa,int mode)4000 pmap_kenter_attr(vm_offset_t va, vm_paddr_t pa, int mode)
4001 {
4002 pt_entry_t *pte;
4003 int cache_bits;
4004
4005 pte = vtopte(va);
4006 cache_bits = pmap_cache_bits(kernel_pmap, mode, 0);
4007 pte_store(pte, pa | pg_g | pg_nx | X86_PG_A | X86_PG_M |
4008 X86_PG_RW | X86_PG_V | cache_bits);
4009 }
4010
4011 /*
4012 * Remove a page from the kernel pagetables.
4013 * Note: not SMP coherent.
4014 */
4015 void
pmap_kremove(vm_offset_t va)4016 pmap_kremove(vm_offset_t va)
4017 {
4018 pt_entry_t *pte;
4019
4020 pte = vtopte(va);
4021 pte_clear(pte);
4022 }
4023
4024 /*
4025 * Used to map a range of physical addresses into kernel
4026 * virtual address space.
4027 *
4028 * The value passed in '*virt' is a suggested virtual address for
4029 * the mapping. Architectures which can support a direct-mapped
4030 * physical to virtual region can return the appropriate address
4031 * within that region, leaving '*virt' unchanged. Other
4032 * architectures should map the pages starting at '*virt' and
4033 * update '*virt' with the first usable address after the mapped
4034 * region.
4035 */
4036 vm_offset_t
pmap_map(vm_offset_t * virt,vm_paddr_t start,vm_paddr_t end,int prot)4037 pmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end, int prot)
4038 {
4039 return PHYS_TO_DMAP(start);
4040 }
4041
4042 /*
4043 * Add a list of wired pages to the kva
4044 * this routine is only used for temporary
4045 * kernel mappings that do not need to have
4046 * page modification or references recorded.
4047 * Note that old mappings are simply written
4048 * over. The page *must* be wired.
4049 * Note: SMP coherent. Uses a ranged shootdown IPI.
4050 */
4051 void
pmap_qenter(vm_offset_t sva,vm_page_t * ma,int count)4052 pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count)
4053 {
4054 pt_entry_t *endpte, oldpte, pa, *pte;
4055 vm_page_t m;
4056 int cache_bits;
4057
4058 oldpte = 0;
4059 pte = vtopte(sva);
4060 endpte = pte + count;
4061 while (pte < endpte) {
4062 m = *ma++;
4063 cache_bits = pmap_cache_bits(kernel_pmap, m->md.pat_mode, 0);
4064 pa = VM_PAGE_TO_PHYS(m) | cache_bits;
4065 if ((*pte & (PG_FRAME | X86_PG_PTE_CACHE)) != pa) {
4066 oldpte |= *pte;
4067 pte_store(pte, pa | pg_g | pg_nx | X86_PG_A |
4068 X86_PG_M | X86_PG_RW | X86_PG_V);
4069 }
4070 pte++;
4071 }
4072 if (__predict_false((oldpte & X86_PG_V) != 0))
4073 pmap_invalidate_range(kernel_pmap, sva, sva + count *
4074 PAGE_SIZE);
4075 }
4076
4077 /*
4078 * This routine tears out page mappings from the
4079 * kernel -- it is meant only for temporary mappings.
4080 * Note: SMP coherent. Uses a ranged shootdown IPI.
4081 */
4082 void
pmap_qremove(vm_offset_t sva,int count)4083 pmap_qremove(vm_offset_t sva, int count)
4084 {
4085 vm_offset_t va;
4086
4087 va = sva;
4088 while (count-- > 0) {
4089 /*
4090 * pmap_enter() calls within the kernel virtual
4091 * address space happen on virtual addresses from
4092 * subarenas that import superpage-sized and -aligned
4093 * address ranges. So, the virtual address that we
4094 * allocate to use with pmap_qenter() can't be close
4095 * enough to one of those pmap_enter() calls for it to
4096 * be caught up in a promotion.
4097 */
4098 KASSERT(va >= VM_MIN_KERNEL_ADDRESS, ("usermode va %lx", va));
4099 KASSERT((*vtopde(va) & X86_PG_PS) == 0,
4100 ("pmap_qremove on promoted va %#lx", va));
4101
4102 pmap_kremove(va);
4103 va += PAGE_SIZE;
4104 }
4105 pmap_invalidate_range(kernel_pmap, sva, va);
4106 }
4107
4108 /***************************************************
4109 * Page table page management routines.....
4110 ***************************************************/
4111 /*
4112 * Schedule the specified unused page table page to be freed. Specifically,
4113 * add the page to the specified list of pages that will be released to the
4114 * physical memory manager after the TLB has been updated.
4115 */
4116 static __inline void
pmap_add_delayed_free_list(vm_page_t m,struct spglist * free,boolean_t set_PG_ZERO)4117 pmap_add_delayed_free_list(vm_page_t m, struct spglist *free,
4118 boolean_t set_PG_ZERO)
4119 {
4120
4121 if (set_PG_ZERO)
4122 m->flags |= PG_ZERO;
4123 else
4124 m->flags &= ~PG_ZERO;
4125 SLIST_INSERT_HEAD(free, m, plinks.s.ss);
4126 }
4127
4128 /*
4129 * Inserts the specified page table page into the specified pmap's collection
4130 * of idle page table pages. Each of a pmap's page table pages is responsible
4131 * for mapping a distinct range of virtual addresses. The pmap's collection is
4132 * ordered by this virtual address range.
4133 *
4134 * If "promoted" is false, then the page table page "mpte" must be zero filled;
4135 * "mpte"'s valid field will be set to 0.
4136 *
4137 * If "promoted" is true and "allpte_PG_A_set" is false, then "mpte" must
4138 * contain valid mappings with identical attributes except for PG_A; "mpte"'s
4139 * valid field will be set to 1.
4140 *
4141 * If "promoted" and "allpte_PG_A_set" are both true, then "mpte" must contain
4142 * valid mappings with identical attributes including PG_A; "mpte"'s valid
4143 * field will be set to VM_PAGE_BITS_ALL.
4144 */
4145 static __inline int
pmap_insert_pt_page(pmap_t pmap,vm_page_t mpte,bool promoted,bool allpte_PG_A_set)4146 pmap_insert_pt_page(pmap_t pmap, vm_page_t mpte, bool promoted,
4147 bool allpte_PG_A_set)
4148 {
4149
4150 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
4151 KASSERT(promoted || !allpte_PG_A_set,
4152 ("a zero-filled PTP can't have PG_A set in every PTE"));
4153 mpte->valid = promoted ? (allpte_PG_A_set ? VM_PAGE_BITS_ALL : 1) : 0;
4154 return (vm_radix_insert(&pmap->pm_root, mpte));
4155 }
4156
4157 /*
4158 * Removes the page table page mapping the specified virtual address from the
4159 * specified pmap's collection of idle page table pages, and returns it.
4160 * Otherwise, returns NULL if there is no page table page corresponding to the
4161 * specified virtual address.
4162 */
4163 static __inline vm_page_t
pmap_remove_pt_page(pmap_t pmap,vm_offset_t va)4164 pmap_remove_pt_page(pmap_t pmap, vm_offset_t va)
4165 {
4166
4167 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
4168 return (vm_radix_remove(&pmap->pm_root, pmap_pde_pindex(va)));
4169 }
4170
4171 /*
4172 * Decrements a page table page's reference count, which is used to record the
4173 * number of valid page table entries within the page. If the reference count
4174 * drops to zero, then the page table page is unmapped. Returns TRUE if the
4175 * page table page was unmapped and FALSE otherwise.
4176 */
4177 static inline boolean_t
pmap_unwire_ptp(pmap_t pmap,vm_offset_t va,vm_page_t m,struct spglist * free)4178 pmap_unwire_ptp(pmap_t pmap, vm_offset_t va, vm_page_t m, struct spglist *free)
4179 {
4180
4181 --m->ref_count;
4182 if (m->ref_count == 0) {
4183 _pmap_unwire_ptp(pmap, va, m, free);
4184 return (TRUE);
4185 } else
4186 return (FALSE);
4187 }
4188
4189 static void
_pmap_unwire_ptp(pmap_t pmap,vm_offset_t va,vm_page_t m,struct spglist * free)4190 _pmap_unwire_ptp(pmap_t pmap, vm_offset_t va, vm_page_t m, struct spglist *free)
4191 {
4192 pml5_entry_t *pml5;
4193 pml4_entry_t *pml4;
4194 pdp_entry_t *pdp;
4195 pd_entry_t *pd;
4196 vm_page_t pdpg, pdppg, pml4pg;
4197
4198 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
4199
4200 /*
4201 * unmap the page table page
4202 */
4203 if (m->pindex >= NUPDE + NUPDPE + NUPML4E) {
4204 /* PML4 page */
4205 MPASS(pmap_is_la57(pmap));
4206 pml5 = pmap_pml5e(pmap, va);
4207 *pml5 = 0;
4208 if (pmap->pm_pmltopu != NULL && va <= VM_MAXUSER_ADDRESS) {
4209 pml5 = pmap_pml5e_u(pmap, va);
4210 *pml5 = 0;
4211 }
4212 } else if (m->pindex >= NUPDE + NUPDPE) {
4213 /* PDP page */
4214 pml4 = pmap_pml4e(pmap, va);
4215 *pml4 = 0;
4216 if (!pmap_is_la57(pmap) && pmap->pm_pmltopu != NULL &&
4217 va <= VM_MAXUSER_ADDRESS) {
4218 pml4 = pmap_pml4e_u(pmap, va);
4219 *pml4 = 0;
4220 }
4221 } else if (m->pindex >= NUPDE) {
4222 /* PD page */
4223 pdp = pmap_pdpe(pmap, va);
4224 *pdp = 0;
4225 } else {
4226 /* PTE page */
4227 pd = pmap_pde(pmap, va);
4228 *pd = 0;
4229 }
4230 if (m->pindex < NUPDE) {
4231 /* We just released a PT, unhold the matching PD */
4232 pdpg = PHYS_TO_VM_PAGE(*pmap_pdpe(pmap, va) & PG_FRAME);
4233 pmap_unwire_ptp(pmap, va, pdpg, free);
4234 } else if (m->pindex < NUPDE + NUPDPE) {
4235 /* We just released a PD, unhold the matching PDP */
4236 pdppg = PHYS_TO_VM_PAGE(*pmap_pml4e(pmap, va) & PG_FRAME);
4237 pmap_unwire_ptp(pmap, va, pdppg, free);
4238 } else if (m->pindex < NUPDE + NUPDPE + NUPML4E && pmap_is_la57(pmap)) {
4239 /* We just released a PDP, unhold the matching PML4 */
4240 pml4pg = PHYS_TO_VM_PAGE(*pmap_pml5e(pmap, va) & PG_FRAME);
4241 pmap_unwire_ptp(pmap, va, pml4pg, free);
4242 }
4243
4244 pmap_pt_page_count_adj(pmap, -1);
4245
4246 /*
4247 * Put page on a list so that it is released after
4248 * *ALL* TLB shootdown is done
4249 */
4250 pmap_add_delayed_free_list(m, free, TRUE);
4251 }
4252
4253 /*
4254 * After removing a page table entry, this routine is used to
4255 * conditionally free the page, and manage the reference count.
4256 */
4257 static int
pmap_unuse_pt(pmap_t pmap,vm_offset_t va,pd_entry_t ptepde,struct spglist * free)4258 pmap_unuse_pt(pmap_t pmap, vm_offset_t va, pd_entry_t ptepde,
4259 struct spglist *free)
4260 {
4261 vm_page_t mpte;
4262
4263 if (va >= VM_MAXUSER_ADDRESS)
4264 return (0);
4265 KASSERT(ptepde != 0, ("pmap_unuse_pt: ptepde != 0"));
4266 mpte = PHYS_TO_VM_PAGE(ptepde & PG_FRAME);
4267 return (pmap_unwire_ptp(pmap, va, mpte, free));
4268 }
4269
4270 /*
4271 * Release a page table page reference after a failed attempt to create a
4272 * mapping.
4273 */
4274 static void
pmap_abort_ptp(pmap_t pmap,vm_offset_t va,vm_page_t mpte)4275 pmap_abort_ptp(pmap_t pmap, vm_offset_t va, vm_page_t mpte)
4276 {
4277 struct spglist free;
4278
4279 SLIST_INIT(&free);
4280 if (pmap_unwire_ptp(pmap, va, mpte, &free)) {
4281 /*
4282 * Although "va" was never mapped, paging-structure caches
4283 * could nonetheless have entries that refer to the freed
4284 * page table pages. Invalidate those entries.
4285 */
4286 pmap_invalidate_page(pmap, va);
4287 vm_page_free_pages_toq(&free, true);
4288 }
4289 }
4290
4291 static void
pmap_pinit_pcids(pmap_t pmap,uint32_t pcid,int gen)4292 pmap_pinit_pcids(pmap_t pmap, uint32_t pcid, int gen)
4293 {
4294 struct pmap_pcid *pcidp;
4295 int i;
4296
4297 CPU_FOREACH(i) {
4298 pcidp = zpcpu_get_cpu(pmap->pm_pcidp, i);
4299 pcidp->pm_pcid = pcid;
4300 pcidp->pm_gen = gen;
4301 }
4302 }
4303
4304 void
pmap_pinit0(pmap_t pmap)4305 pmap_pinit0(pmap_t pmap)
4306 {
4307 struct proc *p;
4308 struct thread *td;
4309
4310 PMAP_LOCK_INIT(pmap);
4311 pmap->pm_pmltop = kernel_pmap->pm_pmltop;
4312 pmap->pm_pmltopu = NULL;
4313 pmap->pm_cr3 = kernel_pmap->pm_cr3;
4314 /* hack to keep pmap_pti_pcid_invalidate() alive */
4315 pmap->pm_ucr3 = PMAP_NO_CR3;
4316 vm_radix_init(&pmap->pm_root);
4317 CPU_ZERO(&pmap->pm_active);
4318 TAILQ_INIT(&pmap->pm_pvchunk);
4319 bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
4320 pmap->pm_flags = pmap_flags;
4321 pmap->pm_pcidp = uma_zalloc_pcpu(pcpu_zone_8, M_WAITOK);
4322 pmap_pinit_pcids(pmap, PMAP_PCID_KERN + 1, 1);
4323 pmap_activate_boot(pmap);
4324 td = curthread;
4325 if (pti) {
4326 p = td->td_proc;
4327 PROC_LOCK(p);
4328 p->p_md.md_flags |= P_MD_KPTI;
4329 PROC_UNLOCK(p);
4330 }
4331 pmap_thread_init_invl_gen(td);
4332
4333 if ((cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0) {
4334 pmap_pkru_ranges_zone = uma_zcreate("pkru ranges",
4335 sizeof(struct pmap_pkru_range), NULL, NULL, NULL, NULL,
4336 UMA_ALIGN_PTR, 0);
4337 }
4338 }
4339
4340 void
pmap_pinit_pml4(vm_page_t pml4pg)4341 pmap_pinit_pml4(vm_page_t pml4pg)
4342 {
4343 pml4_entry_t *pm_pml4;
4344 int i;
4345
4346 pm_pml4 = (pml4_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pml4pg));
4347
4348 /* Wire in kernel global address entries. */
4349 for (i = 0; i < NKPML4E; i++) {
4350 pm_pml4[KPML4BASE + i] = (KPDPphys + ptoa(i)) | X86_PG_RW |
4351 X86_PG_V;
4352 }
4353 #ifdef KASAN
4354 for (i = 0; i < NKASANPML4E; i++) {
4355 pm_pml4[KASANPML4I + i] = (KASANPDPphys + ptoa(i)) | X86_PG_RW |
4356 X86_PG_V | pg_nx;
4357 }
4358 #endif
4359 #ifdef KMSAN
4360 for (i = 0; i < NKMSANSHADPML4E; i++) {
4361 pm_pml4[KMSANSHADPML4I + i] = (KMSANSHADPDPphys + ptoa(i)) |
4362 X86_PG_RW | X86_PG_V | pg_nx;
4363 }
4364 for (i = 0; i < NKMSANORIGPML4E; i++) {
4365 pm_pml4[KMSANORIGPML4I + i] = (KMSANORIGPDPphys + ptoa(i)) |
4366 X86_PG_RW | X86_PG_V | pg_nx;
4367 }
4368 #endif
4369 for (i = 0; i < ndmpdpphys; i++) {
4370 pm_pml4[DMPML4I + i] = (DMPDPphys + ptoa(i)) | X86_PG_RW |
4371 X86_PG_V;
4372 }
4373
4374 /* install self-referential address mapping entry(s) */
4375 pm_pml4[PML4PML4I] = VM_PAGE_TO_PHYS(pml4pg) | X86_PG_V | X86_PG_RW |
4376 X86_PG_A | X86_PG_M;
4377
4378 /* install large map entries if configured */
4379 for (i = 0; i < lm_ents; i++)
4380 pm_pml4[LMSPML4I + i] = kernel_pmap->pm_pmltop[LMSPML4I + i];
4381 }
4382
4383 void
pmap_pinit_pml5(vm_page_t pml5pg)4384 pmap_pinit_pml5(vm_page_t pml5pg)
4385 {
4386 pml5_entry_t *pm_pml5;
4387
4388 pm_pml5 = (pml5_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pml5pg));
4389
4390 /*
4391 * Add pml5 entry at top of KVA pointing to existing pml4 table,
4392 * entering all existing kernel mappings into level 5 table.
4393 */
4394 pm_pml5[pmap_pml5e_index(UPT_MAX_ADDRESS)] = KPML4phys | X86_PG_V |
4395 X86_PG_RW | X86_PG_A | X86_PG_M;
4396
4397 /*
4398 * Install self-referential address mapping entry.
4399 */
4400 pm_pml5[PML5PML5I] = VM_PAGE_TO_PHYS(pml5pg) |
4401 X86_PG_RW | X86_PG_V | X86_PG_M | X86_PG_A;
4402 }
4403
4404 static void
pmap_pinit_pml4_pti(vm_page_t pml4pgu)4405 pmap_pinit_pml4_pti(vm_page_t pml4pgu)
4406 {
4407 pml4_entry_t *pm_pml4u;
4408 int i;
4409
4410 pm_pml4u = (pml4_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pml4pgu));
4411 for (i = 0; i < NPML4EPG; i++)
4412 pm_pml4u[i] = pti_pml4[i];
4413 }
4414
4415 static void
pmap_pinit_pml5_pti(vm_page_t pml5pgu)4416 pmap_pinit_pml5_pti(vm_page_t pml5pgu)
4417 {
4418 pml5_entry_t *pm_pml5u;
4419
4420 pm_pml5u = (pml5_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pml5pgu));
4421 pagezero(pm_pml5u);
4422
4423 /*
4424 * Add pml5 entry at top of KVA pointing to existing pml4 pti
4425 * table, entering all kernel mappings needed for usermode
4426 * into level 5 table.
4427 */
4428 pm_pml5u[pmap_pml5e_index(UPT_MAX_ADDRESS)] =
4429 pmap_kextract((vm_offset_t)pti_pml4) |
4430 X86_PG_V | X86_PG_RW | X86_PG_A | X86_PG_M;
4431 }
4432
4433 /* Allocate a page table page and do related bookkeeping */
4434 static vm_page_t
pmap_alloc_pt_page(pmap_t pmap,vm_pindex_t pindex,int flags)4435 pmap_alloc_pt_page(pmap_t pmap, vm_pindex_t pindex, int flags)
4436 {
4437 vm_page_t m;
4438
4439 m = vm_page_alloc_noobj(flags);
4440 if (__predict_false(m == NULL))
4441 return (NULL);
4442 m->pindex = pindex;
4443 pmap_pt_page_count_adj(pmap, 1);
4444 return (m);
4445 }
4446
4447 static void
pmap_free_pt_page(pmap_t pmap,vm_page_t m,bool zerofilled)4448 pmap_free_pt_page(pmap_t pmap, vm_page_t m, bool zerofilled)
4449 {
4450 /*
4451 * This function assumes the page will need to be unwired,
4452 * even though the counterpart allocation in pmap_alloc_pt_page()
4453 * doesn't enforce VM_ALLOC_WIRED. However, all current uses
4454 * of pmap_free_pt_page() require unwiring. The case in which
4455 * a PT page doesn't require unwiring because its ref_count has
4456 * naturally reached 0 is handled through _pmap_unwire_ptp().
4457 */
4458 vm_page_unwire_noq(m);
4459 if (zerofilled)
4460 vm_page_free_zero(m);
4461 else
4462 vm_page_free(m);
4463
4464 pmap_pt_page_count_adj(pmap, -1);
4465 }
4466
4467 _Static_assert(sizeof(struct pmap_pcid) == 8, "Fix pcpu zone for pm_pcidp");
4468
4469 /*
4470 * Initialize a preallocated and zeroed pmap structure,
4471 * such as one in a vmspace structure.
4472 */
4473 int
pmap_pinit_type(pmap_t pmap,enum pmap_type pm_type,int flags)4474 pmap_pinit_type(pmap_t pmap, enum pmap_type pm_type, int flags)
4475 {
4476 vm_page_t pmltop_pg, pmltop_pgu;
4477 vm_paddr_t pmltop_phys;
4478
4479 bzero(&pmap->pm_stats, sizeof pmap->pm_stats);
4480
4481 /*
4482 * Allocate the page directory page. Pass NULL instead of a
4483 * pointer to the pmap here to avoid calling
4484 * pmap_resident_count_adj() through pmap_pt_page_count_adj(),
4485 * since that requires pmap lock. Instead do the accounting
4486 * manually.
4487 *
4488 * Note that final call to pmap_remove() optimization that
4489 * checks for zero resident_count is basically disabled by
4490 * accounting for top-level page. But the optimization was
4491 * not effective since we started using non-managed mapping of
4492 * the shared page.
4493 */
4494 pmltop_pg = pmap_alloc_pt_page(NULL, 0, VM_ALLOC_WIRED | VM_ALLOC_ZERO |
4495 VM_ALLOC_WAITOK);
4496 pmap_pt_page_count_pinit(pmap, 1);
4497
4498 pmltop_phys = VM_PAGE_TO_PHYS(pmltop_pg);
4499 pmap->pm_pmltop = (pml5_entry_t *)PHYS_TO_DMAP(pmltop_phys);
4500
4501 if (pmap_pcid_enabled) {
4502 if (pmap->pm_pcidp == NULL)
4503 pmap->pm_pcidp = uma_zalloc_pcpu(pcpu_zone_8,
4504 M_WAITOK);
4505 pmap_pinit_pcids(pmap, PMAP_PCID_NONE, 0);
4506 }
4507 pmap->pm_cr3 = PMAP_NO_CR3; /* initialize to an invalid value */
4508 pmap->pm_ucr3 = PMAP_NO_CR3;
4509 pmap->pm_pmltopu = NULL;
4510
4511 pmap->pm_type = pm_type;
4512
4513 /*
4514 * Do not install the host kernel mappings in the nested page
4515 * tables. These mappings are meaningless in the guest physical
4516 * address space.
4517 * Install minimal kernel mappings in PTI case.
4518 */
4519 switch (pm_type) {
4520 case PT_X86:
4521 pmap->pm_cr3 = pmltop_phys;
4522 if (pmap_is_la57(pmap))
4523 pmap_pinit_pml5(pmltop_pg);
4524 else
4525 pmap_pinit_pml4(pmltop_pg);
4526 if ((curproc->p_md.md_flags & P_MD_KPTI) != 0) {
4527 /*
4528 * As with pmltop_pg, pass NULL instead of a
4529 * pointer to the pmap to ensure that the PTI
4530 * page counted explicitly.
4531 */
4532 pmltop_pgu = pmap_alloc_pt_page(NULL, 0,
4533 VM_ALLOC_WIRED | VM_ALLOC_WAITOK);
4534 pmap_pt_page_count_pinit(pmap, 1);
4535 pmap->pm_pmltopu = (pml4_entry_t *)PHYS_TO_DMAP(
4536 VM_PAGE_TO_PHYS(pmltop_pgu));
4537 if (pmap_is_la57(pmap))
4538 pmap_pinit_pml5_pti(pmltop_pgu);
4539 else
4540 pmap_pinit_pml4_pti(pmltop_pgu);
4541 pmap->pm_ucr3 = VM_PAGE_TO_PHYS(pmltop_pgu);
4542 }
4543 if ((cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0) {
4544 rangeset_init(&pmap->pm_pkru, pkru_dup_range,
4545 pkru_free_range, pmap, M_NOWAIT);
4546 }
4547 break;
4548 case PT_EPT:
4549 case PT_RVI:
4550 pmap->pm_eptsmr = smr_create("pmap", 0, 0);
4551 break;
4552 }
4553
4554 vm_radix_init(&pmap->pm_root);
4555 CPU_ZERO(&pmap->pm_active);
4556 TAILQ_INIT(&pmap->pm_pvchunk);
4557 pmap->pm_flags = flags;
4558 pmap->pm_eptgen = 0;
4559
4560 return (1);
4561 }
4562
4563 int
pmap_pinit(pmap_t pmap)4564 pmap_pinit(pmap_t pmap)
4565 {
4566
4567 return (pmap_pinit_type(pmap, PT_X86, pmap_flags));
4568 }
4569
4570 static void
pmap_allocpte_free_unref(pmap_t pmap,vm_offset_t va,pt_entry_t * pte)4571 pmap_allocpte_free_unref(pmap_t pmap, vm_offset_t va, pt_entry_t *pte)
4572 {
4573 vm_page_t mpg;
4574 struct spglist free;
4575
4576 mpg = PHYS_TO_VM_PAGE(*pte & PG_FRAME);
4577 if (mpg->ref_count != 0)
4578 return;
4579 SLIST_INIT(&free);
4580 _pmap_unwire_ptp(pmap, va, mpg, &free);
4581 pmap_invalidate_page(pmap, va);
4582 vm_page_free_pages_toq(&free, true);
4583 }
4584
4585 static pml4_entry_t *
pmap_allocpte_getpml4(pmap_t pmap,struct rwlock ** lockp,vm_offset_t va,bool addref)4586 pmap_allocpte_getpml4(pmap_t pmap, struct rwlock **lockp, vm_offset_t va,
4587 bool addref)
4588 {
4589 vm_pindex_t pml5index;
4590 pml5_entry_t *pml5;
4591 pml4_entry_t *pml4;
4592 vm_page_t pml4pg;
4593 pt_entry_t PG_V;
4594 bool allocated;
4595
4596 if (!pmap_is_la57(pmap))
4597 return (&pmap->pm_pmltop[pmap_pml4e_index(va)]);
4598
4599 PG_V = pmap_valid_bit(pmap);
4600 pml5index = pmap_pml5e_index(va);
4601 pml5 = &pmap->pm_pmltop[pml5index];
4602 if ((*pml5 & PG_V) == 0) {
4603 if (pmap_allocpte_nosleep(pmap, pmap_pml5e_pindex(va), lockp,
4604 va) == NULL)
4605 return (NULL);
4606 allocated = true;
4607 } else {
4608 allocated = false;
4609 }
4610 pml4 = (pml4_entry_t *)PHYS_TO_DMAP(*pml5 & PG_FRAME);
4611 pml4 = &pml4[pmap_pml4e_index(va)];
4612 if ((*pml4 & PG_V) == 0) {
4613 pml4pg = PHYS_TO_VM_PAGE(*pml5 & PG_FRAME);
4614 if (allocated && !addref)
4615 pml4pg->ref_count--;
4616 else if (!allocated && addref)
4617 pml4pg->ref_count++;
4618 }
4619 return (pml4);
4620 }
4621
4622 static pdp_entry_t *
pmap_allocpte_getpdp(pmap_t pmap,struct rwlock ** lockp,vm_offset_t va,bool addref)4623 pmap_allocpte_getpdp(pmap_t pmap, struct rwlock **lockp, vm_offset_t va,
4624 bool addref)
4625 {
4626 vm_page_t pdppg;
4627 pml4_entry_t *pml4;
4628 pdp_entry_t *pdp;
4629 pt_entry_t PG_V;
4630 bool allocated;
4631
4632 PG_V = pmap_valid_bit(pmap);
4633
4634 pml4 = pmap_allocpte_getpml4(pmap, lockp, va, false);
4635 if (pml4 == NULL)
4636 return (NULL);
4637
4638 if ((*pml4 & PG_V) == 0) {
4639 /* Have to allocate a new pdp, recurse */
4640 if (pmap_allocpte_nosleep(pmap, pmap_pml4e_pindex(va), lockp,
4641 va) == NULL) {
4642 if (pmap_is_la57(pmap))
4643 pmap_allocpte_free_unref(pmap, va,
4644 pmap_pml5e(pmap, va));
4645 return (NULL);
4646 }
4647 allocated = true;
4648 } else {
4649 allocated = false;
4650 }
4651 pdp = (pdp_entry_t *)PHYS_TO_DMAP(*pml4 & PG_FRAME);
4652 pdp = &pdp[pmap_pdpe_index(va)];
4653 if ((*pdp & PG_V) == 0) {
4654 pdppg = PHYS_TO_VM_PAGE(*pml4 & PG_FRAME);
4655 if (allocated && !addref)
4656 pdppg->ref_count--;
4657 else if (!allocated && addref)
4658 pdppg->ref_count++;
4659 }
4660 return (pdp);
4661 }
4662
4663 /*
4664 * The ptepindexes, i.e. page indices, of the page table pages encountered
4665 * while translating virtual address va are defined as follows:
4666 * - for the page table page (last level),
4667 * ptepindex = pmap_pde_pindex(va) = va >> PDRSHIFT,
4668 * in other words, it is just the index of the PDE that maps the page
4669 * table page.
4670 * - for the page directory page,
4671 * ptepindex = NUPDE (number of userland PD entries) +
4672 * (pmap_pde_index(va) >> NPDEPGSHIFT)
4673 * i.e. index of PDPE is put after the last index of PDE,
4674 * - for the page directory pointer page,
4675 * ptepindex = NUPDE + NUPDPE + (pmap_pde_index(va) >> (NPDEPGSHIFT +
4676 * NPML4EPGSHIFT),
4677 * i.e. index of pml4e is put after the last index of PDPE,
4678 * - for the PML4 page (if LA57 mode is enabled),
4679 * ptepindex = NUPDE + NUPDPE + NUPML4E + (pmap_pde_index(va) >>
4680 * (NPDEPGSHIFT + NPML4EPGSHIFT + NPML5EPGSHIFT),
4681 * i.e. index of pml5e is put after the last index of PML4E.
4682 *
4683 * Define an order on the paging entries, where all entries of the
4684 * same height are put together, then heights are put from deepest to
4685 * root. Then ptexpindex is the sequential number of the
4686 * corresponding paging entry in this order.
4687 *
4688 * The values of NUPDE, NUPDPE, and NUPML4E are determined by the size of
4689 * LA57 paging structures even in LA48 paging mode. Moreover, the
4690 * ptepindexes are calculated as if the paging structures were 5-level
4691 * regardless of the actual mode of operation.
4692 *
4693 * The root page at PML4/PML5 does not participate in this indexing scheme,
4694 * since it is statically allocated by pmap_pinit() and not by pmap_allocpte().
4695 */
4696 static vm_page_t
pmap_allocpte_nosleep(pmap_t pmap,vm_pindex_t ptepindex,struct rwlock ** lockp,vm_offset_t va)4697 pmap_allocpte_nosleep(pmap_t pmap, vm_pindex_t ptepindex, struct rwlock **lockp,
4698 vm_offset_t va)
4699 {
4700 vm_pindex_t pml5index, pml4index;
4701 pml5_entry_t *pml5, *pml5u;
4702 pml4_entry_t *pml4, *pml4u;
4703 pdp_entry_t *pdp;
4704 pd_entry_t *pd;
4705 vm_page_t m, pdpg;
4706 pt_entry_t PG_A, PG_M, PG_RW, PG_V;
4707
4708 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
4709
4710 PG_A = pmap_accessed_bit(pmap);
4711 PG_M = pmap_modified_bit(pmap);
4712 PG_V = pmap_valid_bit(pmap);
4713 PG_RW = pmap_rw_bit(pmap);
4714
4715 /*
4716 * Allocate a page table page.
4717 */
4718 m = pmap_alloc_pt_page(pmap, ptepindex,
4719 VM_ALLOC_WIRED | VM_ALLOC_ZERO);
4720 if (m == NULL)
4721 return (NULL);
4722
4723 /*
4724 * Map the pagetable page into the process address space, if
4725 * it isn't already there.
4726 */
4727 if (ptepindex >= NUPDE + NUPDPE + NUPML4E) {
4728 MPASS(pmap_is_la57(pmap));
4729
4730 pml5index = pmap_pml5e_index(va);
4731 pml5 = &pmap->pm_pmltop[pml5index];
4732 KASSERT((*pml5 & PG_V) == 0,
4733 ("pmap %p va %#lx pml5 %#lx", pmap, va, *pml5));
4734 *pml5 = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V | PG_A | PG_M;
4735
4736 if (pmap->pm_pmltopu != NULL && pml5index < NUPML5E) {
4737 MPASS(pmap->pm_ucr3 != PMAP_NO_CR3);
4738 *pml5 |= pg_nx;
4739
4740 pml5u = &pmap->pm_pmltopu[pml5index];
4741 *pml5u = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V |
4742 PG_A | PG_M;
4743 }
4744 } else if (ptepindex >= NUPDE + NUPDPE) {
4745 pml4index = pmap_pml4e_index(va);
4746 /* Wire up a new PDPE page */
4747 pml4 = pmap_allocpte_getpml4(pmap, lockp, va, true);
4748 if (pml4 == NULL) {
4749 pmap_free_pt_page(pmap, m, true);
4750 return (NULL);
4751 }
4752 KASSERT((*pml4 & PG_V) == 0,
4753 ("pmap %p va %#lx pml4 %#lx", pmap, va, *pml4));
4754 *pml4 = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V | PG_A | PG_M;
4755
4756 if (!pmap_is_la57(pmap) && pmap->pm_pmltopu != NULL &&
4757 pml4index < NUPML4E) {
4758 MPASS(pmap->pm_ucr3 != PMAP_NO_CR3);
4759
4760 /*
4761 * PTI: Make all user-space mappings in the
4762 * kernel-mode page table no-execute so that
4763 * we detect any programming errors that leave
4764 * the kernel-mode page table active on return
4765 * to user space.
4766 */
4767 *pml4 |= pg_nx;
4768
4769 pml4u = &pmap->pm_pmltopu[pml4index];
4770 *pml4u = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V |
4771 PG_A | PG_M;
4772 }
4773 } else if (ptepindex >= NUPDE) {
4774 /* Wire up a new PDE page */
4775 pdp = pmap_allocpte_getpdp(pmap, lockp, va, true);
4776 if (pdp == NULL) {
4777 pmap_free_pt_page(pmap, m, true);
4778 return (NULL);
4779 }
4780 KASSERT((*pdp & PG_V) == 0,
4781 ("pmap %p va %#lx pdp %#lx", pmap, va, *pdp));
4782 *pdp = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V | PG_A | PG_M;
4783 } else {
4784 /* Wire up a new PTE page */
4785 pdp = pmap_allocpte_getpdp(pmap, lockp, va, false);
4786 if (pdp == NULL) {
4787 pmap_free_pt_page(pmap, m, true);
4788 return (NULL);
4789 }
4790 if ((*pdp & PG_V) == 0) {
4791 /* Have to allocate a new pd, recurse */
4792 if (pmap_allocpte_nosleep(pmap, pmap_pdpe_pindex(va),
4793 lockp, va) == NULL) {
4794 pmap_allocpte_free_unref(pmap, va,
4795 pmap_pml4e(pmap, va));
4796 pmap_free_pt_page(pmap, m, true);
4797 return (NULL);
4798 }
4799 } else {
4800 /* Add reference to the pd page */
4801 pdpg = PHYS_TO_VM_PAGE(*pdp & PG_FRAME);
4802 pdpg->ref_count++;
4803 }
4804 pd = (pd_entry_t *)PHYS_TO_DMAP(*pdp & PG_FRAME);
4805
4806 /* Now we know where the page directory page is */
4807 pd = &pd[pmap_pde_index(va)];
4808 KASSERT((*pd & PG_V) == 0,
4809 ("pmap %p va %#lx pd %#lx", pmap, va, *pd));
4810 *pd = VM_PAGE_TO_PHYS(m) | PG_U | PG_RW | PG_V | PG_A | PG_M;
4811 }
4812
4813 return (m);
4814 }
4815
4816 /*
4817 * This routine is called if the desired page table page does not exist.
4818 *
4819 * If page table page allocation fails, this routine may sleep before
4820 * returning NULL. It sleeps only if a lock pointer was given. Sleep
4821 * occurs right before returning to the caller. This way, we never
4822 * drop pmap lock to sleep while a page table page has ref_count == 0,
4823 * which prevents the page from being freed under us.
4824 */
4825 static vm_page_t
pmap_allocpte_alloc(pmap_t pmap,vm_pindex_t ptepindex,struct rwlock ** lockp,vm_offset_t va)4826 pmap_allocpte_alloc(pmap_t pmap, vm_pindex_t ptepindex, struct rwlock **lockp,
4827 vm_offset_t va)
4828 {
4829 vm_page_t m;
4830
4831 m = pmap_allocpte_nosleep(pmap, ptepindex, lockp, va);
4832 if (m == NULL && lockp != NULL) {
4833 RELEASE_PV_LIST_LOCK(lockp);
4834 PMAP_UNLOCK(pmap);
4835 PMAP_ASSERT_NOT_IN_DI();
4836 vm_wait(NULL);
4837 PMAP_LOCK(pmap);
4838 }
4839 return (m);
4840 }
4841
4842 static pd_entry_t *
pmap_alloc_pde(pmap_t pmap,vm_offset_t va,vm_page_t * pdpgp,struct rwlock ** lockp)4843 pmap_alloc_pde(pmap_t pmap, vm_offset_t va, vm_page_t *pdpgp,
4844 struct rwlock **lockp)
4845 {
4846 pdp_entry_t *pdpe, PG_V;
4847 pd_entry_t *pde;
4848 vm_page_t pdpg;
4849 vm_pindex_t pdpindex;
4850
4851 PG_V = pmap_valid_bit(pmap);
4852
4853 retry:
4854 pdpe = pmap_pdpe(pmap, va);
4855 if (pdpe != NULL && (*pdpe & PG_V) != 0) {
4856 pde = pmap_pdpe_to_pde(pdpe, va);
4857 if (va < VM_MAXUSER_ADDRESS) {
4858 /* Add a reference to the pd page. */
4859 pdpg = PHYS_TO_VM_PAGE(*pdpe & PG_FRAME);
4860 pdpg->ref_count++;
4861 } else
4862 pdpg = NULL;
4863 } else if (va < VM_MAXUSER_ADDRESS) {
4864 /* Allocate a pd page. */
4865 pdpindex = pmap_pde_pindex(va) >> NPDPEPGSHIFT;
4866 pdpg = pmap_allocpte_alloc(pmap, NUPDE + pdpindex, lockp, va);
4867 if (pdpg == NULL) {
4868 if (lockp != NULL)
4869 goto retry;
4870 else
4871 return (NULL);
4872 }
4873 pde = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pdpg));
4874 pde = &pde[pmap_pde_index(va)];
4875 } else
4876 panic("pmap_alloc_pde: missing page table page for va %#lx",
4877 va);
4878 *pdpgp = pdpg;
4879 return (pde);
4880 }
4881
4882 static vm_page_t
pmap_allocpte(pmap_t pmap,vm_offset_t va,struct rwlock ** lockp)4883 pmap_allocpte(pmap_t pmap, vm_offset_t va, struct rwlock **lockp)
4884 {
4885 vm_pindex_t ptepindex;
4886 pd_entry_t *pd, PG_V;
4887 vm_page_t m;
4888
4889 PG_V = pmap_valid_bit(pmap);
4890
4891 /*
4892 * Calculate pagetable page index
4893 */
4894 ptepindex = pmap_pde_pindex(va);
4895 retry:
4896 /*
4897 * Get the page directory entry
4898 */
4899 pd = pmap_pde(pmap, va);
4900
4901 /*
4902 * This supports switching from a 2MB page to a
4903 * normal 4K page.
4904 */
4905 if (pd != NULL && (*pd & (PG_PS | PG_V)) == (PG_PS | PG_V)) {
4906 if (!pmap_demote_pde_locked(pmap, pd, va, lockp)) {
4907 /*
4908 * Invalidation of the 2MB page mapping may have caused
4909 * the deallocation of the underlying PD page.
4910 */
4911 pd = NULL;
4912 }
4913 }
4914
4915 /*
4916 * If the page table page is mapped, we just increment the
4917 * hold count, and activate it.
4918 */
4919 if (pd != NULL && (*pd & PG_V) != 0) {
4920 m = PHYS_TO_VM_PAGE(*pd & PG_FRAME);
4921 m->ref_count++;
4922 } else {
4923 /*
4924 * Here if the pte page isn't mapped, or if it has been
4925 * deallocated.
4926 */
4927 m = pmap_allocpte_alloc(pmap, ptepindex, lockp, va);
4928 if (m == NULL && lockp != NULL)
4929 goto retry;
4930 }
4931 return (m);
4932 }
4933
4934 /***************************************************
4935 * Pmap allocation/deallocation routines.
4936 ***************************************************/
4937
4938 /*
4939 * Release any resources held by the given physical map.
4940 * Called when a pmap initialized by pmap_pinit is being released.
4941 * Should only be called if the map contains no valid mappings.
4942 */
4943 void
pmap_release(pmap_t pmap)4944 pmap_release(pmap_t pmap)
4945 {
4946 vm_page_t m;
4947 int i;
4948
4949 KASSERT(vm_radix_is_empty(&pmap->pm_root),
4950 ("pmap_release: pmap %p has reserved page table page(s)",
4951 pmap));
4952 KASSERT(CPU_EMPTY(&pmap->pm_active),
4953 ("releasing active pmap %p", pmap));
4954
4955 m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pmap->pm_pmltop));
4956
4957 if (pmap_is_la57(pmap)) {
4958 pmap->pm_pmltop[pmap_pml5e_index(UPT_MAX_ADDRESS)] = 0;
4959 pmap->pm_pmltop[PML5PML5I] = 0;
4960 } else {
4961 for (i = 0; i < NKPML4E; i++) /* KVA */
4962 pmap->pm_pmltop[KPML4BASE + i] = 0;
4963 #ifdef KASAN
4964 for (i = 0; i < NKASANPML4E; i++) /* KASAN shadow map */
4965 pmap->pm_pmltop[KASANPML4I + i] = 0;
4966 #endif
4967 #ifdef KMSAN
4968 for (i = 0; i < NKMSANSHADPML4E; i++) /* KMSAN shadow map */
4969 pmap->pm_pmltop[KMSANSHADPML4I + i] = 0;
4970 for (i = 0; i < NKMSANORIGPML4E; i++) /* KMSAN shadow map */
4971 pmap->pm_pmltop[KMSANORIGPML4I + i] = 0;
4972 #endif
4973 for (i = 0; i < ndmpdpphys; i++)/* Direct Map */
4974 pmap->pm_pmltop[DMPML4I + i] = 0;
4975 pmap->pm_pmltop[PML4PML4I] = 0; /* Recursive Mapping */
4976 for (i = 0; i < lm_ents; i++) /* Large Map */
4977 pmap->pm_pmltop[LMSPML4I + i] = 0;
4978 }
4979
4980 pmap_free_pt_page(NULL, m, true);
4981 pmap_pt_page_count_pinit(pmap, -1);
4982
4983 if (pmap->pm_pmltopu != NULL) {
4984 m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pmap->
4985 pm_pmltopu));
4986 pmap_free_pt_page(NULL, m, false);
4987 pmap_pt_page_count_pinit(pmap, -1);
4988 }
4989 if (pmap->pm_type == PT_X86 &&
4990 (cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0)
4991 rangeset_fini(&pmap->pm_pkru);
4992
4993 KASSERT(pmap->pm_stats.resident_count == 0,
4994 ("pmap_release: pmap %p resident count %ld != 0",
4995 pmap, pmap->pm_stats.resident_count));
4996 }
4997
4998 static int
kvm_size(SYSCTL_HANDLER_ARGS)4999 kvm_size(SYSCTL_HANDLER_ARGS)
5000 {
5001 unsigned long ksize = VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS;
5002
5003 return sysctl_handle_long(oidp, &ksize, 0, req);
5004 }
5005 SYSCTL_PROC(_vm, OID_AUTO, kvm_size, CTLTYPE_LONG | CTLFLAG_RD | CTLFLAG_MPSAFE,
5006 0, 0, kvm_size, "LU",
5007 "Size of KVM");
5008
5009 static int
kvm_free(SYSCTL_HANDLER_ARGS)5010 kvm_free(SYSCTL_HANDLER_ARGS)
5011 {
5012 unsigned long kfree = VM_MAX_KERNEL_ADDRESS - kernel_vm_end;
5013
5014 return sysctl_handle_long(oidp, &kfree, 0, req);
5015 }
5016 SYSCTL_PROC(_vm, OID_AUTO, kvm_free, CTLTYPE_LONG | CTLFLAG_RD | CTLFLAG_MPSAFE,
5017 0, 0, kvm_free, "LU",
5018 "Amount of KVM free");
5019
5020 #ifdef KMSAN
5021 static void
pmap_kmsan_shadow_map_page_array(vm_paddr_t pdppa,vm_size_t size)5022 pmap_kmsan_shadow_map_page_array(vm_paddr_t pdppa, vm_size_t size)
5023 {
5024 pdp_entry_t *pdpe;
5025 pd_entry_t *pde;
5026 pt_entry_t *pte;
5027 vm_paddr_t dummypa, dummypd, dummypt;
5028 int i, npde, npdpg;
5029
5030 npdpg = howmany(size, NBPDP);
5031 npde = size / NBPDR;
5032
5033 dummypa = vm_phys_early_alloc(-1, PAGE_SIZE);
5034 pagezero((void *)PHYS_TO_DMAP(dummypa));
5035
5036 dummypt = vm_phys_early_alloc(-1, PAGE_SIZE);
5037 pagezero((void *)PHYS_TO_DMAP(dummypt));
5038 dummypd = vm_phys_early_alloc(-1, PAGE_SIZE * npdpg);
5039 for (i = 0; i < npdpg; i++)
5040 pagezero((void *)PHYS_TO_DMAP(dummypd + ptoa(i)));
5041
5042 pte = (pt_entry_t *)PHYS_TO_DMAP(dummypt);
5043 for (i = 0; i < NPTEPG; i++)
5044 pte[i] = (pt_entry_t)(dummypa | X86_PG_V | X86_PG_RW |
5045 X86_PG_A | X86_PG_M | pg_nx);
5046
5047 pde = (pd_entry_t *)PHYS_TO_DMAP(dummypd);
5048 for (i = 0; i < npde; i++)
5049 pde[i] = (pd_entry_t)(dummypt | X86_PG_V | X86_PG_RW | pg_nx);
5050
5051 pdpe = (pdp_entry_t *)PHYS_TO_DMAP(pdppa);
5052 for (i = 0; i < npdpg; i++)
5053 pdpe[i] = (pdp_entry_t)(dummypd + ptoa(i) | X86_PG_V |
5054 X86_PG_RW | pg_nx);
5055 }
5056
5057 static void
pmap_kmsan_page_array_startup(vm_offset_t start,vm_offset_t end)5058 pmap_kmsan_page_array_startup(vm_offset_t start, vm_offset_t end)
5059 {
5060 vm_size_t size;
5061
5062 KASSERT(start % NBPDP == 0, ("unaligned page array start address"));
5063
5064 /*
5065 * The end of the page array's KVA region is 2MB aligned, see
5066 * kmem_init().
5067 */
5068 size = round_2mpage(end) - start;
5069 pmap_kmsan_shadow_map_page_array(KMSANSHADPDPphys, size);
5070 pmap_kmsan_shadow_map_page_array(KMSANORIGPDPphys, size);
5071 }
5072 #endif
5073
5074 /*
5075 * Allocate physical memory for the vm_page array and map it into KVA,
5076 * attempting to back the vm_pages with domain-local memory.
5077 */
5078 void
pmap_page_array_startup(long pages)5079 pmap_page_array_startup(long pages)
5080 {
5081 pdp_entry_t *pdpe;
5082 pd_entry_t *pde, newpdir;
5083 vm_offset_t va, start, end;
5084 vm_paddr_t pa;
5085 long pfn;
5086 int domain, i;
5087
5088 vm_page_array_size = pages;
5089
5090 start = VM_MIN_KERNEL_ADDRESS;
5091 end = start + pages * sizeof(struct vm_page);
5092 for (va = start; va < end; va += NBPDR) {
5093 pfn = first_page + (va - start) / sizeof(struct vm_page);
5094 domain = vm_phys_domain(ptoa(pfn));
5095 pdpe = pmap_pdpe(kernel_pmap, va);
5096 if ((*pdpe & X86_PG_V) == 0) {
5097 pa = vm_phys_early_alloc(domain, PAGE_SIZE);
5098 dump_add_page(pa);
5099 pagezero((void *)PHYS_TO_DMAP(pa));
5100 *pdpe = (pdp_entry_t)(pa | X86_PG_V | X86_PG_RW |
5101 X86_PG_A | X86_PG_M);
5102 }
5103 pde = pmap_pdpe_to_pde(pdpe, va);
5104 if ((*pde & X86_PG_V) != 0)
5105 panic("Unexpected pde");
5106 pa = vm_phys_early_alloc(domain, NBPDR);
5107 for (i = 0; i < NPDEPG; i++)
5108 dump_add_page(pa + i * PAGE_SIZE);
5109 newpdir = (pd_entry_t)(pa | X86_PG_V | X86_PG_RW | X86_PG_A |
5110 X86_PG_M | PG_PS | pg_g | pg_nx);
5111 pde_store(pde, newpdir);
5112 }
5113 vm_page_array = (vm_page_t)start;
5114
5115 #ifdef KMSAN
5116 pmap_kmsan_page_array_startup(start, end);
5117 #endif
5118 }
5119
5120 /*
5121 * grow the number of kernel page table entries, if needed
5122 */
5123 void
pmap_growkernel(vm_offset_t addr)5124 pmap_growkernel(vm_offset_t addr)
5125 {
5126 vm_paddr_t paddr;
5127 vm_page_t nkpg;
5128 pd_entry_t *pde, newpdir;
5129 pdp_entry_t *pdpe;
5130 vm_offset_t end;
5131
5132 TSENTER();
5133 mtx_assert(&kernel_map->system_mtx, MA_OWNED);
5134
5135 /*
5136 * The kernel map covers two distinct regions of KVA: that used
5137 * for dynamic kernel memory allocations, and the uppermost 2GB
5138 * of the virtual address space. The latter is used to map the
5139 * kernel and loadable kernel modules. This scheme enables the
5140 * use of a special code generation model for kernel code which
5141 * takes advantage of compact addressing modes in machine code.
5142 *
5143 * Both regions grow upwards; to avoid wasting memory, the gap
5144 * in between is unmapped. If "addr" is above "KERNBASE", the
5145 * kernel's region is grown, otherwise the kmem region is grown.
5146 *
5147 * The correctness of this action is based on the following
5148 * argument: vm_map_insert() allocates contiguous ranges of the
5149 * kernel virtual address space. It calls this function if a range
5150 * ends after "kernel_vm_end". If the kernel is mapped between
5151 * "kernel_vm_end" and "addr", then the range cannot begin at
5152 * "kernel_vm_end". In fact, its beginning address cannot be less
5153 * than the kernel. Thus, there is no immediate need to allocate
5154 * any new kernel page table pages between "kernel_vm_end" and
5155 * "KERNBASE".
5156 */
5157 if (KERNBASE < addr) {
5158 end = KERNBASE + nkpt * NBPDR;
5159 if (end == 0) {
5160 TSEXIT();
5161 return;
5162 }
5163 } else {
5164 end = kernel_vm_end;
5165 }
5166
5167 addr = roundup2(addr, NBPDR);
5168 if (addr - 1 >= vm_map_max(kernel_map))
5169 addr = vm_map_max(kernel_map);
5170 if (addr <= end) {
5171 /*
5172 * The grown region is already mapped, so there is
5173 * nothing to do.
5174 */
5175 TSEXIT();
5176 return;
5177 }
5178
5179 kasan_shadow_map(end, addr - end);
5180 kmsan_shadow_map(end, addr - end);
5181 while (end < addr) {
5182 pdpe = pmap_pdpe(kernel_pmap, end);
5183 if ((*pdpe & X86_PG_V) == 0) {
5184 nkpg = pmap_alloc_pt_page(kernel_pmap,
5185 pmap_pdpe_pindex(end), VM_ALLOC_WIRED |
5186 VM_ALLOC_INTERRUPT | VM_ALLOC_ZERO);
5187 if (nkpg == NULL)
5188 panic("pmap_growkernel: no memory to grow kernel");
5189 paddr = VM_PAGE_TO_PHYS(nkpg);
5190 *pdpe = (pdp_entry_t)(paddr | X86_PG_V | X86_PG_RW |
5191 X86_PG_A | X86_PG_M);
5192 continue; /* try again */
5193 }
5194 pde = pmap_pdpe_to_pde(pdpe, end);
5195 if ((*pde & X86_PG_V) != 0) {
5196 end = (end + NBPDR) & ~PDRMASK;
5197 if (end - 1 >= vm_map_max(kernel_map)) {
5198 end = vm_map_max(kernel_map);
5199 break;
5200 }
5201 continue;
5202 }
5203
5204 nkpg = pmap_alloc_pt_page(kernel_pmap, pmap_pde_pindex(end),
5205 VM_ALLOC_WIRED | VM_ALLOC_INTERRUPT | VM_ALLOC_ZERO);
5206 if (nkpg == NULL)
5207 panic("pmap_growkernel: no memory to grow kernel");
5208 paddr = VM_PAGE_TO_PHYS(nkpg);
5209 newpdir = paddr | X86_PG_V | X86_PG_RW | X86_PG_A | X86_PG_M;
5210 pde_store(pde, newpdir);
5211
5212 end = (end + NBPDR) & ~PDRMASK;
5213 if (end - 1 >= vm_map_max(kernel_map)) {
5214 end = vm_map_max(kernel_map);
5215 break;
5216 }
5217 }
5218
5219 if (end <= KERNBASE)
5220 kernel_vm_end = end;
5221 else
5222 nkpt = howmany(end - KERNBASE, NBPDR);
5223 TSEXIT();
5224 }
5225
5226 /***************************************************
5227 * page management routines.
5228 ***************************************************/
5229
5230 static const uint64_t pc_freemask[_NPCM] = {
5231 [0 ... _NPCM - 2] = PC_FREEN,
5232 [_NPCM - 1] = PC_FREEL
5233 };
5234
5235 #ifdef PV_STATS
5236
5237 static COUNTER_U64_DEFINE_EARLY(pc_chunk_count);
5238 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pc_chunk_count, CTLFLAG_RD,
5239 &pc_chunk_count, "Current number of pv entry cnunks");
5240
5241 static COUNTER_U64_DEFINE_EARLY(pc_chunk_allocs);
5242 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pc_chunk_allocs, CTLFLAG_RD,
5243 &pc_chunk_allocs, "Total number of pv entry chunks allocated");
5244
5245 static COUNTER_U64_DEFINE_EARLY(pc_chunk_frees);
5246 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pc_chunk_frees, CTLFLAG_RD,
5247 &pc_chunk_frees, "Total number of pv entry chunks freed");
5248
5249 static COUNTER_U64_DEFINE_EARLY(pc_chunk_tryfail);
5250 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pc_chunk_tryfail, CTLFLAG_RD,
5251 &pc_chunk_tryfail,
5252 "Number of failed attempts to get a pv entry chunk page");
5253
5254 static COUNTER_U64_DEFINE_EARLY(pv_entry_frees);
5255 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pv_entry_frees, CTLFLAG_RD,
5256 &pv_entry_frees, "Total number of pv entries freed");
5257
5258 static COUNTER_U64_DEFINE_EARLY(pv_entry_allocs);
5259 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD,
5260 &pv_entry_allocs, "Total number of pv entries allocated");
5261
5262 static COUNTER_U64_DEFINE_EARLY(pv_entry_count);
5263 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pv_entry_count, CTLFLAG_RD,
5264 &pv_entry_count, "Current number of pv entries");
5265
5266 static COUNTER_U64_DEFINE_EARLY(pv_entry_spare);
5267 SYSCTL_COUNTER_U64(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD,
5268 &pv_entry_spare, "Current number of spare pv entries");
5269 #endif
5270
5271 static void
reclaim_pv_chunk_leave_pmap(pmap_t pmap,pmap_t locked_pmap,bool start_di)5272 reclaim_pv_chunk_leave_pmap(pmap_t pmap, pmap_t locked_pmap, bool start_di)
5273 {
5274
5275 if (pmap == NULL)
5276 return;
5277 pmap_invalidate_all(pmap);
5278 if (pmap != locked_pmap)
5279 PMAP_UNLOCK(pmap);
5280 if (start_di)
5281 pmap_delayed_invl_finish();
5282 }
5283
5284 /*
5285 * We are in a serious low memory condition. Resort to
5286 * drastic measures to free some pages so we can allocate
5287 * another pv entry chunk.
5288 *
5289 * Returns NULL if PV entries were reclaimed from the specified pmap.
5290 *
5291 * We do not, however, unmap 2mpages because subsequent accesses will
5292 * allocate per-page pv entries until repromotion occurs, thereby
5293 * exacerbating the shortage of free pv entries.
5294 */
5295 static vm_page_t
reclaim_pv_chunk_domain(pmap_t locked_pmap,struct rwlock ** lockp,int domain)5296 reclaim_pv_chunk_domain(pmap_t locked_pmap, struct rwlock **lockp, int domain)
5297 {
5298 struct pv_chunks_list *pvc;
5299 struct pv_chunk *pc, *pc_marker, *pc_marker_end;
5300 struct pv_chunk_header pc_marker_b, pc_marker_end_b;
5301 struct md_page *pvh;
5302 pd_entry_t *pde;
5303 pmap_t next_pmap, pmap;
5304 pt_entry_t *pte, tpte;
5305 pt_entry_t PG_G, PG_A, PG_M, PG_RW;
5306 pv_entry_t pv;
5307 vm_offset_t va;
5308 vm_page_t m, m_pc;
5309 struct spglist free;
5310 uint64_t inuse;
5311 int bit, field, freed;
5312 bool start_di, restart;
5313
5314 PMAP_LOCK_ASSERT(locked_pmap, MA_OWNED);
5315 KASSERT(lockp != NULL, ("reclaim_pv_chunk: lockp is NULL"));
5316 pmap = NULL;
5317 m_pc = NULL;
5318 PG_G = PG_A = PG_M = PG_RW = 0;
5319 SLIST_INIT(&free);
5320 bzero(&pc_marker_b, sizeof(pc_marker_b));
5321 bzero(&pc_marker_end_b, sizeof(pc_marker_end_b));
5322 pc_marker = (struct pv_chunk *)&pc_marker_b;
5323 pc_marker_end = (struct pv_chunk *)&pc_marker_end_b;
5324
5325 /*
5326 * A delayed invalidation block should already be active if
5327 * pmap_advise() or pmap_remove() called this function by way
5328 * of pmap_demote_pde_locked().
5329 */
5330 start_di = pmap_not_in_di();
5331
5332 pvc = &pv_chunks[domain];
5333 mtx_lock(&pvc->pvc_lock);
5334 pvc->active_reclaims++;
5335 TAILQ_INSERT_HEAD(&pvc->pvc_list, pc_marker, pc_lru);
5336 TAILQ_INSERT_TAIL(&pvc->pvc_list, pc_marker_end, pc_lru);
5337 while ((pc = TAILQ_NEXT(pc_marker, pc_lru)) != pc_marker_end &&
5338 SLIST_EMPTY(&free)) {
5339 next_pmap = pc->pc_pmap;
5340 if (next_pmap == NULL) {
5341 /*
5342 * The next chunk is a marker. However, it is
5343 * not our marker, so active_reclaims must be
5344 * > 1. Consequently, the next_chunk code
5345 * will not rotate the pv_chunks list.
5346 */
5347 goto next_chunk;
5348 }
5349 mtx_unlock(&pvc->pvc_lock);
5350
5351 /*
5352 * A pv_chunk can only be removed from the pc_lru list
5353 * when both pc_chunks_mutex is owned and the
5354 * corresponding pmap is locked.
5355 */
5356 if (pmap != next_pmap) {
5357 restart = false;
5358 reclaim_pv_chunk_leave_pmap(pmap, locked_pmap,
5359 start_di);
5360 pmap = next_pmap;
5361 /* Avoid deadlock and lock recursion. */
5362 if (pmap > locked_pmap) {
5363 RELEASE_PV_LIST_LOCK(lockp);
5364 PMAP_LOCK(pmap);
5365 if (start_di)
5366 pmap_delayed_invl_start();
5367 mtx_lock(&pvc->pvc_lock);
5368 restart = true;
5369 } else if (pmap != locked_pmap) {
5370 if (PMAP_TRYLOCK(pmap)) {
5371 if (start_di)
5372 pmap_delayed_invl_start();
5373 mtx_lock(&pvc->pvc_lock);
5374 restart = true;
5375 } else {
5376 pmap = NULL; /* pmap is not locked */
5377 mtx_lock(&pvc->pvc_lock);
5378 pc = TAILQ_NEXT(pc_marker, pc_lru);
5379 if (pc == NULL ||
5380 pc->pc_pmap != next_pmap)
5381 continue;
5382 goto next_chunk;
5383 }
5384 } else if (start_di)
5385 pmap_delayed_invl_start();
5386 PG_G = pmap_global_bit(pmap);
5387 PG_A = pmap_accessed_bit(pmap);
5388 PG_M = pmap_modified_bit(pmap);
5389 PG_RW = pmap_rw_bit(pmap);
5390 if (restart)
5391 continue;
5392 }
5393
5394 /*
5395 * Destroy every non-wired, 4 KB page mapping in the chunk.
5396 */
5397 freed = 0;
5398 for (field = 0; field < _NPCM; field++) {
5399 for (inuse = ~pc->pc_map[field] & pc_freemask[field];
5400 inuse != 0; inuse &= ~(1UL << bit)) {
5401 bit = bsfq(inuse);
5402 pv = &pc->pc_pventry[field * 64 + bit];
5403 va = pv->pv_va;
5404 pde = pmap_pde(pmap, va);
5405 if ((*pde & PG_PS) != 0)
5406 continue;
5407 pte = pmap_pde_to_pte(pde, va);
5408 if ((*pte & PG_W) != 0)
5409 continue;
5410 tpte = pte_load_clear(pte);
5411 if ((tpte & PG_G) != 0)
5412 pmap_invalidate_page(pmap, va);
5413 m = PHYS_TO_VM_PAGE(tpte & PG_FRAME);
5414 if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
5415 vm_page_dirty(m);
5416 if ((tpte & PG_A) != 0)
5417 vm_page_aflag_set(m, PGA_REFERENCED);
5418 CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m);
5419 TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
5420 m->md.pv_gen++;
5421 if (TAILQ_EMPTY(&m->md.pv_list) &&
5422 (m->flags & PG_FICTITIOUS) == 0) {
5423 pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
5424 if (TAILQ_EMPTY(&pvh->pv_list)) {
5425 vm_page_aflag_clear(m,
5426 PGA_WRITEABLE);
5427 }
5428 }
5429 pmap_delayed_invl_page(m);
5430 pc->pc_map[field] |= 1UL << bit;
5431 pmap_unuse_pt(pmap, va, *pde, &free);
5432 freed++;
5433 }
5434 }
5435 if (freed == 0) {
5436 mtx_lock(&pvc->pvc_lock);
5437 goto next_chunk;
5438 }
5439 /* Every freed mapping is for a 4 KB page. */
5440 pmap_resident_count_adj(pmap, -freed);
5441 PV_STAT(counter_u64_add(pv_entry_frees, freed));
5442 PV_STAT(counter_u64_add(pv_entry_spare, freed));
5443 PV_STAT(counter_u64_add(pv_entry_count, -freed));
5444 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
5445 if (pc_is_free(pc)) {
5446 PV_STAT(counter_u64_add(pv_entry_spare, -_NPCPV));
5447 PV_STAT(counter_u64_add(pc_chunk_count, -1));
5448 PV_STAT(counter_u64_add(pc_chunk_frees, 1));
5449 /* Entire chunk is free; return it. */
5450 m_pc = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
5451 dump_drop_page(m_pc->phys_addr);
5452 mtx_lock(&pvc->pvc_lock);
5453 TAILQ_REMOVE(&pvc->pvc_list, pc, pc_lru);
5454 break;
5455 }
5456 TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
5457 mtx_lock(&pvc->pvc_lock);
5458 /* One freed pv entry in locked_pmap is sufficient. */
5459 if (pmap == locked_pmap)
5460 break;
5461 next_chunk:
5462 TAILQ_REMOVE(&pvc->pvc_list, pc_marker, pc_lru);
5463 TAILQ_INSERT_AFTER(&pvc->pvc_list, pc, pc_marker, pc_lru);
5464 if (pvc->active_reclaims == 1 && pmap != NULL) {
5465 /*
5466 * Rotate the pv chunks list so that we do not
5467 * scan the same pv chunks that could not be
5468 * freed (because they contained a wired
5469 * and/or superpage mapping) on every
5470 * invocation of reclaim_pv_chunk().
5471 */
5472 while ((pc = TAILQ_FIRST(&pvc->pvc_list)) != pc_marker) {
5473 MPASS(pc->pc_pmap != NULL);
5474 TAILQ_REMOVE(&pvc->pvc_list, pc, pc_lru);
5475 TAILQ_INSERT_TAIL(&pvc->pvc_list, pc, pc_lru);
5476 }
5477 }
5478 }
5479 TAILQ_REMOVE(&pvc->pvc_list, pc_marker, pc_lru);
5480 TAILQ_REMOVE(&pvc->pvc_list, pc_marker_end, pc_lru);
5481 pvc->active_reclaims--;
5482 mtx_unlock(&pvc->pvc_lock);
5483 reclaim_pv_chunk_leave_pmap(pmap, locked_pmap, start_di);
5484 if (m_pc == NULL && !SLIST_EMPTY(&free)) {
5485 m_pc = SLIST_FIRST(&free);
5486 SLIST_REMOVE_HEAD(&free, plinks.s.ss);
5487 /* Recycle a freed page table page. */
5488 m_pc->ref_count = 1;
5489 }
5490 vm_page_free_pages_toq(&free, true);
5491 return (m_pc);
5492 }
5493
5494 static vm_page_t
reclaim_pv_chunk(pmap_t locked_pmap,struct rwlock ** lockp)5495 reclaim_pv_chunk(pmap_t locked_pmap, struct rwlock **lockp)
5496 {
5497 vm_page_t m;
5498 int i, domain;
5499
5500 domain = PCPU_GET(domain);
5501 for (i = 0; i < vm_ndomains; i++) {
5502 m = reclaim_pv_chunk_domain(locked_pmap, lockp, domain);
5503 if (m != NULL)
5504 break;
5505 domain = (domain + 1) % vm_ndomains;
5506 }
5507
5508 return (m);
5509 }
5510
5511 /*
5512 * free the pv_entry back to the free list
5513 */
5514 static void
free_pv_entry(pmap_t pmap,pv_entry_t pv)5515 free_pv_entry(pmap_t pmap, pv_entry_t pv)
5516 {
5517 struct pv_chunk *pc;
5518 int idx, field, bit;
5519
5520 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
5521 PV_STAT(counter_u64_add(pv_entry_frees, 1));
5522 PV_STAT(counter_u64_add(pv_entry_spare, 1));
5523 PV_STAT(counter_u64_add(pv_entry_count, -1));
5524 pc = pv_to_chunk(pv);
5525 idx = pv - &pc->pc_pventry[0];
5526 field = idx / 64;
5527 bit = idx % 64;
5528 pc->pc_map[field] |= 1ul << bit;
5529 if (!pc_is_free(pc)) {
5530 /* 98% of the time, pc is already at the head of the list. */
5531 if (__predict_false(pc != TAILQ_FIRST(&pmap->pm_pvchunk))) {
5532 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
5533 TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
5534 }
5535 return;
5536 }
5537 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
5538 free_pv_chunk(pc);
5539 }
5540
5541 static void
free_pv_chunk_dequeued(struct pv_chunk * pc)5542 free_pv_chunk_dequeued(struct pv_chunk *pc)
5543 {
5544 vm_page_t m;
5545
5546 PV_STAT(counter_u64_add(pv_entry_spare, -_NPCPV));
5547 PV_STAT(counter_u64_add(pc_chunk_count, -1));
5548 PV_STAT(counter_u64_add(pc_chunk_frees, 1));
5549 counter_u64_add(pv_page_count, -1);
5550 /* entire chunk is free, return it */
5551 m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
5552 dump_drop_page(m->phys_addr);
5553 vm_page_unwire_noq(m);
5554 vm_page_free(m);
5555 }
5556
5557 static void
free_pv_chunk(struct pv_chunk * pc)5558 free_pv_chunk(struct pv_chunk *pc)
5559 {
5560 struct pv_chunks_list *pvc;
5561
5562 pvc = &pv_chunks[pc_to_domain(pc)];
5563 mtx_lock(&pvc->pvc_lock);
5564 TAILQ_REMOVE(&pvc->pvc_list, pc, pc_lru);
5565 mtx_unlock(&pvc->pvc_lock);
5566 free_pv_chunk_dequeued(pc);
5567 }
5568
5569 static void
free_pv_chunk_batch(struct pv_chunklist * batch)5570 free_pv_chunk_batch(struct pv_chunklist *batch)
5571 {
5572 struct pv_chunks_list *pvc;
5573 struct pv_chunk *pc, *npc;
5574 int i;
5575
5576 for (i = 0; i < vm_ndomains; i++) {
5577 if (TAILQ_EMPTY(&batch[i]))
5578 continue;
5579 pvc = &pv_chunks[i];
5580 mtx_lock(&pvc->pvc_lock);
5581 TAILQ_FOREACH(pc, &batch[i], pc_list) {
5582 TAILQ_REMOVE(&pvc->pvc_list, pc, pc_lru);
5583 }
5584 mtx_unlock(&pvc->pvc_lock);
5585 }
5586
5587 for (i = 0; i < vm_ndomains; i++) {
5588 TAILQ_FOREACH_SAFE(pc, &batch[i], pc_list, npc) {
5589 free_pv_chunk_dequeued(pc);
5590 }
5591 }
5592 }
5593
5594 /*
5595 * Returns a new PV entry, allocating a new PV chunk from the system when
5596 * needed. If this PV chunk allocation fails and a PV list lock pointer was
5597 * given, a PV chunk is reclaimed from an arbitrary pmap. Otherwise, NULL is
5598 * returned.
5599 *
5600 * The given PV list lock may be released.
5601 */
5602 static pv_entry_t
get_pv_entry(pmap_t pmap,struct rwlock ** lockp)5603 get_pv_entry(pmap_t pmap, struct rwlock **lockp)
5604 {
5605 struct pv_chunks_list *pvc;
5606 int bit, field;
5607 pv_entry_t pv;
5608 struct pv_chunk *pc;
5609 vm_page_t m;
5610
5611 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
5612 PV_STAT(counter_u64_add(pv_entry_allocs, 1));
5613 retry:
5614 pc = TAILQ_FIRST(&pmap->pm_pvchunk);
5615 if (pc != NULL) {
5616 for (field = 0; field < _NPCM; field++) {
5617 if (pc->pc_map[field]) {
5618 bit = bsfq(pc->pc_map[field]);
5619 break;
5620 }
5621 }
5622 if (field < _NPCM) {
5623 pv = &pc->pc_pventry[field * 64 + bit];
5624 pc->pc_map[field] &= ~(1ul << bit);
5625 /* If this was the last item, move it to tail */
5626 if (pc->pc_map[0] == 0 && pc->pc_map[1] == 0 &&
5627 pc->pc_map[2] == 0) {
5628 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
5629 TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc,
5630 pc_list);
5631 }
5632 PV_STAT(counter_u64_add(pv_entry_count, 1));
5633 PV_STAT(counter_u64_add(pv_entry_spare, -1));
5634 return (pv);
5635 }
5636 }
5637 /* No free items, allocate another chunk */
5638 m = vm_page_alloc_noobj(VM_ALLOC_WIRED);
5639 if (m == NULL) {
5640 if (lockp == NULL) {
5641 PV_STAT(counter_u64_add(pc_chunk_tryfail, 1));
5642 return (NULL);
5643 }
5644 m = reclaim_pv_chunk(pmap, lockp);
5645 if (m == NULL)
5646 goto retry;
5647 } else
5648 counter_u64_add(pv_page_count, 1);
5649 PV_STAT(counter_u64_add(pc_chunk_count, 1));
5650 PV_STAT(counter_u64_add(pc_chunk_allocs, 1));
5651 dump_add_page(m->phys_addr);
5652 pc = (void *)PHYS_TO_DMAP(m->phys_addr);
5653 pc->pc_pmap = pmap;
5654 pc->pc_map[0] = PC_FREEN & ~1ul; /* preallocated bit 0 */
5655 pc->pc_map[1] = PC_FREEN;
5656 pc->pc_map[2] = PC_FREEL;
5657 pvc = &pv_chunks[vm_page_domain(m)];
5658 mtx_lock(&pvc->pvc_lock);
5659 TAILQ_INSERT_TAIL(&pvc->pvc_list, pc, pc_lru);
5660 mtx_unlock(&pvc->pvc_lock);
5661 pv = &pc->pc_pventry[0];
5662 TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
5663 PV_STAT(counter_u64_add(pv_entry_count, 1));
5664 PV_STAT(counter_u64_add(pv_entry_spare, _NPCPV - 1));
5665 return (pv);
5666 }
5667
5668 /*
5669 * Returns the number of one bits within the given PV chunk map.
5670 *
5671 * The erratas for Intel processors state that "POPCNT Instruction May
5672 * Take Longer to Execute Than Expected". It is believed that the
5673 * issue is the spurious dependency on the destination register.
5674 * Provide a hint to the register rename logic that the destination
5675 * value is overwritten, by clearing it, as suggested in the
5676 * optimization manual. It should be cheap for unaffected processors
5677 * as well.
5678 *
5679 * Reference numbers for erratas are
5680 * 4th Gen Core: HSD146
5681 * 5th Gen Core: BDM85
5682 * 6th Gen Core: SKL029
5683 */
5684 static int
popcnt_pc_map_pq(uint64_t * map)5685 popcnt_pc_map_pq(uint64_t *map)
5686 {
5687 u_long result, tmp;
5688
5689 __asm __volatile("xorl %k0,%k0;popcntq %2,%0;"
5690 "xorl %k1,%k1;popcntq %3,%1;addl %k1,%k0;"
5691 "xorl %k1,%k1;popcntq %4,%1;addl %k1,%k0"
5692 : "=&r" (result), "=&r" (tmp)
5693 : "m" (map[0]), "m" (map[1]), "m" (map[2]));
5694 return (result);
5695 }
5696
5697 /*
5698 * Ensure that the number of spare PV entries in the specified pmap meets or
5699 * exceeds the given count, "needed".
5700 *
5701 * The given PV list lock may be released.
5702 */
5703 static void
reserve_pv_entries(pmap_t pmap,int needed,struct rwlock ** lockp)5704 reserve_pv_entries(pmap_t pmap, int needed, struct rwlock **lockp)
5705 {
5706 struct pv_chunks_list *pvc;
5707 struct pch new_tail[PMAP_MEMDOM];
5708 struct pv_chunk *pc;
5709 vm_page_t m;
5710 int avail, free, i;
5711 bool reclaimed;
5712
5713 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
5714 KASSERT(lockp != NULL, ("reserve_pv_entries: lockp is NULL"));
5715
5716 /*
5717 * Newly allocated PV chunks must be stored in a private list until
5718 * the required number of PV chunks have been allocated. Otherwise,
5719 * reclaim_pv_chunk() could recycle one of these chunks. In
5720 * contrast, these chunks must be added to the pmap upon allocation.
5721 */
5722 for (i = 0; i < PMAP_MEMDOM; i++)
5723 TAILQ_INIT(&new_tail[i]);
5724 retry:
5725 avail = 0;
5726 TAILQ_FOREACH(pc, &pmap->pm_pvchunk, pc_list) {
5727 #ifndef __POPCNT__
5728 if ((cpu_feature2 & CPUID2_POPCNT) == 0)
5729 bit_count((bitstr_t *)pc->pc_map, 0,
5730 sizeof(pc->pc_map) * NBBY, &free);
5731 else
5732 #endif
5733 free = popcnt_pc_map_pq(pc->pc_map);
5734 if (free == 0)
5735 break;
5736 avail += free;
5737 if (avail >= needed)
5738 break;
5739 }
5740 for (reclaimed = false; avail < needed; avail += _NPCPV) {
5741 m = vm_page_alloc_noobj(VM_ALLOC_WIRED);
5742 if (m == NULL) {
5743 m = reclaim_pv_chunk(pmap, lockp);
5744 if (m == NULL)
5745 goto retry;
5746 reclaimed = true;
5747 } else
5748 counter_u64_add(pv_page_count, 1);
5749 PV_STAT(counter_u64_add(pc_chunk_count, 1));
5750 PV_STAT(counter_u64_add(pc_chunk_allocs, 1));
5751 dump_add_page(m->phys_addr);
5752 pc = (void *)PHYS_TO_DMAP(m->phys_addr);
5753 pc->pc_pmap = pmap;
5754 pc->pc_map[0] = PC_FREEN;
5755 pc->pc_map[1] = PC_FREEN;
5756 pc->pc_map[2] = PC_FREEL;
5757 TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
5758 TAILQ_INSERT_TAIL(&new_tail[vm_page_domain(m)], pc, pc_lru);
5759 PV_STAT(counter_u64_add(pv_entry_spare, _NPCPV));
5760
5761 /*
5762 * The reclaim might have freed a chunk from the current pmap.
5763 * If that chunk contained available entries, we need to
5764 * re-count the number of available entries.
5765 */
5766 if (reclaimed)
5767 goto retry;
5768 }
5769 for (i = 0; i < vm_ndomains; i++) {
5770 if (TAILQ_EMPTY(&new_tail[i]))
5771 continue;
5772 pvc = &pv_chunks[i];
5773 mtx_lock(&pvc->pvc_lock);
5774 TAILQ_CONCAT(&pvc->pvc_list, &new_tail[i], pc_lru);
5775 mtx_unlock(&pvc->pvc_lock);
5776 }
5777 }
5778
5779 /*
5780 * First find and then remove the pv entry for the specified pmap and virtual
5781 * address from the specified pv list. Returns the pv entry if found and NULL
5782 * otherwise. This operation can be performed on pv lists for either 4KB or
5783 * 2MB page mappings.
5784 */
5785 static __inline pv_entry_t
pmap_pvh_remove(struct md_page * pvh,pmap_t pmap,vm_offset_t va)5786 pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
5787 {
5788 pv_entry_t pv;
5789
5790 TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
5791 if (pmap == PV_PMAP(pv) && va == pv->pv_va) {
5792 TAILQ_REMOVE(&pvh->pv_list, pv, pv_next);
5793 pvh->pv_gen++;
5794 break;
5795 }
5796 }
5797 return (pv);
5798 }
5799
5800 /*
5801 * After demotion from a 2MB page mapping to 512 4KB page mappings,
5802 * destroy the pv entry for the 2MB page mapping and reinstantiate the pv
5803 * entries for each of the 4KB page mappings.
5804 */
5805 static void
pmap_pv_demote_pde(pmap_t pmap,vm_offset_t va,vm_paddr_t pa,struct rwlock ** lockp)5806 pmap_pv_demote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
5807 struct rwlock **lockp)
5808 {
5809 struct md_page *pvh;
5810 struct pv_chunk *pc;
5811 pv_entry_t pv;
5812 vm_offset_t va_last;
5813 vm_page_t m;
5814 int bit, field;
5815
5816 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
5817 KASSERT((pa & PDRMASK) == 0,
5818 ("pmap_pv_demote_pde: pa is not 2mpage aligned"));
5819 CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa);
5820
5821 /*
5822 * Transfer the 2mpage's pv entry for this mapping to the first
5823 * page's pv list. Once this transfer begins, the pv list lock
5824 * must not be released until the last pv entry is reinstantiated.
5825 */
5826 pvh = pa_to_pvh(pa);
5827 va = trunc_2mpage(va);
5828 pv = pmap_pvh_remove(pvh, pmap, va);
5829 KASSERT(pv != NULL, ("pmap_pv_demote_pde: pv not found"));
5830 m = PHYS_TO_VM_PAGE(pa);
5831 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
5832 m->md.pv_gen++;
5833 /* Instantiate the remaining NPTEPG - 1 pv entries. */
5834 PV_STAT(counter_u64_add(pv_entry_allocs, NPTEPG - 1));
5835 va_last = va + NBPDR - PAGE_SIZE;
5836 for (;;) {
5837 pc = TAILQ_FIRST(&pmap->pm_pvchunk);
5838 KASSERT(pc->pc_map[0] != 0 || pc->pc_map[1] != 0 ||
5839 pc->pc_map[2] != 0, ("pmap_pv_demote_pde: missing spare"));
5840 for (field = 0; field < _NPCM; field++) {
5841 while (pc->pc_map[field]) {
5842 bit = bsfq(pc->pc_map[field]);
5843 pc->pc_map[field] &= ~(1ul << bit);
5844 pv = &pc->pc_pventry[field * 64 + bit];
5845 va += PAGE_SIZE;
5846 pv->pv_va = va;
5847 m++;
5848 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
5849 ("pmap_pv_demote_pde: page %p is not managed", m));
5850 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
5851 m->md.pv_gen++;
5852 if (va == va_last)
5853 goto out;
5854 }
5855 }
5856 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
5857 TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list);
5858 }
5859 out:
5860 if (pc->pc_map[0] == 0 && pc->pc_map[1] == 0 && pc->pc_map[2] == 0) {
5861 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
5862 TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc, pc_list);
5863 }
5864 PV_STAT(counter_u64_add(pv_entry_count, NPTEPG - 1));
5865 PV_STAT(counter_u64_add(pv_entry_spare, -(NPTEPG - 1)));
5866 }
5867
5868 #if VM_NRESERVLEVEL > 0
5869 /*
5870 * After promotion from 512 4KB page mappings to a single 2MB page mapping,
5871 * replace the many pv entries for the 4KB page mappings by a single pv entry
5872 * for the 2MB page mapping.
5873 */
5874 static void
pmap_pv_promote_pde(pmap_t pmap,vm_offset_t va,vm_paddr_t pa,struct rwlock ** lockp)5875 pmap_pv_promote_pde(pmap_t pmap, vm_offset_t va, vm_paddr_t pa,
5876 struct rwlock **lockp)
5877 {
5878 struct md_page *pvh;
5879 pv_entry_t pv;
5880 vm_offset_t va_last;
5881 vm_page_t m;
5882
5883 KASSERT((pa & PDRMASK) == 0,
5884 ("pmap_pv_promote_pde: pa is not 2mpage aligned"));
5885 CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa);
5886
5887 /*
5888 * Transfer the first page's pv entry for this mapping to the 2mpage's
5889 * pv list. Aside from avoiding the cost of a call to get_pv_entry(),
5890 * a transfer avoids the possibility that get_pv_entry() calls
5891 * reclaim_pv_chunk() and that reclaim_pv_chunk() removes one of the
5892 * mappings that is being promoted.
5893 */
5894 m = PHYS_TO_VM_PAGE(pa);
5895 va = trunc_2mpage(va);
5896 pv = pmap_pvh_remove(&m->md, pmap, va);
5897 KASSERT(pv != NULL, ("pmap_pv_promote_pde: pv not found"));
5898 pvh = pa_to_pvh(pa);
5899 TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_next);
5900 pvh->pv_gen++;
5901 /* Free the remaining NPTEPG - 1 pv entries. */
5902 va_last = va + NBPDR - PAGE_SIZE;
5903 do {
5904 m++;
5905 va += PAGE_SIZE;
5906 pmap_pvh_free(&m->md, pmap, va);
5907 } while (va < va_last);
5908 }
5909 #endif /* VM_NRESERVLEVEL > 0 */
5910
5911 /*
5912 * First find and then destroy the pv entry for the specified pmap and virtual
5913 * address. This operation can be performed on pv lists for either 4KB or 2MB
5914 * page mappings.
5915 */
5916 static void
pmap_pvh_free(struct md_page * pvh,pmap_t pmap,vm_offset_t va)5917 pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
5918 {
5919 pv_entry_t pv;
5920
5921 pv = pmap_pvh_remove(pvh, pmap, va);
5922 KASSERT(pv != NULL, ("pmap_pvh_free: pv not found"));
5923 free_pv_entry(pmap, pv);
5924 }
5925
5926 /*
5927 * Conditionally create the PV entry for a 4KB page mapping if the required
5928 * memory can be allocated without resorting to reclamation.
5929 */
5930 static boolean_t
pmap_try_insert_pv_entry(pmap_t pmap,vm_offset_t va,vm_page_t m,struct rwlock ** lockp)5931 pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m,
5932 struct rwlock **lockp)
5933 {
5934 pv_entry_t pv;
5935
5936 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
5937 /* Pass NULL instead of the lock pointer to disable reclamation. */
5938 if ((pv = get_pv_entry(pmap, NULL)) != NULL) {
5939 pv->pv_va = va;
5940 CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m);
5941 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
5942 m->md.pv_gen++;
5943 return (TRUE);
5944 } else
5945 return (FALSE);
5946 }
5947
5948 /*
5949 * Create the PV entry for a 2MB page mapping. Always returns true unless the
5950 * flag PMAP_ENTER_NORECLAIM is specified. If that flag is specified, returns
5951 * false if the PV entry cannot be allocated without resorting to reclamation.
5952 */
5953 static bool
pmap_pv_insert_pde(pmap_t pmap,vm_offset_t va,pd_entry_t pde,u_int flags,struct rwlock ** lockp)5954 pmap_pv_insert_pde(pmap_t pmap, vm_offset_t va, pd_entry_t pde, u_int flags,
5955 struct rwlock **lockp)
5956 {
5957 struct md_page *pvh;
5958 pv_entry_t pv;
5959 vm_paddr_t pa;
5960
5961 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
5962 /* Pass NULL instead of the lock pointer to disable reclamation. */
5963 if ((pv = get_pv_entry(pmap, (flags & PMAP_ENTER_NORECLAIM) != 0 ?
5964 NULL : lockp)) == NULL)
5965 return (false);
5966 pv->pv_va = va;
5967 pa = pde & PG_PS_FRAME;
5968 CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa);
5969 pvh = pa_to_pvh(pa);
5970 TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_next);
5971 pvh->pv_gen++;
5972 return (true);
5973 }
5974
5975 /*
5976 * Fills a page table page with mappings to consecutive physical pages.
5977 */
5978 static void
pmap_fill_ptp(pt_entry_t * firstpte,pt_entry_t newpte)5979 pmap_fill_ptp(pt_entry_t *firstpte, pt_entry_t newpte)
5980 {
5981 pt_entry_t *pte;
5982
5983 for (pte = firstpte; pte < firstpte + NPTEPG; pte++) {
5984 *pte = newpte;
5985 newpte += PAGE_SIZE;
5986 }
5987 }
5988
5989 /*
5990 * Tries to demote a 2MB page mapping. If demotion fails, the 2MB page
5991 * mapping is invalidated.
5992 */
5993 static boolean_t
pmap_demote_pde(pmap_t pmap,pd_entry_t * pde,vm_offset_t va)5994 pmap_demote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va)
5995 {
5996 struct rwlock *lock;
5997 boolean_t rv;
5998
5999 lock = NULL;
6000 rv = pmap_demote_pde_locked(pmap, pde, va, &lock);
6001 if (lock != NULL)
6002 rw_wunlock(lock);
6003 return (rv);
6004 }
6005
6006 static void
pmap_demote_pde_check(pt_entry_t * firstpte __unused,pt_entry_t newpte __unused)6007 pmap_demote_pde_check(pt_entry_t *firstpte __unused, pt_entry_t newpte __unused)
6008 {
6009 #ifdef INVARIANTS
6010 #ifdef DIAGNOSTIC
6011 pt_entry_t *xpte, *ypte;
6012
6013 for (xpte = firstpte; xpte < firstpte + NPTEPG;
6014 xpte++, newpte += PAGE_SIZE) {
6015 if ((*xpte & PG_FRAME) != (newpte & PG_FRAME)) {
6016 printf("pmap_demote_pde: xpte %zd and newpte map "
6017 "different pages: found %#lx, expected %#lx\n",
6018 xpte - firstpte, *xpte, newpte);
6019 printf("page table dump\n");
6020 for (ypte = firstpte; ypte < firstpte + NPTEPG; ypte++)
6021 printf("%zd %#lx\n", ypte - firstpte, *ypte);
6022 panic("firstpte");
6023 }
6024 }
6025 #else
6026 KASSERT((*firstpte & PG_FRAME) == (newpte & PG_FRAME),
6027 ("pmap_demote_pde: firstpte and newpte map different physical"
6028 " addresses"));
6029 #endif
6030 #endif
6031 }
6032
6033 static void
pmap_demote_pde_abort(pmap_t pmap,vm_offset_t va,pd_entry_t * pde,pd_entry_t oldpde,struct rwlock ** lockp)6034 pmap_demote_pde_abort(pmap_t pmap, vm_offset_t va, pd_entry_t *pde,
6035 pd_entry_t oldpde, struct rwlock **lockp)
6036 {
6037 struct spglist free;
6038 vm_offset_t sva;
6039
6040 SLIST_INIT(&free);
6041 sva = trunc_2mpage(va);
6042 pmap_remove_pde(pmap, pde, sva, &free, lockp);
6043 if ((oldpde & pmap_global_bit(pmap)) == 0)
6044 pmap_invalidate_pde_page(pmap, sva, oldpde);
6045 vm_page_free_pages_toq(&free, true);
6046 CTR2(KTR_PMAP, "pmap_demote_pde: failure for va %#lx in pmap %p",
6047 va, pmap);
6048 }
6049
6050 static boolean_t
pmap_demote_pde_locked(pmap_t pmap,pd_entry_t * pde,vm_offset_t va,struct rwlock ** lockp)6051 pmap_demote_pde_locked(pmap_t pmap, pd_entry_t *pde, vm_offset_t va,
6052 struct rwlock **lockp)
6053 {
6054 pd_entry_t newpde, oldpde;
6055 pt_entry_t *firstpte, newpte;
6056 pt_entry_t PG_A, PG_G, PG_M, PG_PKU_MASK, PG_RW, PG_V;
6057 vm_paddr_t mptepa;
6058 vm_page_t mpte;
6059 int PG_PTE_CACHE;
6060 bool in_kernel;
6061
6062 PG_A = pmap_accessed_bit(pmap);
6063 PG_G = pmap_global_bit(pmap);
6064 PG_M = pmap_modified_bit(pmap);
6065 PG_RW = pmap_rw_bit(pmap);
6066 PG_V = pmap_valid_bit(pmap);
6067 PG_PTE_CACHE = pmap_cache_mask(pmap, 0);
6068 PG_PKU_MASK = pmap_pku_mask_bit(pmap);
6069
6070 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
6071 in_kernel = va >= VM_MAXUSER_ADDRESS;
6072 oldpde = *pde;
6073 KASSERT((oldpde & (PG_PS | PG_V)) == (PG_PS | PG_V),
6074 ("pmap_demote_pde: oldpde is missing PG_PS and/or PG_V"));
6075
6076 /*
6077 * Invalidate the 2MB page mapping and return "failure" if the
6078 * mapping was never accessed.
6079 */
6080 if ((oldpde & PG_A) == 0) {
6081 KASSERT((oldpde & PG_W) == 0,
6082 ("pmap_demote_pde: a wired mapping is missing PG_A"));
6083 pmap_demote_pde_abort(pmap, va, pde, oldpde, lockp);
6084 return (FALSE);
6085 }
6086
6087 mpte = pmap_remove_pt_page(pmap, va);
6088 if (mpte == NULL) {
6089 KASSERT((oldpde & PG_W) == 0,
6090 ("pmap_demote_pde: page table page for a wired mapping"
6091 " is missing"));
6092
6093 /*
6094 * If the page table page is missing and the mapping
6095 * is for a kernel address, the mapping must belong to
6096 * the direct map. Page table pages are preallocated
6097 * for every other part of the kernel address space,
6098 * so the direct map region is the only part of the
6099 * kernel address space that must be handled here.
6100 */
6101 KASSERT(!in_kernel || (va >= DMAP_MIN_ADDRESS &&
6102 va < DMAP_MAX_ADDRESS),
6103 ("pmap_demote_pde: No saved mpte for va %#lx", va));
6104
6105 /*
6106 * If the 2MB page mapping belongs to the direct map
6107 * region of the kernel's address space, then the page
6108 * allocation request specifies the highest possible
6109 * priority (VM_ALLOC_INTERRUPT). Otherwise, the
6110 * priority is normal.
6111 */
6112 mpte = pmap_alloc_pt_page(pmap, pmap_pde_pindex(va),
6113 (in_kernel ? VM_ALLOC_INTERRUPT : 0) | VM_ALLOC_WIRED);
6114
6115 /*
6116 * If the allocation of the new page table page fails,
6117 * invalidate the 2MB page mapping and return "failure".
6118 */
6119 if (mpte == NULL) {
6120 pmap_demote_pde_abort(pmap, va, pde, oldpde, lockp);
6121 return (FALSE);
6122 }
6123
6124 if (!in_kernel)
6125 mpte->ref_count = NPTEPG;
6126 }
6127 mptepa = VM_PAGE_TO_PHYS(mpte);
6128 firstpte = (pt_entry_t *)PHYS_TO_DMAP(mptepa);
6129 newpde = mptepa | PG_M | PG_A | (oldpde & PG_U) | PG_RW | PG_V;
6130 KASSERT((oldpde & (PG_M | PG_RW)) != PG_RW,
6131 ("pmap_demote_pde: oldpde is missing PG_M"));
6132 newpte = oldpde & ~PG_PS;
6133 newpte = pmap_swap_pat(pmap, newpte);
6134
6135 /*
6136 * If the PTP is not leftover from an earlier promotion or it does not
6137 * have PG_A set in every PTE, then fill it. The new PTEs will all
6138 * have PG_A set.
6139 */
6140 if (!vm_page_all_valid(mpte))
6141 pmap_fill_ptp(firstpte, newpte);
6142
6143 pmap_demote_pde_check(firstpte, newpte);
6144
6145 /*
6146 * If the mapping has changed attributes, update the PTEs.
6147 */
6148 if ((*firstpte & PG_PTE_PROMOTE) != (newpte & PG_PTE_PROMOTE))
6149 pmap_fill_ptp(firstpte, newpte);
6150
6151 /*
6152 * The spare PV entries must be reserved prior to demoting the
6153 * mapping, that is, prior to changing the PDE. Otherwise, the state
6154 * of the PDE and the PV lists will be inconsistent, which can result
6155 * in reclaim_pv_chunk() attempting to remove a PV entry from the
6156 * wrong PV list and pmap_pv_demote_pde() failing to find the expected
6157 * PV entry for the 2MB page mapping that is being demoted.
6158 */
6159 if ((oldpde & PG_MANAGED) != 0)
6160 reserve_pv_entries(pmap, NPTEPG - 1, lockp);
6161
6162 /*
6163 * Demote the mapping. This pmap is locked. The old PDE has
6164 * PG_A set. If the old PDE has PG_RW set, it also has PG_M
6165 * set. Thus, there is no danger of a race with another
6166 * processor changing the setting of PG_A and/or PG_M between
6167 * the read above and the store below.
6168 */
6169 if (workaround_erratum383)
6170 pmap_update_pde(pmap, va, pde, newpde);
6171 else
6172 pde_store(pde, newpde);
6173
6174 /*
6175 * Invalidate a stale recursive mapping of the page table page.
6176 */
6177 if (in_kernel)
6178 pmap_invalidate_page(pmap, (vm_offset_t)vtopte(va));
6179
6180 /*
6181 * Demote the PV entry.
6182 */
6183 if ((oldpde & PG_MANAGED) != 0)
6184 pmap_pv_demote_pde(pmap, va, oldpde & PG_PS_FRAME, lockp);
6185
6186 counter_u64_add(pmap_pde_demotions, 1);
6187 CTR2(KTR_PMAP, "pmap_demote_pde: success for va %#lx in pmap %p",
6188 va, pmap);
6189 return (TRUE);
6190 }
6191
6192 /*
6193 * pmap_remove_kernel_pde: Remove a kernel superpage mapping.
6194 */
6195 static void
pmap_remove_kernel_pde(pmap_t pmap,pd_entry_t * pde,vm_offset_t va)6196 pmap_remove_kernel_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va)
6197 {
6198 pd_entry_t newpde;
6199 vm_paddr_t mptepa;
6200 vm_page_t mpte;
6201
6202 KASSERT(pmap == kernel_pmap, ("pmap %p is not kernel_pmap", pmap));
6203 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
6204 mpte = pmap_remove_pt_page(pmap, va);
6205 if (mpte == NULL)
6206 panic("pmap_remove_kernel_pde: Missing pt page.");
6207
6208 mptepa = VM_PAGE_TO_PHYS(mpte);
6209 newpde = mptepa | X86_PG_M | X86_PG_A | X86_PG_RW | X86_PG_V;
6210
6211 /*
6212 * If this page table page was unmapped by a promotion, then it
6213 * contains valid mappings. Zero it to invalidate those mappings.
6214 */
6215 if (vm_page_any_valid(mpte))
6216 pagezero((void *)PHYS_TO_DMAP(mptepa));
6217
6218 /*
6219 * Demote the mapping.
6220 */
6221 if (workaround_erratum383)
6222 pmap_update_pde(pmap, va, pde, newpde);
6223 else
6224 pde_store(pde, newpde);
6225
6226 /*
6227 * Invalidate a stale recursive mapping of the page table page.
6228 */
6229 pmap_invalidate_page(pmap, (vm_offset_t)vtopte(va));
6230 }
6231
6232 /*
6233 * pmap_remove_pde: do the things to unmap a superpage in a process
6234 */
6235 static int
pmap_remove_pde(pmap_t pmap,pd_entry_t * pdq,vm_offset_t sva,struct spglist * free,struct rwlock ** lockp)6236 pmap_remove_pde(pmap_t pmap, pd_entry_t *pdq, vm_offset_t sva,
6237 struct spglist *free, struct rwlock **lockp)
6238 {
6239 struct md_page *pvh;
6240 pd_entry_t oldpde;
6241 vm_offset_t eva, va;
6242 vm_page_t m, mpte;
6243 pt_entry_t PG_G, PG_A, PG_M, PG_RW;
6244
6245 PG_G = pmap_global_bit(pmap);
6246 PG_A = pmap_accessed_bit(pmap);
6247 PG_M = pmap_modified_bit(pmap);
6248 PG_RW = pmap_rw_bit(pmap);
6249
6250 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
6251 KASSERT((sva & PDRMASK) == 0,
6252 ("pmap_remove_pde: sva is not 2mpage aligned"));
6253 oldpde = pte_load_clear(pdq);
6254 if (oldpde & PG_W)
6255 pmap->pm_stats.wired_count -= NBPDR / PAGE_SIZE;
6256 if ((oldpde & PG_G) != 0)
6257 pmap_invalidate_pde_page(kernel_pmap, sva, oldpde);
6258 pmap_resident_count_adj(pmap, -NBPDR / PAGE_SIZE);
6259 if (oldpde & PG_MANAGED) {
6260 CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, oldpde & PG_PS_FRAME);
6261 pvh = pa_to_pvh(oldpde & PG_PS_FRAME);
6262 pmap_pvh_free(pvh, pmap, sva);
6263 eva = sva + NBPDR;
6264 for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME);
6265 va < eva; va += PAGE_SIZE, m++) {
6266 if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW))
6267 vm_page_dirty(m);
6268 if (oldpde & PG_A)
6269 vm_page_aflag_set(m, PGA_REFERENCED);
6270 if (TAILQ_EMPTY(&m->md.pv_list) &&
6271 TAILQ_EMPTY(&pvh->pv_list))
6272 vm_page_aflag_clear(m, PGA_WRITEABLE);
6273 pmap_delayed_invl_page(m);
6274 }
6275 }
6276 if (pmap == kernel_pmap) {
6277 pmap_remove_kernel_pde(pmap, pdq, sva);
6278 } else {
6279 mpte = pmap_remove_pt_page(pmap, sva);
6280 if (mpte != NULL) {
6281 KASSERT(vm_page_any_valid(mpte),
6282 ("pmap_remove_pde: pte page not promoted"));
6283 pmap_pt_page_count_adj(pmap, -1);
6284 KASSERT(mpte->ref_count == NPTEPG,
6285 ("pmap_remove_pde: pte page ref count error"));
6286 mpte->ref_count = 0;
6287 pmap_add_delayed_free_list(mpte, free, FALSE);
6288 }
6289 }
6290 return (pmap_unuse_pt(pmap, sva, *pmap_pdpe(pmap, sva), free));
6291 }
6292
6293 /*
6294 * pmap_remove_pte: do the things to unmap a page in a process
6295 */
6296 static int
pmap_remove_pte(pmap_t pmap,pt_entry_t * ptq,vm_offset_t va,pd_entry_t ptepde,struct spglist * free,struct rwlock ** lockp)6297 pmap_remove_pte(pmap_t pmap, pt_entry_t *ptq, vm_offset_t va,
6298 pd_entry_t ptepde, struct spglist *free, struct rwlock **lockp)
6299 {
6300 struct md_page *pvh;
6301 pt_entry_t oldpte, PG_A, PG_M, PG_RW;
6302 vm_page_t m;
6303
6304 PG_A = pmap_accessed_bit(pmap);
6305 PG_M = pmap_modified_bit(pmap);
6306 PG_RW = pmap_rw_bit(pmap);
6307
6308 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
6309 oldpte = pte_load_clear(ptq);
6310 if (oldpte & PG_W)
6311 pmap->pm_stats.wired_count -= 1;
6312 pmap_resident_count_adj(pmap, -1);
6313 if (oldpte & PG_MANAGED) {
6314 m = PHYS_TO_VM_PAGE(oldpte & PG_FRAME);
6315 if ((oldpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
6316 vm_page_dirty(m);
6317 if (oldpte & PG_A)
6318 vm_page_aflag_set(m, PGA_REFERENCED);
6319 CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m);
6320 pmap_pvh_free(&m->md, pmap, va);
6321 if (TAILQ_EMPTY(&m->md.pv_list) &&
6322 (m->flags & PG_FICTITIOUS) == 0) {
6323 pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
6324 if (TAILQ_EMPTY(&pvh->pv_list))
6325 vm_page_aflag_clear(m, PGA_WRITEABLE);
6326 }
6327 pmap_delayed_invl_page(m);
6328 }
6329 return (pmap_unuse_pt(pmap, va, ptepde, free));
6330 }
6331
6332 /*
6333 * Remove a single page from a process address space
6334 */
6335 static void
pmap_remove_page(pmap_t pmap,vm_offset_t va,pd_entry_t * pde,struct spglist * free)6336 pmap_remove_page(pmap_t pmap, vm_offset_t va, pd_entry_t *pde,
6337 struct spglist *free)
6338 {
6339 struct rwlock *lock;
6340 pt_entry_t *pte, PG_V;
6341
6342 PG_V = pmap_valid_bit(pmap);
6343 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
6344 if ((*pde & PG_V) == 0)
6345 return;
6346 pte = pmap_pde_to_pte(pde, va);
6347 if ((*pte & PG_V) == 0)
6348 return;
6349 lock = NULL;
6350 pmap_remove_pte(pmap, pte, va, *pde, free, &lock);
6351 if (lock != NULL)
6352 rw_wunlock(lock);
6353 pmap_invalidate_page(pmap, va);
6354 }
6355
6356 /*
6357 * Removes the specified range of addresses from the page table page.
6358 */
6359 static bool
pmap_remove_ptes(pmap_t pmap,vm_offset_t sva,vm_offset_t eva,pd_entry_t * pde,struct spglist * free,struct rwlock ** lockp)6360 pmap_remove_ptes(pmap_t pmap, vm_offset_t sva, vm_offset_t eva,
6361 pd_entry_t *pde, struct spglist *free, struct rwlock **lockp)
6362 {
6363 pt_entry_t PG_G, *pte;
6364 vm_offset_t va;
6365 bool anyvalid;
6366
6367 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
6368 PG_G = pmap_global_bit(pmap);
6369 anyvalid = false;
6370 va = eva;
6371 for (pte = pmap_pde_to_pte(pde, sva); sva != eva; pte++,
6372 sva += PAGE_SIZE) {
6373 if (*pte == 0) {
6374 if (va != eva) {
6375 pmap_invalidate_range(pmap, va, sva);
6376 va = eva;
6377 }
6378 continue;
6379 }
6380 if ((*pte & PG_G) == 0)
6381 anyvalid = true;
6382 else if (va == eva)
6383 va = sva;
6384 if (pmap_remove_pte(pmap, pte, sva, *pde, free, lockp)) {
6385 sva += PAGE_SIZE;
6386 break;
6387 }
6388 }
6389 if (va != eva)
6390 pmap_invalidate_range(pmap, va, sva);
6391 return (anyvalid);
6392 }
6393
6394 static void
pmap_remove1(pmap_t pmap,vm_offset_t sva,vm_offset_t eva,bool map_delete)6395 pmap_remove1(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, bool map_delete)
6396 {
6397 struct rwlock *lock;
6398 vm_page_t mt;
6399 vm_offset_t va_next;
6400 pml5_entry_t *pml5e;
6401 pml4_entry_t *pml4e;
6402 pdp_entry_t *pdpe;
6403 pd_entry_t ptpaddr, *pde;
6404 pt_entry_t PG_G, PG_V;
6405 struct spglist free;
6406 int anyvalid;
6407
6408 PG_G = pmap_global_bit(pmap);
6409 PG_V = pmap_valid_bit(pmap);
6410
6411 /*
6412 * If there are no resident pages besides the top level page
6413 * table page(s), there is nothing to do. Kernel pmap always
6414 * accounts whole preloaded area as resident, which makes its
6415 * resident count > 2.
6416 * Perform an unsynchronized read. This is, however, safe.
6417 */
6418 if (pmap->pm_stats.resident_count <= 1 + (pmap->pm_pmltopu != NULL ?
6419 1 : 0))
6420 return;
6421
6422 anyvalid = 0;
6423 SLIST_INIT(&free);
6424
6425 pmap_delayed_invl_start();
6426 PMAP_LOCK(pmap);
6427 if (map_delete)
6428 pmap_pkru_on_remove(pmap, sva, eva);
6429
6430 /*
6431 * special handling of removing one page. a very
6432 * common operation and easy to short circuit some
6433 * code.
6434 */
6435 if (sva + PAGE_SIZE == eva) {
6436 pde = pmap_pde(pmap, sva);
6437 if (pde && (*pde & PG_PS) == 0) {
6438 pmap_remove_page(pmap, sva, pde, &free);
6439 goto out;
6440 }
6441 }
6442
6443 lock = NULL;
6444 for (; sva < eva; sva = va_next) {
6445 if (pmap->pm_stats.resident_count == 0)
6446 break;
6447
6448 if (pmap_is_la57(pmap)) {
6449 pml5e = pmap_pml5e(pmap, sva);
6450 if ((*pml5e & PG_V) == 0) {
6451 va_next = (sva + NBPML5) & ~PML5MASK;
6452 if (va_next < sva)
6453 va_next = eva;
6454 continue;
6455 }
6456 pml4e = pmap_pml5e_to_pml4e(pml5e, sva);
6457 } else {
6458 pml4e = pmap_pml4e(pmap, sva);
6459 }
6460 if ((*pml4e & PG_V) == 0) {
6461 va_next = (sva + NBPML4) & ~PML4MASK;
6462 if (va_next < sva)
6463 va_next = eva;
6464 continue;
6465 }
6466
6467 va_next = (sva + NBPDP) & ~PDPMASK;
6468 if (va_next < sva)
6469 va_next = eva;
6470 pdpe = pmap_pml4e_to_pdpe(pml4e, sva);
6471 if ((*pdpe & PG_V) == 0)
6472 continue;
6473 if ((*pdpe & PG_PS) != 0) {
6474 KASSERT(va_next <= eva,
6475 ("partial update of non-transparent 1G mapping "
6476 "pdpe %#lx sva %#lx eva %#lx va_next %#lx",
6477 *pdpe, sva, eva, va_next));
6478 MPASS(pmap != kernel_pmap); /* XXXKIB */
6479 MPASS((*pdpe & (PG_MANAGED | PG_G)) == 0);
6480 anyvalid = 1;
6481 *pdpe = 0;
6482 pmap_resident_count_adj(pmap, -NBPDP / PAGE_SIZE);
6483 mt = PHYS_TO_VM_PAGE(*pmap_pml4e(pmap, sva) & PG_FRAME);
6484 pmap_unwire_ptp(pmap, sva, mt, &free);
6485 continue;
6486 }
6487
6488 /*
6489 * Calculate index for next page table.
6490 */
6491 va_next = (sva + NBPDR) & ~PDRMASK;
6492 if (va_next < sva)
6493 va_next = eva;
6494
6495 pde = pmap_pdpe_to_pde(pdpe, sva);
6496 ptpaddr = *pde;
6497
6498 /*
6499 * Weed out invalid mappings.
6500 */
6501 if (ptpaddr == 0)
6502 continue;
6503
6504 /*
6505 * Check for large page.
6506 */
6507 if ((ptpaddr & PG_PS) != 0) {
6508 /*
6509 * Are we removing the entire large page? If not,
6510 * demote the mapping and fall through.
6511 */
6512 if (sva + NBPDR == va_next && eva >= va_next) {
6513 /*
6514 * The TLB entry for a PG_G mapping is
6515 * invalidated by pmap_remove_pde().
6516 */
6517 if ((ptpaddr & PG_G) == 0)
6518 anyvalid = 1;
6519 pmap_remove_pde(pmap, pde, sva, &free, &lock);
6520 continue;
6521 } else if (!pmap_demote_pde_locked(pmap, pde, sva,
6522 &lock)) {
6523 /* The large page mapping was destroyed. */
6524 continue;
6525 } else
6526 ptpaddr = *pde;
6527 }
6528
6529 /*
6530 * Limit our scan to either the end of the va represented
6531 * by the current page table page, or to the end of the
6532 * range being removed.
6533 */
6534 if (va_next > eva)
6535 va_next = eva;
6536
6537 if (pmap_remove_ptes(pmap, sva, va_next, pde, &free, &lock))
6538 anyvalid = 1;
6539 }
6540 if (lock != NULL)
6541 rw_wunlock(lock);
6542 out:
6543 if (anyvalid)
6544 pmap_invalidate_all(pmap);
6545 PMAP_UNLOCK(pmap);
6546 pmap_delayed_invl_finish();
6547 vm_page_free_pages_toq(&free, true);
6548 }
6549
6550 /*
6551 * Remove the given range of addresses from the specified map.
6552 *
6553 * It is assumed that the start and end are properly
6554 * rounded to the page size.
6555 */
6556 void
pmap_remove(pmap_t pmap,vm_offset_t sva,vm_offset_t eva)6557 pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
6558 {
6559 pmap_remove1(pmap, sva, eva, false);
6560 }
6561
6562 /*
6563 * Remove the given range of addresses as part of a logical unmap
6564 * operation. This has the effect of calling pmap_remove(), but
6565 * also clears any metadata that should persist for the lifetime
6566 * of a logical mapping.
6567 */
6568 void
pmap_map_delete(pmap_t pmap,vm_offset_t sva,vm_offset_t eva)6569 pmap_map_delete(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
6570 {
6571 pmap_remove1(pmap, sva, eva, true);
6572 }
6573
6574 /*
6575 * Routine: pmap_remove_all
6576 * Function:
6577 * Removes this physical page from
6578 * all physical maps in which it resides.
6579 * Reflects back modify bits to the pager.
6580 *
6581 * Notes:
6582 * Original versions of this routine were very
6583 * inefficient because they iteratively called
6584 * pmap_remove (slow...)
6585 */
6586
6587 void
pmap_remove_all(vm_page_t m)6588 pmap_remove_all(vm_page_t m)
6589 {
6590 struct md_page *pvh;
6591 pv_entry_t pv;
6592 pmap_t pmap;
6593 struct rwlock *lock;
6594 pt_entry_t *pte, tpte, PG_A, PG_M, PG_RW;
6595 pd_entry_t *pde;
6596 vm_offset_t va;
6597 struct spglist free;
6598 int pvh_gen, md_gen;
6599
6600 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
6601 ("pmap_remove_all: page %p is not managed", m));
6602 SLIST_INIT(&free);
6603 lock = VM_PAGE_TO_PV_LIST_LOCK(m);
6604 pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy :
6605 pa_to_pvh(VM_PAGE_TO_PHYS(m));
6606 rw_wlock(lock);
6607 retry:
6608 while ((pv = TAILQ_FIRST(&pvh->pv_list)) != NULL) {
6609 pmap = PV_PMAP(pv);
6610 if (!PMAP_TRYLOCK(pmap)) {
6611 pvh_gen = pvh->pv_gen;
6612 rw_wunlock(lock);
6613 PMAP_LOCK(pmap);
6614 rw_wlock(lock);
6615 if (pvh_gen != pvh->pv_gen) {
6616 PMAP_UNLOCK(pmap);
6617 goto retry;
6618 }
6619 }
6620 va = pv->pv_va;
6621 pde = pmap_pde(pmap, va);
6622 (void)pmap_demote_pde_locked(pmap, pde, va, &lock);
6623 PMAP_UNLOCK(pmap);
6624 }
6625 while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
6626 pmap = PV_PMAP(pv);
6627 if (!PMAP_TRYLOCK(pmap)) {
6628 pvh_gen = pvh->pv_gen;
6629 md_gen = m->md.pv_gen;
6630 rw_wunlock(lock);
6631 PMAP_LOCK(pmap);
6632 rw_wlock(lock);
6633 if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) {
6634 PMAP_UNLOCK(pmap);
6635 goto retry;
6636 }
6637 }
6638 PG_A = pmap_accessed_bit(pmap);
6639 PG_M = pmap_modified_bit(pmap);
6640 PG_RW = pmap_rw_bit(pmap);
6641 pmap_resident_count_adj(pmap, -1);
6642 pde = pmap_pde(pmap, pv->pv_va);
6643 KASSERT((*pde & PG_PS) == 0, ("pmap_remove_all: found"
6644 " a 2mpage in page %p's pv list", m));
6645 pte = pmap_pde_to_pte(pde, pv->pv_va);
6646 tpte = pte_load_clear(pte);
6647 if (tpte & PG_W)
6648 pmap->pm_stats.wired_count--;
6649 if (tpte & PG_A)
6650 vm_page_aflag_set(m, PGA_REFERENCED);
6651
6652 /*
6653 * Update the vm_page_t clean and reference bits.
6654 */
6655 if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
6656 vm_page_dirty(m);
6657 pmap_unuse_pt(pmap, pv->pv_va, *pde, &free);
6658 pmap_invalidate_page(pmap, pv->pv_va);
6659 TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
6660 m->md.pv_gen++;
6661 free_pv_entry(pmap, pv);
6662 PMAP_UNLOCK(pmap);
6663 }
6664 vm_page_aflag_clear(m, PGA_WRITEABLE);
6665 rw_wunlock(lock);
6666 pmap_delayed_invl_wait(m);
6667 vm_page_free_pages_toq(&free, true);
6668 }
6669
6670 /*
6671 * pmap_protect_pde: do the things to protect a 2mpage in a process
6672 */
6673 static boolean_t
pmap_protect_pde(pmap_t pmap,pd_entry_t * pde,vm_offset_t sva,vm_prot_t prot)6674 pmap_protect_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t sva, vm_prot_t prot)
6675 {
6676 pd_entry_t newpde, oldpde;
6677 vm_page_t m, mt;
6678 boolean_t anychanged;
6679 pt_entry_t PG_G, PG_M, PG_RW;
6680
6681 PG_G = pmap_global_bit(pmap);
6682 PG_M = pmap_modified_bit(pmap);
6683 PG_RW = pmap_rw_bit(pmap);
6684
6685 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
6686 KASSERT((sva & PDRMASK) == 0,
6687 ("pmap_protect_pde: sva is not 2mpage aligned"));
6688 anychanged = FALSE;
6689 retry:
6690 oldpde = newpde = *pde;
6691 if ((prot & VM_PROT_WRITE) == 0) {
6692 if ((oldpde & (PG_MANAGED | PG_M | PG_RW)) ==
6693 (PG_MANAGED | PG_M | PG_RW)) {
6694 m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME);
6695 for (mt = m; mt < &m[NBPDR / PAGE_SIZE]; mt++)
6696 vm_page_dirty(mt);
6697 }
6698 newpde &= ~(PG_RW | PG_M);
6699 }
6700 if ((prot & VM_PROT_EXECUTE) == 0)
6701 newpde |= pg_nx;
6702 if (newpde != oldpde) {
6703 /*
6704 * As an optimization to future operations on this PDE, clear
6705 * PG_PROMOTED. The impending invalidation will remove any
6706 * lingering 4KB page mappings from the TLB.
6707 */
6708 if (!atomic_cmpset_long(pde, oldpde, newpde & ~PG_PROMOTED))
6709 goto retry;
6710 if ((oldpde & PG_G) != 0)
6711 pmap_invalidate_pde_page(kernel_pmap, sva, oldpde);
6712 else
6713 anychanged = TRUE;
6714 }
6715 return (anychanged);
6716 }
6717
6718 /*
6719 * Set the physical protection on the
6720 * specified range of this map as requested.
6721 */
6722 void
pmap_protect(pmap_t pmap,vm_offset_t sva,vm_offset_t eva,vm_prot_t prot)6723 pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
6724 {
6725 vm_page_t m;
6726 vm_offset_t va_next;
6727 pml4_entry_t *pml4e;
6728 pdp_entry_t *pdpe;
6729 pd_entry_t ptpaddr, *pde;
6730 pt_entry_t *pte, PG_G, PG_M, PG_RW, PG_V;
6731 pt_entry_t obits, pbits;
6732 boolean_t anychanged;
6733
6734 KASSERT((prot & ~VM_PROT_ALL) == 0, ("invalid prot %x", prot));
6735 if (prot == VM_PROT_NONE) {
6736 pmap_remove(pmap, sva, eva);
6737 return;
6738 }
6739
6740 if ((prot & (VM_PROT_WRITE|VM_PROT_EXECUTE)) ==
6741 (VM_PROT_WRITE|VM_PROT_EXECUTE))
6742 return;
6743
6744 PG_G = pmap_global_bit(pmap);
6745 PG_M = pmap_modified_bit(pmap);
6746 PG_V = pmap_valid_bit(pmap);
6747 PG_RW = pmap_rw_bit(pmap);
6748 anychanged = FALSE;
6749
6750 /*
6751 * Although this function delays and batches the invalidation
6752 * of stale TLB entries, it does not need to call
6753 * pmap_delayed_invl_start() and
6754 * pmap_delayed_invl_finish(), because it does not
6755 * ordinarily destroy mappings. Stale TLB entries from
6756 * protection-only changes need only be invalidated before the
6757 * pmap lock is released, because protection-only changes do
6758 * not destroy PV entries. Even operations that iterate over
6759 * a physical page's PV list of mappings, like
6760 * pmap_remove_write(), acquire the pmap lock for each
6761 * mapping. Consequently, for protection-only changes, the
6762 * pmap lock suffices to synchronize both page table and TLB
6763 * updates.
6764 *
6765 * This function only destroys a mapping if pmap_demote_pde()
6766 * fails. In that case, stale TLB entries are immediately
6767 * invalidated.
6768 */
6769
6770 PMAP_LOCK(pmap);
6771 for (; sva < eva; sva = va_next) {
6772 pml4e = pmap_pml4e(pmap, sva);
6773 if (pml4e == NULL || (*pml4e & PG_V) == 0) {
6774 va_next = (sva + NBPML4) & ~PML4MASK;
6775 if (va_next < sva)
6776 va_next = eva;
6777 continue;
6778 }
6779
6780 va_next = (sva + NBPDP) & ~PDPMASK;
6781 if (va_next < sva)
6782 va_next = eva;
6783 pdpe = pmap_pml4e_to_pdpe(pml4e, sva);
6784 if ((*pdpe & PG_V) == 0)
6785 continue;
6786 if ((*pdpe & PG_PS) != 0) {
6787 KASSERT(va_next <= eva,
6788 ("partial update of non-transparent 1G mapping "
6789 "pdpe %#lx sva %#lx eva %#lx va_next %#lx",
6790 *pdpe, sva, eva, va_next));
6791 retry_pdpe:
6792 obits = pbits = *pdpe;
6793 MPASS((pbits & (PG_MANAGED | PG_G)) == 0);
6794 MPASS(pmap != kernel_pmap); /* XXXKIB */
6795 if ((prot & VM_PROT_WRITE) == 0)
6796 pbits &= ~(PG_RW | PG_M);
6797 if ((prot & VM_PROT_EXECUTE) == 0)
6798 pbits |= pg_nx;
6799
6800 if (pbits != obits) {
6801 if (!atomic_cmpset_long(pdpe, obits, pbits))
6802 /* PG_PS cannot be cleared under us, */
6803 goto retry_pdpe;
6804 anychanged = TRUE;
6805 }
6806 continue;
6807 }
6808
6809 va_next = (sva + NBPDR) & ~PDRMASK;
6810 if (va_next < sva)
6811 va_next = eva;
6812
6813 pde = pmap_pdpe_to_pde(pdpe, sva);
6814 ptpaddr = *pde;
6815
6816 /*
6817 * Weed out invalid mappings.
6818 */
6819 if (ptpaddr == 0)
6820 continue;
6821
6822 /*
6823 * Check for large page.
6824 */
6825 if ((ptpaddr & PG_PS) != 0) {
6826 /*
6827 * Are we protecting the entire large page? If not,
6828 * demote the mapping and fall through.
6829 */
6830 if (sva + NBPDR == va_next && eva >= va_next) {
6831 /*
6832 * The TLB entry for a PG_G mapping is
6833 * invalidated by pmap_protect_pde().
6834 */
6835 if (pmap_protect_pde(pmap, pde, sva, prot))
6836 anychanged = TRUE;
6837 continue;
6838 } else if (!pmap_demote_pde(pmap, pde, sva)) {
6839 /*
6840 * The large page mapping was destroyed.
6841 */
6842 continue;
6843 }
6844 }
6845
6846 if (va_next > eva)
6847 va_next = eva;
6848
6849 for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
6850 sva += PAGE_SIZE) {
6851 retry:
6852 obits = pbits = *pte;
6853 if ((pbits & PG_V) == 0)
6854 continue;
6855
6856 if ((prot & VM_PROT_WRITE) == 0) {
6857 if ((pbits & (PG_MANAGED | PG_M | PG_RW)) ==
6858 (PG_MANAGED | PG_M | PG_RW)) {
6859 m = PHYS_TO_VM_PAGE(pbits & PG_FRAME);
6860 vm_page_dirty(m);
6861 }
6862 pbits &= ~(PG_RW | PG_M);
6863 }
6864 if ((prot & VM_PROT_EXECUTE) == 0)
6865 pbits |= pg_nx;
6866
6867 if (pbits != obits) {
6868 if (!atomic_cmpset_long(pte, obits, pbits))
6869 goto retry;
6870 if (obits & PG_G)
6871 pmap_invalidate_page(pmap, sva);
6872 else
6873 anychanged = TRUE;
6874 }
6875 }
6876 }
6877 if (anychanged)
6878 pmap_invalidate_all(pmap);
6879 PMAP_UNLOCK(pmap);
6880 }
6881
6882 static bool
pmap_pde_ept_executable(pmap_t pmap,pd_entry_t pde)6883 pmap_pde_ept_executable(pmap_t pmap, pd_entry_t pde)
6884 {
6885
6886 if (pmap->pm_type != PT_EPT)
6887 return (false);
6888 return ((pde & EPT_PG_EXECUTE) != 0);
6889 }
6890
6891 #if VM_NRESERVLEVEL > 0
6892 /*
6893 * Tries to promote the 512, contiguous 4KB page mappings that are within a
6894 * single page table page (PTP) to a single 2MB page mapping. For promotion
6895 * to occur, two conditions must be met: (1) the 4KB page mappings must map
6896 * aligned, contiguous physical memory and (2) the 4KB page mappings must have
6897 * identical characteristics.
6898 */
6899 static bool
pmap_promote_pde(pmap_t pmap,pd_entry_t * pde,vm_offset_t va,vm_page_t mpte,struct rwlock ** lockp)6900 pmap_promote_pde(pmap_t pmap, pd_entry_t *pde, vm_offset_t va, vm_page_t mpte,
6901 struct rwlock **lockp)
6902 {
6903 pd_entry_t newpde;
6904 pt_entry_t *firstpte, oldpte, pa, *pte;
6905 pt_entry_t allpte_PG_A, PG_A, PG_G, PG_M, PG_PKU_MASK, PG_RW, PG_V;
6906 int PG_PTE_CACHE;
6907
6908 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
6909 if (!pmap_ps_enabled(pmap))
6910 return (false);
6911
6912 PG_A = pmap_accessed_bit(pmap);
6913 PG_G = pmap_global_bit(pmap);
6914 PG_M = pmap_modified_bit(pmap);
6915 PG_V = pmap_valid_bit(pmap);
6916 PG_RW = pmap_rw_bit(pmap);
6917 PG_PKU_MASK = pmap_pku_mask_bit(pmap);
6918 PG_PTE_CACHE = pmap_cache_mask(pmap, 0);
6919
6920 /*
6921 * Examine the first PTE in the specified PTP. Abort if this PTE is
6922 * ineligible for promotion due to hardware errata, invalid, or does
6923 * not map the first 4KB physical page within a 2MB page.
6924 */
6925 firstpte = (pt_entry_t *)PHYS_TO_DMAP(*pde & PG_FRAME);
6926 newpde = *firstpte;
6927 if (!pmap_allow_2m_x_page(pmap, pmap_pde_ept_executable(pmap, newpde)))
6928 return (false);
6929 if ((newpde & ((PG_FRAME & PDRMASK) | PG_V)) != PG_V) {
6930 counter_u64_add(pmap_pde_p_failures, 1);
6931 CTR2(KTR_PMAP, "pmap_promote_pde: failure for va %#lx"
6932 " in pmap %p", va, pmap);
6933 return (false);
6934 }
6935
6936 /*
6937 * Both here and in the below "for" loop, to allow for repromotion
6938 * after MADV_FREE, conditionally write protect a clean PTE before
6939 * possibly aborting the promotion due to other PTE attributes. Why?
6940 * Suppose that MADV_FREE is applied to a part of a superpage, the
6941 * address range [S, E). pmap_advise() will demote the superpage
6942 * mapping, destroy the 4KB page mapping at the end of [S, E), and
6943 * clear PG_M and PG_A in the PTEs for the rest of [S, E). Later,
6944 * imagine that the memory in [S, E) is recycled, but the last 4KB
6945 * page in [S, E) is not the last to be rewritten, or simply accessed.
6946 * In other words, there is still a 4KB page in [S, E), call it P,
6947 * that is writeable but PG_M and PG_A are clear in P's PTE. Unless
6948 * we write protect P before aborting the promotion, if and when P is
6949 * finally rewritten, there won't be a page fault to trigger
6950 * repromotion.
6951 */
6952 setpde:
6953 if ((newpde & (PG_M | PG_RW)) == PG_RW) {
6954 /*
6955 * When PG_M is already clear, PG_RW can be cleared without
6956 * a TLB invalidation.
6957 */
6958 if (!atomic_fcmpset_long(firstpte, &newpde, newpde & ~PG_RW))
6959 goto setpde;
6960 newpde &= ~PG_RW;
6961 CTR2(KTR_PMAP, "pmap_promote_pde: protect for va %#lx"
6962 " in pmap %p", va & ~PDRMASK, pmap);
6963 }
6964
6965 /*
6966 * Examine each of the other PTEs in the specified PTP. Abort if this
6967 * PTE maps an unexpected 4KB physical page or does not have identical
6968 * characteristics to the first PTE.
6969 */
6970 allpte_PG_A = newpde & PG_A;
6971 pa = (newpde & (PG_PS_FRAME | PG_V)) + NBPDR - PAGE_SIZE;
6972 for (pte = firstpte + NPTEPG - 1; pte > firstpte; pte--) {
6973 oldpte = *pte;
6974 if ((oldpte & (PG_FRAME | PG_V)) != pa) {
6975 counter_u64_add(pmap_pde_p_failures, 1);
6976 CTR2(KTR_PMAP, "pmap_promote_pde: failure for va %#lx"
6977 " in pmap %p", va, pmap);
6978 return (false);
6979 }
6980 setpte:
6981 if ((oldpte & (PG_M | PG_RW)) == PG_RW) {
6982 /*
6983 * When PG_M is already clear, PG_RW can be cleared
6984 * without a TLB invalidation.
6985 */
6986 if (!atomic_fcmpset_long(pte, &oldpte, oldpte & ~PG_RW))
6987 goto setpte;
6988 oldpte &= ~PG_RW;
6989 CTR2(KTR_PMAP, "pmap_promote_pde: protect for va %#lx"
6990 " in pmap %p", (oldpte & PG_FRAME & PDRMASK) |
6991 (va & ~PDRMASK), pmap);
6992 }
6993 if ((oldpte & PG_PTE_PROMOTE) != (newpde & PG_PTE_PROMOTE)) {
6994 counter_u64_add(pmap_pde_p_failures, 1);
6995 CTR2(KTR_PMAP, "pmap_promote_pde: failure for va %#lx"
6996 " in pmap %p", va, pmap);
6997 return (false);
6998 }
6999 allpte_PG_A &= oldpte;
7000 pa -= PAGE_SIZE;
7001 }
7002
7003 /*
7004 * Unless all PTEs have PG_A set, clear it from the superpage mapping,
7005 * so that promotions triggered by speculative mappings, such as
7006 * pmap_enter_quick(), don't automatically mark the underlying pages
7007 * as referenced.
7008 */
7009 newpde &= ~PG_A | allpte_PG_A;
7010
7011 /*
7012 * EPT PTEs with PG_M set and PG_A clear are not supported by early
7013 * MMUs supporting EPT.
7014 */
7015 KASSERT((newpde & PG_A) != 0 || safe_to_clear_referenced(pmap, newpde),
7016 ("unsupported EPT PTE"));
7017
7018 /*
7019 * Save the PTP in its current state until the PDE mapping the
7020 * superpage is demoted by pmap_demote_pde() or destroyed by
7021 * pmap_remove_pde(). If PG_A is not set in every PTE, then request
7022 * that the PTP be refilled on demotion.
7023 */
7024 if (mpte == NULL)
7025 mpte = PHYS_TO_VM_PAGE(*pde & PG_FRAME);
7026 KASSERT(mpte >= vm_page_array &&
7027 mpte < &vm_page_array[vm_page_array_size],
7028 ("pmap_promote_pde: page table page is out of range"));
7029 KASSERT(mpte->pindex == pmap_pde_pindex(va),
7030 ("pmap_promote_pde: page table page's pindex is wrong "
7031 "mpte %p pidx %#lx va %#lx va pde pidx %#lx",
7032 mpte, mpte->pindex, va, pmap_pde_pindex(va)));
7033 if (pmap_insert_pt_page(pmap, mpte, true, allpte_PG_A != 0)) {
7034 counter_u64_add(pmap_pde_p_failures, 1);
7035 CTR2(KTR_PMAP,
7036 "pmap_promote_pde: failure for va %#lx in pmap %p", va,
7037 pmap);
7038 return (false);
7039 }
7040
7041 /*
7042 * Promote the pv entries.
7043 */
7044 if ((newpde & PG_MANAGED) != 0)
7045 pmap_pv_promote_pde(pmap, va, newpde & PG_PS_FRAME, lockp);
7046
7047 /*
7048 * Propagate the PAT index to its proper position.
7049 */
7050 newpde = pmap_swap_pat(pmap, newpde);
7051
7052 /*
7053 * Map the superpage.
7054 */
7055 if (workaround_erratum383)
7056 pmap_update_pde(pmap, va, pde, PG_PS | newpde);
7057 else
7058 pde_store(pde, PG_PROMOTED | PG_PS | newpde);
7059
7060 counter_u64_add(pmap_pde_promotions, 1);
7061 CTR2(KTR_PMAP, "pmap_promote_pde: success for va %#lx"
7062 " in pmap %p", va, pmap);
7063 return (true);
7064 }
7065 #endif /* VM_NRESERVLEVEL > 0 */
7066
7067 static int
pmap_enter_largepage(pmap_t pmap,vm_offset_t va,pt_entry_t newpte,int flags,int psind)7068 pmap_enter_largepage(pmap_t pmap, vm_offset_t va, pt_entry_t newpte, int flags,
7069 int psind)
7070 {
7071 vm_page_t mp;
7072 pt_entry_t origpte, *pml4e, *pdpe, *pde, pten, PG_V;
7073
7074 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
7075 KASSERT(psind > 0 && psind < MAXPAGESIZES && pagesizes[psind] != 0,
7076 ("psind %d unexpected", psind));
7077 KASSERT(((newpte & PG_FRAME) & (pagesizes[psind] - 1)) == 0,
7078 ("unaligned phys address %#lx newpte %#lx psind %d",
7079 newpte & PG_FRAME, newpte, psind));
7080 KASSERT((va & (pagesizes[psind] - 1)) == 0,
7081 ("unaligned va %#lx psind %d", va, psind));
7082 KASSERT(va < VM_MAXUSER_ADDRESS,
7083 ("kernel mode non-transparent superpage")); /* XXXKIB */
7084 KASSERT(va + pagesizes[psind] < VM_MAXUSER_ADDRESS,
7085 ("overflowing user map va %#lx psind %d", va, psind)); /* XXXKIB */
7086
7087 PG_V = pmap_valid_bit(pmap);
7088
7089 restart:
7090 if (!pmap_pkru_same(pmap, va, va + pagesizes[psind]))
7091 return (KERN_PROTECTION_FAILURE);
7092 pten = newpte;
7093 if (va < VM_MAXUSER_ADDRESS && pmap->pm_type == PT_X86)
7094 pten |= pmap_pkru_get(pmap, va);
7095
7096 if (psind == 2) { /* 1G */
7097 pml4e = pmap_pml4e(pmap, va);
7098 if (pml4e == NULL || (*pml4e & PG_V) == 0) {
7099 mp = pmap_allocpte_alloc(pmap, pmap_pml4e_pindex(va),
7100 NULL, va);
7101 if (mp == NULL)
7102 goto allocf;
7103 pdpe = (pdp_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mp));
7104 pdpe = &pdpe[pmap_pdpe_index(va)];
7105 origpte = *pdpe;
7106 MPASS(origpte == 0);
7107 } else {
7108 pdpe = pmap_pml4e_to_pdpe(pml4e, va);
7109 KASSERT(pdpe != NULL, ("va %#lx lost pdpe", va));
7110 origpte = *pdpe;
7111 if ((origpte & PG_V) == 0) {
7112 mp = PHYS_TO_VM_PAGE(*pml4e & PG_FRAME);
7113 mp->ref_count++;
7114 }
7115 }
7116 *pdpe = pten;
7117 } else /* (psind == 1) */ { /* 2M */
7118 pde = pmap_pde(pmap, va);
7119 if (pde == NULL) {
7120 mp = pmap_allocpte_alloc(pmap, pmap_pdpe_pindex(va),
7121 NULL, va);
7122 if (mp == NULL)
7123 goto allocf;
7124 pde = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mp));
7125 pde = &pde[pmap_pde_index(va)];
7126 origpte = *pde;
7127 MPASS(origpte == 0);
7128 } else {
7129 origpte = *pde;
7130 if ((origpte & PG_V) == 0) {
7131 pdpe = pmap_pdpe(pmap, va);
7132 MPASS(pdpe != NULL && (*pdpe & PG_V) != 0);
7133 mp = PHYS_TO_VM_PAGE(*pdpe & PG_FRAME);
7134 mp->ref_count++;
7135 }
7136 }
7137 *pde = pten;
7138 }
7139 KASSERT((origpte & PG_V) == 0 || ((origpte & PG_PS) != 0 &&
7140 (origpte & PG_PS_FRAME) == (pten & PG_PS_FRAME)),
7141 ("va %#lx changing %s phys page origpte %#lx pten %#lx",
7142 va, psind == 2 ? "1G" : "2M", origpte, pten));
7143 if ((pten & PG_W) != 0 && (origpte & PG_W) == 0)
7144 pmap->pm_stats.wired_count += pagesizes[psind] / PAGE_SIZE;
7145 else if ((pten & PG_W) == 0 && (origpte & PG_W) != 0)
7146 pmap->pm_stats.wired_count -= pagesizes[psind] / PAGE_SIZE;
7147 if ((origpte & PG_V) == 0)
7148 pmap_resident_count_adj(pmap, pagesizes[psind] / PAGE_SIZE);
7149
7150 return (KERN_SUCCESS);
7151
7152 allocf:
7153 if ((flags & PMAP_ENTER_NOSLEEP) != 0)
7154 return (KERN_RESOURCE_SHORTAGE);
7155 PMAP_UNLOCK(pmap);
7156 vm_wait(NULL);
7157 PMAP_LOCK(pmap);
7158 goto restart;
7159 }
7160
7161 /*
7162 * Insert the given physical page (p) at
7163 * the specified virtual address (v) in the
7164 * target physical map with the protection requested.
7165 *
7166 * If specified, the page will be wired down, meaning
7167 * that the related pte can not be reclaimed.
7168 *
7169 * NB: This is the only routine which MAY NOT lazy-evaluate
7170 * or lose information. That is, this routine must actually
7171 * insert this page into the given map NOW.
7172 *
7173 * When destroying both a page table and PV entry, this function
7174 * performs the TLB invalidation before releasing the PV list
7175 * lock, so we do not need pmap_delayed_invl_page() calls here.
7176 */
7177 int
pmap_enter(pmap_t pmap,vm_offset_t va,vm_page_t m,vm_prot_t prot,u_int flags,int8_t psind)7178 pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
7179 u_int flags, int8_t psind)
7180 {
7181 struct rwlock *lock;
7182 pd_entry_t *pde;
7183 pt_entry_t *pte, PG_G, PG_A, PG_M, PG_RW, PG_V;
7184 pt_entry_t newpte, origpte;
7185 pv_entry_t pv;
7186 vm_paddr_t opa, pa;
7187 vm_page_t mpte, om;
7188 int rv;
7189 boolean_t nosleep;
7190
7191 PG_A = pmap_accessed_bit(pmap);
7192 PG_G = pmap_global_bit(pmap);
7193 PG_M = pmap_modified_bit(pmap);
7194 PG_V = pmap_valid_bit(pmap);
7195 PG_RW = pmap_rw_bit(pmap);
7196
7197 va = trunc_page(va);
7198 KASSERT(va <= VM_MAX_KERNEL_ADDRESS, ("pmap_enter: toobig"));
7199 KASSERT(va < UPT_MIN_ADDRESS || va >= UPT_MAX_ADDRESS,
7200 ("pmap_enter: invalid to pmap_enter page table pages (va: 0x%lx)",
7201 va));
7202 KASSERT((m->oflags & VPO_UNMANAGED) != 0 || !VA_IS_CLEANMAP(va),
7203 ("pmap_enter: managed mapping within the clean submap"));
7204 if ((m->oflags & VPO_UNMANAGED) == 0)
7205 VM_PAGE_OBJECT_BUSY_ASSERT(m);
7206 KASSERT((flags & PMAP_ENTER_RESERVED) == 0,
7207 ("pmap_enter: flags %u has reserved bits set", flags));
7208 pa = VM_PAGE_TO_PHYS(m);
7209 newpte = (pt_entry_t)(pa | PG_A | PG_V);
7210 if ((flags & VM_PROT_WRITE) != 0)
7211 newpte |= PG_M;
7212 if ((prot & VM_PROT_WRITE) != 0)
7213 newpte |= PG_RW;
7214 KASSERT((newpte & (PG_M | PG_RW)) != PG_M,
7215 ("pmap_enter: flags includes VM_PROT_WRITE but prot doesn't"));
7216 if ((prot & VM_PROT_EXECUTE) == 0)
7217 newpte |= pg_nx;
7218 if ((flags & PMAP_ENTER_WIRED) != 0)
7219 newpte |= PG_W;
7220 if (va < VM_MAXUSER_ADDRESS)
7221 newpte |= PG_U;
7222 if (pmap == kernel_pmap)
7223 newpte |= PG_G;
7224 newpte |= pmap_cache_bits(pmap, m->md.pat_mode, psind > 0);
7225
7226 /*
7227 * Set modified bit gratuitously for writeable mappings if
7228 * the page is unmanaged. We do not want to take a fault
7229 * to do the dirty bit accounting for these mappings.
7230 */
7231 if ((m->oflags & VPO_UNMANAGED) != 0) {
7232 if ((newpte & PG_RW) != 0)
7233 newpte |= PG_M;
7234 } else
7235 newpte |= PG_MANAGED;
7236
7237 lock = NULL;
7238 PMAP_LOCK(pmap);
7239 if ((flags & PMAP_ENTER_LARGEPAGE) != 0) {
7240 KASSERT((m->oflags & VPO_UNMANAGED) != 0,
7241 ("managed largepage va %#lx flags %#x", va, flags));
7242 rv = pmap_enter_largepage(pmap, va, newpte | PG_PS, flags,
7243 psind);
7244 goto out;
7245 }
7246 if (psind == 1) {
7247 /* Assert the required virtual and physical alignment. */
7248 KASSERT((va & PDRMASK) == 0, ("pmap_enter: va unaligned"));
7249 KASSERT(m->psind > 0, ("pmap_enter: m->psind < psind"));
7250 rv = pmap_enter_pde(pmap, va, newpte | PG_PS, flags, m, &lock);
7251 goto out;
7252 }
7253 mpte = NULL;
7254
7255 /*
7256 * In the case that a page table page is not
7257 * resident, we are creating it here.
7258 */
7259 retry:
7260 pde = pmap_pde(pmap, va);
7261 if (pde != NULL && (*pde & PG_V) != 0 && ((*pde & PG_PS) == 0 ||
7262 pmap_demote_pde_locked(pmap, pde, va, &lock))) {
7263 pte = pmap_pde_to_pte(pde, va);
7264 if (va < VM_MAXUSER_ADDRESS && mpte == NULL) {
7265 mpte = PHYS_TO_VM_PAGE(*pde & PG_FRAME);
7266 mpte->ref_count++;
7267 }
7268 } else if (va < VM_MAXUSER_ADDRESS) {
7269 /*
7270 * Here if the pte page isn't mapped, or if it has been
7271 * deallocated.
7272 */
7273 nosleep = (flags & PMAP_ENTER_NOSLEEP) != 0;
7274 mpte = pmap_allocpte_alloc(pmap, pmap_pde_pindex(va),
7275 nosleep ? NULL : &lock, va);
7276 if (mpte == NULL && nosleep) {
7277 rv = KERN_RESOURCE_SHORTAGE;
7278 goto out;
7279 }
7280 goto retry;
7281 } else
7282 panic("pmap_enter: invalid page directory va=%#lx", va);
7283
7284 origpte = *pte;
7285 pv = NULL;
7286 if (va < VM_MAXUSER_ADDRESS && pmap->pm_type == PT_X86)
7287 newpte |= pmap_pkru_get(pmap, va);
7288
7289 /*
7290 * Is the specified virtual address already mapped?
7291 */
7292 if ((origpte & PG_V) != 0) {
7293 /*
7294 * Wiring change, just update stats. We don't worry about
7295 * wiring PT pages as they remain resident as long as there
7296 * are valid mappings in them. Hence, if a user page is wired,
7297 * the PT page will be also.
7298 */
7299 if ((newpte & PG_W) != 0 && (origpte & PG_W) == 0)
7300 pmap->pm_stats.wired_count++;
7301 else if ((newpte & PG_W) == 0 && (origpte & PG_W) != 0)
7302 pmap->pm_stats.wired_count--;
7303
7304 /*
7305 * Remove the extra PT page reference.
7306 */
7307 if (mpte != NULL) {
7308 mpte->ref_count--;
7309 KASSERT(mpte->ref_count > 0,
7310 ("pmap_enter: missing reference to page table page,"
7311 " va: 0x%lx", va));
7312 }
7313
7314 /*
7315 * Has the physical page changed?
7316 */
7317 opa = origpte & PG_FRAME;
7318 if (opa == pa) {
7319 /*
7320 * No, might be a protection or wiring change.
7321 */
7322 if ((origpte & PG_MANAGED) != 0 &&
7323 (newpte & PG_RW) != 0)
7324 vm_page_aflag_set(m, PGA_WRITEABLE);
7325 if (((origpte ^ newpte) & ~(PG_M | PG_A)) == 0)
7326 goto unchanged;
7327 goto validate;
7328 }
7329
7330 /*
7331 * The physical page has changed. Temporarily invalidate
7332 * the mapping. This ensures that all threads sharing the
7333 * pmap keep a consistent view of the mapping, which is
7334 * necessary for the correct handling of COW faults. It
7335 * also permits reuse of the old mapping's PV entry,
7336 * avoiding an allocation.
7337 *
7338 * For consistency, handle unmanaged mappings the same way.
7339 */
7340 origpte = pte_load_clear(pte);
7341 KASSERT((origpte & PG_FRAME) == opa,
7342 ("pmap_enter: unexpected pa update for %#lx", va));
7343 if ((origpte & PG_MANAGED) != 0) {
7344 om = PHYS_TO_VM_PAGE(opa);
7345
7346 /*
7347 * The pmap lock is sufficient to synchronize with
7348 * concurrent calls to pmap_page_test_mappings() and
7349 * pmap_ts_referenced().
7350 */
7351 if ((origpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
7352 vm_page_dirty(om);
7353 if ((origpte & PG_A) != 0) {
7354 pmap_invalidate_page(pmap, va);
7355 vm_page_aflag_set(om, PGA_REFERENCED);
7356 }
7357 CHANGE_PV_LIST_LOCK_TO_PHYS(&lock, opa);
7358 pv = pmap_pvh_remove(&om->md, pmap, va);
7359 KASSERT(pv != NULL,
7360 ("pmap_enter: no PV entry for %#lx", va));
7361 if ((newpte & PG_MANAGED) == 0)
7362 free_pv_entry(pmap, pv);
7363 if ((om->a.flags & PGA_WRITEABLE) != 0 &&
7364 TAILQ_EMPTY(&om->md.pv_list) &&
7365 ((om->flags & PG_FICTITIOUS) != 0 ||
7366 TAILQ_EMPTY(&pa_to_pvh(opa)->pv_list)))
7367 vm_page_aflag_clear(om, PGA_WRITEABLE);
7368 } else {
7369 /*
7370 * Since this mapping is unmanaged, assume that PG_A
7371 * is set.
7372 */
7373 pmap_invalidate_page(pmap, va);
7374 }
7375 origpte = 0;
7376 } else {
7377 /*
7378 * Increment the counters.
7379 */
7380 if ((newpte & PG_W) != 0)
7381 pmap->pm_stats.wired_count++;
7382 pmap_resident_count_adj(pmap, 1);
7383 }
7384
7385 /*
7386 * Enter on the PV list if part of our managed memory.
7387 */
7388 if ((newpte & PG_MANAGED) != 0) {
7389 if (pv == NULL) {
7390 pv = get_pv_entry(pmap, &lock);
7391 pv->pv_va = va;
7392 }
7393 CHANGE_PV_LIST_LOCK_TO_PHYS(&lock, pa);
7394 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
7395 m->md.pv_gen++;
7396 if ((newpte & PG_RW) != 0)
7397 vm_page_aflag_set(m, PGA_WRITEABLE);
7398 }
7399
7400 /*
7401 * Update the PTE.
7402 */
7403 if ((origpte & PG_V) != 0) {
7404 validate:
7405 origpte = pte_load_store(pte, newpte);
7406 KASSERT((origpte & PG_FRAME) == pa,
7407 ("pmap_enter: unexpected pa update for %#lx", va));
7408 if ((newpte & PG_M) == 0 && (origpte & (PG_M | PG_RW)) ==
7409 (PG_M | PG_RW)) {
7410 if ((origpte & PG_MANAGED) != 0)
7411 vm_page_dirty(m);
7412
7413 /*
7414 * Although the PTE may still have PG_RW set, TLB
7415 * invalidation may nonetheless be required because
7416 * the PTE no longer has PG_M set.
7417 */
7418 } else if ((origpte & PG_NX) != 0 || (newpte & PG_NX) == 0) {
7419 /*
7420 * This PTE change does not require TLB invalidation.
7421 */
7422 goto unchanged;
7423 }
7424 if ((origpte & PG_A) != 0)
7425 pmap_invalidate_page(pmap, va);
7426 } else
7427 pte_store(pte, newpte);
7428
7429 unchanged:
7430
7431 #if VM_NRESERVLEVEL > 0
7432 /*
7433 * If both the page table page and the reservation are fully
7434 * populated, then attempt promotion.
7435 */
7436 if ((mpte == NULL || mpte->ref_count == NPTEPG) &&
7437 (m->flags & PG_FICTITIOUS) == 0 &&
7438 vm_reserv_level_iffullpop(m) == 0)
7439 (void)pmap_promote_pde(pmap, pde, va, mpte, &lock);
7440 #endif
7441
7442 rv = KERN_SUCCESS;
7443 out:
7444 if (lock != NULL)
7445 rw_wunlock(lock);
7446 PMAP_UNLOCK(pmap);
7447 return (rv);
7448 }
7449
7450 /*
7451 * Tries to create a read- and/or execute-only 2MB page mapping. Returns
7452 * KERN_SUCCESS if the mapping was created. Otherwise, returns an error
7453 * value. See pmap_enter_pde() for the possible error values when "no sleep",
7454 * "no replace", and "no reclaim" are specified.
7455 */
7456 static int
pmap_enter_2mpage(pmap_t pmap,vm_offset_t va,vm_page_t m,vm_prot_t prot,struct rwlock ** lockp)7457 pmap_enter_2mpage(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
7458 struct rwlock **lockp)
7459 {
7460 pd_entry_t newpde;
7461 pt_entry_t PG_V;
7462
7463 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
7464 PG_V = pmap_valid_bit(pmap);
7465 newpde = VM_PAGE_TO_PHYS(m) | pmap_cache_bits(pmap, m->md.pat_mode, 1) |
7466 PG_PS | PG_V;
7467 if ((m->oflags & VPO_UNMANAGED) == 0)
7468 newpde |= PG_MANAGED;
7469 if ((prot & VM_PROT_EXECUTE) == 0)
7470 newpde |= pg_nx;
7471 if (va < VM_MAXUSER_ADDRESS)
7472 newpde |= PG_U;
7473 return (pmap_enter_pde(pmap, va, newpde, PMAP_ENTER_NOSLEEP |
7474 PMAP_ENTER_NOREPLACE | PMAP_ENTER_NORECLAIM, NULL, lockp));
7475 }
7476
7477 /*
7478 * Returns true if every page table entry in the specified page table page is
7479 * zero.
7480 */
7481 static bool
pmap_every_pte_zero(vm_paddr_t pa)7482 pmap_every_pte_zero(vm_paddr_t pa)
7483 {
7484 pt_entry_t *pt_end, *pte;
7485
7486 KASSERT((pa & PAGE_MASK) == 0, ("pa is misaligned"));
7487 pte = (pt_entry_t *)PHYS_TO_DMAP(pa);
7488 for (pt_end = pte + NPTEPG; pte < pt_end; pte++) {
7489 if (*pte != 0)
7490 return (false);
7491 }
7492 return (true);
7493 }
7494
7495 /*
7496 * Tries to create the specified 2MB page mapping. Returns KERN_SUCCESS if
7497 * the mapping was created, and one of KERN_FAILURE, KERN_NO_SPACE,
7498 * KERN_PROTECTION_FAILURE, or KERN_RESOURCE_SHORTAGE otherwise. Returns
7499 * KERN_FAILURE if either (1) PMAP_ENTER_NOREPLACE was specified and a 4KB
7500 * page mapping already exists within the 2MB virtual address range starting
7501 * at the specified virtual address or (2) the requested 2MB page mapping is
7502 * not supported due to hardware errata. Returns KERN_NO_SPACE if
7503 * PMAP_ENTER_NOREPLACE was specified and a 2MB page mapping already exists at
7504 * the specified virtual address. Returns KERN_PROTECTION_FAILURE if the PKRU
7505 * settings are not the same across the 2MB virtual address range starting at
7506 * the specified virtual address. Returns KERN_RESOURCE_SHORTAGE if either
7507 * (1) PMAP_ENTER_NOSLEEP was specified and a page table page allocation
7508 * failed or (2) PMAP_ENTER_NORECLAIM was specified and a PV entry allocation
7509 * failed.
7510 *
7511 * The parameter "m" is only used when creating a managed, writeable mapping.
7512 */
7513 static int
pmap_enter_pde(pmap_t pmap,vm_offset_t va,pd_entry_t newpde,u_int flags,vm_page_t m,struct rwlock ** lockp)7514 pmap_enter_pde(pmap_t pmap, vm_offset_t va, pd_entry_t newpde, u_int flags,
7515 vm_page_t m, struct rwlock **lockp)
7516 {
7517 struct spglist free;
7518 pd_entry_t oldpde, *pde;
7519 pt_entry_t PG_G, PG_RW, PG_V;
7520 vm_page_t mt, pdpg;
7521 vm_page_t uwptpg;
7522
7523 PG_G = pmap_global_bit(pmap);
7524 PG_RW = pmap_rw_bit(pmap);
7525 KASSERT((newpde & (pmap_modified_bit(pmap) | PG_RW)) != PG_RW,
7526 ("pmap_enter_pde: newpde is missing PG_M"));
7527 PG_V = pmap_valid_bit(pmap);
7528 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
7529
7530 if (!pmap_allow_2m_x_page(pmap, pmap_pde_ept_executable(pmap,
7531 newpde))) {
7532 CTR2(KTR_PMAP, "pmap_enter_pde: 2m x blocked for va %#lx"
7533 " in pmap %p", va, pmap);
7534 return (KERN_FAILURE);
7535 }
7536 if ((pde = pmap_alloc_pde(pmap, va, &pdpg, (flags &
7537 PMAP_ENTER_NOSLEEP) != 0 ? NULL : lockp)) == NULL) {
7538 CTR2(KTR_PMAP, "pmap_enter_pde: failure for va %#lx"
7539 " in pmap %p", va, pmap);
7540 return (KERN_RESOURCE_SHORTAGE);
7541 }
7542
7543 /*
7544 * If pkru is not same for the whole pde range, return failure
7545 * and let vm_fault() cope. Check after pde allocation, since
7546 * it could sleep.
7547 */
7548 if (!pmap_pkru_same(pmap, va, va + NBPDR)) {
7549 pmap_abort_ptp(pmap, va, pdpg);
7550 return (KERN_PROTECTION_FAILURE);
7551 }
7552 if (va < VM_MAXUSER_ADDRESS && pmap->pm_type == PT_X86) {
7553 newpde &= ~X86_PG_PKU_MASK;
7554 newpde |= pmap_pkru_get(pmap, va);
7555 }
7556
7557 /*
7558 * If there are existing mappings, either abort or remove them.
7559 */
7560 oldpde = *pde;
7561 if ((oldpde & PG_V) != 0) {
7562 KASSERT(pdpg == NULL || pdpg->ref_count > 1,
7563 ("pmap_enter_pde: pdpg's reference count is too low"));
7564 if ((flags & PMAP_ENTER_NOREPLACE) != 0) {
7565 if ((oldpde & PG_PS) != 0) {
7566 if (pdpg != NULL)
7567 pdpg->ref_count--;
7568 CTR2(KTR_PMAP,
7569 "pmap_enter_pde: no space for va %#lx"
7570 " in pmap %p", va, pmap);
7571 return (KERN_NO_SPACE);
7572 } else if (va < VM_MAXUSER_ADDRESS ||
7573 !pmap_every_pte_zero(oldpde & PG_FRAME)) {
7574 if (pdpg != NULL)
7575 pdpg->ref_count--;
7576 CTR2(KTR_PMAP,
7577 "pmap_enter_pde: failure for va %#lx"
7578 " in pmap %p", va, pmap);
7579 return (KERN_FAILURE);
7580 }
7581 }
7582 /* Break the existing mapping(s). */
7583 SLIST_INIT(&free);
7584 if ((oldpde & PG_PS) != 0) {
7585 /*
7586 * The reference to the PD page that was acquired by
7587 * pmap_alloc_pde() ensures that it won't be freed.
7588 * However, if the PDE resulted from a promotion, then
7589 * a reserved PT page could be freed.
7590 */
7591 (void)pmap_remove_pde(pmap, pde, va, &free, lockp);
7592 if ((oldpde & PG_G) == 0)
7593 pmap_invalidate_pde_page(pmap, va, oldpde);
7594 } else {
7595 pmap_delayed_invl_start();
7596 if (pmap_remove_ptes(pmap, va, va + NBPDR, pde, &free,
7597 lockp))
7598 pmap_invalidate_all(pmap);
7599 pmap_delayed_invl_finish();
7600 }
7601 if (va < VM_MAXUSER_ADDRESS) {
7602 vm_page_free_pages_toq(&free, true);
7603 KASSERT(*pde == 0, ("pmap_enter_pde: non-zero pde %p",
7604 pde));
7605 } else {
7606 KASSERT(SLIST_EMPTY(&free),
7607 ("pmap_enter_pde: freed kernel page table page"));
7608
7609 /*
7610 * Both pmap_remove_pde() and pmap_remove_ptes() will
7611 * leave the kernel page table page zero filled.
7612 */
7613 mt = PHYS_TO_VM_PAGE(*pde & PG_FRAME);
7614 if (pmap_insert_pt_page(pmap, mt, false, false))
7615 panic("pmap_enter_pde: trie insert failed");
7616 }
7617 }
7618
7619 /*
7620 * Allocate leaf ptpage for wired userspace pages.
7621 */
7622 uwptpg = NULL;
7623 if ((newpde & PG_W) != 0 && pmap != kernel_pmap) {
7624 uwptpg = pmap_alloc_pt_page(pmap, pmap_pde_pindex(va),
7625 VM_ALLOC_WIRED);
7626 if (uwptpg == NULL)
7627 return (KERN_RESOURCE_SHORTAGE);
7628 if (pmap_insert_pt_page(pmap, uwptpg, true, false)) {
7629 pmap_free_pt_page(pmap, uwptpg, false);
7630 return (KERN_RESOURCE_SHORTAGE);
7631 }
7632
7633 uwptpg->ref_count = NPTEPG;
7634 }
7635 if ((newpde & PG_MANAGED) != 0) {
7636 /*
7637 * Abort this mapping if its PV entry could not be created.
7638 */
7639 if (!pmap_pv_insert_pde(pmap, va, newpde, flags, lockp)) {
7640 if (pdpg != NULL)
7641 pmap_abort_ptp(pmap, va, pdpg);
7642 if (uwptpg != NULL) {
7643 mt = pmap_remove_pt_page(pmap, va);
7644 KASSERT(mt == uwptpg,
7645 ("removed pt page %p, expected %p", mt,
7646 uwptpg));
7647 uwptpg->ref_count = 1;
7648 pmap_free_pt_page(pmap, uwptpg, false);
7649 }
7650 CTR2(KTR_PMAP, "pmap_enter_pde: failure for va %#lx"
7651 " in pmap %p", va, pmap);
7652 return (KERN_RESOURCE_SHORTAGE);
7653 }
7654 if ((newpde & PG_RW) != 0) {
7655 for (mt = m; mt < &m[NBPDR / PAGE_SIZE]; mt++)
7656 vm_page_aflag_set(mt, PGA_WRITEABLE);
7657 }
7658 }
7659
7660 /*
7661 * Increment counters.
7662 */
7663 if ((newpde & PG_W) != 0)
7664 pmap->pm_stats.wired_count += NBPDR / PAGE_SIZE;
7665 pmap_resident_count_adj(pmap, NBPDR / PAGE_SIZE);
7666
7667 /*
7668 * Map the superpage. (This is not a promoted mapping; there will not
7669 * be any lingering 4KB page mappings in the TLB.)
7670 */
7671 pde_store(pde, newpde);
7672
7673 counter_u64_add(pmap_pde_mappings, 1);
7674 CTR2(KTR_PMAP, "pmap_enter_pde: success for va %#lx in pmap %p",
7675 va, pmap);
7676 return (KERN_SUCCESS);
7677 }
7678
7679 /*
7680 * Maps a sequence of resident pages belonging to the same object.
7681 * The sequence begins with the given page m_start. This page is
7682 * mapped at the given virtual address start. Each subsequent page is
7683 * mapped at a virtual address that is offset from start by the same
7684 * amount as the page is offset from m_start within the object. The
7685 * last page in the sequence is the page with the largest offset from
7686 * m_start that can be mapped at a virtual address less than the given
7687 * virtual address end. Not every virtual page between start and end
7688 * is mapped; only those for which a resident page exists with the
7689 * corresponding offset from m_start are mapped.
7690 */
7691 void
pmap_enter_object(pmap_t pmap,vm_offset_t start,vm_offset_t end,vm_page_t m_start,vm_prot_t prot)7692 pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end,
7693 vm_page_t m_start, vm_prot_t prot)
7694 {
7695 struct rwlock *lock;
7696 vm_offset_t va;
7697 vm_page_t m, mpte;
7698 vm_pindex_t diff, psize;
7699 int rv;
7700
7701 VM_OBJECT_ASSERT_LOCKED(m_start->object);
7702
7703 psize = atop(end - start);
7704 mpte = NULL;
7705 m = m_start;
7706 lock = NULL;
7707 PMAP_LOCK(pmap);
7708 while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
7709 va = start + ptoa(diff);
7710 if ((va & PDRMASK) == 0 && va + NBPDR <= end &&
7711 m->psind == 1 && pmap_ps_enabled(pmap) &&
7712 ((rv = pmap_enter_2mpage(pmap, va, m, prot, &lock)) ==
7713 KERN_SUCCESS || rv == KERN_NO_SPACE))
7714 m = &m[NBPDR / PAGE_SIZE - 1];
7715 else
7716 mpte = pmap_enter_quick_locked(pmap, va, m, prot,
7717 mpte, &lock);
7718 m = TAILQ_NEXT(m, listq);
7719 }
7720 if (lock != NULL)
7721 rw_wunlock(lock);
7722 PMAP_UNLOCK(pmap);
7723 }
7724
7725 /*
7726 * this code makes some *MAJOR* assumptions:
7727 * 1. Current pmap & pmap exists.
7728 * 2. Not wired.
7729 * 3. Read access.
7730 * 4. No page table pages.
7731 * but is *MUCH* faster than pmap_enter...
7732 */
7733
7734 void
pmap_enter_quick(pmap_t pmap,vm_offset_t va,vm_page_t m,vm_prot_t prot)7735 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
7736 {
7737 struct rwlock *lock;
7738
7739 lock = NULL;
7740 PMAP_LOCK(pmap);
7741 (void)pmap_enter_quick_locked(pmap, va, m, prot, NULL, &lock);
7742 if (lock != NULL)
7743 rw_wunlock(lock);
7744 PMAP_UNLOCK(pmap);
7745 }
7746
7747 static vm_page_t
pmap_enter_quick_locked(pmap_t pmap,vm_offset_t va,vm_page_t m,vm_prot_t prot,vm_page_t mpte,struct rwlock ** lockp)7748 pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
7749 vm_prot_t prot, vm_page_t mpte, struct rwlock **lockp)
7750 {
7751 pd_entry_t *pde;
7752 pt_entry_t newpte, *pte, PG_V;
7753
7754 KASSERT(!VA_IS_CLEANMAP(va) ||
7755 (m->oflags & VPO_UNMANAGED) != 0,
7756 ("pmap_enter_quick_locked: managed mapping within the clean submap"));
7757 PG_V = pmap_valid_bit(pmap);
7758 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
7759 pde = NULL;
7760
7761 /*
7762 * In the case that a page table page is not
7763 * resident, we are creating it here.
7764 */
7765 if (va < VM_MAXUSER_ADDRESS) {
7766 pdp_entry_t *pdpe;
7767 vm_pindex_t ptepindex;
7768
7769 /*
7770 * Calculate pagetable page index
7771 */
7772 ptepindex = pmap_pde_pindex(va);
7773 if (mpte && (mpte->pindex == ptepindex)) {
7774 mpte->ref_count++;
7775 } else {
7776 /*
7777 * If the page table page is mapped, we just increment
7778 * the hold count, and activate it. Otherwise, we
7779 * attempt to allocate a page table page, passing NULL
7780 * instead of the PV list lock pointer because we don't
7781 * intend to sleep. If this attempt fails, we don't
7782 * retry. Instead, we give up.
7783 */
7784 pdpe = pmap_pdpe(pmap, va);
7785 if (pdpe != NULL && (*pdpe & PG_V) != 0) {
7786 if ((*pdpe & PG_PS) != 0)
7787 return (NULL);
7788 pde = pmap_pdpe_to_pde(pdpe, va);
7789 if ((*pde & PG_V) != 0) {
7790 if ((*pde & PG_PS) != 0)
7791 return (NULL);
7792 mpte = PHYS_TO_VM_PAGE(*pde & PG_FRAME);
7793 mpte->ref_count++;
7794 } else {
7795 mpte = pmap_allocpte_alloc(pmap,
7796 ptepindex, NULL, va);
7797 if (mpte == NULL)
7798 return (NULL);
7799 }
7800 } else {
7801 mpte = pmap_allocpte_alloc(pmap, ptepindex,
7802 NULL, va);
7803 if (mpte == NULL)
7804 return (NULL);
7805 }
7806 }
7807 pte = (pt_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mpte));
7808 pte = &pte[pmap_pte_index(va)];
7809 } else {
7810 mpte = NULL;
7811 pte = vtopte(va);
7812 }
7813 if (*pte) {
7814 if (mpte != NULL)
7815 mpte->ref_count--;
7816 return (NULL);
7817 }
7818
7819 /*
7820 * Enter on the PV list if part of our managed memory.
7821 */
7822 if ((m->oflags & VPO_UNMANAGED) == 0 &&
7823 !pmap_try_insert_pv_entry(pmap, va, m, lockp)) {
7824 if (mpte != NULL)
7825 pmap_abort_ptp(pmap, va, mpte);
7826 return (NULL);
7827 }
7828
7829 /*
7830 * Increment counters
7831 */
7832 pmap_resident_count_adj(pmap, 1);
7833
7834 newpte = VM_PAGE_TO_PHYS(m) | PG_V |
7835 pmap_cache_bits(pmap, m->md.pat_mode, 0);
7836 if ((m->oflags & VPO_UNMANAGED) == 0)
7837 newpte |= PG_MANAGED;
7838 if ((prot & VM_PROT_EXECUTE) == 0)
7839 newpte |= pg_nx;
7840 if (va < VM_MAXUSER_ADDRESS)
7841 newpte |= PG_U | pmap_pkru_get(pmap, va);
7842 pte_store(pte, newpte);
7843
7844 #if VM_NRESERVLEVEL > 0
7845 /*
7846 * If both the PTP and the reservation are fully populated, then
7847 * attempt promotion.
7848 */
7849 if ((mpte == NULL || mpte->ref_count == NPTEPG) &&
7850 (m->flags & PG_FICTITIOUS) == 0 &&
7851 vm_reserv_level_iffullpop(m) == 0) {
7852 if (pde == NULL)
7853 pde = pmap_pde(pmap, va);
7854
7855 /*
7856 * If promotion succeeds, then the next call to this function
7857 * should not be given the unmapped PTP as a hint.
7858 */
7859 if (pmap_promote_pde(pmap, pde, va, mpte, lockp))
7860 mpte = NULL;
7861 }
7862 #endif
7863
7864 return (mpte);
7865 }
7866
7867 /*
7868 * Make a temporary mapping for a physical address. This is only intended
7869 * to be used for panic dumps.
7870 */
7871 void *
pmap_kenter_temporary(vm_paddr_t pa,int i)7872 pmap_kenter_temporary(vm_paddr_t pa, int i)
7873 {
7874 vm_offset_t va;
7875
7876 va = (vm_offset_t)crashdumpmap + (i * PAGE_SIZE);
7877 pmap_kenter(va, pa);
7878 pmap_invlpg(kernel_pmap, va);
7879 return ((void *)crashdumpmap);
7880 }
7881
7882 /*
7883 * This code maps large physical mmap regions into the
7884 * processor address space. Note that some shortcuts
7885 * are taken, but the code works.
7886 */
7887 void
pmap_object_init_pt(pmap_t pmap,vm_offset_t addr,vm_object_t object,vm_pindex_t pindex,vm_size_t size)7888 pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object,
7889 vm_pindex_t pindex, vm_size_t size)
7890 {
7891 pd_entry_t *pde;
7892 pt_entry_t PG_A, PG_M, PG_RW, PG_V;
7893 vm_paddr_t pa, ptepa;
7894 vm_page_t p, pdpg;
7895 int pat_mode;
7896
7897 PG_A = pmap_accessed_bit(pmap);
7898 PG_M = pmap_modified_bit(pmap);
7899 PG_V = pmap_valid_bit(pmap);
7900 PG_RW = pmap_rw_bit(pmap);
7901
7902 VM_OBJECT_ASSERT_WLOCKED(object);
7903 KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG,
7904 ("pmap_object_init_pt: non-device object"));
7905 if ((addr & (NBPDR - 1)) == 0 && (size & (NBPDR - 1)) == 0) {
7906 if (!pmap_ps_enabled(pmap))
7907 return;
7908 if (!vm_object_populate(object, pindex, pindex + atop(size)))
7909 return;
7910 p = vm_page_lookup(object, pindex);
7911 KASSERT(vm_page_all_valid(p),
7912 ("pmap_object_init_pt: invalid page %p", p));
7913 pat_mode = p->md.pat_mode;
7914
7915 /*
7916 * Abort the mapping if the first page is not physically
7917 * aligned to a 2MB page boundary.
7918 */
7919 ptepa = VM_PAGE_TO_PHYS(p);
7920 if (ptepa & (NBPDR - 1))
7921 return;
7922
7923 /*
7924 * Skip the first page. Abort the mapping if the rest of
7925 * the pages are not physically contiguous or have differing
7926 * memory attributes.
7927 */
7928 p = TAILQ_NEXT(p, listq);
7929 for (pa = ptepa + PAGE_SIZE; pa < ptepa + size;
7930 pa += PAGE_SIZE) {
7931 KASSERT(vm_page_all_valid(p),
7932 ("pmap_object_init_pt: invalid page %p", p));
7933 if (pa != VM_PAGE_TO_PHYS(p) ||
7934 pat_mode != p->md.pat_mode)
7935 return;
7936 p = TAILQ_NEXT(p, listq);
7937 }
7938
7939 /*
7940 * Map using 2MB pages. Since "ptepa" is 2M aligned and
7941 * "size" is a multiple of 2M, adding the PAT setting to "pa"
7942 * will not affect the termination of this loop.
7943 */
7944 PMAP_LOCK(pmap);
7945 for (pa = ptepa | pmap_cache_bits(pmap, pat_mode, 1);
7946 pa < ptepa + size; pa += NBPDR) {
7947 pde = pmap_alloc_pde(pmap, addr, &pdpg, NULL);
7948 if (pde == NULL) {
7949 /*
7950 * The creation of mappings below is only an
7951 * optimization. If a page directory page
7952 * cannot be allocated without blocking,
7953 * continue on to the next mapping rather than
7954 * blocking.
7955 */
7956 addr += NBPDR;
7957 continue;
7958 }
7959 if ((*pde & PG_V) == 0) {
7960 pde_store(pde, pa | PG_PS | PG_M | PG_A |
7961 PG_U | PG_RW | PG_V);
7962 pmap_resident_count_adj(pmap, NBPDR / PAGE_SIZE);
7963 counter_u64_add(pmap_pde_mappings, 1);
7964 } else {
7965 /* Continue on if the PDE is already valid. */
7966 pdpg->ref_count--;
7967 KASSERT(pdpg->ref_count > 0,
7968 ("pmap_object_init_pt: missing reference "
7969 "to page directory page, va: 0x%lx", addr));
7970 }
7971 addr += NBPDR;
7972 }
7973 PMAP_UNLOCK(pmap);
7974 }
7975 }
7976
7977 /*
7978 * Clear the wired attribute from the mappings for the specified range of
7979 * addresses in the given pmap. Every valid mapping within that range
7980 * must have the wired attribute set. In contrast, invalid mappings
7981 * cannot have the wired attribute set, so they are ignored.
7982 *
7983 * The wired attribute of the page table entry is not a hardware
7984 * feature, so there is no need to invalidate any TLB entries.
7985 * Since pmap_demote_pde() for the wired entry must never fail,
7986 * pmap_delayed_invl_start()/finish() calls around the
7987 * function are not needed.
7988 */
7989 void
pmap_unwire(pmap_t pmap,vm_offset_t sva,vm_offset_t eva)7990 pmap_unwire(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
7991 {
7992 vm_offset_t va_next;
7993 pml4_entry_t *pml4e;
7994 pdp_entry_t *pdpe;
7995 pd_entry_t *pde;
7996 pt_entry_t *pte, PG_V, PG_G __diagused;
7997
7998 PG_V = pmap_valid_bit(pmap);
7999 PG_G = pmap_global_bit(pmap);
8000 PMAP_LOCK(pmap);
8001 for (; sva < eva; sva = va_next) {
8002 pml4e = pmap_pml4e(pmap, sva);
8003 if (pml4e == NULL || (*pml4e & PG_V) == 0) {
8004 va_next = (sva + NBPML4) & ~PML4MASK;
8005 if (va_next < sva)
8006 va_next = eva;
8007 continue;
8008 }
8009
8010 va_next = (sva + NBPDP) & ~PDPMASK;
8011 if (va_next < sva)
8012 va_next = eva;
8013 pdpe = pmap_pml4e_to_pdpe(pml4e, sva);
8014 if ((*pdpe & PG_V) == 0)
8015 continue;
8016 if ((*pdpe & PG_PS) != 0) {
8017 KASSERT(va_next <= eva,
8018 ("partial update of non-transparent 1G mapping "
8019 "pdpe %#lx sva %#lx eva %#lx va_next %#lx",
8020 *pdpe, sva, eva, va_next));
8021 MPASS(pmap != kernel_pmap); /* XXXKIB */
8022 MPASS((*pdpe & (PG_MANAGED | PG_G)) == 0);
8023 atomic_clear_long(pdpe, PG_W);
8024 pmap->pm_stats.wired_count -= NBPDP / PAGE_SIZE;
8025 continue;
8026 }
8027
8028 va_next = (sva + NBPDR) & ~PDRMASK;
8029 if (va_next < sva)
8030 va_next = eva;
8031 pde = pmap_pdpe_to_pde(pdpe, sva);
8032 if ((*pde & PG_V) == 0)
8033 continue;
8034 if ((*pde & PG_PS) != 0) {
8035 if ((*pde & PG_W) == 0)
8036 panic("pmap_unwire: pde %#jx is missing PG_W",
8037 (uintmax_t)*pde);
8038
8039 /*
8040 * Are we unwiring the entire large page? If not,
8041 * demote the mapping and fall through.
8042 */
8043 if (sva + NBPDR == va_next && eva >= va_next) {
8044 atomic_clear_long(pde, PG_W);
8045 pmap->pm_stats.wired_count -= NBPDR /
8046 PAGE_SIZE;
8047 continue;
8048 } else if (!pmap_demote_pde(pmap, pde, sva))
8049 panic("pmap_unwire: demotion failed");
8050 }
8051 if (va_next > eva)
8052 va_next = eva;
8053 for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
8054 sva += PAGE_SIZE) {
8055 if ((*pte & PG_V) == 0)
8056 continue;
8057 if ((*pte & PG_W) == 0)
8058 panic("pmap_unwire: pte %#jx is missing PG_W",
8059 (uintmax_t)*pte);
8060
8061 /*
8062 * PG_W must be cleared atomically. Although the pmap
8063 * lock synchronizes access to PG_W, another processor
8064 * could be setting PG_M and/or PG_A concurrently.
8065 */
8066 atomic_clear_long(pte, PG_W);
8067 pmap->pm_stats.wired_count--;
8068 }
8069 }
8070 PMAP_UNLOCK(pmap);
8071 }
8072
8073 /*
8074 * Copy the range specified by src_addr/len
8075 * from the source map to the range dst_addr/len
8076 * in the destination map.
8077 *
8078 * This routine is only advisory and need not do anything.
8079 */
8080 void
pmap_copy(pmap_t dst_pmap,pmap_t src_pmap,vm_offset_t dst_addr,vm_size_t len,vm_offset_t src_addr)8081 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
8082 vm_offset_t src_addr)
8083 {
8084 struct rwlock *lock;
8085 pml4_entry_t *pml4e;
8086 pdp_entry_t *pdpe;
8087 pd_entry_t *pde, srcptepaddr;
8088 pt_entry_t *dst_pte, PG_A, PG_M, PG_V, ptetemp, *src_pte;
8089 vm_offset_t addr, end_addr, va_next;
8090 vm_page_t dst_pdpg, dstmpte, srcmpte;
8091
8092 if (dst_addr != src_addr)
8093 return;
8094
8095 if (dst_pmap->pm_type != src_pmap->pm_type)
8096 return;
8097
8098 /*
8099 * EPT page table entries that require emulation of A/D bits are
8100 * sensitive to clearing the PG_A bit (aka EPT_PG_READ). Although
8101 * we clear PG_M (aka EPT_PG_WRITE) concomitantly, the PG_U bit
8102 * (aka EPT_PG_EXECUTE) could still be set. Since some EPT
8103 * implementations flag an EPT misconfiguration for exec-only
8104 * mappings we skip this function entirely for emulated pmaps.
8105 */
8106 if (pmap_emulate_ad_bits(dst_pmap))
8107 return;
8108
8109 end_addr = src_addr + len;
8110 lock = NULL;
8111 if (dst_pmap < src_pmap) {
8112 PMAP_LOCK(dst_pmap);
8113 PMAP_LOCK(src_pmap);
8114 } else {
8115 PMAP_LOCK(src_pmap);
8116 PMAP_LOCK(dst_pmap);
8117 }
8118
8119 PG_A = pmap_accessed_bit(dst_pmap);
8120 PG_M = pmap_modified_bit(dst_pmap);
8121 PG_V = pmap_valid_bit(dst_pmap);
8122
8123 for (addr = src_addr; addr < end_addr; addr = va_next) {
8124 KASSERT(addr < UPT_MIN_ADDRESS,
8125 ("pmap_copy: invalid to pmap_copy page tables"));
8126
8127 pml4e = pmap_pml4e(src_pmap, addr);
8128 if (pml4e == NULL || (*pml4e & PG_V) == 0) {
8129 va_next = (addr + NBPML4) & ~PML4MASK;
8130 if (va_next < addr)
8131 va_next = end_addr;
8132 continue;
8133 }
8134
8135 va_next = (addr + NBPDP) & ~PDPMASK;
8136 if (va_next < addr)
8137 va_next = end_addr;
8138 pdpe = pmap_pml4e_to_pdpe(pml4e, addr);
8139 if ((*pdpe & PG_V) == 0)
8140 continue;
8141 if ((*pdpe & PG_PS) != 0) {
8142 KASSERT(va_next <= end_addr,
8143 ("partial update of non-transparent 1G mapping "
8144 "pdpe %#lx sva %#lx eva %#lx va_next %#lx",
8145 *pdpe, addr, end_addr, va_next));
8146 MPASS((addr & PDPMASK) == 0);
8147 MPASS((*pdpe & PG_MANAGED) == 0);
8148 srcptepaddr = *pdpe;
8149 pdpe = pmap_pdpe(dst_pmap, addr);
8150 if (pdpe == NULL) {
8151 if (pmap_allocpte_alloc(dst_pmap,
8152 pmap_pml4e_pindex(addr), NULL, addr) ==
8153 NULL)
8154 break;
8155 pdpe = pmap_pdpe(dst_pmap, addr);
8156 } else {
8157 pml4e = pmap_pml4e(dst_pmap, addr);
8158 dst_pdpg = PHYS_TO_VM_PAGE(*pml4e & PG_FRAME);
8159 dst_pdpg->ref_count++;
8160 }
8161 KASSERT(*pdpe == 0,
8162 ("1G mapping present in dst pmap "
8163 "pdpe %#lx sva %#lx eva %#lx va_next %#lx",
8164 *pdpe, addr, end_addr, va_next));
8165 *pdpe = srcptepaddr & ~PG_W;
8166 pmap_resident_count_adj(dst_pmap, NBPDP / PAGE_SIZE);
8167 continue;
8168 }
8169
8170 va_next = (addr + NBPDR) & ~PDRMASK;
8171 if (va_next < addr)
8172 va_next = end_addr;
8173
8174 pde = pmap_pdpe_to_pde(pdpe, addr);
8175 srcptepaddr = *pde;
8176 if (srcptepaddr == 0)
8177 continue;
8178
8179 if (srcptepaddr & PG_PS) {
8180 /*
8181 * We can only virtual copy whole superpages.
8182 */
8183 if ((addr & PDRMASK) != 0 || addr + NBPDR > end_addr)
8184 continue;
8185 pde = pmap_alloc_pde(dst_pmap, addr, &dst_pdpg, NULL);
8186 if (pde == NULL)
8187 break;
8188 if (*pde == 0 && ((srcptepaddr & PG_MANAGED) == 0 ||
8189 pmap_pv_insert_pde(dst_pmap, addr, srcptepaddr,
8190 PMAP_ENTER_NORECLAIM, &lock))) {
8191 /*
8192 * We leave the dirty bit unchanged because
8193 * managed read/write superpage mappings are
8194 * required to be dirty. However, managed
8195 * superpage mappings are not required to
8196 * have their accessed bit set, so we clear
8197 * it because we don't know if this mapping
8198 * will be used.
8199 */
8200 srcptepaddr &= ~PG_W;
8201 if ((srcptepaddr & PG_MANAGED) != 0)
8202 srcptepaddr &= ~PG_A;
8203 *pde = srcptepaddr;
8204 pmap_resident_count_adj(dst_pmap, NBPDR /
8205 PAGE_SIZE);
8206 counter_u64_add(pmap_pde_mappings, 1);
8207 } else
8208 pmap_abort_ptp(dst_pmap, addr, dst_pdpg);
8209 continue;
8210 }
8211
8212 srcptepaddr &= PG_FRAME;
8213 srcmpte = PHYS_TO_VM_PAGE(srcptepaddr);
8214 KASSERT(srcmpte->ref_count > 0,
8215 ("pmap_copy: source page table page is unused"));
8216
8217 if (va_next > end_addr)
8218 va_next = end_addr;
8219
8220 src_pte = (pt_entry_t *)PHYS_TO_DMAP(srcptepaddr);
8221 src_pte = &src_pte[pmap_pte_index(addr)];
8222 dstmpte = NULL;
8223 for (; addr < va_next; addr += PAGE_SIZE, src_pte++) {
8224 ptetemp = *src_pte;
8225
8226 /*
8227 * We only virtual copy managed pages.
8228 */
8229 if ((ptetemp & PG_MANAGED) == 0)
8230 continue;
8231
8232 if (dstmpte != NULL) {
8233 KASSERT(dstmpte->pindex ==
8234 pmap_pde_pindex(addr),
8235 ("dstmpte pindex/addr mismatch"));
8236 dstmpte->ref_count++;
8237 } else if ((dstmpte = pmap_allocpte(dst_pmap, addr,
8238 NULL)) == NULL)
8239 goto out;
8240 dst_pte = (pt_entry_t *)
8241 PHYS_TO_DMAP(VM_PAGE_TO_PHYS(dstmpte));
8242 dst_pte = &dst_pte[pmap_pte_index(addr)];
8243 if (*dst_pte == 0 &&
8244 pmap_try_insert_pv_entry(dst_pmap, addr,
8245 PHYS_TO_VM_PAGE(ptetemp & PG_FRAME), &lock)) {
8246 /*
8247 * Clear the wired, modified, and accessed
8248 * (referenced) bits during the copy.
8249 */
8250 *dst_pte = ptetemp & ~(PG_W | PG_M | PG_A);
8251 pmap_resident_count_adj(dst_pmap, 1);
8252 } else {
8253 pmap_abort_ptp(dst_pmap, addr, dstmpte);
8254 goto out;
8255 }
8256 /* Have we copied all of the valid mappings? */
8257 if (dstmpte->ref_count >= srcmpte->ref_count)
8258 break;
8259 }
8260 }
8261 out:
8262 if (lock != NULL)
8263 rw_wunlock(lock);
8264 PMAP_UNLOCK(src_pmap);
8265 PMAP_UNLOCK(dst_pmap);
8266 }
8267
8268 int
pmap_vmspace_copy(pmap_t dst_pmap,pmap_t src_pmap)8269 pmap_vmspace_copy(pmap_t dst_pmap, pmap_t src_pmap)
8270 {
8271 int error;
8272
8273 if (dst_pmap->pm_type != src_pmap->pm_type ||
8274 dst_pmap->pm_type != PT_X86 ||
8275 (cpu_stdext_feature2 & CPUID_STDEXT2_PKU) == 0)
8276 return (0);
8277 for (;;) {
8278 if (dst_pmap < src_pmap) {
8279 PMAP_LOCK(dst_pmap);
8280 PMAP_LOCK(src_pmap);
8281 } else {
8282 PMAP_LOCK(src_pmap);
8283 PMAP_LOCK(dst_pmap);
8284 }
8285 error = pmap_pkru_copy(dst_pmap, src_pmap);
8286 /* Clean up partial copy on failure due to no memory. */
8287 if (error == ENOMEM)
8288 pmap_pkru_deassign_all(dst_pmap);
8289 PMAP_UNLOCK(src_pmap);
8290 PMAP_UNLOCK(dst_pmap);
8291 if (error != ENOMEM)
8292 break;
8293 vm_wait(NULL);
8294 }
8295 return (error);
8296 }
8297
8298 /*
8299 * Zero the specified hardware page.
8300 */
8301 void
pmap_zero_page(vm_page_t m)8302 pmap_zero_page(vm_page_t m)
8303 {
8304 vm_offset_t va;
8305
8306 #ifdef TSLOG_PAGEZERO
8307 TSENTER();
8308 #endif
8309 va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
8310 pagezero((void *)va);
8311 #ifdef TSLOG_PAGEZERO
8312 TSEXIT();
8313 #endif
8314 }
8315
8316 /*
8317 * Zero an area within a single hardware page. off and size must not
8318 * cover an area beyond a single hardware page.
8319 */
8320 void
pmap_zero_page_area(vm_page_t m,int off,int size)8321 pmap_zero_page_area(vm_page_t m, int off, int size)
8322 {
8323 vm_offset_t va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
8324
8325 if (off == 0 && size == PAGE_SIZE)
8326 pagezero((void *)va);
8327 else
8328 bzero((char *)va + off, size);
8329 }
8330
8331 /*
8332 * Copy 1 specified hardware page to another.
8333 */
8334 void
pmap_copy_page(vm_page_t msrc,vm_page_t mdst)8335 pmap_copy_page(vm_page_t msrc, vm_page_t mdst)
8336 {
8337 vm_offset_t src = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(msrc));
8338 vm_offset_t dst = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mdst));
8339
8340 pagecopy((void *)src, (void *)dst);
8341 }
8342
8343 int unmapped_buf_allowed = 1;
8344
8345 void
pmap_copy_pages(vm_page_t ma[],vm_offset_t a_offset,vm_page_t mb[],vm_offset_t b_offset,int xfersize)8346 pmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[],
8347 vm_offset_t b_offset, int xfersize)
8348 {
8349 void *a_cp, *b_cp;
8350 vm_page_t pages[2];
8351 vm_offset_t vaddr[2], a_pg_offset, b_pg_offset;
8352 int cnt;
8353 boolean_t mapped;
8354
8355 while (xfersize > 0) {
8356 a_pg_offset = a_offset & PAGE_MASK;
8357 pages[0] = ma[a_offset >> PAGE_SHIFT];
8358 b_pg_offset = b_offset & PAGE_MASK;
8359 pages[1] = mb[b_offset >> PAGE_SHIFT];
8360 cnt = min(xfersize, PAGE_SIZE - a_pg_offset);
8361 cnt = min(cnt, PAGE_SIZE - b_pg_offset);
8362 mapped = pmap_map_io_transient(pages, vaddr, 2, FALSE);
8363 a_cp = (char *)vaddr[0] + a_pg_offset;
8364 b_cp = (char *)vaddr[1] + b_pg_offset;
8365 bcopy(a_cp, b_cp, cnt);
8366 if (__predict_false(mapped))
8367 pmap_unmap_io_transient(pages, vaddr, 2, FALSE);
8368 a_offset += cnt;
8369 b_offset += cnt;
8370 xfersize -= cnt;
8371 }
8372 }
8373
8374 /*
8375 * Returns true if the pmap's pv is one of the first
8376 * 16 pvs linked to from this page. This count may
8377 * be changed upwards or downwards in the future; it
8378 * is only necessary that true be returned for a small
8379 * subset of pmaps for proper page aging.
8380 */
8381 boolean_t
pmap_page_exists_quick(pmap_t pmap,vm_page_t m)8382 pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
8383 {
8384 struct md_page *pvh;
8385 struct rwlock *lock;
8386 pv_entry_t pv;
8387 int loops = 0;
8388 boolean_t rv;
8389
8390 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
8391 ("pmap_page_exists_quick: page %p is not managed", m));
8392 rv = FALSE;
8393 lock = VM_PAGE_TO_PV_LIST_LOCK(m);
8394 rw_rlock(lock);
8395 TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
8396 if (PV_PMAP(pv) == pmap) {
8397 rv = TRUE;
8398 break;
8399 }
8400 loops++;
8401 if (loops >= 16)
8402 break;
8403 }
8404 if (!rv && loops < 16 && (m->flags & PG_FICTITIOUS) == 0) {
8405 pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
8406 TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
8407 if (PV_PMAP(pv) == pmap) {
8408 rv = TRUE;
8409 break;
8410 }
8411 loops++;
8412 if (loops >= 16)
8413 break;
8414 }
8415 }
8416 rw_runlock(lock);
8417 return (rv);
8418 }
8419
8420 /*
8421 * pmap_page_wired_mappings:
8422 *
8423 * Return the number of managed mappings to the given physical page
8424 * that are wired.
8425 */
8426 int
pmap_page_wired_mappings(vm_page_t m)8427 pmap_page_wired_mappings(vm_page_t m)
8428 {
8429 struct rwlock *lock;
8430 struct md_page *pvh;
8431 pmap_t pmap;
8432 pt_entry_t *pte;
8433 pv_entry_t pv;
8434 int count, md_gen, pvh_gen;
8435
8436 if ((m->oflags & VPO_UNMANAGED) != 0)
8437 return (0);
8438 lock = VM_PAGE_TO_PV_LIST_LOCK(m);
8439 rw_rlock(lock);
8440 restart:
8441 count = 0;
8442 TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
8443 pmap = PV_PMAP(pv);
8444 if (!PMAP_TRYLOCK(pmap)) {
8445 md_gen = m->md.pv_gen;
8446 rw_runlock(lock);
8447 PMAP_LOCK(pmap);
8448 rw_rlock(lock);
8449 if (md_gen != m->md.pv_gen) {
8450 PMAP_UNLOCK(pmap);
8451 goto restart;
8452 }
8453 }
8454 pte = pmap_pte(pmap, pv->pv_va);
8455 if ((*pte & PG_W) != 0)
8456 count++;
8457 PMAP_UNLOCK(pmap);
8458 }
8459 if ((m->flags & PG_FICTITIOUS) == 0) {
8460 pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
8461 TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
8462 pmap = PV_PMAP(pv);
8463 if (!PMAP_TRYLOCK(pmap)) {
8464 md_gen = m->md.pv_gen;
8465 pvh_gen = pvh->pv_gen;
8466 rw_runlock(lock);
8467 PMAP_LOCK(pmap);
8468 rw_rlock(lock);
8469 if (md_gen != m->md.pv_gen ||
8470 pvh_gen != pvh->pv_gen) {
8471 PMAP_UNLOCK(pmap);
8472 goto restart;
8473 }
8474 }
8475 pte = pmap_pde(pmap, pv->pv_va);
8476 if ((*pte & PG_W) != 0)
8477 count++;
8478 PMAP_UNLOCK(pmap);
8479 }
8480 }
8481 rw_runlock(lock);
8482 return (count);
8483 }
8484
8485 /*
8486 * Returns TRUE if the given page is mapped individually or as part of
8487 * a 2mpage. Otherwise, returns FALSE.
8488 */
8489 boolean_t
pmap_page_is_mapped(vm_page_t m)8490 pmap_page_is_mapped(vm_page_t m)
8491 {
8492 struct rwlock *lock;
8493 boolean_t rv;
8494
8495 if ((m->oflags & VPO_UNMANAGED) != 0)
8496 return (FALSE);
8497 lock = VM_PAGE_TO_PV_LIST_LOCK(m);
8498 rw_rlock(lock);
8499 rv = !TAILQ_EMPTY(&m->md.pv_list) ||
8500 ((m->flags & PG_FICTITIOUS) == 0 &&
8501 !TAILQ_EMPTY(&pa_to_pvh(VM_PAGE_TO_PHYS(m))->pv_list));
8502 rw_runlock(lock);
8503 return (rv);
8504 }
8505
8506 /*
8507 * Destroy all managed, non-wired mappings in the given user-space
8508 * pmap. This pmap cannot be active on any processor besides the
8509 * caller.
8510 *
8511 * This function cannot be applied to the kernel pmap. Moreover, it
8512 * is not intended for general use. It is only to be used during
8513 * process termination. Consequently, it can be implemented in ways
8514 * that make it faster than pmap_remove(). First, it can more quickly
8515 * destroy mappings by iterating over the pmap's collection of PV
8516 * entries, rather than searching the page table. Second, it doesn't
8517 * have to test and clear the page table entries atomically, because
8518 * no processor is currently accessing the user address space. In
8519 * particular, a page table entry's dirty bit won't change state once
8520 * this function starts.
8521 *
8522 * Although this function destroys all of the pmap's managed,
8523 * non-wired mappings, it can delay and batch the invalidation of TLB
8524 * entries without calling pmap_delayed_invl_start() and
8525 * pmap_delayed_invl_finish(). Because the pmap is not active on
8526 * any other processor, none of these TLB entries will ever be used
8527 * before their eventual invalidation. Consequently, there is no need
8528 * for either pmap_remove_all() or pmap_remove_write() to wait for
8529 * that eventual TLB invalidation.
8530 */
8531 void
pmap_remove_pages(pmap_t pmap)8532 pmap_remove_pages(pmap_t pmap)
8533 {
8534 pd_entry_t ptepde;
8535 pt_entry_t *pte, tpte;
8536 pt_entry_t PG_M, PG_RW, PG_V;
8537 struct spglist free;
8538 struct pv_chunklist free_chunks[PMAP_MEMDOM];
8539 vm_page_t m, mpte, mt;
8540 pv_entry_t pv;
8541 struct md_page *pvh;
8542 struct pv_chunk *pc, *npc;
8543 struct rwlock *lock;
8544 int64_t bit;
8545 uint64_t inuse, bitmask;
8546 int allfree, field, i, idx;
8547 #ifdef PV_STATS
8548 int freed;
8549 #endif
8550 boolean_t superpage;
8551 vm_paddr_t pa;
8552
8553 /*
8554 * Assert that the given pmap is only active on the current
8555 * CPU. Unfortunately, we cannot block another CPU from
8556 * activating the pmap while this function is executing.
8557 */
8558 KASSERT(pmap == PCPU_GET(curpmap), ("non-current pmap %p", pmap));
8559 #ifdef INVARIANTS
8560 {
8561 cpuset_t other_cpus;
8562
8563 other_cpus = all_cpus;
8564 critical_enter();
8565 CPU_CLR(PCPU_GET(cpuid), &other_cpus);
8566 CPU_AND(&other_cpus, &other_cpus, &pmap->pm_active);
8567 critical_exit();
8568 KASSERT(CPU_EMPTY(&other_cpus), ("pmap active %p", pmap));
8569 }
8570 #endif
8571
8572 lock = NULL;
8573 PG_M = pmap_modified_bit(pmap);
8574 PG_V = pmap_valid_bit(pmap);
8575 PG_RW = pmap_rw_bit(pmap);
8576
8577 for (i = 0; i < PMAP_MEMDOM; i++)
8578 TAILQ_INIT(&free_chunks[i]);
8579 SLIST_INIT(&free);
8580 PMAP_LOCK(pmap);
8581 TAILQ_FOREACH_SAFE(pc, &pmap->pm_pvchunk, pc_list, npc) {
8582 allfree = 1;
8583 #ifdef PV_STATS
8584 freed = 0;
8585 #endif
8586 for (field = 0; field < _NPCM; field++) {
8587 inuse = ~pc->pc_map[field] & pc_freemask[field];
8588 while (inuse != 0) {
8589 bit = bsfq(inuse);
8590 bitmask = 1UL << bit;
8591 idx = field * 64 + bit;
8592 pv = &pc->pc_pventry[idx];
8593 inuse &= ~bitmask;
8594
8595 pte = pmap_pdpe(pmap, pv->pv_va);
8596 ptepde = *pte;
8597 pte = pmap_pdpe_to_pde(pte, pv->pv_va);
8598 tpte = *pte;
8599 if ((tpte & (PG_PS | PG_V)) == PG_V) {
8600 superpage = FALSE;
8601 ptepde = tpte;
8602 pte = (pt_entry_t *)PHYS_TO_DMAP(tpte &
8603 PG_FRAME);
8604 pte = &pte[pmap_pte_index(pv->pv_va)];
8605 tpte = *pte;
8606 } else {
8607 /*
8608 * Keep track whether 'tpte' is a
8609 * superpage explicitly instead of
8610 * relying on PG_PS being set.
8611 *
8612 * This is because PG_PS is numerically
8613 * identical to PG_PTE_PAT and thus a
8614 * regular page could be mistaken for
8615 * a superpage.
8616 */
8617 superpage = TRUE;
8618 }
8619
8620 if ((tpte & PG_V) == 0) {
8621 panic("bad pte va %lx pte %lx",
8622 pv->pv_va, tpte);
8623 }
8624
8625 /*
8626 * We cannot remove wired pages from a process' mapping at this time
8627 */
8628 if (tpte & PG_W) {
8629 allfree = 0;
8630 continue;
8631 }
8632
8633 /* Mark free */
8634 pc->pc_map[field] |= bitmask;
8635
8636 /*
8637 * Because this pmap is not active on other
8638 * processors, the dirty bit cannot have
8639 * changed state since we last loaded pte.
8640 */
8641 pte_clear(pte);
8642
8643 if (superpage)
8644 pa = tpte & PG_PS_FRAME;
8645 else
8646 pa = tpte & PG_FRAME;
8647
8648 m = PHYS_TO_VM_PAGE(pa);
8649 KASSERT(m->phys_addr == pa,
8650 ("vm_page_t %p phys_addr mismatch %016jx %016jx",
8651 m, (uintmax_t)m->phys_addr,
8652 (uintmax_t)tpte));
8653
8654 KASSERT((m->flags & PG_FICTITIOUS) != 0 ||
8655 m < &vm_page_array[vm_page_array_size],
8656 ("pmap_remove_pages: bad tpte %#jx",
8657 (uintmax_t)tpte));
8658
8659 /*
8660 * Update the vm_page_t clean/reference bits.
8661 */
8662 if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) {
8663 if (superpage) {
8664 for (mt = m; mt < &m[NBPDR / PAGE_SIZE]; mt++)
8665 vm_page_dirty(mt);
8666 } else
8667 vm_page_dirty(m);
8668 }
8669
8670 CHANGE_PV_LIST_LOCK_TO_VM_PAGE(&lock, m);
8671
8672 if (superpage) {
8673 pmap_resident_count_adj(pmap, -NBPDR / PAGE_SIZE);
8674 pvh = pa_to_pvh(tpte & PG_PS_FRAME);
8675 TAILQ_REMOVE(&pvh->pv_list, pv, pv_next);
8676 pvh->pv_gen++;
8677 if (TAILQ_EMPTY(&pvh->pv_list)) {
8678 for (mt = m; mt < &m[NBPDR / PAGE_SIZE]; mt++)
8679 if ((mt->a.flags & PGA_WRITEABLE) != 0 &&
8680 TAILQ_EMPTY(&mt->md.pv_list))
8681 vm_page_aflag_clear(mt, PGA_WRITEABLE);
8682 }
8683 mpte = pmap_remove_pt_page(pmap, pv->pv_va);
8684 if (mpte != NULL) {
8685 KASSERT(vm_page_any_valid(mpte),
8686 ("pmap_remove_pages: pte page not promoted"));
8687 pmap_pt_page_count_adj(pmap, -1);
8688 KASSERT(mpte->ref_count == NPTEPG,
8689 ("pmap_remove_pages: pte page reference count error"));
8690 mpte->ref_count = 0;
8691 pmap_add_delayed_free_list(mpte, &free, FALSE);
8692 }
8693 } else {
8694 pmap_resident_count_adj(pmap, -1);
8695 TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
8696 m->md.pv_gen++;
8697 if ((m->a.flags & PGA_WRITEABLE) != 0 &&
8698 TAILQ_EMPTY(&m->md.pv_list) &&
8699 (m->flags & PG_FICTITIOUS) == 0) {
8700 pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
8701 if (TAILQ_EMPTY(&pvh->pv_list))
8702 vm_page_aflag_clear(m, PGA_WRITEABLE);
8703 }
8704 }
8705 pmap_unuse_pt(pmap, pv->pv_va, ptepde, &free);
8706 #ifdef PV_STATS
8707 freed++;
8708 #endif
8709 }
8710 }
8711 PV_STAT(counter_u64_add(pv_entry_frees, freed));
8712 PV_STAT(counter_u64_add(pv_entry_spare, freed));
8713 PV_STAT(counter_u64_add(pv_entry_count, -freed));
8714 if (allfree) {
8715 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
8716 TAILQ_INSERT_TAIL(&free_chunks[pc_to_domain(pc)], pc, pc_list);
8717 }
8718 }
8719 if (lock != NULL)
8720 rw_wunlock(lock);
8721 pmap_invalidate_all(pmap);
8722 pmap_pkru_deassign_all(pmap);
8723 free_pv_chunk_batch((struct pv_chunklist *)&free_chunks);
8724 PMAP_UNLOCK(pmap);
8725 vm_page_free_pages_toq(&free, true);
8726 }
8727
8728 static boolean_t
pmap_page_test_mappings(vm_page_t m,boolean_t accessed,boolean_t modified)8729 pmap_page_test_mappings(vm_page_t m, boolean_t accessed, boolean_t modified)
8730 {
8731 struct rwlock *lock;
8732 pv_entry_t pv;
8733 struct md_page *pvh;
8734 pt_entry_t *pte, mask;
8735 pt_entry_t PG_A, PG_M, PG_RW, PG_V;
8736 pmap_t pmap;
8737 int md_gen, pvh_gen;
8738 boolean_t rv;
8739
8740 rv = FALSE;
8741 lock = VM_PAGE_TO_PV_LIST_LOCK(m);
8742 rw_rlock(lock);
8743 restart:
8744 TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
8745 pmap = PV_PMAP(pv);
8746 if (!PMAP_TRYLOCK(pmap)) {
8747 md_gen = m->md.pv_gen;
8748 rw_runlock(lock);
8749 PMAP_LOCK(pmap);
8750 rw_rlock(lock);
8751 if (md_gen != m->md.pv_gen) {
8752 PMAP_UNLOCK(pmap);
8753 goto restart;
8754 }
8755 }
8756 pte = pmap_pte(pmap, pv->pv_va);
8757 mask = 0;
8758 if (modified) {
8759 PG_M = pmap_modified_bit(pmap);
8760 PG_RW = pmap_rw_bit(pmap);
8761 mask |= PG_RW | PG_M;
8762 }
8763 if (accessed) {
8764 PG_A = pmap_accessed_bit(pmap);
8765 PG_V = pmap_valid_bit(pmap);
8766 mask |= PG_V | PG_A;
8767 }
8768 rv = (*pte & mask) == mask;
8769 PMAP_UNLOCK(pmap);
8770 if (rv)
8771 goto out;
8772 }
8773 if ((m->flags & PG_FICTITIOUS) == 0) {
8774 pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
8775 TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
8776 pmap = PV_PMAP(pv);
8777 if (!PMAP_TRYLOCK(pmap)) {
8778 md_gen = m->md.pv_gen;
8779 pvh_gen = pvh->pv_gen;
8780 rw_runlock(lock);
8781 PMAP_LOCK(pmap);
8782 rw_rlock(lock);
8783 if (md_gen != m->md.pv_gen ||
8784 pvh_gen != pvh->pv_gen) {
8785 PMAP_UNLOCK(pmap);
8786 goto restart;
8787 }
8788 }
8789 pte = pmap_pde(pmap, pv->pv_va);
8790 mask = 0;
8791 if (modified) {
8792 PG_M = pmap_modified_bit(pmap);
8793 PG_RW = pmap_rw_bit(pmap);
8794 mask |= PG_RW | PG_M;
8795 }
8796 if (accessed) {
8797 PG_A = pmap_accessed_bit(pmap);
8798 PG_V = pmap_valid_bit(pmap);
8799 mask |= PG_V | PG_A;
8800 }
8801 rv = (*pte & mask) == mask;
8802 PMAP_UNLOCK(pmap);
8803 if (rv)
8804 goto out;
8805 }
8806 }
8807 out:
8808 rw_runlock(lock);
8809 return (rv);
8810 }
8811
8812 /*
8813 * pmap_is_modified:
8814 *
8815 * Return whether or not the specified physical page was modified
8816 * in any physical maps.
8817 */
8818 boolean_t
pmap_is_modified(vm_page_t m)8819 pmap_is_modified(vm_page_t m)
8820 {
8821
8822 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
8823 ("pmap_is_modified: page %p is not managed", m));
8824
8825 /*
8826 * If the page is not busied then this check is racy.
8827 */
8828 if (!pmap_page_is_write_mapped(m))
8829 return (FALSE);
8830 return (pmap_page_test_mappings(m, FALSE, TRUE));
8831 }
8832
8833 /*
8834 * pmap_is_prefaultable:
8835 *
8836 * Return whether or not the specified virtual address is eligible
8837 * for prefault.
8838 */
8839 boolean_t
pmap_is_prefaultable(pmap_t pmap,vm_offset_t addr)8840 pmap_is_prefaultable(pmap_t pmap, vm_offset_t addr)
8841 {
8842 pd_entry_t *pde;
8843 pt_entry_t *pte, PG_V;
8844 boolean_t rv;
8845
8846 PG_V = pmap_valid_bit(pmap);
8847
8848 /*
8849 * Return TRUE if and only if the PTE for the specified virtual
8850 * address is allocated but invalid.
8851 */
8852 rv = FALSE;
8853 PMAP_LOCK(pmap);
8854 pde = pmap_pde(pmap, addr);
8855 if (pde != NULL && (*pde & (PG_PS | PG_V)) == PG_V) {
8856 pte = pmap_pde_to_pte(pde, addr);
8857 rv = (*pte & PG_V) == 0;
8858 }
8859 PMAP_UNLOCK(pmap);
8860 return (rv);
8861 }
8862
8863 /*
8864 * pmap_is_referenced:
8865 *
8866 * Return whether or not the specified physical page was referenced
8867 * in any physical maps.
8868 */
8869 boolean_t
pmap_is_referenced(vm_page_t m)8870 pmap_is_referenced(vm_page_t m)
8871 {
8872
8873 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
8874 ("pmap_is_referenced: page %p is not managed", m));
8875 return (pmap_page_test_mappings(m, TRUE, FALSE));
8876 }
8877
8878 /*
8879 * Clear the write and modified bits in each of the given page's mappings.
8880 */
8881 void
pmap_remove_write(vm_page_t m)8882 pmap_remove_write(vm_page_t m)
8883 {
8884 struct md_page *pvh;
8885 pmap_t pmap;
8886 struct rwlock *lock;
8887 pv_entry_t next_pv, pv;
8888 pd_entry_t *pde;
8889 pt_entry_t oldpte, *pte, PG_M, PG_RW;
8890 vm_offset_t va;
8891 int pvh_gen, md_gen;
8892
8893 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
8894 ("pmap_remove_write: page %p is not managed", m));
8895
8896 vm_page_assert_busied(m);
8897 if (!pmap_page_is_write_mapped(m))
8898 return;
8899
8900 lock = VM_PAGE_TO_PV_LIST_LOCK(m);
8901 pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy :
8902 pa_to_pvh(VM_PAGE_TO_PHYS(m));
8903 rw_wlock(lock);
8904 retry:
8905 TAILQ_FOREACH_SAFE(pv, &pvh->pv_list, pv_next, next_pv) {
8906 pmap = PV_PMAP(pv);
8907 if (!PMAP_TRYLOCK(pmap)) {
8908 pvh_gen = pvh->pv_gen;
8909 rw_wunlock(lock);
8910 PMAP_LOCK(pmap);
8911 rw_wlock(lock);
8912 if (pvh_gen != pvh->pv_gen) {
8913 PMAP_UNLOCK(pmap);
8914 goto retry;
8915 }
8916 }
8917 PG_RW = pmap_rw_bit(pmap);
8918 va = pv->pv_va;
8919 pde = pmap_pde(pmap, va);
8920 if ((*pde & PG_RW) != 0)
8921 (void)pmap_demote_pde_locked(pmap, pde, va, &lock);
8922 KASSERT(lock == VM_PAGE_TO_PV_LIST_LOCK(m),
8923 ("inconsistent pv lock %p %p for page %p",
8924 lock, VM_PAGE_TO_PV_LIST_LOCK(m), m));
8925 PMAP_UNLOCK(pmap);
8926 }
8927 TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
8928 pmap = PV_PMAP(pv);
8929 if (!PMAP_TRYLOCK(pmap)) {
8930 pvh_gen = pvh->pv_gen;
8931 md_gen = m->md.pv_gen;
8932 rw_wunlock(lock);
8933 PMAP_LOCK(pmap);
8934 rw_wlock(lock);
8935 if (pvh_gen != pvh->pv_gen ||
8936 md_gen != m->md.pv_gen) {
8937 PMAP_UNLOCK(pmap);
8938 goto retry;
8939 }
8940 }
8941 PG_M = pmap_modified_bit(pmap);
8942 PG_RW = pmap_rw_bit(pmap);
8943 pde = pmap_pde(pmap, pv->pv_va);
8944 KASSERT((*pde & PG_PS) == 0,
8945 ("pmap_remove_write: found a 2mpage in page %p's pv list",
8946 m));
8947 pte = pmap_pde_to_pte(pde, pv->pv_va);
8948 oldpte = *pte;
8949 if (oldpte & PG_RW) {
8950 while (!atomic_fcmpset_long(pte, &oldpte, oldpte &
8951 ~(PG_RW | PG_M)))
8952 cpu_spinwait();
8953 if ((oldpte & PG_M) != 0)
8954 vm_page_dirty(m);
8955 pmap_invalidate_page(pmap, pv->pv_va);
8956 }
8957 PMAP_UNLOCK(pmap);
8958 }
8959 rw_wunlock(lock);
8960 vm_page_aflag_clear(m, PGA_WRITEABLE);
8961 pmap_delayed_invl_wait(m);
8962 }
8963
8964 /*
8965 * pmap_ts_referenced:
8966 *
8967 * Return a count of reference bits for a page, clearing those bits.
8968 * It is not necessary for every reference bit to be cleared, but it
8969 * is necessary that 0 only be returned when there are truly no
8970 * reference bits set.
8971 *
8972 * As an optimization, update the page's dirty field if a modified bit is
8973 * found while counting reference bits. This opportunistic update can be
8974 * performed at low cost and can eliminate the need for some future calls
8975 * to pmap_is_modified(). However, since this function stops after
8976 * finding PMAP_TS_REFERENCED_MAX reference bits, it may not detect some
8977 * dirty pages. Those dirty pages will only be detected by a future call
8978 * to pmap_is_modified().
8979 *
8980 * A DI block is not needed within this function, because
8981 * invalidations are performed before the PV list lock is
8982 * released.
8983 */
8984 int
pmap_ts_referenced(vm_page_t m)8985 pmap_ts_referenced(vm_page_t m)
8986 {
8987 struct md_page *pvh;
8988 pv_entry_t pv, pvf;
8989 pmap_t pmap;
8990 struct rwlock *lock;
8991 pd_entry_t oldpde, *pde;
8992 pt_entry_t *pte, PG_A, PG_M, PG_RW;
8993 vm_offset_t va;
8994 vm_paddr_t pa;
8995 int cleared, md_gen, not_cleared, pvh_gen;
8996 struct spglist free;
8997 boolean_t demoted;
8998
8999 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
9000 ("pmap_ts_referenced: page %p is not managed", m));
9001 SLIST_INIT(&free);
9002 cleared = 0;
9003 pa = VM_PAGE_TO_PHYS(m);
9004 lock = PHYS_TO_PV_LIST_LOCK(pa);
9005 pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy : pa_to_pvh(pa);
9006 rw_wlock(lock);
9007 retry:
9008 not_cleared = 0;
9009 if ((pvf = TAILQ_FIRST(&pvh->pv_list)) == NULL)
9010 goto small_mappings;
9011 pv = pvf;
9012 do {
9013 if (pvf == NULL)
9014 pvf = pv;
9015 pmap = PV_PMAP(pv);
9016 if (!PMAP_TRYLOCK(pmap)) {
9017 pvh_gen = pvh->pv_gen;
9018 rw_wunlock(lock);
9019 PMAP_LOCK(pmap);
9020 rw_wlock(lock);
9021 if (pvh_gen != pvh->pv_gen) {
9022 PMAP_UNLOCK(pmap);
9023 goto retry;
9024 }
9025 }
9026 PG_A = pmap_accessed_bit(pmap);
9027 PG_M = pmap_modified_bit(pmap);
9028 PG_RW = pmap_rw_bit(pmap);
9029 va = pv->pv_va;
9030 pde = pmap_pde(pmap, pv->pv_va);
9031 oldpde = *pde;
9032 if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW)) {
9033 /*
9034 * Although "oldpde" is mapping a 2MB page, because
9035 * this function is called at a 4KB page granularity,
9036 * we only update the 4KB page under test.
9037 */
9038 vm_page_dirty(m);
9039 }
9040 if ((oldpde & PG_A) != 0) {
9041 /*
9042 * Since this reference bit is shared by 512 4KB
9043 * pages, it should not be cleared every time it is
9044 * tested. Apply a simple "hash" function on the
9045 * physical page number, the virtual superpage number,
9046 * and the pmap address to select one 4KB page out of
9047 * the 512 on which testing the reference bit will
9048 * result in clearing that reference bit. This
9049 * function is designed to avoid the selection of the
9050 * same 4KB page for every 2MB page mapping.
9051 *
9052 * On demotion, a mapping that hasn't been referenced
9053 * is simply destroyed. To avoid the possibility of a
9054 * subsequent page fault on a demoted wired mapping,
9055 * always leave its reference bit set. Moreover,
9056 * since the superpage is wired, the current state of
9057 * its reference bit won't affect page replacement.
9058 */
9059 if ((((pa >> PAGE_SHIFT) ^ (pv->pv_va >> PDRSHIFT) ^
9060 (uintptr_t)pmap) & (NPTEPG - 1)) == 0 &&
9061 (oldpde & PG_W) == 0) {
9062 if (safe_to_clear_referenced(pmap, oldpde)) {
9063 atomic_clear_long(pde, PG_A);
9064 pmap_invalidate_page(pmap, pv->pv_va);
9065 demoted = FALSE;
9066 } else if (pmap_demote_pde_locked(pmap, pde,
9067 pv->pv_va, &lock)) {
9068 /*
9069 * Remove the mapping to a single page
9070 * so that a subsequent access may
9071 * repromote. Since the underlying
9072 * page table page is fully populated,
9073 * this removal never frees a page
9074 * table page.
9075 */
9076 demoted = TRUE;
9077 va += VM_PAGE_TO_PHYS(m) - (oldpde &
9078 PG_PS_FRAME);
9079 pte = pmap_pde_to_pte(pde, va);
9080 pmap_remove_pte(pmap, pte, va, *pde,
9081 NULL, &lock);
9082 pmap_invalidate_page(pmap, va);
9083 } else
9084 demoted = TRUE;
9085
9086 if (demoted) {
9087 /*
9088 * The superpage mapping was removed
9089 * entirely and therefore 'pv' is no
9090 * longer valid.
9091 */
9092 if (pvf == pv)
9093 pvf = NULL;
9094 pv = NULL;
9095 }
9096 cleared++;
9097 KASSERT(lock == VM_PAGE_TO_PV_LIST_LOCK(m),
9098 ("inconsistent pv lock %p %p for page %p",
9099 lock, VM_PAGE_TO_PV_LIST_LOCK(m), m));
9100 } else
9101 not_cleared++;
9102 }
9103 PMAP_UNLOCK(pmap);
9104 /* Rotate the PV list if it has more than one entry. */
9105 if (pv != NULL && TAILQ_NEXT(pv, pv_next) != NULL) {
9106 TAILQ_REMOVE(&pvh->pv_list, pv, pv_next);
9107 TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_next);
9108 pvh->pv_gen++;
9109 }
9110 if (cleared + not_cleared >= PMAP_TS_REFERENCED_MAX)
9111 goto out;
9112 } while ((pv = TAILQ_FIRST(&pvh->pv_list)) != pvf);
9113 small_mappings:
9114 if ((pvf = TAILQ_FIRST(&m->md.pv_list)) == NULL)
9115 goto out;
9116 pv = pvf;
9117 do {
9118 if (pvf == NULL)
9119 pvf = pv;
9120 pmap = PV_PMAP(pv);
9121 if (!PMAP_TRYLOCK(pmap)) {
9122 pvh_gen = pvh->pv_gen;
9123 md_gen = m->md.pv_gen;
9124 rw_wunlock(lock);
9125 PMAP_LOCK(pmap);
9126 rw_wlock(lock);
9127 if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) {
9128 PMAP_UNLOCK(pmap);
9129 goto retry;
9130 }
9131 }
9132 PG_A = pmap_accessed_bit(pmap);
9133 PG_M = pmap_modified_bit(pmap);
9134 PG_RW = pmap_rw_bit(pmap);
9135 pde = pmap_pde(pmap, pv->pv_va);
9136 KASSERT((*pde & PG_PS) == 0,
9137 ("pmap_ts_referenced: found a 2mpage in page %p's pv list",
9138 m));
9139 pte = pmap_pde_to_pte(pde, pv->pv_va);
9140 if ((*pte & (PG_M | PG_RW)) == (PG_M | PG_RW))
9141 vm_page_dirty(m);
9142 if ((*pte & PG_A) != 0) {
9143 if (safe_to_clear_referenced(pmap, *pte)) {
9144 atomic_clear_long(pte, PG_A);
9145 pmap_invalidate_page(pmap, pv->pv_va);
9146 cleared++;
9147 } else if ((*pte & PG_W) == 0) {
9148 /*
9149 * Wired pages cannot be paged out so
9150 * doing accessed bit emulation for
9151 * them is wasted effort. We do the
9152 * hard work for unwired pages only.
9153 */
9154 pmap_remove_pte(pmap, pte, pv->pv_va,
9155 *pde, &free, &lock);
9156 pmap_invalidate_page(pmap, pv->pv_va);
9157 cleared++;
9158 if (pvf == pv)
9159 pvf = NULL;
9160 pv = NULL;
9161 KASSERT(lock == VM_PAGE_TO_PV_LIST_LOCK(m),
9162 ("inconsistent pv lock %p %p for page %p",
9163 lock, VM_PAGE_TO_PV_LIST_LOCK(m), m));
9164 } else
9165 not_cleared++;
9166 }
9167 PMAP_UNLOCK(pmap);
9168 /* Rotate the PV list if it has more than one entry. */
9169 if (pv != NULL && TAILQ_NEXT(pv, pv_next) != NULL) {
9170 TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
9171 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
9172 m->md.pv_gen++;
9173 }
9174 } while ((pv = TAILQ_FIRST(&m->md.pv_list)) != pvf && cleared +
9175 not_cleared < PMAP_TS_REFERENCED_MAX);
9176 out:
9177 rw_wunlock(lock);
9178 vm_page_free_pages_toq(&free, true);
9179 return (cleared + not_cleared);
9180 }
9181
9182 /*
9183 * Apply the given advice to the specified range of addresses within the
9184 * given pmap. Depending on the advice, clear the referenced and/or
9185 * modified flags in each mapping and set the mapped page's dirty field.
9186 */
9187 void
pmap_advise(pmap_t pmap,vm_offset_t sva,vm_offset_t eva,int advice)9188 pmap_advise(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, int advice)
9189 {
9190 struct rwlock *lock;
9191 pml4_entry_t *pml4e;
9192 pdp_entry_t *pdpe;
9193 pd_entry_t oldpde, *pde;
9194 pt_entry_t *pte, PG_A, PG_G, PG_M, PG_RW, PG_V;
9195 vm_offset_t va, va_next;
9196 vm_page_t m;
9197 bool anychanged;
9198
9199 if (advice != MADV_DONTNEED && advice != MADV_FREE)
9200 return;
9201
9202 /*
9203 * A/D bit emulation requires an alternate code path when clearing
9204 * the modified and accessed bits below. Since this function is
9205 * advisory in nature we skip it entirely for pmaps that require
9206 * A/D bit emulation.
9207 */
9208 if (pmap_emulate_ad_bits(pmap))
9209 return;
9210
9211 PG_A = pmap_accessed_bit(pmap);
9212 PG_G = pmap_global_bit(pmap);
9213 PG_M = pmap_modified_bit(pmap);
9214 PG_V = pmap_valid_bit(pmap);
9215 PG_RW = pmap_rw_bit(pmap);
9216 anychanged = false;
9217 pmap_delayed_invl_start();
9218 PMAP_LOCK(pmap);
9219 for (; sva < eva; sva = va_next) {
9220 pml4e = pmap_pml4e(pmap, sva);
9221 if (pml4e == NULL || (*pml4e & PG_V) == 0) {
9222 va_next = (sva + NBPML4) & ~PML4MASK;
9223 if (va_next < sva)
9224 va_next = eva;
9225 continue;
9226 }
9227
9228 va_next = (sva + NBPDP) & ~PDPMASK;
9229 if (va_next < sva)
9230 va_next = eva;
9231 pdpe = pmap_pml4e_to_pdpe(pml4e, sva);
9232 if ((*pdpe & PG_V) == 0)
9233 continue;
9234 if ((*pdpe & PG_PS) != 0)
9235 continue;
9236
9237 va_next = (sva + NBPDR) & ~PDRMASK;
9238 if (va_next < sva)
9239 va_next = eva;
9240 pde = pmap_pdpe_to_pde(pdpe, sva);
9241 oldpde = *pde;
9242 if ((oldpde & PG_V) == 0)
9243 continue;
9244 else if ((oldpde & PG_PS) != 0) {
9245 if ((oldpde & PG_MANAGED) == 0)
9246 continue;
9247 lock = NULL;
9248 if (!pmap_demote_pde_locked(pmap, pde, sva, &lock)) {
9249 if (lock != NULL)
9250 rw_wunlock(lock);
9251
9252 /*
9253 * The large page mapping was destroyed.
9254 */
9255 continue;
9256 }
9257
9258 /*
9259 * Unless the page mappings are wired, remove the
9260 * mapping to a single page so that a subsequent
9261 * access may repromote. Choosing the last page
9262 * within the address range [sva, min(va_next, eva))
9263 * generally results in more repromotions. Since the
9264 * underlying page table page is fully populated, this
9265 * removal never frees a page table page.
9266 */
9267 if ((oldpde & PG_W) == 0) {
9268 va = eva;
9269 if (va > va_next)
9270 va = va_next;
9271 va -= PAGE_SIZE;
9272 KASSERT(va >= sva,
9273 ("pmap_advise: no address gap"));
9274 pte = pmap_pde_to_pte(pde, va);
9275 KASSERT((*pte & PG_V) != 0,
9276 ("pmap_advise: invalid PTE"));
9277 pmap_remove_pte(pmap, pte, va, *pde, NULL,
9278 &lock);
9279 anychanged = true;
9280 }
9281 if (lock != NULL)
9282 rw_wunlock(lock);
9283 }
9284 if (va_next > eva)
9285 va_next = eva;
9286 va = va_next;
9287 for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
9288 sva += PAGE_SIZE) {
9289 if ((*pte & (PG_MANAGED | PG_V)) != (PG_MANAGED | PG_V))
9290 goto maybe_invlrng;
9291 else if ((*pte & (PG_M | PG_RW)) == (PG_M | PG_RW)) {
9292 if (advice == MADV_DONTNEED) {
9293 /*
9294 * Future calls to pmap_is_modified()
9295 * can be avoided by making the page
9296 * dirty now.
9297 */
9298 m = PHYS_TO_VM_PAGE(*pte & PG_FRAME);
9299 vm_page_dirty(m);
9300 }
9301 atomic_clear_long(pte, PG_M | PG_A);
9302 } else if ((*pte & PG_A) != 0)
9303 atomic_clear_long(pte, PG_A);
9304 else
9305 goto maybe_invlrng;
9306
9307 if ((*pte & PG_G) != 0) {
9308 if (va == va_next)
9309 va = sva;
9310 } else
9311 anychanged = true;
9312 continue;
9313 maybe_invlrng:
9314 if (va != va_next) {
9315 pmap_invalidate_range(pmap, va, sva);
9316 va = va_next;
9317 }
9318 }
9319 if (va != va_next)
9320 pmap_invalidate_range(pmap, va, sva);
9321 }
9322 if (anychanged)
9323 pmap_invalidate_all(pmap);
9324 PMAP_UNLOCK(pmap);
9325 pmap_delayed_invl_finish();
9326 }
9327
9328 /*
9329 * Clear the modify bits on the specified physical page.
9330 */
9331 void
pmap_clear_modify(vm_page_t m)9332 pmap_clear_modify(vm_page_t m)
9333 {
9334 struct md_page *pvh;
9335 pmap_t pmap;
9336 pv_entry_t next_pv, pv;
9337 pd_entry_t oldpde, *pde;
9338 pt_entry_t *pte, PG_M, PG_RW;
9339 struct rwlock *lock;
9340 vm_offset_t va;
9341 int md_gen, pvh_gen;
9342
9343 KASSERT((m->oflags & VPO_UNMANAGED) == 0,
9344 ("pmap_clear_modify: page %p is not managed", m));
9345 vm_page_assert_busied(m);
9346
9347 if (!pmap_page_is_write_mapped(m))
9348 return;
9349 pvh = (m->flags & PG_FICTITIOUS) != 0 ? &pv_dummy :
9350 pa_to_pvh(VM_PAGE_TO_PHYS(m));
9351 lock = VM_PAGE_TO_PV_LIST_LOCK(m);
9352 rw_wlock(lock);
9353 restart:
9354 TAILQ_FOREACH_SAFE(pv, &pvh->pv_list, pv_next, next_pv) {
9355 pmap = PV_PMAP(pv);
9356 if (!PMAP_TRYLOCK(pmap)) {
9357 pvh_gen = pvh->pv_gen;
9358 rw_wunlock(lock);
9359 PMAP_LOCK(pmap);
9360 rw_wlock(lock);
9361 if (pvh_gen != pvh->pv_gen) {
9362 PMAP_UNLOCK(pmap);
9363 goto restart;
9364 }
9365 }
9366 PG_M = pmap_modified_bit(pmap);
9367 PG_RW = pmap_rw_bit(pmap);
9368 va = pv->pv_va;
9369 pde = pmap_pde(pmap, va);
9370 oldpde = *pde;
9371 /* If oldpde has PG_RW set, then it also has PG_M set. */
9372 if ((oldpde & PG_RW) != 0 &&
9373 pmap_demote_pde_locked(pmap, pde, va, &lock) &&
9374 (oldpde & PG_W) == 0) {
9375 /*
9376 * Write protect the mapping to a single page so that
9377 * a subsequent write access may repromote.
9378 */
9379 va += VM_PAGE_TO_PHYS(m) - (oldpde & PG_PS_FRAME);
9380 pte = pmap_pde_to_pte(pde, va);
9381 atomic_clear_long(pte, PG_M | PG_RW);
9382 vm_page_dirty(m);
9383 pmap_invalidate_page(pmap, va);
9384 }
9385 PMAP_UNLOCK(pmap);
9386 }
9387 TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
9388 pmap = PV_PMAP(pv);
9389 if (!PMAP_TRYLOCK(pmap)) {
9390 md_gen = m->md.pv_gen;
9391 pvh_gen = pvh->pv_gen;
9392 rw_wunlock(lock);
9393 PMAP_LOCK(pmap);
9394 rw_wlock(lock);
9395 if (pvh_gen != pvh->pv_gen || md_gen != m->md.pv_gen) {
9396 PMAP_UNLOCK(pmap);
9397 goto restart;
9398 }
9399 }
9400 PG_M = pmap_modified_bit(pmap);
9401 PG_RW = pmap_rw_bit(pmap);
9402 pde = pmap_pde(pmap, pv->pv_va);
9403 KASSERT((*pde & PG_PS) == 0, ("pmap_clear_modify: found"
9404 " a 2mpage in page %p's pv list", m));
9405 pte = pmap_pde_to_pte(pde, pv->pv_va);
9406 if ((*pte & (PG_M | PG_RW)) == (PG_M | PG_RW)) {
9407 atomic_clear_long(pte, PG_M);
9408 pmap_invalidate_page(pmap, pv->pv_va);
9409 }
9410 PMAP_UNLOCK(pmap);
9411 }
9412 rw_wunlock(lock);
9413 }
9414
9415 /*
9416 * Miscellaneous support routines follow
9417 */
9418
9419 /* Adjust the properties for a leaf page table entry. */
9420 static __inline void
pmap_pte_props(pt_entry_t * pte,u_long bits,u_long mask)9421 pmap_pte_props(pt_entry_t *pte, u_long bits, u_long mask)
9422 {
9423 u_long opte, npte;
9424
9425 opte = *(u_long *)pte;
9426 do {
9427 npte = opte & ~mask;
9428 npte |= bits;
9429 } while (npte != opte && !atomic_fcmpset_long((u_long *)pte, &opte,
9430 npte));
9431 }
9432
9433 /*
9434 * Map a set of physical memory pages into the kernel virtual
9435 * address space. Return a pointer to where it is mapped. This
9436 * routine is intended to be used for mapping device memory,
9437 * NOT real memory.
9438 */
9439 static void *
pmap_mapdev_internal(vm_paddr_t pa,vm_size_t size,int mode,int flags)9440 pmap_mapdev_internal(vm_paddr_t pa, vm_size_t size, int mode, int flags)
9441 {
9442 struct pmap_preinit_mapping *ppim;
9443 vm_offset_t va, offset;
9444 vm_size_t tmpsize;
9445 int i;
9446
9447 offset = pa & PAGE_MASK;
9448 size = round_page(offset + size);
9449 pa = trunc_page(pa);
9450
9451 if (!pmap_initialized) {
9452 va = 0;
9453 for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) {
9454 ppim = pmap_preinit_mapping + i;
9455 if (ppim->va == 0) {
9456 ppim->pa = pa;
9457 ppim->sz = size;
9458 ppim->mode = mode;
9459 ppim->va = virtual_avail;
9460 virtual_avail += size;
9461 va = ppim->va;
9462 break;
9463 }
9464 }
9465 if (va == 0)
9466 panic("%s: too many preinit mappings", __func__);
9467 } else {
9468 /*
9469 * If we have a preinit mapping, re-use it.
9470 */
9471 for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) {
9472 ppim = pmap_preinit_mapping + i;
9473 if (ppim->pa == pa && ppim->sz == size &&
9474 (ppim->mode == mode ||
9475 (flags & MAPDEV_SETATTR) == 0))
9476 return ((void *)(ppim->va + offset));
9477 }
9478 /*
9479 * If the specified range of physical addresses fits within
9480 * the direct map window, use the direct map.
9481 */
9482 if (pa < dmaplimit && pa + size <= dmaplimit) {
9483 va = PHYS_TO_DMAP(pa);
9484 if ((flags & MAPDEV_SETATTR) != 0) {
9485 PMAP_LOCK(kernel_pmap);
9486 i = pmap_change_props_locked(va, size,
9487 PROT_NONE, mode, flags);
9488 PMAP_UNLOCK(kernel_pmap);
9489 } else
9490 i = 0;
9491 if (!i)
9492 return ((void *)(va + offset));
9493 }
9494 va = kva_alloc(size);
9495 if (va == 0)
9496 panic("%s: Couldn't allocate KVA", __func__);
9497 }
9498 for (tmpsize = 0; tmpsize < size; tmpsize += PAGE_SIZE)
9499 pmap_kenter_attr(va + tmpsize, pa + tmpsize, mode);
9500 pmap_invalidate_range(kernel_pmap, va, va + tmpsize);
9501 if ((flags & MAPDEV_FLUSHCACHE) != 0)
9502 pmap_invalidate_cache_range(va, va + tmpsize);
9503 return ((void *)(va + offset));
9504 }
9505
9506 void *
pmap_mapdev_attr(vm_paddr_t pa,vm_size_t size,int mode)9507 pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, int mode)
9508 {
9509
9510 return (pmap_mapdev_internal(pa, size, mode, MAPDEV_FLUSHCACHE |
9511 MAPDEV_SETATTR));
9512 }
9513
9514 void *
pmap_mapdev(vm_paddr_t pa,vm_size_t size)9515 pmap_mapdev(vm_paddr_t pa, vm_size_t size)
9516 {
9517
9518 return (pmap_mapdev_attr(pa, size, PAT_UNCACHEABLE));
9519 }
9520
9521 void *
pmap_mapdev_pciecfg(vm_paddr_t pa,vm_size_t size)9522 pmap_mapdev_pciecfg(vm_paddr_t pa, vm_size_t size)
9523 {
9524
9525 return (pmap_mapdev_internal(pa, size, PAT_UNCACHEABLE,
9526 MAPDEV_SETATTR));
9527 }
9528
9529 void *
pmap_mapbios(vm_paddr_t pa,vm_size_t size)9530 pmap_mapbios(vm_paddr_t pa, vm_size_t size)
9531 {
9532
9533 return (pmap_mapdev_internal(pa, size, PAT_WRITE_BACK,
9534 MAPDEV_FLUSHCACHE));
9535 }
9536
9537 void
pmap_unmapdev(void * p,vm_size_t size)9538 pmap_unmapdev(void *p, vm_size_t size)
9539 {
9540 struct pmap_preinit_mapping *ppim;
9541 vm_offset_t offset, va;
9542 int i;
9543
9544 va = (vm_offset_t)p;
9545
9546 /* If we gave a direct map region in pmap_mapdev, do nothing */
9547 if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS)
9548 return;
9549 offset = va & PAGE_MASK;
9550 size = round_page(offset + size);
9551 va = trunc_page(va);
9552 for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) {
9553 ppim = pmap_preinit_mapping + i;
9554 if (ppim->va == va && ppim->sz == size) {
9555 if (pmap_initialized)
9556 return;
9557 ppim->pa = 0;
9558 ppim->va = 0;
9559 ppim->sz = 0;
9560 ppim->mode = 0;
9561 if (va + size == virtual_avail)
9562 virtual_avail = va;
9563 return;
9564 }
9565 }
9566 if (pmap_initialized) {
9567 pmap_qremove(va, atop(size));
9568 kva_free(va, size);
9569 }
9570 }
9571
9572 /*
9573 * Tries to demote a 1GB page mapping.
9574 */
9575 static boolean_t
pmap_demote_pdpe(pmap_t pmap,pdp_entry_t * pdpe,vm_offset_t va)9576 pmap_demote_pdpe(pmap_t pmap, pdp_entry_t *pdpe, vm_offset_t va)
9577 {
9578 pdp_entry_t newpdpe, oldpdpe;
9579 pd_entry_t *firstpde, newpde, *pde;
9580 pt_entry_t PG_A, PG_M, PG_RW, PG_V;
9581 vm_paddr_t pdpgpa;
9582 vm_page_t pdpg;
9583
9584 PG_A = pmap_accessed_bit(pmap);
9585 PG_M = pmap_modified_bit(pmap);
9586 PG_V = pmap_valid_bit(pmap);
9587 PG_RW = pmap_rw_bit(pmap);
9588
9589 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
9590 oldpdpe = *pdpe;
9591 KASSERT((oldpdpe & (PG_PS | PG_V)) == (PG_PS | PG_V),
9592 ("pmap_demote_pdpe: oldpdpe is missing PG_PS and/or PG_V"));
9593 pdpg = pmap_alloc_pt_page(pmap, va >> PDPSHIFT,
9594 VM_ALLOC_WIRED | VM_ALLOC_INTERRUPT);
9595 if (pdpg == NULL) {
9596 CTR2(KTR_PMAP, "pmap_demote_pdpe: failure for va %#lx"
9597 " in pmap %p", va, pmap);
9598 return (FALSE);
9599 }
9600 pdpgpa = VM_PAGE_TO_PHYS(pdpg);
9601 firstpde = (pd_entry_t *)PHYS_TO_DMAP(pdpgpa);
9602 newpdpe = pdpgpa | PG_M | PG_A | (oldpdpe & PG_U) | PG_RW | PG_V;
9603 KASSERT((oldpdpe & PG_A) != 0,
9604 ("pmap_demote_pdpe: oldpdpe is missing PG_A"));
9605 KASSERT((oldpdpe & (PG_M | PG_RW)) != PG_RW,
9606 ("pmap_demote_pdpe: oldpdpe is missing PG_M"));
9607 newpde = oldpdpe;
9608
9609 /*
9610 * Initialize the page directory page.
9611 */
9612 for (pde = firstpde; pde < firstpde + NPDEPG; pde++) {
9613 *pde = newpde;
9614 newpde += NBPDR;
9615 }
9616
9617 /*
9618 * Demote the mapping.
9619 */
9620 *pdpe = newpdpe;
9621
9622 /*
9623 * Invalidate a stale recursive mapping of the page directory page.
9624 */
9625 pmap_invalidate_page(pmap, (vm_offset_t)vtopde(va));
9626
9627 counter_u64_add(pmap_pdpe_demotions, 1);
9628 CTR2(KTR_PMAP, "pmap_demote_pdpe: success for va %#lx"
9629 " in pmap %p", va, pmap);
9630 return (TRUE);
9631 }
9632
9633 /*
9634 * Sets the memory attribute for the specified page.
9635 */
9636 void
pmap_page_set_memattr(vm_page_t m,vm_memattr_t ma)9637 pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
9638 {
9639
9640 m->md.pat_mode = ma;
9641
9642 /*
9643 * If "m" is a normal page, update its direct mapping. This update
9644 * can be relied upon to perform any cache operations that are
9645 * required for data coherence.
9646 */
9647 if ((m->flags & PG_FICTITIOUS) == 0 &&
9648 pmap_change_attr(PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m)), PAGE_SIZE,
9649 m->md.pat_mode))
9650 panic("memory attribute change on the direct map failed");
9651 }
9652
9653 void
pmap_page_set_memattr_noflush(vm_page_t m,vm_memattr_t ma)9654 pmap_page_set_memattr_noflush(vm_page_t m, vm_memattr_t ma)
9655 {
9656 int error;
9657
9658 m->md.pat_mode = ma;
9659
9660 if ((m->flags & PG_FICTITIOUS) != 0)
9661 return;
9662 PMAP_LOCK(kernel_pmap);
9663 error = pmap_change_props_locked(PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m)),
9664 PAGE_SIZE, PROT_NONE, m->md.pat_mode, 0);
9665 PMAP_UNLOCK(kernel_pmap);
9666 if (error != 0)
9667 panic("memory attribute change on the direct map failed");
9668 }
9669
9670 /*
9671 * Changes the specified virtual address range's memory type to that given by
9672 * the parameter "mode". The specified virtual address range must be
9673 * completely contained within either the direct map or the kernel map. If
9674 * the virtual address range is contained within the kernel map, then the
9675 * memory type for each of the corresponding ranges of the direct map is also
9676 * changed. (The corresponding ranges of the direct map are those ranges that
9677 * map the same physical pages as the specified virtual address range.) These
9678 * changes to the direct map are necessary because Intel describes the
9679 * behavior of their processors as "undefined" if two or more mappings to the
9680 * same physical page have different memory types.
9681 *
9682 * Returns zero if the change completed successfully, and either EINVAL or
9683 * ENOMEM if the change failed. Specifically, EINVAL is returned if some part
9684 * of the virtual address range was not mapped, and ENOMEM is returned if
9685 * there was insufficient memory available to complete the change. In the
9686 * latter case, the memory type may have been changed on some part of the
9687 * virtual address range or the direct map.
9688 */
9689 int
pmap_change_attr(vm_offset_t va,vm_size_t size,int mode)9690 pmap_change_attr(vm_offset_t va, vm_size_t size, int mode)
9691 {
9692 int error;
9693
9694 PMAP_LOCK(kernel_pmap);
9695 error = pmap_change_props_locked(va, size, PROT_NONE, mode,
9696 MAPDEV_FLUSHCACHE);
9697 PMAP_UNLOCK(kernel_pmap);
9698 return (error);
9699 }
9700
9701 /*
9702 * Changes the specified virtual address range's protections to those
9703 * specified by "prot". Like pmap_change_attr(), protections for aliases
9704 * in the direct map are updated as well. Protections on aliasing mappings may
9705 * be a subset of the requested protections; for example, mappings in the direct
9706 * map are never executable.
9707 */
9708 int
pmap_change_prot(vm_offset_t va,vm_size_t size,vm_prot_t prot)9709 pmap_change_prot(vm_offset_t va, vm_size_t size, vm_prot_t prot)
9710 {
9711 int error;
9712
9713 /* Only supported within the kernel map. */
9714 if (va < VM_MIN_KERNEL_ADDRESS)
9715 return (EINVAL);
9716
9717 PMAP_LOCK(kernel_pmap);
9718 error = pmap_change_props_locked(va, size, prot, -1,
9719 MAPDEV_ASSERTVALID);
9720 PMAP_UNLOCK(kernel_pmap);
9721 return (error);
9722 }
9723
9724 static int
pmap_change_props_locked(vm_offset_t va,vm_size_t size,vm_prot_t prot,int mode,int flags)9725 pmap_change_props_locked(vm_offset_t va, vm_size_t size, vm_prot_t prot,
9726 int mode, int flags)
9727 {
9728 vm_offset_t base, offset, tmpva;
9729 vm_paddr_t pa_start, pa_end, pa_end1;
9730 pdp_entry_t *pdpe;
9731 pd_entry_t *pde, pde_bits, pde_mask;
9732 pt_entry_t *pte, pte_bits, pte_mask;
9733 int error;
9734 bool changed;
9735
9736 PMAP_LOCK_ASSERT(kernel_pmap, MA_OWNED);
9737 base = trunc_page(va);
9738 offset = va & PAGE_MASK;
9739 size = round_page(offset + size);
9740
9741 /*
9742 * Only supported on kernel virtual addresses, including the direct
9743 * map but excluding the recursive map.
9744 */
9745 if (base < DMAP_MIN_ADDRESS)
9746 return (EINVAL);
9747
9748 /*
9749 * Construct our flag sets and masks. "bits" is the subset of
9750 * "mask" that will be set in each modified PTE.
9751 *
9752 * Mappings in the direct map are never allowed to be executable.
9753 */
9754 pde_bits = pte_bits = 0;
9755 pde_mask = pte_mask = 0;
9756 if (mode != -1) {
9757 pde_bits |= pmap_cache_bits(kernel_pmap, mode, true);
9758 pde_mask |= X86_PG_PDE_CACHE;
9759 pte_bits |= pmap_cache_bits(kernel_pmap, mode, false);
9760 pte_mask |= X86_PG_PTE_CACHE;
9761 }
9762 if (prot != VM_PROT_NONE) {
9763 if ((prot & VM_PROT_WRITE) != 0) {
9764 pde_bits |= X86_PG_RW;
9765 pte_bits |= X86_PG_RW;
9766 }
9767 if ((prot & VM_PROT_EXECUTE) == 0 ||
9768 va < VM_MIN_KERNEL_ADDRESS) {
9769 pde_bits |= pg_nx;
9770 pte_bits |= pg_nx;
9771 }
9772 pde_mask |= X86_PG_RW | pg_nx;
9773 pte_mask |= X86_PG_RW | pg_nx;
9774 }
9775
9776 /*
9777 * Pages that aren't mapped aren't supported. Also break down 2MB pages
9778 * into 4KB pages if required.
9779 */
9780 for (tmpva = base; tmpva < base + size; ) {
9781 pdpe = pmap_pdpe(kernel_pmap, tmpva);
9782 if (pdpe == NULL || *pdpe == 0) {
9783 KASSERT((flags & MAPDEV_ASSERTVALID) == 0,
9784 ("%s: addr %#lx is not mapped", __func__, tmpva));
9785 return (EINVAL);
9786 }
9787 if (*pdpe & PG_PS) {
9788 /*
9789 * If the current 1GB page already has the required
9790 * properties, then we need not demote this page. Just
9791 * increment tmpva to the next 1GB page frame.
9792 */
9793 if ((*pdpe & pde_mask) == pde_bits) {
9794 tmpva = trunc_1gpage(tmpva) + NBPDP;
9795 continue;
9796 }
9797
9798 /*
9799 * If the current offset aligns with a 1GB page frame
9800 * and there is at least 1GB left within the range, then
9801 * we need not break down this page into 2MB pages.
9802 */
9803 if ((tmpva & PDPMASK) == 0 &&
9804 tmpva + PDPMASK < base + size) {
9805 tmpva += NBPDP;
9806 continue;
9807 }
9808 if (!pmap_demote_pdpe(kernel_pmap, pdpe, tmpva))
9809 return (ENOMEM);
9810 }
9811 pde = pmap_pdpe_to_pde(pdpe, tmpva);
9812 if (*pde == 0) {
9813 KASSERT((flags & MAPDEV_ASSERTVALID) == 0,
9814 ("%s: addr %#lx is not mapped", __func__, tmpva));
9815 return (EINVAL);
9816 }
9817 if (*pde & PG_PS) {
9818 /*
9819 * If the current 2MB page already has the required
9820 * properties, then we need not demote this page. Just
9821 * increment tmpva to the next 2MB page frame.
9822 */
9823 if ((*pde & pde_mask) == pde_bits) {
9824 tmpva = trunc_2mpage(tmpva) + NBPDR;
9825 continue;
9826 }
9827
9828 /*
9829 * If the current offset aligns with a 2MB page frame
9830 * and there is at least 2MB left within the range, then
9831 * we need not break down this page into 4KB pages.
9832 */
9833 if ((tmpva & PDRMASK) == 0 &&
9834 tmpva + PDRMASK < base + size) {
9835 tmpva += NBPDR;
9836 continue;
9837 }
9838 if (!pmap_demote_pde(kernel_pmap, pde, tmpva))
9839 return (ENOMEM);
9840 }
9841 pte = pmap_pde_to_pte(pde, tmpva);
9842 if (*pte == 0) {
9843 KASSERT((flags & MAPDEV_ASSERTVALID) == 0,
9844 ("%s: addr %#lx is not mapped", __func__, tmpva));
9845 return (EINVAL);
9846 }
9847 tmpva += PAGE_SIZE;
9848 }
9849 error = 0;
9850
9851 /*
9852 * Ok, all the pages exist, so run through them updating their
9853 * properties if required.
9854 */
9855 changed = false;
9856 pa_start = pa_end = 0;
9857 for (tmpva = base; tmpva < base + size; ) {
9858 pdpe = pmap_pdpe(kernel_pmap, tmpva);
9859 if (*pdpe & PG_PS) {
9860 if ((*pdpe & pde_mask) != pde_bits) {
9861 pmap_pte_props(pdpe, pde_bits, pde_mask);
9862 changed = true;
9863 }
9864 if (tmpva >= VM_MIN_KERNEL_ADDRESS &&
9865 (*pdpe & PG_PS_FRAME) < dmaplimit) {
9866 if (pa_start == pa_end) {
9867 /* Start physical address run. */
9868 pa_start = *pdpe & PG_PS_FRAME;
9869 pa_end = pa_start + NBPDP;
9870 } else if (pa_end == (*pdpe & PG_PS_FRAME))
9871 pa_end += NBPDP;
9872 else {
9873 /* Run ended, update direct map. */
9874 error = pmap_change_props_locked(
9875 PHYS_TO_DMAP(pa_start),
9876 pa_end - pa_start, prot, mode,
9877 flags);
9878 if (error != 0)
9879 break;
9880 /* Start physical address run. */
9881 pa_start = *pdpe & PG_PS_FRAME;
9882 pa_end = pa_start + NBPDP;
9883 }
9884 }
9885 tmpva = trunc_1gpage(tmpva) + NBPDP;
9886 continue;
9887 }
9888 pde = pmap_pdpe_to_pde(pdpe, tmpva);
9889 if (*pde & PG_PS) {
9890 if ((*pde & pde_mask) != pde_bits) {
9891 pmap_pte_props(pde, pde_bits, pde_mask);
9892 changed = true;
9893 }
9894 if (tmpva >= VM_MIN_KERNEL_ADDRESS &&
9895 (*pde & PG_PS_FRAME) < dmaplimit) {
9896 if (pa_start == pa_end) {
9897 /* Start physical address run. */
9898 pa_start = *pde & PG_PS_FRAME;
9899 pa_end = pa_start + NBPDR;
9900 } else if (pa_end == (*pde & PG_PS_FRAME))
9901 pa_end += NBPDR;
9902 else {
9903 /* Run ended, update direct map. */
9904 error = pmap_change_props_locked(
9905 PHYS_TO_DMAP(pa_start),
9906 pa_end - pa_start, prot, mode,
9907 flags);
9908 if (error != 0)
9909 break;
9910 /* Start physical address run. */
9911 pa_start = *pde & PG_PS_FRAME;
9912 pa_end = pa_start + NBPDR;
9913 }
9914 }
9915 tmpva = trunc_2mpage(tmpva) + NBPDR;
9916 } else {
9917 pte = pmap_pde_to_pte(pde, tmpva);
9918 if ((*pte & pte_mask) != pte_bits) {
9919 pmap_pte_props(pte, pte_bits, pte_mask);
9920 changed = true;
9921 }
9922 if (tmpva >= VM_MIN_KERNEL_ADDRESS &&
9923 (*pte & PG_FRAME) < dmaplimit) {
9924 if (pa_start == pa_end) {
9925 /* Start physical address run. */
9926 pa_start = *pte & PG_FRAME;
9927 pa_end = pa_start + PAGE_SIZE;
9928 } else if (pa_end == (*pte & PG_FRAME))
9929 pa_end += PAGE_SIZE;
9930 else {
9931 /* Run ended, update direct map. */
9932 error = pmap_change_props_locked(
9933 PHYS_TO_DMAP(pa_start),
9934 pa_end - pa_start, prot, mode,
9935 flags);
9936 if (error != 0)
9937 break;
9938 /* Start physical address run. */
9939 pa_start = *pte & PG_FRAME;
9940 pa_end = pa_start + PAGE_SIZE;
9941 }
9942 }
9943 tmpva += PAGE_SIZE;
9944 }
9945 }
9946 if (error == 0 && pa_start != pa_end && pa_start < dmaplimit) {
9947 pa_end1 = MIN(pa_end, dmaplimit);
9948 if (pa_start != pa_end1)
9949 error = pmap_change_props_locked(PHYS_TO_DMAP(pa_start),
9950 pa_end1 - pa_start, prot, mode, flags);
9951 }
9952
9953 /*
9954 * Flush CPU caches if required to make sure any data isn't cached that
9955 * shouldn't be, etc.
9956 */
9957 if (changed) {
9958 pmap_invalidate_range(kernel_pmap, base, tmpva);
9959 if ((flags & MAPDEV_FLUSHCACHE) != 0)
9960 pmap_invalidate_cache_range(base, tmpva);
9961 }
9962 return (error);
9963 }
9964
9965 /*
9966 * Demotes any mapping within the direct map region that covers more than the
9967 * specified range of physical addresses. This range's size must be a power
9968 * of two and its starting address must be a multiple of its size. Since the
9969 * demotion does not change any attributes of the mapping, a TLB invalidation
9970 * is not mandatory. The caller may, however, request a TLB invalidation.
9971 */
9972 void
pmap_demote_DMAP(vm_paddr_t base,vm_size_t len,boolean_t invalidate)9973 pmap_demote_DMAP(vm_paddr_t base, vm_size_t len, boolean_t invalidate)
9974 {
9975 pdp_entry_t *pdpe;
9976 pd_entry_t *pde;
9977 vm_offset_t va;
9978 boolean_t changed;
9979
9980 if (len == 0)
9981 return;
9982 KASSERT(powerof2(len), ("pmap_demote_DMAP: len is not a power of 2"));
9983 KASSERT((base & (len - 1)) == 0,
9984 ("pmap_demote_DMAP: base is not a multiple of len"));
9985 if (len < NBPDP && base < dmaplimit) {
9986 va = PHYS_TO_DMAP(base);
9987 changed = FALSE;
9988 PMAP_LOCK(kernel_pmap);
9989 pdpe = pmap_pdpe(kernel_pmap, va);
9990 if ((*pdpe & X86_PG_V) == 0)
9991 panic("pmap_demote_DMAP: invalid PDPE");
9992 if ((*pdpe & PG_PS) != 0) {
9993 if (!pmap_demote_pdpe(kernel_pmap, pdpe, va))
9994 panic("pmap_demote_DMAP: PDPE failed");
9995 changed = TRUE;
9996 }
9997 if (len < NBPDR) {
9998 pde = pmap_pdpe_to_pde(pdpe, va);
9999 if ((*pde & X86_PG_V) == 0)
10000 panic("pmap_demote_DMAP: invalid PDE");
10001 if ((*pde & PG_PS) != 0) {
10002 if (!pmap_demote_pde(kernel_pmap, pde, va))
10003 panic("pmap_demote_DMAP: PDE failed");
10004 changed = TRUE;
10005 }
10006 }
10007 if (changed && invalidate)
10008 pmap_invalidate_page(kernel_pmap, va);
10009 PMAP_UNLOCK(kernel_pmap);
10010 }
10011 }
10012
10013 /*
10014 * Perform the pmap work for mincore(2). If the page is not both referenced and
10015 * modified by this pmap, returns its physical address so that the caller can
10016 * find other mappings.
10017 */
10018 int
pmap_mincore(pmap_t pmap,vm_offset_t addr,vm_paddr_t * pap)10019 pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *pap)
10020 {
10021 pdp_entry_t *pdpe;
10022 pd_entry_t *pdep;
10023 pt_entry_t pte, PG_A, PG_M, PG_RW, PG_V;
10024 vm_paddr_t pa;
10025 int val;
10026
10027 PG_A = pmap_accessed_bit(pmap);
10028 PG_M = pmap_modified_bit(pmap);
10029 PG_V = pmap_valid_bit(pmap);
10030 PG_RW = pmap_rw_bit(pmap);
10031
10032 PMAP_LOCK(pmap);
10033 pte = 0;
10034 pa = 0;
10035 val = 0;
10036 pdpe = pmap_pdpe(pmap, addr);
10037 if (pdpe == NULL)
10038 goto out;
10039 if ((*pdpe & PG_V) != 0) {
10040 if ((*pdpe & PG_PS) != 0) {
10041 pte = *pdpe;
10042 pa = ((pte & PG_PS_PDP_FRAME) | (addr & PDPMASK)) &
10043 PG_FRAME;
10044 val = MINCORE_PSIND(2);
10045 } else {
10046 pdep = pmap_pde(pmap, addr);
10047 if (pdep != NULL && (*pdep & PG_V) != 0) {
10048 if ((*pdep & PG_PS) != 0) {
10049 pte = *pdep;
10050 /* Compute the physical address of the 4KB page. */
10051 pa = ((pte & PG_PS_FRAME) | (addr &
10052 PDRMASK)) & PG_FRAME;
10053 val = MINCORE_PSIND(1);
10054 } else {
10055 pte = *pmap_pde_to_pte(pdep, addr);
10056 pa = pte & PG_FRAME;
10057 val = 0;
10058 }
10059 }
10060 }
10061 }
10062 if ((pte & PG_V) != 0) {
10063 val |= MINCORE_INCORE;
10064 if ((pte & (PG_M | PG_RW)) == (PG_M | PG_RW))
10065 val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER;
10066 if ((pte & PG_A) != 0)
10067 val |= MINCORE_REFERENCED | MINCORE_REFERENCED_OTHER;
10068 }
10069 if ((val & (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER)) !=
10070 (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER) &&
10071 (pte & (PG_MANAGED | PG_V)) == (PG_MANAGED | PG_V)) {
10072 *pap = pa;
10073 }
10074 out:
10075 PMAP_UNLOCK(pmap);
10076 return (val);
10077 }
10078
10079 static uint64_t
pmap_pcid_alloc(pmap_t pmap,struct pmap_pcid * pcidp)10080 pmap_pcid_alloc(pmap_t pmap, struct pmap_pcid *pcidp)
10081 {
10082 uint32_t gen, new_gen, pcid_next;
10083
10084 CRITICAL_ASSERT(curthread);
10085 gen = PCPU_GET(pcid_gen);
10086 if (pcidp->pm_pcid == PMAP_PCID_KERN)
10087 return (pti ? 0 : CR3_PCID_SAVE);
10088 if (pcidp->pm_gen == gen)
10089 return (CR3_PCID_SAVE);
10090 pcid_next = PCPU_GET(pcid_next);
10091 KASSERT((!pti && pcid_next <= PMAP_PCID_OVERMAX) ||
10092 (pti && pcid_next <= PMAP_PCID_OVERMAX_KERN),
10093 ("cpu %d pcid_next %#x", PCPU_GET(cpuid), pcid_next));
10094 if ((!pti && pcid_next == PMAP_PCID_OVERMAX) ||
10095 (pti && pcid_next == PMAP_PCID_OVERMAX_KERN)) {
10096 new_gen = gen + 1;
10097 if (new_gen == 0)
10098 new_gen = 1;
10099 PCPU_SET(pcid_gen, new_gen);
10100 pcid_next = PMAP_PCID_KERN + 1;
10101 } else {
10102 new_gen = gen;
10103 }
10104 pcidp->pm_pcid = pcid_next;
10105 pcidp->pm_gen = new_gen;
10106 PCPU_SET(pcid_next, pcid_next + 1);
10107 return (0);
10108 }
10109
10110 static uint64_t
pmap_pcid_alloc_checked(pmap_t pmap,struct pmap_pcid * pcidp)10111 pmap_pcid_alloc_checked(pmap_t pmap, struct pmap_pcid *pcidp)
10112 {
10113 uint64_t cached;
10114
10115 cached = pmap_pcid_alloc(pmap, pcidp);
10116 KASSERT(pcidp->pm_pcid < PMAP_PCID_OVERMAX,
10117 ("pmap %p cpu %d pcid %#x", pmap, PCPU_GET(cpuid), pcidp->pm_pcid));
10118 KASSERT(pcidp->pm_pcid != PMAP_PCID_KERN || pmap == kernel_pmap,
10119 ("non-kernel pmap pmap %p cpu %d pcid %#x",
10120 pmap, PCPU_GET(cpuid), pcidp->pm_pcid));
10121 return (cached);
10122 }
10123
10124 static void
pmap_activate_sw_pti_post(struct thread * td,pmap_t pmap)10125 pmap_activate_sw_pti_post(struct thread *td, pmap_t pmap)
10126 {
10127
10128 PCPU_GET(tssp)->tss_rsp0 = pmap->pm_ucr3 != PMAP_NO_CR3 ?
10129 PCPU_GET(pti_rsp0) : (uintptr_t)td->td_md.md_stack_base;
10130 }
10131
10132 static void
pmap_activate_sw_pcid_pti(struct thread * td,pmap_t pmap,u_int cpuid)10133 pmap_activate_sw_pcid_pti(struct thread *td, pmap_t pmap, u_int cpuid)
10134 {
10135 pmap_t old_pmap;
10136 struct pmap_pcid *pcidp, *old_pcidp;
10137 uint64_t cached, cr3, kcr3, ucr3;
10138
10139 KASSERT((read_rflags() & PSL_I) == 0,
10140 ("PCID needs interrupts disabled in pmap_activate_sw()"));
10141
10142 /* See the comment in pmap_invalidate_page_pcid(). */
10143 if (PCPU_GET(ucr3_load_mask) != PMAP_UCR3_NOMASK) {
10144 PCPU_SET(ucr3_load_mask, PMAP_UCR3_NOMASK);
10145 old_pmap = PCPU_GET(curpmap);
10146 MPASS(old_pmap->pm_ucr3 != PMAP_NO_CR3);
10147 old_pcidp = zpcpu_get_cpu(old_pmap->pm_pcidp, cpuid);
10148 old_pcidp->pm_gen = 0;
10149 }
10150
10151 pcidp = zpcpu_get_cpu(pmap->pm_pcidp, cpuid);
10152 cached = pmap_pcid_alloc_checked(pmap, pcidp);
10153 cr3 = rcr3();
10154 if ((cr3 & ~CR3_PCID_MASK) != pmap->pm_cr3)
10155 load_cr3(pmap->pm_cr3 | pcidp->pm_pcid);
10156 PCPU_SET(curpmap, pmap);
10157 kcr3 = pmap->pm_cr3 | pcidp->pm_pcid;
10158 ucr3 = pmap->pm_ucr3 | pcidp->pm_pcid | PMAP_PCID_USER_PT;
10159
10160 if (!cached && pmap->pm_ucr3 != PMAP_NO_CR3)
10161 PCPU_SET(ucr3_load_mask, ~CR3_PCID_SAVE);
10162
10163 PCPU_SET(kcr3, kcr3 | CR3_PCID_SAVE);
10164 PCPU_SET(ucr3, ucr3 | CR3_PCID_SAVE);
10165 if (cached)
10166 counter_u64_add(pcid_save_cnt, 1);
10167
10168 pmap_activate_sw_pti_post(td, pmap);
10169 }
10170
10171 static void
pmap_activate_sw_pcid_nopti(struct thread * td __unused,pmap_t pmap,u_int cpuid)10172 pmap_activate_sw_pcid_nopti(struct thread *td __unused, pmap_t pmap,
10173 u_int cpuid)
10174 {
10175 struct pmap_pcid *pcidp;
10176 uint64_t cached, cr3;
10177
10178 KASSERT((read_rflags() & PSL_I) == 0,
10179 ("PCID needs interrupts disabled in pmap_activate_sw()"));
10180
10181 pcidp = zpcpu_get_cpu(pmap->pm_pcidp, cpuid);
10182 cached = pmap_pcid_alloc_checked(pmap, pcidp);
10183 cr3 = rcr3();
10184 if (!cached || (cr3 & ~CR3_PCID_MASK) != pmap->pm_cr3)
10185 load_cr3(pmap->pm_cr3 | pcidp->pm_pcid | cached);
10186 PCPU_SET(curpmap, pmap);
10187 if (cached)
10188 counter_u64_add(pcid_save_cnt, 1);
10189 }
10190
10191 static void
pmap_activate_sw_nopcid_nopti(struct thread * td __unused,pmap_t pmap,u_int cpuid __unused)10192 pmap_activate_sw_nopcid_nopti(struct thread *td __unused, pmap_t pmap,
10193 u_int cpuid __unused)
10194 {
10195
10196 load_cr3(pmap->pm_cr3);
10197 PCPU_SET(curpmap, pmap);
10198 }
10199
10200 static void
pmap_activate_sw_nopcid_pti(struct thread * td,pmap_t pmap,u_int cpuid __unused)10201 pmap_activate_sw_nopcid_pti(struct thread *td, pmap_t pmap,
10202 u_int cpuid __unused)
10203 {
10204
10205 pmap_activate_sw_nopcid_nopti(td, pmap, cpuid);
10206 PCPU_SET(kcr3, pmap->pm_cr3);
10207 PCPU_SET(ucr3, pmap->pm_ucr3);
10208 pmap_activate_sw_pti_post(td, pmap);
10209 }
10210
10211 DEFINE_IFUNC(static, void, pmap_activate_sw_mode, (struct thread *, pmap_t,
10212 u_int))
10213 {
10214
10215 if (pmap_pcid_enabled && pti)
10216 return (pmap_activate_sw_pcid_pti);
10217 else if (pmap_pcid_enabled && !pti)
10218 return (pmap_activate_sw_pcid_nopti);
10219 else if (!pmap_pcid_enabled && pti)
10220 return (pmap_activate_sw_nopcid_pti);
10221 else /* if (!pmap_pcid_enabled && !pti) */
10222 return (pmap_activate_sw_nopcid_nopti);
10223 }
10224
10225 void
pmap_activate_sw(struct thread * td)10226 pmap_activate_sw(struct thread *td)
10227 {
10228 pmap_t oldpmap, pmap;
10229 u_int cpuid;
10230
10231 oldpmap = PCPU_GET(curpmap);
10232 pmap = vmspace_pmap(td->td_proc->p_vmspace);
10233 if (oldpmap == pmap) {
10234 if (cpu_vendor_id != CPU_VENDOR_INTEL)
10235 mfence();
10236 return;
10237 }
10238 cpuid = PCPU_GET(cpuid);
10239 #ifdef SMP
10240 CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
10241 #else
10242 CPU_SET(cpuid, &pmap->pm_active);
10243 #endif
10244 pmap_activate_sw_mode(td, pmap, cpuid);
10245 #ifdef SMP
10246 CPU_CLR_ATOMIC(cpuid, &oldpmap->pm_active);
10247 #else
10248 CPU_CLR(cpuid, &oldpmap->pm_active);
10249 #endif
10250 }
10251
10252 void
pmap_activate(struct thread * td)10253 pmap_activate(struct thread *td)
10254 {
10255 /*
10256 * invltlb_{invpcid,}_pcid_handler() is used to handle an
10257 * invalidate_all IPI, which checks for curpmap ==
10258 * smp_tlb_pmap. The below sequence of operations has a
10259 * window where %CR3 is loaded with the new pmap's PML4
10260 * address, but the curpmap value has not yet been updated.
10261 * This causes the invltlb IPI handler, which is called
10262 * between the updates, to execute as a NOP, which leaves
10263 * stale TLB entries.
10264 *
10265 * Note that the most common use of pmap_activate_sw(), from
10266 * a context switch, is immune to this race, because
10267 * interrupts are disabled (while the thread lock is owned),
10268 * so the IPI is delayed until after curpmap is updated. Protect
10269 * other callers in a similar way, by disabling interrupts
10270 * around the %cr3 register reload and curpmap assignment.
10271 */
10272 spinlock_enter();
10273 pmap_activate_sw(td);
10274 spinlock_exit();
10275 }
10276
10277 void
pmap_activate_boot(pmap_t pmap)10278 pmap_activate_boot(pmap_t pmap)
10279 {
10280 uint64_t kcr3;
10281 u_int cpuid;
10282
10283 /*
10284 * kernel_pmap must be never deactivated, and we ensure that
10285 * by never activating it at all.
10286 */
10287 MPASS(pmap != kernel_pmap);
10288
10289 cpuid = PCPU_GET(cpuid);
10290 #ifdef SMP
10291 CPU_SET_ATOMIC(cpuid, &pmap->pm_active);
10292 #else
10293 CPU_SET(cpuid, &pmap->pm_active);
10294 #endif
10295 PCPU_SET(curpmap, pmap);
10296 if (pti) {
10297 kcr3 = pmap->pm_cr3;
10298 if (pmap_pcid_enabled)
10299 kcr3 |= pmap_get_pcid(pmap) | CR3_PCID_SAVE;
10300 } else {
10301 kcr3 = PMAP_NO_CR3;
10302 }
10303 PCPU_SET(kcr3, kcr3);
10304 PCPU_SET(ucr3, PMAP_NO_CR3);
10305 }
10306
10307 void
pmap_active_cpus(pmap_t pmap,cpuset_t * res)10308 pmap_active_cpus(pmap_t pmap, cpuset_t *res)
10309 {
10310 *res = pmap->pm_active;
10311 }
10312
10313 void
pmap_sync_icache(pmap_t pm,vm_offset_t va,vm_size_t sz)10314 pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz)
10315 {
10316 }
10317
10318 /*
10319 * Increase the starting virtual address of the given mapping if a
10320 * different alignment might result in more superpage mappings.
10321 */
10322 void
pmap_align_superpage(vm_object_t object,vm_ooffset_t offset,vm_offset_t * addr,vm_size_t size)10323 pmap_align_superpage(vm_object_t object, vm_ooffset_t offset,
10324 vm_offset_t *addr, vm_size_t size)
10325 {
10326 vm_offset_t superpage_offset;
10327
10328 if (size < NBPDR)
10329 return;
10330 if (object != NULL && (object->flags & OBJ_COLORED) != 0)
10331 offset += ptoa(object->pg_color);
10332 superpage_offset = offset & PDRMASK;
10333 if (size - ((NBPDR - superpage_offset) & PDRMASK) < NBPDR ||
10334 (*addr & PDRMASK) == superpage_offset)
10335 return;
10336 if ((*addr & PDRMASK) < superpage_offset)
10337 *addr = (*addr & ~PDRMASK) + superpage_offset;
10338 else
10339 *addr = ((*addr + PDRMASK) & ~PDRMASK) + superpage_offset;
10340 }
10341
10342 #ifdef INVARIANTS
10343 static unsigned long num_dirty_emulations;
10344 SYSCTL_ULONG(_vm_pmap, OID_AUTO, num_dirty_emulations, CTLFLAG_RW,
10345 &num_dirty_emulations, 0, NULL);
10346
10347 static unsigned long num_accessed_emulations;
10348 SYSCTL_ULONG(_vm_pmap, OID_AUTO, num_accessed_emulations, CTLFLAG_RW,
10349 &num_accessed_emulations, 0, NULL);
10350
10351 static unsigned long num_superpage_accessed_emulations;
10352 SYSCTL_ULONG(_vm_pmap, OID_AUTO, num_superpage_accessed_emulations, CTLFLAG_RW,
10353 &num_superpage_accessed_emulations, 0, NULL);
10354
10355 static unsigned long ad_emulation_superpage_promotions;
10356 SYSCTL_ULONG(_vm_pmap, OID_AUTO, ad_emulation_superpage_promotions, CTLFLAG_RW,
10357 &ad_emulation_superpage_promotions, 0, NULL);
10358 #endif /* INVARIANTS */
10359
10360 int
pmap_emulate_accessed_dirty(pmap_t pmap,vm_offset_t va,int ftype)10361 pmap_emulate_accessed_dirty(pmap_t pmap, vm_offset_t va, int ftype)
10362 {
10363 int rv;
10364 struct rwlock *lock;
10365 #if VM_NRESERVLEVEL > 0
10366 vm_page_t m, mpte;
10367 #endif
10368 pd_entry_t *pde;
10369 pt_entry_t *pte, PG_A, PG_M, PG_RW, PG_V;
10370
10371 KASSERT(ftype == VM_PROT_READ || ftype == VM_PROT_WRITE,
10372 ("pmap_emulate_accessed_dirty: invalid fault type %d", ftype));
10373
10374 if (!pmap_emulate_ad_bits(pmap))
10375 return (-1);
10376
10377 PG_A = pmap_accessed_bit(pmap);
10378 PG_M = pmap_modified_bit(pmap);
10379 PG_V = pmap_valid_bit(pmap);
10380 PG_RW = pmap_rw_bit(pmap);
10381
10382 rv = -1;
10383 lock = NULL;
10384 PMAP_LOCK(pmap);
10385
10386 pde = pmap_pde(pmap, va);
10387 if (pde == NULL || (*pde & PG_V) == 0)
10388 goto done;
10389
10390 if ((*pde & PG_PS) != 0) {
10391 if (ftype == VM_PROT_READ) {
10392 #ifdef INVARIANTS
10393 atomic_add_long(&num_superpage_accessed_emulations, 1);
10394 #endif
10395 *pde |= PG_A;
10396 rv = 0;
10397 }
10398 goto done;
10399 }
10400
10401 pte = pmap_pde_to_pte(pde, va);
10402 if ((*pte & PG_V) == 0)
10403 goto done;
10404
10405 if (ftype == VM_PROT_WRITE) {
10406 if ((*pte & PG_RW) == 0)
10407 goto done;
10408 /*
10409 * Set the modified and accessed bits simultaneously.
10410 *
10411 * Intel EPT PTEs that do software emulation of A/D bits map
10412 * PG_A and PG_M to EPT_PG_READ and EPT_PG_WRITE respectively.
10413 * An EPT misconfiguration is triggered if the PTE is writable
10414 * but not readable (WR=10). This is avoided by setting PG_A
10415 * and PG_M simultaneously.
10416 */
10417 *pte |= PG_M | PG_A;
10418 } else {
10419 *pte |= PG_A;
10420 }
10421
10422 #if VM_NRESERVLEVEL > 0
10423 /* try to promote the mapping */
10424 if (va < VM_MAXUSER_ADDRESS)
10425 mpte = PHYS_TO_VM_PAGE(*pde & PG_FRAME);
10426 else
10427 mpte = NULL;
10428
10429 m = PHYS_TO_VM_PAGE(*pte & PG_FRAME);
10430
10431 if ((mpte == NULL || mpte->ref_count == NPTEPG) &&
10432 (m->flags & PG_FICTITIOUS) == 0 &&
10433 vm_reserv_level_iffullpop(m) == 0 &&
10434 pmap_promote_pde(pmap, pde, va, mpte, &lock)) {
10435 #ifdef INVARIANTS
10436 atomic_add_long(&ad_emulation_superpage_promotions, 1);
10437 #endif
10438 }
10439 #endif
10440
10441 #ifdef INVARIANTS
10442 if (ftype == VM_PROT_WRITE)
10443 atomic_add_long(&num_dirty_emulations, 1);
10444 else
10445 atomic_add_long(&num_accessed_emulations, 1);
10446 #endif
10447 rv = 0; /* success */
10448 done:
10449 if (lock != NULL)
10450 rw_wunlock(lock);
10451 PMAP_UNLOCK(pmap);
10452 return (rv);
10453 }
10454
10455 void
pmap_get_mapping(pmap_t pmap,vm_offset_t va,uint64_t * ptr,int * num)10456 pmap_get_mapping(pmap_t pmap, vm_offset_t va, uint64_t *ptr, int *num)
10457 {
10458 pml4_entry_t *pml4;
10459 pdp_entry_t *pdp;
10460 pd_entry_t *pde;
10461 pt_entry_t *pte, PG_V;
10462 int idx;
10463
10464 idx = 0;
10465 PG_V = pmap_valid_bit(pmap);
10466 PMAP_LOCK(pmap);
10467
10468 pml4 = pmap_pml4e(pmap, va);
10469 if (pml4 == NULL)
10470 goto done;
10471 ptr[idx++] = *pml4;
10472 if ((*pml4 & PG_V) == 0)
10473 goto done;
10474
10475 pdp = pmap_pml4e_to_pdpe(pml4, va);
10476 ptr[idx++] = *pdp;
10477 if ((*pdp & PG_V) == 0 || (*pdp & PG_PS) != 0)
10478 goto done;
10479
10480 pde = pmap_pdpe_to_pde(pdp, va);
10481 ptr[idx++] = *pde;
10482 if ((*pde & PG_V) == 0 || (*pde & PG_PS) != 0)
10483 goto done;
10484
10485 pte = pmap_pde_to_pte(pde, va);
10486 ptr[idx++] = *pte;
10487
10488 done:
10489 PMAP_UNLOCK(pmap);
10490 *num = idx;
10491 }
10492
10493 /**
10494 * Get the kernel virtual address of a set of physical pages. If there are
10495 * physical addresses not covered by the DMAP perform a transient mapping
10496 * that will be removed when calling pmap_unmap_io_transient.
10497 *
10498 * \param page The pages the caller wishes to obtain the virtual
10499 * address on the kernel memory map.
10500 * \param vaddr On return contains the kernel virtual memory address
10501 * of the pages passed in the page parameter.
10502 * \param count Number of pages passed in.
10503 * \param can_fault true if the thread using the mapped pages can take
10504 * page faults, false otherwise.
10505 *
10506 * \returns true if the caller must call pmap_unmap_io_transient when
10507 * finished or false otherwise.
10508 *
10509 */
10510 bool
pmap_map_io_transient(vm_page_t page[],vm_offset_t vaddr[],int count,bool can_fault)10511 pmap_map_io_transient(vm_page_t page[], vm_offset_t vaddr[], int count,
10512 bool can_fault)
10513 {
10514 vm_paddr_t paddr;
10515 bool needs_mapping;
10516 int error __unused, i;
10517
10518 /*
10519 * Allocate any KVA space that we need, this is done in a separate
10520 * loop to prevent calling vmem_alloc while pinned.
10521 */
10522 needs_mapping = false;
10523 for (i = 0; i < count; i++) {
10524 paddr = VM_PAGE_TO_PHYS(page[i]);
10525 if (__predict_false(paddr >= dmaplimit)) {
10526 error = vmem_alloc(kernel_arena, PAGE_SIZE,
10527 M_BESTFIT | M_WAITOK, &vaddr[i]);
10528 KASSERT(error == 0, ("vmem_alloc failed: %d", error));
10529 needs_mapping = true;
10530 } else {
10531 vaddr[i] = PHYS_TO_DMAP(paddr);
10532 }
10533 }
10534
10535 /* Exit early if everything is covered by the DMAP */
10536 if (!needs_mapping)
10537 return (false);
10538
10539 /*
10540 * NB: The sequence of updating a page table followed by accesses
10541 * to the corresponding pages used in the !DMAP case is subject to
10542 * the situation described in the "AMD64 Architecture Programmer's
10543 * Manual Volume 2: System Programming" rev. 3.23, "7.3.1 Special
10544 * Coherency Considerations". Therefore, issuing the INVLPG right
10545 * after modifying the PTE bits is crucial.
10546 */
10547 if (!can_fault)
10548 sched_pin();
10549 for (i = 0; i < count; i++) {
10550 paddr = VM_PAGE_TO_PHYS(page[i]);
10551 if (paddr >= dmaplimit) {
10552 if (can_fault) {
10553 /*
10554 * Slow path, since we can get page faults
10555 * while mappings are active don't pin the
10556 * thread to the CPU and instead add a global
10557 * mapping visible to all CPUs.
10558 */
10559 pmap_qenter(vaddr[i], &page[i], 1);
10560 } else {
10561 pmap_kenter_attr(vaddr[i], paddr,
10562 page[i]->md.pat_mode);
10563 pmap_invlpg(kernel_pmap, vaddr[i]);
10564 }
10565 }
10566 }
10567
10568 return (needs_mapping);
10569 }
10570
10571 void
pmap_unmap_io_transient(vm_page_t page[],vm_offset_t vaddr[],int count,bool can_fault)10572 pmap_unmap_io_transient(vm_page_t page[], vm_offset_t vaddr[], int count,
10573 bool can_fault)
10574 {
10575 vm_paddr_t paddr;
10576 int i;
10577
10578 if (!can_fault)
10579 sched_unpin();
10580 for (i = 0; i < count; i++) {
10581 paddr = VM_PAGE_TO_PHYS(page[i]);
10582 if (paddr >= dmaplimit) {
10583 if (can_fault)
10584 pmap_qremove(vaddr[i], 1);
10585 vmem_free(kernel_arena, vaddr[i], PAGE_SIZE);
10586 }
10587 }
10588 }
10589
10590 vm_offset_t
pmap_quick_enter_page(vm_page_t m)10591 pmap_quick_enter_page(vm_page_t m)
10592 {
10593 vm_paddr_t paddr;
10594
10595 paddr = VM_PAGE_TO_PHYS(m);
10596 if (paddr < dmaplimit)
10597 return (PHYS_TO_DMAP(paddr));
10598 mtx_lock_spin(&qframe_mtx);
10599 KASSERT(*vtopte(qframe) == 0, ("qframe busy"));
10600
10601 /*
10602 * Since qframe is exclusively mapped by us, and we do not set
10603 * PG_G, we can use INVLPG here.
10604 */
10605 invlpg(qframe);
10606
10607 pte_store(vtopte(qframe), paddr | X86_PG_RW | X86_PG_V | X86_PG_A |
10608 X86_PG_M | pmap_cache_bits(kernel_pmap, m->md.pat_mode, 0));
10609 return (qframe);
10610 }
10611
10612 void
pmap_quick_remove_page(vm_offset_t addr)10613 pmap_quick_remove_page(vm_offset_t addr)
10614 {
10615
10616 if (addr != qframe)
10617 return;
10618 pte_store(vtopte(qframe), 0);
10619 mtx_unlock_spin(&qframe_mtx);
10620 }
10621
10622 /*
10623 * Pdp pages from the large map are managed differently from either
10624 * kernel or user page table pages. They are permanently allocated at
10625 * initialization time, and their reference count is permanently set to
10626 * zero. The pml4 entries pointing to those pages are copied into
10627 * each allocated pmap.
10628 *
10629 * In contrast, pd and pt pages are managed like user page table
10630 * pages. They are dynamically allocated, and their reference count
10631 * represents the number of valid entries within the page.
10632 */
10633 static vm_page_t
pmap_large_map_getptp_unlocked(void)10634 pmap_large_map_getptp_unlocked(void)
10635 {
10636 return (pmap_alloc_pt_page(kernel_pmap, 0, VM_ALLOC_ZERO));
10637 }
10638
10639 static vm_page_t
pmap_large_map_getptp(void)10640 pmap_large_map_getptp(void)
10641 {
10642 vm_page_t m;
10643
10644 PMAP_LOCK_ASSERT(kernel_pmap, MA_OWNED);
10645 m = pmap_large_map_getptp_unlocked();
10646 if (m == NULL) {
10647 PMAP_UNLOCK(kernel_pmap);
10648 vm_wait(NULL);
10649 PMAP_LOCK(kernel_pmap);
10650 /* Callers retry. */
10651 }
10652 return (m);
10653 }
10654
10655 static pdp_entry_t *
pmap_large_map_pdpe(vm_offset_t va)10656 pmap_large_map_pdpe(vm_offset_t va)
10657 {
10658 vm_pindex_t pml4_idx;
10659 vm_paddr_t mphys;
10660
10661 pml4_idx = pmap_pml4e_index(va);
10662 KASSERT(LMSPML4I <= pml4_idx && pml4_idx < LMSPML4I + lm_ents,
10663 ("pmap_large_map_pdpe: va %#jx out of range idx %#jx LMSPML4I "
10664 "%#jx lm_ents %d",
10665 (uintmax_t)va, (uintmax_t)pml4_idx, LMSPML4I, lm_ents));
10666 KASSERT((kernel_pml4[pml4_idx] & X86_PG_V) != 0,
10667 ("pmap_large_map_pdpe: invalid pml4 for va %#jx idx %#jx "
10668 "LMSPML4I %#jx lm_ents %d",
10669 (uintmax_t)va, (uintmax_t)pml4_idx, LMSPML4I, lm_ents));
10670 mphys = kernel_pml4[pml4_idx] & PG_FRAME;
10671 return ((pdp_entry_t *)PHYS_TO_DMAP(mphys) + pmap_pdpe_index(va));
10672 }
10673
10674 static pd_entry_t *
pmap_large_map_pde(vm_offset_t va)10675 pmap_large_map_pde(vm_offset_t va)
10676 {
10677 pdp_entry_t *pdpe;
10678 vm_page_t m;
10679 vm_paddr_t mphys;
10680
10681 retry:
10682 pdpe = pmap_large_map_pdpe(va);
10683 if (*pdpe == 0) {
10684 m = pmap_large_map_getptp();
10685 if (m == NULL)
10686 goto retry;
10687 mphys = VM_PAGE_TO_PHYS(m);
10688 *pdpe = mphys | X86_PG_A | X86_PG_RW | X86_PG_V | pg_nx;
10689 } else {
10690 MPASS((*pdpe & X86_PG_PS) == 0);
10691 mphys = *pdpe & PG_FRAME;
10692 }
10693 return ((pd_entry_t *)PHYS_TO_DMAP(mphys) + pmap_pde_index(va));
10694 }
10695
10696 static pt_entry_t *
pmap_large_map_pte(vm_offset_t va)10697 pmap_large_map_pte(vm_offset_t va)
10698 {
10699 pd_entry_t *pde;
10700 vm_page_t m;
10701 vm_paddr_t mphys;
10702
10703 retry:
10704 pde = pmap_large_map_pde(va);
10705 if (*pde == 0) {
10706 m = pmap_large_map_getptp();
10707 if (m == NULL)
10708 goto retry;
10709 mphys = VM_PAGE_TO_PHYS(m);
10710 *pde = mphys | X86_PG_A | X86_PG_RW | X86_PG_V | pg_nx;
10711 PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pde))->ref_count++;
10712 } else {
10713 MPASS((*pde & X86_PG_PS) == 0);
10714 mphys = *pde & PG_FRAME;
10715 }
10716 return ((pt_entry_t *)PHYS_TO_DMAP(mphys) + pmap_pte_index(va));
10717 }
10718
10719 static vm_paddr_t
pmap_large_map_kextract(vm_offset_t va)10720 pmap_large_map_kextract(vm_offset_t va)
10721 {
10722 pdp_entry_t *pdpe, pdp;
10723 pd_entry_t *pde, pd;
10724 pt_entry_t *pte, pt;
10725
10726 KASSERT(PMAP_ADDRESS_IN_LARGEMAP(va),
10727 ("not largemap range %#lx", (u_long)va));
10728 pdpe = pmap_large_map_pdpe(va);
10729 pdp = *pdpe;
10730 KASSERT((pdp & X86_PG_V) != 0,
10731 ("invalid pdp va %#lx pdpe %#lx pdp %#lx", va,
10732 (u_long)pdpe, pdp));
10733 if ((pdp & X86_PG_PS) != 0) {
10734 KASSERT((amd_feature & AMDID_PAGE1GB) != 0,
10735 ("no 1G pages, va %#lx pdpe %#lx pdp %#lx", va,
10736 (u_long)pdpe, pdp));
10737 return ((pdp & PG_PS_PDP_FRAME) | (va & PDPMASK));
10738 }
10739 pde = pmap_pdpe_to_pde(pdpe, va);
10740 pd = *pde;
10741 KASSERT((pd & X86_PG_V) != 0,
10742 ("invalid pd va %#lx pde %#lx pd %#lx", va, (u_long)pde, pd));
10743 if ((pd & X86_PG_PS) != 0)
10744 return ((pd & PG_PS_FRAME) | (va & PDRMASK));
10745 pte = pmap_pde_to_pte(pde, va);
10746 pt = *pte;
10747 KASSERT((pt & X86_PG_V) != 0,
10748 ("invalid pte va %#lx pte %#lx pt %#lx", va, (u_long)pte, pt));
10749 return ((pt & PG_FRAME) | (va & PAGE_MASK));
10750 }
10751
10752 static int
pmap_large_map_getva(vm_size_t len,vm_offset_t align,vm_offset_t phase,vmem_addr_t * vmem_res)10753 pmap_large_map_getva(vm_size_t len, vm_offset_t align, vm_offset_t phase,
10754 vmem_addr_t *vmem_res)
10755 {
10756
10757 /*
10758 * Large mappings are all but static. Consequently, there
10759 * is no point in waiting for an earlier allocation to be
10760 * freed.
10761 */
10762 return (vmem_xalloc(large_vmem, len, align, phase, 0, VMEM_ADDR_MIN,
10763 VMEM_ADDR_MAX, M_NOWAIT | M_BESTFIT, vmem_res));
10764 }
10765
10766 int
pmap_large_map(vm_paddr_t spa,vm_size_t len,void ** addr,vm_memattr_t mattr)10767 pmap_large_map(vm_paddr_t spa, vm_size_t len, void **addr,
10768 vm_memattr_t mattr)
10769 {
10770 pdp_entry_t *pdpe;
10771 pd_entry_t *pde;
10772 pt_entry_t *pte;
10773 vm_offset_t va, inc;
10774 vmem_addr_t vmem_res;
10775 vm_paddr_t pa;
10776 int error;
10777
10778 if (len == 0 || spa + len < spa)
10779 return (EINVAL);
10780
10781 /* See if DMAP can serve. */
10782 if (spa + len <= dmaplimit) {
10783 va = PHYS_TO_DMAP(spa);
10784 *addr = (void *)va;
10785 return (pmap_change_attr(va, len, mattr));
10786 }
10787
10788 /*
10789 * No, allocate KVA. Fit the address with best possible
10790 * alignment for superpages. Fall back to worse align if
10791 * failed.
10792 */
10793 error = ENOMEM;
10794 if ((amd_feature & AMDID_PAGE1GB) != 0 && rounddown2(spa + len,
10795 NBPDP) >= roundup2(spa, NBPDP) + NBPDP)
10796 error = pmap_large_map_getva(len, NBPDP, spa & PDPMASK,
10797 &vmem_res);
10798 if (error != 0 && rounddown2(spa + len, NBPDR) >= roundup2(spa,
10799 NBPDR) + NBPDR)
10800 error = pmap_large_map_getva(len, NBPDR, spa & PDRMASK,
10801 &vmem_res);
10802 if (error != 0)
10803 error = pmap_large_map_getva(len, PAGE_SIZE, 0, &vmem_res);
10804 if (error != 0)
10805 return (error);
10806
10807 /*
10808 * Fill pagetable. PG_M is not pre-set, we scan modified bits
10809 * in the pagetable to minimize flushing. No need to
10810 * invalidate TLB, since we only update invalid entries.
10811 */
10812 PMAP_LOCK(kernel_pmap);
10813 for (pa = spa, va = vmem_res; len > 0; pa += inc, va += inc,
10814 len -= inc) {
10815 if ((amd_feature & AMDID_PAGE1GB) != 0 && len >= NBPDP &&
10816 (pa & PDPMASK) == 0 && (va & PDPMASK) == 0) {
10817 pdpe = pmap_large_map_pdpe(va);
10818 MPASS(*pdpe == 0);
10819 *pdpe = pa | pg_g | X86_PG_PS | X86_PG_RW |
10820 X86_PG_V | X86_PG_A | pg_nx |
10821 pmap_cache_bits(kernel_pmap, mattr, TRUE);
10822 inc = NBPDP;
10823 } else if (len >= NBPDR && (pa & PDRMASK) == 0 &&
10824 (va & PDRMASK) == 0) {
10825 pde = pmap_large_map_pde(va);
10826 MPASS(*pde == 0);
10827 *pde = pa | pg_g | X86_PG_PS | X86_PG_RW |
10828 X86_PG_V | X86_PG_A | pg_nx |
10829 pmap_cache_bits(kernel_pmap, mattr, TRUE);
10830 PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pde))->
10831 ref_count++;
10832 inc = NBPDR;
10833 } else {
10834 pte = pmap_large_map_pte(va);
10835 MPASS(*pte == 0);
10836 *pte = pa | pg_g | X86_PG_RW | X86_PG_V |
10837 X86_PG_A | pg_nx | pmap_cache_bits(kernel_pmap,
10838 mattr, FALSE);
10839 PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pte))->
10840 ref_count++;
10841 inc = PAGE_SIZE;
10842 }
10843 }
10844 PMAP_UNLOCK(kernel_pmap);
10845 MPASS(len == 0);
10846
10847 *addr = (void *)vmem_res;
10848 return (0);
10849 }
10850
10851 void
pmap_large_unmap(void * svaa,vm_size_t len)10852 pmap_large_unmap(void *svaa, vm_size_t len)
10853 {
10854 vm_offset_t sva, va;
10855 vm_size_t inc;
10856 pdp_entry_t *pdpe, pdp;
10857 pd_entry_t *pde, pd;
10858 pt_entry_t *pte;
10859 vm_page_t m;
10860 struct spglist spgf;
10861
10862 sva = (vm_offset_t)svaa;
10863 if (len == 0 || sva + len < sva || (sva >= DMAP_MIN_ADDRESS &&
10864 sva + len <= DMAP_MIN_ADDRESS + dmaplimit))
10865 return;
10866
10867 SLIST_INIT(&spgf);
10868 KASSERT(PMAP_ADDRESS_IN_LARGEMAP(sva) &&
10869 PMAP_ADDRESS_IN_LARGEMAP(sva + len - 1),
10870 ("not largemap range %#lx %#lx", (u_long)svaa, (u_long)svaa + len));
10871 PMAP_LOCK(kernel_pmap);
10872 for (va = sva; va < sva + len; va += inc) {
10873 pdpe = pmap_large_map_pdpe(va);
10874 pdp = *pdpe;
10875 KASSERT((pdp & X86_PG_V) != 0,
10876 ("invalid pdp va %#lx pdpe %#lx pdp %#lx", va,
10877 (u_long)pdpe, pdp));
10878 if ((pdp & X86_PG_PS) != 0) {
10879 KASSERT((amd_feature & AMDID_PAGE1GB) != 0,
10880 ("no 1G pages, va %#lx pdpe %#lx pdp %#lx", va,
10881 (u_long)pdpe, pdp));
10882 KASSERT((va & PDPMASK) == 0,
10883 ("PDPMASK bit set, va %#lx pdpe %#lx pdp %#lx", va,
10884 (u_long)pdpe, pdp));
10885 KASSERT(va + NBPDP <= sva + len,
10886 ("unmap covers partial 1GB page, sva %#lx va %#lx "
10887 "pdpe %#lx pdp %#lx len %#lx", sva, va,
10888 (u_long)pdpe, pdp, len));
10889 *pdpe = 0;
10890 inc = NBPDP;
10891 continue;
10892 }
10893 pde = pmap_pdpe_to_pde(pdpe, va);
10894 pd = *pde;
10895 KASSERT((pd & X86_PG_V) != 0,
10896 ("invalid pd va %#lx pde %#lx pd %#lx", va,
10897 (u_long)pde, pd));
10898 if ((pd & X86_PG_PS) != 0) {
10899 KASSERT((va & PDRMASK) == 0,
10900 ("PDRMASK bit set, va %#lx pde %#lx pd %#lx", va,
10901 (u_long)pde, pd));
10902 KASSERT(va + NBPDR <= sva + len,
10903 ("unmap covers partial 2MB page, sva %#lx va %#lx "
10904 "pde %#lx pd %#lx len %#lx", sva, va, (u_long)pde,
10905 pd, len));
10906 pde_store(pde, 0);
10907 inc = NBPDR;
10908 m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pde));
10909 m->ref_count--;
10910 if (m->ref_count == 0) {
10911 *pdpe = 0;
10912 SLIST_INSERT_HEAD(&spgf, m, plinks.s.ss);
10913 }
10914 continue;
10915 }
10916 pte = pmap_pde_to_pte(pde, va);
10917 KASSERT((*pte & X86_PG_V) != 0,
10918 ("invalid pte va %#lx pte %#lx pt %#lx", va,
10919 (u_long)pte, *pte));
10920 pte_clear(pte);
10921 inc = PAGE_SIZE;
10922 m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pte));
10923 m->ref_count--;
10924 if (m->ref_count == 0) {
10925 *pde = 0;
10926 SLIST_INSERT_HEAD(&spgf, m, plinks.s.ss);
10927 m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pde));
10928 m->ref_count--;
10929 if (m->ref_count == 0) {
10930 *pdpe = 0;
10931 SLIST_INSERT_HEAD(&spgf, m, plinks.s.ss);
10932 }
10933 }
10934 }
10935 pmap_invalidate_range(kernel_pmap, sva, sva + len);
10936 PMAP_UNLOCK(kernel_pmap);
10937 vm_page_free_pages_toq(&spgf, false);
10938 vmem_free(large_vmem, sva, len);
10939 }
10940
10941 static void
pmap_large_map_wb_fence_mfence(void)10942 pmap_large_map_wb_fence_mfence(void)
10943 {
10944
10945 mfence();
10946 }
10947
10948 static void
pmap_large_map_wb_fence_atomic(void)10949 pmap_large_map_wb_fence_atomic(void)
10950 {
10951
10952 atomic_thread_fence_seq_cst();
10953 }
10954
10955 static void
pmap_large_map_wb_fence_nop(void)10956 pmap_large_map_wb_fence_nop(void)
10957 {
10958 }
10959
10960 DEFINE_IFUNC(static, void, pmap_large_map_wb_fence, (void))
10961 {
10962
10963 if (cpu_vendor_id != CPU_VENDOR_INTEL)
10964 return (pmap_large_map_wb_fence_mfence);
10965 else if ((cpu_stdext_feature & (CPUID_STDEXT_CLWB |
10966 CPUID_STDEXT_CLFLUSHOPT)) == 0)
10967 return (pmap_large_map_wb_fence_atomic);
10968 else
10969 /* clflush is strongly enough ordered */
10970 return (pmap_large_map_wb_fence_nop);
10971 }
10972
10973 static void
pmap_large_map_flush_range_clwb(vm_offset_t va,vm_size_t len)10974 pmap_large_map_flush_range_clwb(vm_offset_t va, vm_size_t len)
10975 {
10976
10977 for (; len > 0; len -= cpu_clflush_line_size,
10978 va += cpu_clflush_line_size)
10979 clwb(va);
10980 }
10981
10982 static void
pmap_large_map_flush_range_clflushopt(vm_offset_t va,vm_size_t len)10983 pmap_large_map_flush_range_clflushopt(vm_offset_t va, vm_size_t len)
10984 {
10985
10986 for (; len > 0; len -= cpu_clflush_line_size,
10987 va += cpu_clflush_line_size)
10988 clflushopt(va);
10989 }
10990
10991 static void
pmap_large_map_flush_range_clflush(vm_offset_t va,vm_size_t len)10992 pmap_large_map_flush_range_clflush(vm_offset_t va, vm_size_t len)
10993 {
10994
10995 for (; len > 0; len -= cpu_clflush_line_size,
10996 va += cpu_clflush_line_size)
10997 clflush(va);
10998 }
10999
11000 static void
pmap_large_map_flush_range_nop(vm_offset_t sva __unused,vm_size_t len __unused)11001 pmap_large_map_flush_range_nop(vm_offset_t sva __unused, vm_size_t len __unused)
11002 {
11003 }
11004
11005 DEFINE_IFUNC(static, void, pmap_large_map_flush_range, (vm_offset_t, vm_size_t))
11006 {
11007
11008 if ((cpu_stdext_feature & CPUID_STDEXT_CLWB) != 0)
11009 return (pmap_large_map_flush_range_clwb);
11010 else if ((cpu_stdext_feature & CPUID_STDEXT_CLFLUSHOPT) != 0)
11011 return (pmap_large_map_flush_range_clflushopt);
11012 else if ((cpu_feature & CPUID_CLFSH) != 0)
11013 return (pmap_large_map_flush_range_clflush);
11014 else
11015 return (pmap_large_map_flush_range_nop);
11016 }
11017
11018 static void
pmap_large_map_wb_large(vm_offset_t sva,vm_offset_t eva)11019 pmap_large_map_wb_large(vm_offset_t sva, vm_offset_t eva)
11020 {
11021 volatile u_long *pe;
11022 u_long p;
11023 vm_offset_t va;
11024 vm_size_t inc;
11025 bool seen_other;
11026
11027 for (va = sva; va < eva; va += inc) {
11028 inc = 0;
11029 if ((amd_feature & AMDID_PAGE1GB) != 0) {
11030 pe = (volatile u_long *)pmap_large_map_pdpe(va);
11031 p = *pe;
11032 if ((p & X86_PG_PS) != 0)
11033 inc = NBPDP;
11034 }
11035 if (inc == 0) {
11036 pe = (volatile u_long *)pmap_large_map_pde(va);
11037 p = *pe;
11038 if ((p & X86_PG_PS) != 0)
11039 inc = NBPDR;
11040 }
11041 if (inc == 0) {
11042 pe = (volatile u_long *)pmap_large_map_pte(va);
11043 p = *pe;
11044 inc = PAGE_SIZE;
11045 }
11046 seen_other = false;
11047 for (;;) {
11048 if ((p & X86_PG_AVAIL1) != 0) {
11049 /*
11050 * Spin-wait for the end of a parallel
11051 * write-back.
11052 */
11053 cpu_spinwait();
11054 p = *pe;
11055
11056 /*
11057 * If we saw other write-back
11058 * occuring, we cannot rely on PG_M to
11059 * indicate state of the cache. The
11060 * PG_M bit is cleared before the
11061 * flush to avoid ignoring new writes,
11062 * and writes which are relevant for
11063 * us might happen after.
11064 */
11065 seen_other = true;
11066 continue;
11067 }
11068
11069 if ((p & X86_PG_M) != 0 || seen_other) {
11070 if (!atomic_fcmpset_long(pe, &p,
11071 (p & ~X86_PG_M) | X86_PG_AVAIL1))
11072 /*
11073 * If we saw PG_M without
11074 * PG_AVAIL1, and then on the
11075 * next attempt we do not
11076 * observe either PG_M or
11077 * PG_AVAIL1, the other
11078 * write-back started after us
11079 * and finished before us. We
11080 * can rely on it doing our
11081 * work.
11082 */
11083 continue;
11084 pmap_large_map_flush_range(va, inc);
11085 atomic_clear_long(pe, X86_PG_AVAIL1);
11086 }
11087 break;
11088 }
11089 maybe_yield();
11090 }
11091 }
11092
11093 /*
11094 * Write-back cache lines for the given address range.
11095 *
11096 * Must be called only on the range or sub-range returned from
11097 * pmap_large_map(). Must not be called on the coalesced ranges.
11098 *
11099 * Does nothing on CPUs without CLWB, CLFLUSHOPT, or CLFLUSH
11100 * instructions support.
11101 */
11102 void
pmap_large_map_wb(void * svap,vm_size_t len)11103 pmap_large_map_wb(void *svap, vm_size_t len)
11104 {
11105 vm_offset_t eva, sva;
11106
11107 sva = (vm_offset_t)svap;
11108 eva = sva + len;
11109 pmap_large_map_wb_fence();
11110 if (sva >= DMAP_MIN_ADDRESS && eva <= DMAP_MIN_ADDRESS + dmaplimit) {
11111 pmap_large_map_flush_range(sva, len);
11112 } else {
11113 KASSERT(sva >= LARGEMAP_MIN_ADDRESS &&
11114 eva <= LARGEMAP_MIN_ADDRESS + lm_ents * NBPML4,
11115 ("pmap_large_map_wb: not largemap %#lx %#lx", sva, len));
11116 pmap_large_map_wb_large(sva, eva);
11117 }
11118 pmap_large_map_wb_fence();
11119 }
11120
11121 static vm_page_t
pmap_pti_alloc_page(void)11122 pmap_pti_alloc_page(void)
11123 {
11124 vm_page_t m;
11125
11126 VM_OBJECT_ASSERT_WLOCKED(pti_obj);
11127 m = vm_page_grab(pti_obj, pti_pg_idx++, VM_ALLOC_WIRED | VM_ALLOC_ZERO);
11128 return (m);
11129 }
11130
11131 static bool
pmap_pti_free_page(vm_page_t m)11132 pmap_pti_free_page(vm_page_t m)
11133 {
11134 if (!vm_page_unwire_noq(m))
11135 return (false);
11136 vm_page_xbusy_claim(m);
11137 vm_page_free_zero(m);
11138 return (true);
11139 }
11140
11141 static void
pmap_pti_init(void)11142 pmap_pti_init(void)
11143 {
11144 vm_page_t pml4_pg;
11145 pdp_entry_t *pdpe;
11146 vm_offset_t va;
11147 int i;
11148
11149 if (!pti)
11150 return;
11151 pti_obj = vm_pager_allocate(OBJT_PHYS, NULL, 0, VM_PROT_ALL, 0, NULL);
11152 VM_OBJECT_WLOCK(pti_obj);
11153 pml4_pg = pmap_pti_alloc_page();
11154 pti_pml4 = (pml4_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pml4_pg));
11155 for (va = VM_MIN_KERNEL_ADDRESS; va <= VM_MAX_KERNEL_ADDRESS &&
11156 va >= VM_MIN_KERNEL_ADDRESS && va > NBPML4; va += NBPML4) {
11157 pdpe = pmap_pti_pdpe(va);
11158 pmap_pti_wire_pte(pdpe);
11159 }
11160 pmap_pti_add_kva_locked((vm_offset_t)&__pcpu[0],
11161 (vm_offset_t)&__pcpu[0] + sizeof(__pcpu[0]) * MAXCPU, false);
11162 pmap_pti_add_kva_locked((vm_offset_t)idt, (vm_offset_t)idt +
11163 sizeof(struct gate_descriptor) * NIDT, false);
11164 CPU_FOREACH(i) {
11165 /* Doublefault stack IST 1 */
11166 va = __pcpu[i].pc_common_tss.tss_ist1 + sizeof(struct nmi_pcpu);
11167 pmap_pti_add_kva_locked(va - DBLFAULT_STACK_SIZE, va, false);
11168 /* NMI stack IST 2 */
11169 va = __pcpu[i].pc_common_tss.tss_ist2 + sizeof(struct nmi_pcpu);
11170 pmap_pti_add_kva_locked(va - NMI_STACK_SIZE, va, false);
11171 /* MC# stack IST 3 */
11172 va = __pcpu[i].pc_common_tss.tss_ist3 +
11173 sizeof(struct nmi_pcpu);
11174 pmap_pti_add_kva_locked(va - MCE_STACK_SIZE, va, false);
11175 /* DB# stack IST 4 */
11176 va = __pcpu[i].pc_common_tss.tss_ist4 + sizeof(struct nmi_pcpu);
11177 pmap_pti_add_kva_locked(va - DBG_STACK_SIZE, va, false);
11178 }
11179 pmap_pti_add_kva_locked((vm_offset_t)KERNSTART, (vm_offset_t)etext,
11180 true);
11181 pti_finalized = true;
11182 VM_OBJECT_WUNLOCK(pti_obj);
11183 }
11184
11185 static void
pmap_cpu_init(void * arg __unused)11186 pmap_cpu_init(void *arg __unused)
11187 {
11188 CPU_COPY(&all_cpus, &kernel_pmap->pm_active);
11189 pmap_pti_init();
11190 }
11191 SYSINIT(pmap_cpu, SI_SUB_CPU + 1, SI_ORDER_ANY, pmap_cpu_init, NULL);
11192
11193 static pdp_entry_t *
pmap_pti_pdpe(vm_offset_t va)11194 pmap_pti_pdpe(vm_offset_t va)
11195 {
11196 pml4_entry_t *pml4e;
11197 pdp_entry_t *pdpe;
11198 vm_page_t m;
11199 vm_pindex_t pml4_idx;
11200 vm_paddr_t mphys;
11201
11202 VM_OBJECT_ASSERT_WLOCKED(pti_obj);
11203
11204 pml4_idx = pmap_pml4e_index(va);
11205 pml4e = &pti_pml4[pml4_idx];
11206 m = NULL;
11207 if (*pml4e == 0) {
11208 if (pti_finalized)
11209 panic("pml4 alloc after finalization\n");
11210 m = pmap_pti_alloc_page();
11211 if (*pml4e != 0) {
11212 pmap_pti_free_page(m);
11213 mphys = *pml4e & ~PAGE_MASK;
11214 } else {
11215 mphys = VM_PAGE_TO_PHYS(m);
11216 *pml4e = mphys | X86_PG_RW | X86_PG_V;
11217 }
11218 } else {
11219 mphys = *pml4e & ~PAGE_MASK;
11220 }
11221 pdpe = (pdp_entry_t *)PHYS_TO_DMAP(mphys) + pmap_pdpe_index(va);
11222 return (pdpe);
11223 }
11224
11225 static void
pmap_pti_wire_pte(void * pte)11226 pmap_pti_wire_pte(void *pte)
11227 {
11228 vm_page_t m;
11229
11230 VM_OBJECT_ASSERT_WLOCKED(pti_obj);
11231 m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pte));
11232 m->ref_count++;
11233 }
11234
11235 static void
pmap_pti_unwire_pde(void * pde,bool only_ref)11236 pmap_pti_unwire_pde(void *pde, bool only_ref)
11237 {
11238 vm_page_t m;
11239
11240 VM_OBJECT_ASSERT_WLOCKED(pti_obj);
11241 m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pde));
11242 MPASS(only_ref || m->ref_count > 1);
11243 pmap_pti_free_page(m);
11244 }
11245
11246 static void
pmap_pti_unwire_pte(void * pte,vm_offset_t va)11247 pmap_pti_unwire_pte(void *pte, vm_offset_t va)
11248 {
11249 vm_page_t m;
11250 pd_entry_t *pde;
11251
11252 VM_OBJECT_ASSERT_WLOCKED(pti_obj);
11253 m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((uintptr_t)pte));
11254 if (pmap_pti_free_page(m)) {
11255 pde = pmap_pti_pde(va);
11256 MPASS((*pde & (X86_PG_PS | X86_PG_V)) == X86_PG_V);
11257 *pde = 0;
11258 pmap_pti_unwire_pde(pde, false);
11259 }
11260 }
11261
11262 static pd_entry_t *
pmap_pti_pde(vm_offset_t va)11263 pmap_pti_pde(vm_offset_t va)
11264 {
11265 pdp_entry_t *pdpe;
11266 pd_entry_t *pde;
11267 vm_page_t m;
11268 vm_pindex_t pd_idx;
11269 vm_paddr_t mphys;
11270
11271 VM_OBJECT_ASSERT_WLOCKED(pti_obj);
11272
11273 pdpe = pmap_pti_pdpe(va);
11274 if (*pdpe == 0) {
11275 m = pmap_pti_alloc_page();
11276 if (*pdpe != 0) {
11277 pmap_pti_free_page(m);
11278 MPASS((*pdpe & X86_PG_PS) == 0);
11279 mphys = *pdpe & ~PAGE_MASK;
11280 } else {
11281 mphys = VM_PAGE_TO_PHYS(m);
11282 *pdpe = mphys | X86_PG_RW | X86_PG_V;
11283 }
11284 } else {
11285 MPASS((*pdpe & X86_PG_PS) == 0);
11286 mphys = *pdpe & ~PAGE_MASK;
11287 }
11288
11289 pde = (pd_entry_t *)PHYS_TO_DMAP(mphys);
11290 pd_idx = pmap_pde_index(va);
11291 pde += pd_idx;
11292 return (pde);
11293 }
11294
11295 static pt_entry_t *
pmap_pti_pte(vm_offset_t va,bool * unwire_pde)11296 pmap_pti_pte(vm_offset_t va, bool *unwire_pde)
11297 {
11298 pd_entry_t *pde;
11299 pt_entry_t *pte;
11300 vm_page_t m;
11301 vm_paddr_t mphys;
11302
11303 VM_OBJECT_ASSERT_WLOCKED(pti_obj);
11304
11305 pde = pmap_pti_pde(va);
11306 if (unwire_pde != NULL) {
11307 *unwire_pde = true;
11308 pmap_pti_wire_pte(pde);
11309 }
11310 if (*pde == 0) {
11311 m = pmap_pti_alloc_page();
11312 if (*pde != 0) {
11313 pmap_pti_free_page(m);
11314 MPASS((*pde & X86_PG_PS) == 0);
11315 mphys = *pde & ~(PAGE_MASK | pg_nx);
11316 } else {
11317 mphys = VM_PAGE_TO_PHYS(m);
11318 *pde = mphys | X86_PG_RW | X86_PG_V;
11319 if (unwire_pde != NULL)
11320 *unwire_pde = false;
11321 }
11322 } else {
11323 MPASS((*pde & X86_PG_PS) == 0);
11324 mphys = *pde & ~(PAGE_MASK | pg_nx);
11325 }
11326
11327 pte = (pt_entry_t *)PHYS_TO_DMAP(mphys);
11328 pte += pmap_pte_index(va);
11329
11330 return (pte);
11331 }
11332
11333 static void
pmap_pti_add_kva_locked(vm_offset_t sva,vm_offset_t eva,bool exec)11334 pmap_pti_add_kva_locked(vm_offset_t sva, vm_offset_t eva, bool exec)
11335 {
11336 vm_paddr_t pa;
11337 pd_entry_t *pde;
11338 pt_entry_t *pte, ptev;
11339 bool unwire_pde;
11340
11341 VM_OBJECT_ASSERT_WLOCKED(pti_obj);
11342
11343 sva = trunc_page(sva);
11344 MPASS(sva > VM_MAXUSER_ADDRESS);
11345 eva = round_page(eva);
11346 MPASS(sva < eva);
11347 for (; sva < eva; sva += PAGE_SIZE) {
11348 pte = pmap_pti_pte(sva, &unwire_pde);
11349 pa = pmap_kextract(sva);
11350 ptev = pa | X86_PG_RW | X86_PG_V | X86_PG_A | X86_PG_G |
11351 (exec ? 0 : pg_nx) | pmap_cache_bits(kernel_pmap,
11352 VM_MEMATTR_DEFAULT, FALSE);
11353 if (*pte == 0) {
11354 pte_store(pte, ptev);
11355 pmap_pti_wire_pte(pte);
11356 } else {
11357 KASSERT(!pti_finalized,
11358 ("pti overlap after fin %#lx %#lx %#lx",
11359 sva, *pte, ptev));
11360 KASSERT(*pte == ptev,
11361 ("pti non-identical pte after fin %#lx %#lx %#lx",
11362 sva, *pte, ptev));
11363 }
11364 if (unwire_pde) {
11365 pde = pmap_pti_pde(sva);
11366 pmap_pti_unwire_pde(pde, true);
11367 }
11368 }
11369 }
11370
11371 void
pmap_pti_add_kva(vm_offset_t sva,vm_offset_t eva,bool exec)11372 pmap_pti_add_kva(vm_offset_t sva, vm_offset_t eva, bool exec)
11373 {
11374
11375 if (!pti)
11376 return;
11377 VM_OBJECT_WLOCK(pti_obj);
11378 pmap_pti_add_kva_locked(sva, eva, exec);
11379 VM_OBJECT_WUNLOCK(pti_obj);
11380 }
11381
11382 void
pmap_pti_remove_kva(vm_offset_t sva,vm_offset_t eva)11383 pmap_pti_remove_kva(vm_offset_t sva, vm_offset_t eva)
11384 {
11385 pt_entry_t *pte;
11386 vm_offset_t va;
11387
11388 if (!pti)
11389 return;
11390 sva = rounddown2(sva, PAGE_SIZE);
11391 MPASS(sva > VM_MAXUSER_ADDRESS);
11392 eva = roundup2(eva, PAGE_SIZE);
11393 MPASS(sva < eva);
11394 VM_OBJECT_WLOCK(pti_obj);
11395 for (va = sva; va < eva; va += PAGE_SIZE) {
11396 pte = pmap_pti_pte(va, NULL);
11397 KASSERT((*pte & X86_PG_V) != 0,
11398 ("invalid pte va %#lx pte %#lx pt %#lx", va,
11399 (u_long)pte, *pte));
11400 pte_clear(pte);
11401 pmap_pti_unwire_pte(pte, va);
11402 }
11403 pmap_invalidate_range(kernel_pmap, sva, eva);
11404 VM_OBJECT_WUNLOCK(pti_obj);
11405 }
11406
11407 static void *
pkru_dup_range(void * ctx __unused,void * data)11408 pkru_dup_range(void *ctx __unused, void *data)
11409 {
11410 struct pmap_pkru_range *node, *new_node;
11411
11412 new_node = uma_zalloc(pmap_pkru_ranges_zone, M_NOWAIT);
11413 if (new_node == NULL)
11414 return (NULL);
11415 node = data;
11416 memcpy(new_node, node, sizeof(*node));
11417 return (new_node);
11418 }
11419
11420 static void
pkru_free_range(void * ctx __unused,void * node)11421 pkru_free_range(void *ctx __unused, void *node)
11422 {
11423
11424 uma_zfree(pmap_pkru_ranges_zone, node);
11425 }
11426
11427 static int
pmap_pkru_assign(pmap_t pmap,vm_offset_t sva,vm_offset_t eva,u_int keyidx,int flags)11428 pmap_pkru_assign(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, u_int keyidx,
11429 int flags)
11430 {
11431 struct pmap_pkru_range *ppr;
11432 int error;
11433
11434 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
11435 MPASS(pmap->pm_type == PT_X86);
11436 MPASS((cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0);
11437 if ((flags & AMD64_PKRU_EXCL) != 0 &&
11438 !rangeset_check_empty(&pmap->pm_pkru, sva, eva))
11439 return (EBUSY);
11440 ppr = uma_zalloc(pmap_pkru_ranges_zone, M_NOWAIT);
11441 if (ppr == NULL)
11442 return (ENOMEM);
11443 ppr->pkru_keyidx = keyidx;
11444 ppr->pkru_flags = flags & AMD64_PKRU_PERSIST;
11445 error = rangeset_insert(&pmap->pm_pkru, sva, eva, ppr);
11446 if (error != 0)
11447 uma_zfree(pmap_pkru_ranges_zone, ppr);
11448 return (error);
11449 }
11450
11451 static int
pmap_pkru_deassign(pmap_t pmap,vm_offset_t sva,vm_offset_t eva)11452 pmap_pkru_deassign(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
11453 {
11454
11455 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
11456 MPASS(pmap->pm_type == PT_X86);
11457 MPASS((cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0);
11458 return (rangeset_remove(&pmap->pm_pkru, sva, eva));
11459 }
11460
11461 static void
pmap_pkru_deassign_all(pmap_t pmap)11462 pmap_pkru_deassign_all(pmap_t pmap)
11463 {
11464
11465 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
11466 if (pmap->pm_type == PT_X86 &&
11467 (cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0)
11468 rangeset_remove_all(&pmap->pm_pkru);
11469 }
11470
11471 static bool
pmap_pkru_same(pmap_t pmap,vm_offset_t sva,vm_offset_t eva)11472 pmap_pkru_same(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
11473 {
11474 struct pmap_pkru_range *ppr, *prev_ppr;
11475 vm_offset_t va;
11476
11477 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
11478 if (pmap->pm_type != PT_X86 ||
11479 (cpu_stdext_feature2 & CPUID_STDEXT2_PKU) == 0 ||
11480 sva >= VM_MAXUSER_ADDRESS)
11481 return (true);
11482 MPASS(eva <= VM_MAXUSER_ADDRESS);
11483 for (va = sva; va < eva; prev_ppr = ppr) {
11484 ppr = rangeset_lookup(&pmap->pm_pkru, va);
11485 if (va == sva)
11486 prev_ppr = ppr;
11487 else if ((ppr == NULL) ^ (prev_ppr == NULL))
11488 return (false);
11489 if (ppr == NULL) {
11490 va += PAGE_SIZE;
11491 continue;
11492 }
11493 if (prev_ppr->pkru_keyidx != ppr->pkru_keyidx)
11494 return (false);
11495 va = ppr->pkru_rs_el.re_end;
11496 }
11497 return (true);
11498 }
11499
11500 static pt_entry_t
pmap_pkru_get(pmap_t pmap,vm_offset_t va)11501 pmap_pkru_get(pmap_t pmap, vm_offset_t va)
11502 {
11503 struct pmap_pkru_range *ppr;
11504
11505 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
11506 if (pmap->pm_type != PT_X86 ||
11507 (cpu_stdext_feature2 & CPUID_STDEXT2_PKU) == 0 ||
11508 va >= VM_MAXUSER_ADDRESS)
11509 return (0);
11510 ppr = rangeset_lookup(&pmap->pm_pkru, va);
11511 if (ppr != NULL)
11512 return (X86_PG_PKU(ppr->pkru_keyidx));
11513 return (0);
11514 }
11515
11516 static bool
pred_pkru_on_remove(void * ctx __unused,void * r)11517 pred_pkru_on_remove(void *ctx __unused, void *r)
11518 {
11519 struct pmap_pkru_range *ppr;
11520
11521 ppr = r;
11522 return ((ppr->pkru_flags & AMD64_PKRU_PERSIST) == 0);
11523 }
11524
11525 static void
pmap_pkru_on_remove(pmap_t pmap,vm_offset_t sva,vm_offset_t eva)11526 pmap_pkru_on_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
11527 {
11528
11529 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
11530 if (pmap->pm_type == PT_X86 &&
11531 (cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0) {
11532 rangeset_remove_pred(&pmap->pm_pkru, sva, eva,
11533 pred_pkru_on_remove);
11534 }
11535 }
11536
11537 static int
pmap_pkru_copy(pmap_t dst_pmap,pmap_t src_pmap)11538 pmap_pkru_copy(pmap_t dst_pmap, pmap_t src_pmap)
11539 {
11540
11541 PMAP_LOCK_ASSERT(dst_pmap, MA_OWNED);
11542 PMAP_LOCK_ASSERT(src_pmap, MA_OWNED);
11543 MPASS(dst_pmap->pm_type == PT_X86);
11544 MPASS(src_pmap->pm_type == PT_X86);
11545 MPASS((cpu_stdext_feature2 & CPUID_STDEXT2_PKU) != 0);
11546 if (src_pmap->pm_pkru.rs_data_ctx == NULL)
11547 return (0);
11548 return (rangeset_copy(&dst_pmap->pm_pkru, &src_pmap->pm_pkru));
11549 }
11550
11551 static void
pmap_pkru_update_range(pmap_t pmap,vm_offset_t sva,vm_offset_t eva,u_int keyidx)11552 pmap_pkru_update_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva,
11553 u_int keyidx)
11554 {
11555 pml4_entry_t *pml4e;
11556 pdp_entry_t *pdpe;
11557 pd_entry_t newpde, ptpaddr, *pde;
11558 pt_entry_t newpte, *ptep, pte;
11559 vm_offset_t va, va_next;
11560 bool changed;
11561
11562 PMAP_LOCK_ASSERT(pmap, MA_OWNED);
11563 MPASS(pmap->pm_type == PT_X86);
11564 MPASS(keyidx <= PMAP_MAX_PKRU_IDX);
11565
11566 for (changed = false, va = sva; va < eva; va = va_next) {
11567 pml4e = pmap_pml4e(pmap, va);
11568 if (pml4e == NULL || (*pml4e & X86_PG_V) == 0) {
11569 va_next = (va + NBPML4) & ~PML4MASK;
11570 if (va_next < va)
11571 va_next = eva;
11572 continue;
11573 }
11574
11575 pdpe = pmap_pml4e_to_pdpe(pml4e, va);
11576 if ((*pdpe & X86_PG_V) == 0) {
11577 va_next = (va + NBPDP) & ~PDPMASK;
11578 if (va_next < va)
11579 va_next = eva;
11580 continue;
11581 }
11582
11583 va_next = (va + NBPDR) & ~PDRMASK;
11584 if (va_next < va)
11585 va_next = eva;
11586
11587 pde = pmap_pdpe_to_pde(pdpe, va);
11588 ptpaddr = *pde;
11589 if (ptpaddr == 0)
11590 continue;
11591
11592 MPASS((ptpaddr & X86_PG_V) != 0);
11593 if ((ptpaddr & PG_PS) != 0) {
11594 if (va + NBPDR == va_next && eva >= va_next) {
11595 newpde = (ptpaddr & ~X86_PG_PKU_MASK) |
11596 X86_PG_PKU(keyidx);
11597 if (newpde != ptpaddr) {
11598 *pde = newpde;
11599 changed = true;
11600 }
11601 continue;
11602 } else if (!pmap_demote_pde(pmap, pde, va)) {
11603 continue;
11604 }
11605 }
11606
11607 if (va_next > eva)
11608 va_next = eva;
11609
11610 for (ptep = pmap_pde_to_pte(pde, va); va != va_next;
11611 ptep++, va += PAGE_SIZE) {
11612 pte = *ptep;
11613 if ((pte & X86_PG_V) == 0)
11614 continue;
11615 newpte = (pte & ~X86_PG_PKU_MASK) | X86_PG_PKU(keyidx);
11616 if (newpte != pte) {
11617 *ptep = newpte;
11618 changed = true;
11619 }
11620 }
11621 }
11622 if (changed)
11623 pmap_invalidate_range(pmap, sva, eva);
11624 }
11625
11626 static int
pmap_pkru_check_uargs(pmap_t pmap,vm_offset_t sva,vm_offset_t eva,u_int keyidx,int flags)11627 pmap_pkru_check_uargs(pmap_t pmap, vm_offset_t sva, vm_offset_t eva,
11628 u_int keyidx, int flags)
11629 {
11630
11631 if (pmap->pm_type != PT_X86 || keyidx > PMAP_MAX_PKRU_IDX ||
11632 (flags & ~(AMD64_PKRU_PERSIST | AMD64_PKRU_EXCL)) != 0)
11633 return (EINVAL);
11634 if (eva <= sva || eva > VM_MAXUSER_ADDRESS)
11635 return (EFAULT);
11636 if ((cpu_stdext_feature2 & CPUID_STDEXT2_PKU) == 0)
11637 return (ENOTSUP);
11638 return (0);
11639 }
11640
11641 int
pmap_pkru_set(pmap_t pmap,vm_offset_t sva,vm_offset_t eva,u_int keyidx,int flags)11642 pmap_pkru_set(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, u_int keyidx,
11643 int flags)
11644 {
11645 int error;
11646
11647 sva = trunc_page(sva);
11648 eva = round_page(eva);
11649 error = pmap_pkru_check_uargs(pmap, sva, eva, keyidx, flags);
11650 if (error != 0)
11651 return (error);
11652 for (;;) {
11653 PMAP_LOCK(pmap);
11654 error = pmap_pkru_assign(pmap, sva, eva, keyidx, flags);
11655 if (error == 0)
11656 pmap_pkru_update_range(pmap, sva, eva, keyidx);
11657 PMAP_UNLOCK(pmap);
11658 if (error != ENOMEM)
11659 break;
11660 vm_wait(NULL);
11661 }
11662 return (error);
11663 }
11664
11665 int
pmap_pkru_clear(pmap_t pmap,vm_offset_t sva,vm_offset_t eva)11666 pmap_pkru_clear(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
11667 {
11668 int error;
11669
11670 sva = trunc_page(sva);
11671 eva = round_page(eva);
11672 error = pmap_pkru_check_uargs(pmap, sva, eva, 0, 0);
11673 if (error != 0)
11674 return (error);
11675 for (;;) {
11676 PMAP_LOCK(pmap);
11677 error = pmap_pkru_deassign(pmap, sva, eva);
11678 if (error == 0)
11679 pmap_pkru_update_range(pmap, sva, eva, 0);
11680 PMAP_UNLOCK(pmap);
11681 if (error != ENOMEM)
11682 break;
11683 vm_wait(NULL);
11684 }
11685 return (error);
11686 }
11687
11688 #if defined(KASAN) || defined(KMSAN)
11689
11690 /*
11691 * Reserve enough memory to:
11692 * 1) allocate PDP pages for the shadow map(s),
11693 * 2) shadow the boot stack of KSTACK_PAGES pages,
11694 * so we need one PD page, one or two PT pages, and KSTACK_PAGES shadow pages
11695 * per shadow map.
11696 */
11697 #ifdef KASAN
11698 #define SAN_EARLY_PAGES \
11699 (NKASANPML4E + 1 + 2 + howmany(KSTACK_PAGES, KASAN_SHADOW_SCALE))
11700 #else
11701 #define SAN_EARLY_PAGES \
11702 (NKMSANSHADPML4E + NKMSANORIGPML4E + 2 * (1 + 2 + KSTACK_PAGES))
11703 #endif
11704
11705 static uint64_t __nosanitizeaddress __nosanitizememory
pmap_san_enter_early_alloc_4k(uint64_t pabase)11706 pmap_san_enter_early_alloc_4k(uint64_t pabase)
11707 {
11708 static uint8_t data[PAGE_SIZE * SAN_EARLY_PAGES] __aligned(PAGE_SIZE);
11709 static size_t offset = 0;
11710 uint64_t pa;
11711
11712 if (offset == sizeof(data)) {
11713 panic("%s: ran out of memory for the bootstrap shadow map",
11714 __func__);
11715 }
11716
11717 pa = pabase + ((vm_offset_t)&data[offset] - KERNSTART);
11718 offset += PAGE_SIZE;
11719 return (pa);
11720 }
11721
11722 /*
11723 * Map a shadow page, before the kernel has bootstrapped its page tables. This
11724 * is currently only used to shadow the temporary boot stack set up by locore.
11725 */
11726 static void __nosanitizeaddress __nosanitizememory
pmap_san_enter_early(vm_offset_t va)11727 pmap_san_enter_early(vm_offset_t va)
11728 {
11729 static bool first = true;
11730 pml4_entry_t *pml4e;
11731 pdp_entry_t *pdpe;
11732 pd_entry_t *pde;
11733 pt_entry_t *pte;
11734 uint64_t cr3, pa, base;
11735 int i;
11736
11737 base = amd64_loadaddr();
11738 cr3 = rcr3();
11739
11740 if (first) {
11741 /*
11742 * If this the first call, we need to allocate new PML4Es for
11743 * the bootstrap shadow map(s). We don't know how the PML4 page
11744 * was initialized by the boot loader, so we can't simply test
11745 * whether the shadow map's PML4Es are zero.
11746 */
11747 first = false;
11748 #ifdef KASAN
11749 for (i = 0; i < NKASANPML4E; i++) {
11750 pa = pmap_san_enter_early_alloc_4k(base);
11751
11752 pml4e = (pml4_entry_t *)cr3 +
11753 pmap_pml4e_index(KASAN_MIN_ADDRESS + i * NBPML4);
11754 *pml4e = (pml4_entry_t)(pa | X86_PG_RW | X86_PG_V);
11755 }
11756 #else
11757 for (i = 0; i < NKMSANORIGPML4E; i++) {
11758 pa = pmap_san_enter_early_alloc_4k(base);
11759
11760 pml4e = (pml4_entry_t *)cr3 +
11761 pmap_pml4e_index(KMSAN_ORIG_MIN_ADDRESS +
11762 i * NBPML4);
11763 *pml4e = (pml4_entry_t)(pa | X86_PG_RW | X86_PG_V);
11764 }
11765 for (i = 0; i < NKMSANSHADPML4E; i++) {
11766 pa = pmap_san_enter_early_alloc_4k(base);
11767
11768 pml4e = (pml4_entry_t *)cr3 +
11769 pmap_pml4e_index(KMSAN_SHAD_MIN_ADDRESS +
11770 i * NBPML4);
11771 *pml4e = (pml4_entry_t)(pa | X86_PG_RW | X86_PG_V);
11772 }
11773 #endif
11774 }
11775 pml4e = (pml4_entry_t *)cr3 + pmap_pml4e_index(va);
11776 pdpe = (pdp_entry_t *)(*pml4e & PG_FRAME) + pmap_pdpe_index(va);
11777 if (*pdpe == 0) {
11778 pa = pmap_san_enter_early_alloc_4k(base);
11779 *pdpe = (pdp_entry_t)(pa | X86_PG_RW | X86_PG_V);
11780 }
11781 pde = (pd_entry_t *)(*pdpe & PG_FRAME) + pmap_pde_index(va);
11782 if (*pde == 0) {
11783 pa = pmap_san_enter_early_alloc_4k(base);
11784 *pde = (pd_entry_t)(pa | X86_PG_RW | X86_PG_V);
11785 }
11786 pte = (pt_entry_t *)(*pde & PG_FRAME) + pmap_pte_index(va);
11787 if (*pte != 0)
11788 panic("%s: PTE for %#lx is already initialized", __func__, va);
11789 pa = pmap_san_enter_early_alloc_4k(base);
11790 *pte = (pt_entry_t)(pa | X86_PG_A | X86_PG_M | X86_PG_RW | X86_PG_V);
11791 }
11792
11793 static vm_page_t
pmap_san_enter_alloc_4k(void)11794 pmap_san_enter_alloc_4k(void)
11795 {
11796 vm_page_t m;
11797
11798 m = vm_page_alloc_noobj(VM_ALLOC_INTERRUPT | VM_ALLOC_WIRED |
11799 VM_ALLOC_ZERO);
11800 if (m == NULL)
11801 panic("%s: no memory to grow shadow map", __func__);
11802 return (m);
11803 }
11804
11805 static vm_page_t
pmap_san_enter_alloc_2m(void)11806 pmap_san_enter_alloc_2m(void)
11807 {
11808 return (vm_page_alloc_noobj_contig(VM_ALLOC_WIRED | VM_ALLOC_ZERO,
11809 NPTEPG, 0, ~0ul, NBPDR, 0, VM_MEMATTR_DEFAULT));
11810 }
11811
11812 /*
11813 * Grow a shadow map by at least one 4KB page at the specified address. Use 2MB
11814 * pages when possible.
11815 */
11816 void __nosanitizeaddress __nosanitizememory
pmap_san_enter(vm_offset_t va)11817 pmap_san_enter(vm_offset_t va)
11818 {
11819 pdp_entry_t *pdpe;
11820 pd_entry_t *pde;
11821 pt_entry_t *pte;
11822 vm_page_t m;
11823
11824 if (kernphys == 0) {
11825 /*
11826 * We're creating a temporary shadow map for the boot stack.
11827 */
11828 pmap_san_enter_early(va);
11829 return;
11830 }
11831
11832 mtx_assert(&kernel_map->system_mtx, MA_OWNED);
11833
11834 pdpe = pmap_pdpe(kernel_pmap, va);
11835 if ((*pdpe & X86_PG_V) == 0) {
11836 m = pmap_san_enter_alloc_4k();
11837 *pdpe = (pdp_entry_t)(VM_PAGE_TO_PHYS(m) | X86_PG_RW |
11838 X86_PG_V | pg_nx);
11839 }
11840 pde = pmap_pdpe_to_pde(pdpe, va);
11841 if ((*pde & X86_PG_V) == 0) {
11842 m = pmap_san_enter_alloc_2m();
11843 if (m != NULL) {
11844 *pde = (pd_entry_t)(VM_PAGE_TO_PHYS(m) | X86_PG_RW |
11845 X86_PG_PS | X86_PG_V | X86_PG_A | X86_PG_M | pg_nx);
11846 } else {
11847 m = pmap_san_enter_alloc_4k();
11848 *pde = (pd_entry_t)(VM_PAGE_TO_PHYS(m) | X86_PG_RW |
11849 X86_PG_V | pg_nx);
11850 }
11851 }
11852 if ((*pde & X86_PG_PS) != 0)
11853 return;
11854 pte = pmap_pde_to_pte(pde, va);
11855 if ((*pte & X86_PG_V) != 0)
11856 return;
11857 m = pmap_san_enter_alloc_4k();
11858 *pte = (pt_entry_t)(VM_PAGE_TO_PHYS(m) | X86_PG_RW | X86_PG_V |
11859 X86_PG_M | X86_PG_A | pg_nx);
11860 }
11861 #endif
11862
11863 /*
11864 * Track a range of the kernel's virtual address space that is contiguous
11865 * in various mapping attributes.
11866 */
11867 struct pmap_kernel_map_range {
11868 vm_offset_t sva;
11869 pt_entry_t attrs;
11870 int ptes;
11871 int pdes;
11872 int pdpes;
11873 };
11874
11875 static void
sysctl_kmaps_dump(struct sbuf * sb,struct pmap_kernel_map_range * range,vm_offset_t eva)11876 sysctl_kmaps_dump(struct sbuf *sb, struct pmap_kernel_map_range *range,
11877 vm_offset_t eva)
11878 {
11879 const char *mode;
11880 int i, pat_idx;
11881
11882 if (eva <= range->sva)
11883 return;
11884
11885 pat_idx = pmap_pat_index(kernel_pmap, range->attrs, true);
11886 for (i = 0; i < PAT_INDEX_SIZE; i++)
11887 if (pat_index[i] == pat_idx)
11888 break;
11889
11890 switch (i) {
11891 case PAT_WRITE_BACK:
11892 mode = "WB";
11893 break;
11894 case PAT_WRITE_THROUGH:
11895 mode = "WT";
11896 break;
11897 case PAT_UNCACHEABLE:
11898 mode = "UC";
11899 break;
11900 case PAT_UNCACHED:
11901 mode = "U-";
11902 break;
11903 case PAT_WRITE_PROTECTED:
11904 mode = "WP";
11905 break;
11906 case PAT_WRITE_COMBINING:
11907 mode = "WC";
11908 break;
11909 default:
11910 printf("%s: unknown PAT mode %#x for range 0x%016lx-0x%016lx\n",
11911 __func__, pat_idx, range->sva, eva);
11912 mode = "??";
11913 break;
11914 }
11915
11916 sbuf_printf(sb, "0x%016lx-0x%016lx r%c%c%c%c %s %d %d %d\n",
11917 range->sva, eva,
11918 (range->attrs & X86_PG_RW) != 0 ? 'w' : '-',
11919 (range->attrs & pg_nx) != 0 ? '-' : 'x',
11920 (range->attrs & X86_PG_U) != 0 ? 'u' : 's',
11921 (range->attrs & X86_PG_G) != 0 ? 'g' : '-',
11922 mode, range->pdpes, range->pdes, range->ptes);
11923
11924 /* Reset to sentinel value. */
11925 range->sva = la57 ? KV5ADDR(NPML5EPG - 1, NPML4EPG - 1, NPDPEPG - 1,
11926 NPDEPG - 1, NPTEPG - 1) : KV4ADDR(NPML4EPG - 1, NPDPEPG - 1,
11927 NPDEPG - 1, NPTEPG - 1);
11928 }
11929
11930 /*
11931 * Determine whether the attributes specified by a page table entry match those
11932 * being tracked by the current range. This is not quite as simple as a direct
11933 * flag comparison since some PAT modes have multiple representations.
11934 */
11935 static bool
sysctl_kmaps_match(struct pmap_kernel_map_range * range,pt_entry_t attrs)11936 sysctl_kmaps_match(struct pmap_kernel_map_range *range, pt_entry_t attrs)
11937 {
11938 pt_entry_t diff, mask;
11939
11940 mask = X86_PG_G | X86_PG_RW | X86_PG_U | X86_PG_PDE_CACHE | pg_nx;
11941 diff = (range->attrs ^ attrs) & mask;
11942 if (diff == 0)
11943 return (true);
11944 if ((diff & ~X86_PG_PDE_PAT) == 0 &&
11945 pmap_pat_index(kernel_pmap, range->attrs, true) ==
11946 pmap_pat_index(kernel_pmap, attrs, true))
11947 return (true);
11948 return (false);
11949 }
11950
11951 static void
sysctl_kmaps_reinit(struct pmap_kernel_map_range * range,vm_offset_t va,pt_entry_t attrs)11952 sysctl_kmaps_reinit(struct pmap_kernel_map_range *range, vm_offset_t va,
11953 pt_entry_t attrs)
11954 {
11955
11956 memset(range, 0, sizeof(*range));
11957 range->sva = va;
11958 range->attrs = attrs;
11959 }
11960
11961 /*
11962 * Given a leaf PTE, derive the mapping's attributes. If they do not match
11963 * those of the current run, dump the address range and its attributes, and
11964 * begin a new run.
11965 */
11966 static void
sysctl_kmaps_check(struct sbuf * sb,struct pmap_kernel_map_range * range,vm_offset_t va,pml4_entry_t pml4e,pdp_entry_t pdpe,pd_entry_t pde,pt_entry_t pte)11967 sysctl_kmaps_check(struct sbuf *sb, struct pmap_kernel_map_range *range,
11968 vm_offset_t va, pml4_entry_t pml4e, pdp_entry_t pdpe, pd_entry_t pde,
11969 pt_entry_t pte)
11970 {
11971 pt_entry_t attrs;
11972
11973 attrs = pml4e & (X86_PG_RW | X86_PG_U | pg_nx);
11974
11975 attrs |= pdpe & pg_nx;
11976 attrs &= pg_nx | (pdpe & (X86_PG_RW | X86_PG_U));
11977 if ((pdpe & PG_PS) != 0) {
11978 attrs |= pdpe & (X86_PG_G | X86_PG_PDE_CACHE);
11979 } else if (pde != 0) {
11980 attrs |= pde & pg_nx;
11981 attrs &= pg_nx | (pde & (X86_PG_RW | X86_PG_U));
11982 }
11983 if ((pde & PG_PS) != 0) {
11984 attrs |= pde & (X86_PG_G | X86_PG_PDE_CACHE);
11985 } else if (pte != 0) {
11986 attrs |= pte & pg_nx;
11987 attrs &= pg_nx | (pte & (X86_PG_RW | X86_PG_U));
11988 attrs |= pte & (X86_PG_G | X86_PG_PTE_CACHE);
11989
11990 /* Canonicalize by always using the PDE PAT bit. */
11991 if ((attrs & X86_PG_PTE_PAT) != 0)
11992 attrs ^= X86_PG_PDE_PAT | X86_PG_PTE_PAT;
11993 }
11994
11995 if (range->sva > va || !sysctl_kmaps_match(range, attrs)) {
11996 sysctl_kmaps_dump(sb, range, va);
11997 sysctl_kmaps_reinit(range, va, attrs);
11998 }
11999 }
12000
12001 static int
sysctl_kmaps(SYSCTL_HANDLER_ARGS)12002 sysctl_kmaps(SYSCTL_HANDLER_ARGS)
12003 {
12004 struct pmap_kernel_map_range range;
12005 struct sbuf sbuf, *sb;
12006 pml4_entry_t pml4e;
12007 pdp_entry_t *pdp, pdpe;
12008 pd_entry_t *pd, pde;
12009 pt_entry_t *pt, pte;
12010 vm_offset_t sva;
12011 vm_paddr_t pa;
12012 int error, i, j, k, l;
12013
12014 error = sysctl_wire_old_buffer(req, 0);
12015 if (error != 0)
12016 return (error);
12017 sb = &sbuf;
12018 sbuf_new_for_sysctl(sb, NULL, PAGE_SIZE, req);
12019
12020 /* Sentinel value. */
12021 range.sva = la57 ? KV5ADDR(NPML5EPG - 1, NPML4EPG - 1, NPDPEPG - 1,
12022 NPDEPG - 1, NPTEPG - 1) : KV4ADDR(NPML4EPG - 1, NPDPEPG - 1,
12023 NPDEPG - 1, NPTEPG - 1);
12024
12025 /*
12026 * Iterate over the kernel page tables without holding the kernel pmap
12027 * lock. Outside of the large map, kernel page table pages are never
12028 * freed, so at worst we will observe inconsistencies in the output.
12029 * Within the large map, ensure that PDP and PD page addresses are
12030 * valid before descending.
12031 */
12032 for (sva = 0, i = pmap_pml4e_index(sva); i < NPML4EPG; i++) {
12033 switch (i) {
12034 case PML4PML4I:
12035 sbuf_printf(sb, "\nRecursive map:\n");
12036 break;
12037 case DMPML4I:
12038 sbuf_printf(sb, "\nDirect map:\n");
12039 break;
12040 #ifdef KASAN
12041 case KASANPML4I:
12042 sbuf_printf(sb, "\nKASAN shadow map:\n");
12043 break;
12044 #endif
12045 #ifdef KMSAN
12046 case KMSANSHADPML4I:
12047 sbuf_printf(sb, "\nKMSAN shadow map:\n");
12048 break;
12049 case KMSANORIGPML4I:
12050 sbuf_printf(sb, "\nKMSAN origin map:\n");
12051 break;
12052 #endif
12053 case KPML4BASE:
12054 sbuf_printf(sb, "\nKernel map:\n");
12055 break;
12056 case LMSPML4I:
12057 sbuf_printf(sb, "\nLarge map:\n");
12058 break;
12059 }
12060
12061 /* Convert to canonical form. */
12062 if (sva == 1ul << 47)
12063 sva |= -1ul << 48;
12064
12065 restart:
12066 pml4e = kernel_pml4[i];
12067 if ((pml4e & X86_PG_V) == 0) {
12068 sva = rounddown2(sva, NBPML4);
12069 sysctl_kmaps_dump(sb, &range, sva);
12070 sva += NBPML4;
12071 continue;
12072 }
12073 pa = pml4e & PG_FRAME;
12074 pdp = (pdp_entry_t *)PHYS_TO_DMAP(pa);
12075
12076 for (j = pmap_pdpe_index(sva); j < NPDPEPG; j++) {
12077 pdpe = pdp[j];
12078 if ((pdpe & X86_PG_V) == 0) {
12079 sva = rounddown2(sva, NBPDP);
12080 sysctl_kmaps_dump(sb, &range, sva);
12081 sva += NBPDP;
12082 continue;
12083 }
12084 pa = pdpe & PG_FRAME;
12085 if ((pdpe & PG_PS) != 0) {
12086 sva = rounddown2(sva, NBPDP);
12087 sysctl_kmaps_check(sb, &range, sva, pml4e, pdpe,
12088 0, 0);
12089 range.pdpes++;
12090 sva += NBPDP;
12091 continue;
12092 }
12093 if (PMAP_ADDRESS_IN_LARGEMAP(sva) &&
12094 vm_phys_paddr_to_vm_page(pa) == NULL) {
12095 /*
12096 * Page table pages for the large map may be
12097 * freed. Validate the next-level address
12098 * before descending.
12099 */
12100 goto restart;
12101 }
12102 pd = (pd_entry_t *)PHYS_TO_DMAP(pa);
12103
12104 for (k = pmap_pde_index(sva); k < NPDEPG; k++) {
12105 pde = pd[k];
12106 if ((pde & X86_PG_V) == 0) {
12107 sva = rounddown2(sva, NBPDR);
12108 sysctl_kmaps_dump(sb, &range, sva);
12109 sva += NBPDR;
12110 continue;
12111 }
12112 pa = pde & PG_FRAME;
12113 if ((pde & PG_PS) != 0) {
12114 sva = rounddown2(sva, NBPDR);
12115 sysctl_kmaps_check(sb, &range, sva,
12116 pml4e, pdpe, pde, 0);
12117 range.pdes++;
12118 sva += NBPDR;
12119 continue;
12120 }
12121 if (PMAP_ADDRESS_IN_LARGEMAP(sva) &&
12122 vm_phys_paddr_to_vm_page(pa) == NULL) {
12123 /*
12124 * Page table pages for the large map
12125 * may be freed. Validate the
12126 * next-level address before descending.
12127 */
12128 goto restart;
12129 }
12130 pt = (pt_entry_t *)PHYS_TO_DMAP(pa);
12131
12132 for (l = pmap_pte_index(sva); l < NPTEPG; l++,
12133 sva += PAGE_SIZE) {
12134 pte = pt[l];
12135 if ((pte & X86_PG_V) == 0) {
12136 sysctl_kmaps_dump(sb, &range,
12137 sva);
12138 continue;
12139 }
12140 sysctl_kmaps_check(sb, &range, sva,
12141 pml4e, pdpe, pde, pte);
12142 range.ptes++;
12143 }
12144 }
12145 }
12146 }
12147
12148 error = sbuf_finish(sb);
12149 sbuf_delete(sb);
12150 return (error);
12151 }
12152 SYSCTL_OID(_vm_pmap, OID_AUTO, kernel_maps,
12153 CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE | CTLFLAG_SKIP,
12154 NULL, 0, sysctl_kmaps, "A",
12155 "Dump kernel address layout");
12156
12157 #ifdef DDB
DB_SHOW_COMMAND(pte,pmap_print_pte)12158 DB_SHOW_COMMAND(pte, pmap_print_pte)
12159 {
12160 pmap_t pmap;
12161 pml5_entry_t *pml5;
12162 pml4_entry_t *pml4;
12163 pdp_entry_t *pdp;
12164 pd_entry_t *pde;
12165 pt_entry_t *pte, PG_V;
12166 vm_offset_t va;
12167
12168 if (!have_addr) {
12169 db_printf("show pte addr\n");
12170 return;
12171 }
12172 va = (vm_offset_t)addr;
12173
12174 if (kdb_thread != NULL)
12175 pmap = vmspace_pmap(kdb_thread->td_proc->p_vmspace);
12176 else
12177 pmap = PCPU_GET(curpmap);
12178
12179 PG_V = pmap_valid_bit(pmap);
12180 db_printf("VA 0x%016lx", va);
12181
12182 if (pmap_is_la57(pmap)) {
12183 pml5 = pmap_pml5e(pmap, va);
12184 db_printf(" pml5e 0x%016lx", *pml5);
12185 if ((*pml5 & PG_V) == 0) {
12186 db_printf("\n");
12187 return;
12188 }
12189 pml4 = pmap_pml5e_to_pml4e(pml5, va);
12190 } else {
12191 pml4 = pmap_pml4e(pmap, va);
12192 }
12193 db_printf(" pml4e 0x%016lx", *pml4);
12194 if ((*pml4 & PG_V) == 0) {
12195 db_printf("\n");
12196 return;
12197 }
12198 pdp = pmap_pml4e_to_pdpe(pml4, va);
12199 db_printf(" pdpe 0x%016lx", *pdp);
12200 if ((*pdp & PG_V) == 0 || (*pdp & PG_PS) != 0) {
12201 db_printf("\n");
12202 return;
12203 }
12204 pde = pmap_pdpe_to_pde(pdp, va);
12205 db_printf(" pde 0x%016lx", *pde);
12206 if ((*pde & PG_V) == 0 || (*pde & PG_PS) != 0) {
12207 db_printf("\n");
12208 return;
12209 }
12210 pte = pmap_pde_to_pte(pde, va);
12211 db_printf(" pte 0x%016lx\n", *pte);
12212 }
12213
DB_SHOW_COMMAND(phys2dmap,pmap_phys2dmap)12214 DB_SHOW_COMMAND(phys2dmap, pmap_phys2dmap)
12215 {
12216 vm_paddr_t a;
12217
12218 if (have_addr) {
12219 a = (vm_paddr_t)addr;
12220 db_printf("0x%jx\n", (uintmax_t)PHYS_TO_DMAP(a));
12221 } else {
12222 db_printf("show phys2dmap addr\n");
12223 }
12224 }
12225
12226 static void
ptpages_show_page(int level,int idx,vm_page_t pg)12227 ptpages_show_page(int level, int idx, vm_page_t pg)
12228 {
12229 db_printf("l %d i %d pg %p phys %#lx ref %x\n",
12230 level, idx, pg, VM_PAGE_TO_PHYS(pg), pg->ref_count);
12231 }
12232
12233 static void
ptpages_show_complain(int level,int idx,uint64_t pte)12234 ptpages_show_complain(int level, int idx, uint64_t pte)
12235 {
12236 db_printf("l %d i %d pte %#lx\n", level, idx, pte);
12237 }
12238
12239 static void
ptpages_show_pml4(vm_page_t pg4,int num_entries,uint64_t PG_V)12240 ptpages_show_pml4(vm_page_t pg4, int num_entries, uint64_t PG_V)
12241 {
12242 vm_page_t pg3, pg2, pg1;
12243 pml4_entry_t *pml4;
12244 pdp_entry_t *pdp;
12245 pd_entry_t *pd;
12246 int i4, i3, i2;
12247
12248 pml4 = (pml4_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pg4));
12249 for (i4 = 0; i4 < num_entries; i4++) {
12250 if ((pml4[i4] & PG_V) == 0)
12251 continue;
12252 pg3 = PHYS_TO_VM_PAGE(pml4[i4] & PG_FRAME);
12253 if (pg3 == NULL) {
12254 ptpages_show_complain(3, i4, pml4[i4]);
12255 continue;
12256 }
12257 ptpages_show_page(3, i4, pg3);
12258 pdp = (pdp_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pg3));
12259 for (i3 = 0; i3 < NPDPEPG; i3++) {
12260 if ((pdp[i3] & PG_V) == 0)
12261 continue;
12262 pg2 = PHYS_TO_VM_PAGE(pdp[i3] & PG_FRAME);
12263 if (pg3 == NULL) {
12264 ptpages_show_complain(2, i3, pdp[i3]);
12265 continue;
12266 }
12267 ptpages_show_page(2, i3, pg2);
12268 pd = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pg2));
12269 for (i2 = 0; i2 < NPDEPG; i2++) {
12270 if ((pd[i2] & PG_V) == 0)
12271 continue;
12272 pg1 = PHYS_TO_VM_PAGE(pd[i2] & PG_FRAME);
12273 if (pg1 == NULL) {
12274 ptpages_show_complain(1, i2, pd[i2]);
12275 continue;
12276 }
12277 ptpages_show_page(1, i2, pg1);
12278 }
12279 }
12280 }
12281 }
12282
DB_SHOW_COMMAND(ptpages,pmap_ptpages)12283 DB_SHOW_COMMAND(ptpages, pmap_ptpages)
12284 {
12285 pmap_t pmap;
12286 vm_page_t pg;
12287 pml5_entry_t *pml5;
12288 uint64_t PG_V;
12289 int i5;
12290
12291 if (have_addr)
12292 pmap = (pmap_t)addr;
12293 else
12294 pmap = PCPU_GET(curpmap);
12295
12296 PG_V = pmap_valid_bit(pmap);
12297
12298 if (pmap_is_la57(pmap)) {
12299 pml5 = pmap->pm_pmltop;
12300 for (i5 = 0; i5 < NUPML5E; i5++) {
12301 if ((pml5[i5] & PG_V) == 0)
12302 continue;
12303 pg = PHYS_TO_VM_PAGE(pml5[i5] & PG_FRAME);
12304 if (pg == NULL) {
12305 ptpages_show_complain(4, i5, pml5[i5]);
12306 continue;
12307 }
12308 ptpages_show_page(4, i5, pg);
12309 ptpages_show_pml4(pg, NPML4EPG, PG_V);
12310 }
12311 } else {
12312 ptpages_show_pml4(PHYS_TO_VM_PAGE(DMAP_TO_PHYS(
12313 (vm_offset_t)pmap->pm_pmltop)), NUP4ML4E, PG_V);
12314 }
12315 }
12316 #endif
12317