]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/riscv/riscv/pmap.c
MFC r342732:
[FreeBSD/FreeBSD.git] / sys / riscv / riscv / pmap.c
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  * Copyright (c) 2014 Andrew Turner
15  * All rights reserved.
16  * Copyright (c) 2014 The FreeBSD Foundation
17  * All rights reserved.
18  * Copyright (c) 2015-2018 Ruslan Bukin <br@bsdpad.com>
19  * All rights reserved.
20  *
21  * This code is derived from software contributed to Berkeley by
22  * the Systems Programming Group of the University of Utah Computer
23  * Science Department and William Jolitz of UUNET Technologies Inc.
24  *
25  * Portions of this software were developed by Andrew Turner under
26  * sponsorship from The FreeBSD Foundation.
27  *
28  * Portions of this software were developed by SRI International and the
29  * University of Cambridge Computer Laboratory under DARPA/AFRL contract
30  * FA8750-10-C-0237 ("CTSRD"), as part of the DARPA CRASH research programme.
31  *
32  * Portions of this software were developed by the University of Cambridge
33  * Computer Laboratory as part of the CTSRD Project, with support from the
34  * UK Higher Education Innovation Fund (HEIF).
35  *
36  * Redistribution and use in source and binary forms, with or without
37  * modification, are permitted provided that the following conditions
38  * are met:
39  * 1. Redistributions of source code must retain the above copyright
40  *    notice, this list of conditions and the following disclaimer.
41  * 2. Redistributions in binary form must reproduce the above copyright
42  *    notice, this list of conditions and the following disclaimer in the
43  *    documentation and/or other materials provided with the distribution.
44  * 3. All advertising materials mentioning features or use of this software
45  *    must display the following acknowledgement:
46  *      This product includes software developed by the University of
47  *      California, Berkeley and its contributors.
48  * 4. Neither the name of the University nor the names of its contributors
49  *    may be used to endorse or promote products derived from this software
50  *    without specific prior written permission.
51  *
52  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
53  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
55  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
56  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
57  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
58  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
59  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
60  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
61  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62  * SUCH DAMAGE.
63  *
64  *      from:   @(#)pmap.c      7.7 (Berkeley)  5/12/91
65  */
66 /*-
67  * Copyright (c) 2003 Networks Associates Technology, Inc.
68  * All rights reserved.
69  *
70  * This software was developed for the FreeBSD Project by Jake Burkholder,
71  * Safeport Network Services, and Network Associates Laboratories, the
72  * Security Research Division of Network Associates, Inc. under
73  * DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA
74  * CHATS research program.
75  *
76  * Redistribution and use in source and binary forms, with or without
77  * modification, are permitted provided that the following conditions
78  * are met:
79  * 1. Redistributions of source code must retain the above copyright
80  *    notice, this list of conditions and the following disclaimer.
81  * 2. Redistributions in binary form must reproduce the above copyright
82  *    notice, this list of conditions and the following disclaimer in the
83  *    documentation and/or other materials provided with the distribution.
84  *
85  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
86  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
87  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
88  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
89  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
90  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
91  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
92  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
93  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
94  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
95  * SUCH DAMAGE.
96  */
97
98 #include <sys/cdefs.h>
99 __FBSDID("$FreeBSD$");
100
101 /*
102  *      Manages physical address maps.
103  *
104  *      Since the information managed by this module is
105  *      also stored by the logical address mapping module,
106  *      this module may throw away valid virtual-to-physical
107  *      mappings at almost any time.  However, invalidations
108  *      of virtual-to-physical mappings must be done as
109  *      requested.
110  *
111  *      In order to cope with hardware architectures which
112  *      make virtual-to-physical map invalidates expensive,
113  *      this module may delay invalidate or reduced protection
114  *      operations until such time as they are actually
115  *      necessary.  This module is given full information as
116  *      to which processors are currently using which maps,
117  *      and to when physical maps must be made correct.
118  */
119
120 #include <sys/param.h>
121 #include <sys/bus.h>
122 #include <sys/systm.h>
123 #include <sys/kernel.h>
124 #include <sys/ktr.h>
125 #include <sys/lock.h>
126 #include <sys/malloc.h>
127 #include <sys/mman.h>
128 #include <sys/msgbuf.h>
129 #include <sys/mutex.h>
130 #include <sys/proc.h>
131 #include <sys/rwlock.h>
132 #include <sys/sx.h>
133 #include <sys/vmem.h>
134 #include <sys/vmmeter.h>
135 #include <sys/sched.h>
136 #include <sys/sysctl.h>
137 #include <sys/smp.h>
138
139 #include <vm/vm.h>
140 #include <vm/vm_param.h>
141 #include <vm/vm_kern.h>
142 #include <vm/vm_page.h>
143 #include <vm/vm_map.h>
144 #include <vm/vm_object.h>
145 #include <vm/vm_extern.h>
146 #include <vm/vm_pageout.h>
147 #include <vm/vm_pager.h>
148 #include <vm/vm_radix.h>
149 #include <vm/vm_reserv.h>
150 #include <vm/uma.h>
151
152 #include <machine/machdep.h>
153 #include <machine/md_var.h>
154 #include <machine/pcb.h>
155 #include <machine/sbi.h>
156
157 #define NPDEPG          (PAGE_SIZE/(sizeof (pd_entry_t)))
158 #define NUPDE                   (NPDEPG * NPDEPG)
159 #define NUSERPGTBLS             (NUPDE + NPDEPG)
160
161 #if !defined(DIAGNOSTIC)
162 #ifdef __GNUC_GNU_INLINE__
163 #define PMAP_INLINE     __attribute__((__gnu_inline__)) inline
164 #else
165 #define PMAP_INLINE     extern inline
166 #endif
167 #else
168 #define PMAP_INLINE
169 #endif
170
171 #ifdef PV_STATS
172 #define PV_STAT(x)      do { x ; } while (0)
173 #else
174 #define PV_STAT(x)      do { } while (0)
175 #endif
176
177 #define pmap_l2_pindex(v)       ((v) >> L2_SHIFT)
178
179 #define NPV_LIST_LOCKS  MAXCPU
180
181 #define PHYS_TO_PV_LIST_LOCK(pa)        \
182                         (&pv_list_locks[pa_index(pa) % NPV_LIST_LOCKS])
183
184 #define CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa)  do {    \
185         struct rwlock **_lockp = (lockp);               \
186         struct rwlock *_new_lock;                       \
187                                                         \
188         _new_lock = PHYS_TO_PV_LIST_LOCK(pa);           \
189         if (_new_lock != *_lockp) {                     \
190                 if (*_lockp != NULL)                    \
191                         rw_wunlock(*_lockp);            \
192                 *_lockp = _new_lock;                    \
193                 rw_wlock(*_lockp);                      \
194         }                                               \
195 } while (0)
196
197 #define CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m)        \
198                         CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, VM_PAGE_TO_PHYS(m))
199
200 #define RELEASE_PV_LIST_LOCK(lockp)             do {    \
201         struct rwlock **_lockp = (lockp);               \
202                                                         \
203         if (*_lockp != NULL) {                          \
204                 rw_wunlock(*_lockp);                    \
205                 *_lockp = NULL;                         \
206         }                                               \
207 } while (0)
208
209 #define VM_PAGE_TO_PV_LIST_LOCK(m)      \
210                         PHYS_TO_PV_LIST_LOCK(VM_PAGE_TO_PHYS(m))
211
212 /* The list of all the user pmaps */
213 LIST_HEAD(pmaplist, pmap);
214 static struct pmaplist allpmaps = LIST_HEAD_INITIALIZER();
215
216 struct pmap kernel_pmap_store;
217
218 vm_offset_t virtual_avail;      /* VA of first avail page (after kernel bss) */
219 vm_offset_t virtual_end;        /* VA of last avail page (end of kernel AS) */
220 vm_offset_t kernel_vm_end = 0;
221
222 vm_paddr_t dmap_phys_base;      /* The start of the dmap region */
223 vm_paddr_t dmap_phys_max;       /* The limit of the dmap region */
224 vm_offset_t dmap_max_addr;      /* The virtual address limit of the dmap */
225
226 /* This code assumes all L1 DMAP entries will be used */
227 CTASSERT((DMAP_MIN_ADDRESS  & ~L1_OFFSET) == DMAP_MIN_ADDRESS);
228 CTASSERT((DMAP_MAX_ADDRESS  & ~L1_OFFSET) == DMAP_MAX_ADDRESS);
229
230 static struct rwlock_padalign pvh_global_lock;
231
232 /*
233  * Data for the pv entry allocation mechanism
234  */
235 static TAILQ_HEAD(pch, pv_chunk) pv_chunks = TAILQ_HEAD_INITIALIZER(pv_chunks);
236 static struct mtx pv_chunks_mutex;
237 static struct rwlock pv_list_locks[NPV_LIST_LOCKS];
238
239 static void     free_pv_chunk(struct pv_chunk *pc);
240 static void     free_pv_entry(pmap_t pmap, pv_entry_t pv);
241 static pv_entry_t get_pv_entry(pmap_t pmap, struct rwlock **lockp);
242 static vm_page_t reclaim_pv_chunk(pmap_t locked_pmap, struct rwlock **lockp);
243 static void     pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va);
244 static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap,
245                     vm_offset_t va);
246 static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va,
247     vm_page_t m, vm_prot_t prot, vm_page_t mpte, struct rwlock **lockp);
248 static int pmap_remove_l3(pmap_t pmap, pt_entry_t *l3, vm_offset_t sva,
249     pd_entry_t ptepde, struct spglist *free, struct rwlock **lockp);
250 static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va,
251     vm_page_t m, struct rwlock **lockp);
252
253 static vm_page_t _pmap_alloc_l3(pmap_t pmap, vm_pindex_t ptepindex,
254                 struct rwlock **lockp);
255
256 static void _pmap_unwire_l3(pmap_t pmap, vm_offset_t va, vm_page_t m,
257     struct spglist *free);
258 static int pmap_unuse_l3(pmap_t, vm_offset_t, pd_entry_t, struct spglist *);
259
260 #define pmap_clear(pte)                 pmap_store(pte, 0)
261 #define pmap_clear_bits(pte, bits)      atomic_clear_64(pte, bits)
262 #define pmap_load_store(pte, entry)     atomic_swap_64(pte, entry)
263 #define pmap_load_clear(pte)            pmap_load_store(pte, 0)
264 #define pmap_load(pte)                  atomic_load_64(pte)
265 #define pmap_store(pte, entry)          atomic_store_64(pte, entry)
266 #define pmap_store_bits(pte, bits)      atomic_set_64(pte, bits)
267
268 /********************/
269 /* Inline functions */
270 /********************/
271
272 static __inline void
273 pagecopy(void *s, void *d)
274 {
275
276         memcpy(d, s, PAGE_SIZE);
277 }
278
279 static __inline void
280 pagezero(void *p)
281 {
282
283         bzero(p, PAGE_SIZE);
284 }
285
286 #define pmap_l1_index(va)       (((va) >> L1_SHIFT) & Ln_ADDR_MASK)
287 #define pmap_l2_index(va)       (((va) >> L2_SHIFT) & Ln_ADDR_MASK)
288 #define pmap_l3_index(va)       (((va) >> L3_SHIFT) & Ln_ADDR_MASK)
289
290 #define PTE_TO_PHYS(pte)        ((pte >> PTE_PPN0_S) * PAGE_SIZE)
291
292 static __inline pd_entry_t *
293 pmap_l1(pmap_t pmap, vm_offset_t va)
294 {
295
296         return (&pmap->pm_l1[pmap_l1_index(va)]);
297 }
298
299 static __inline pd_entry_t *
300 pmap_l1_to_l2(pd_entry_t *l1, vm_offset_t va)
301 {
302         vm_paddr_t phys;
303         pd_entry_t *l2;
304
305         phys = PTE_TO_PHYS(pmap_load(l1));
306         l2 = (pd_entry_t *)PHYS_TO_DMAP(phys);
307
308         return (&l2[pmap_l2_index(va)]);
309 }
310
311 static __inline pd_entry_t *
312 pmap_l2(pmap_t pmap, vm_offset_t va)
313 {
314         pd_entry_t *l1;
315
316         l1 = pmap_l1(pmap, va);
317         if ((pmap_load(l1) & PTE_V) == 0)
318                 return (NULL);
319         if ((pmap_load(l1) & PTE_RX) != 0)
320                 return (NULL);
321
322         return (pmap_l1_to_l2(l1, va));
323 }
324
325 static __inline pt_entry_t *
326 pmap_l2_to_l3(pd_entry_t *l2, vm_offset_t va)
327 {
328         vm_paddr_t phys;
329         pt_entry_t *l3;
330
331         phys = PTE_TO_PHYS(pmap_load(l2));
332         l3 = (pd_entry_t *)PHYS_TO_DMAP(phys);
333
334         return (&l3[pmap_l3_index(va)]);
335 }
336
337 static __inline pt_entry_t *
338 pmap_l3(pmap_t pmap, vm_offset_t va)
339 {
340         pd_entry_t *l2;
341
342         l2 = pmap_l2(pmap, va);
343         if (l2 == NULL)
344                 return (NULL);
345         if ((pmap_load(l2) & PTE_V) == 0)
346                 return (NULL);
347         if ((pmap_load(l2) & PTE_RX) != 0)
348                 return (NULL);
349
350         return (pmap_l2_to_l3(l2, va));
351 }
352
353 static __inline void
354 pmap_resident_count_inc(pmap_t pmap, int count)
355 {
356
357         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
358         pmap->pm_stats.resident_count += count;
359 }
360
361 static __inline void
362 pmap_resident_count_dec(pmap_t pmap, int count)
363 {
364
365         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
366         KASSERT(pmap->pm_stats.resident_count >= count,
367             ("pmap %p resident count underflow %ld %d", pmap,
368             pmap->pm_stats.resident_count, count));
369         pmap->pm_stats.resident_count -= count;
370 }
371
372 static void
373 pmap_distribute_l1(struct pmap *pmap, vm_pindex_t l1index,
374     pt_entry_t entry)
375 {
376         struct pmap *user_pmap;
377         pd_entry_t *l1;
378
379         /* Distribute new kernel L1 entry to all the user pmaps */
380         if (pmap != kernel_pmap)
381                 return;
382
383         LIST_FOREACH(user_pmap, &allpmaps, pm_list) {
384                 l1 = &user_pmap->pm_l1[l1index];
385                 pmap_store(l1, entry);
386         }
387 }
388
389 static pt_entry_t *
390 pmap_early_page_idx(vm_offset_t l1pt, vm_offset_t va, u_int *l1_slot,
391     u_int *l2_slot)
392 {
393         pt_entry_t *l2;
394         pd_entry_t *l1;
395
396         l1 = (pd_entry_t *)l1pt;
397         *l1_slot = (va >> L1_SHIFT) & Ln_ADDR_MASK;
398
399         /* Check locore has used a table L1 map */
400         KASSERT((l1[*l1_slot] & PTE_RX) == 0,
401                 ("Invalid bootstrap L1 table"));
402
403         /* Find the address of the L2 table */
404         l2 = (pt_entry_t *)init_pt_va;
405         *l2_slot = pmap_l2_index(va);
406
407         return (l2);
408 }
409
410 static vm_paddr_t
411 pmap_early_vtophys(vm_offset_t l1pt, vm_offset_t va)
412 {
413         u_int l1_slot, l2_slot;
414         pt_entry_t *l2;
415         u_int ret;
416
417         l2 = pmap_early_page_idx(l1pt, va, &l1_slot, &l2_slot);
418
419         /* Check locore has used L2 superpages */
420         KASSERT((l2[l2_slot] & PTE_RX) != 0,
421                 ("Invalid bootstrap L2 table"));
422
423         /* L2 is superpages */
424         ret = (l2[l2_slot] >> PTE_PPN1_S) << L2_SHIFT;
425         ret += (va & L2_OFFSET);
426
427         return (ret);
428 }
429
430 static void
431 pmap_bootstrap_dmap(vm_offset_t kern_l1, vm_paddr_t min_pa, vm_paddr_t max_pa)
432 {
433         vm_offset_t va;
434         vm_paddr_t pa;
435         pd_entry_t *l1;
436         u_int l1_slot;
437         pt_entry_t entry;
438         pn_t pn;
439
440         pa = dmap_phys_base = min_pa & ~L1_OFFSET;
441         va = DMAP_MIN_ADDRESS;
442         l1 = (pd_entry_t *)kern_l1;
443         l1_slot = pmap_l1_index(DMAP_MIN_ADDRESS);
444
445         for (; va < DMAP_MAX_ADDRESS && pa < max_pa;
446             pa += L1_SIZE, va += L1_SIZE, l1_slot++) {
447                 KASSERT(l1_slot < Ln_ENTRIES, ("Invalid L1 index"));
448
449                 /* superpages */
450                 pn = (pa / PAGE_SIZE);
451                 entry = PTE_KERN;
452                 entry |= (pn << PTE_PPN0_S);
453                 pmap_store(&l1[l1_slot], entry);
454         }
455
456         /* Set the upper limit of the DMAP region */
457         dmap_phys_max = pa;
458         dmap_max_addr = va;
459
460         sfence_vma();
461 }
462
463 static vm_offset_t
464 pmap_bootstrap_l3(vm_offset_t l1pt, vm_offset_t va, vm_offset_t l3_start)
465 {
466         vm_offset_t l3pt;
467         pt_entry_t entry;
468         pd_entry_t *l2;
469         vm_paddr_t pa;
470         u_int l2_slot;
471         pn_t pn;
472
473         KASSERT((va & L2_OFFSET) == 0, ("Invalid virtual address"));
474
475         l2 = pmap_l2(kernel_pmap, va);
476         l2 = (pd_entry_t *)((uintptr_t)l2 & ~(PAGE_SIZE - 1));
477         l2_slot = pmap_l2_index(va);
478         l3pt = l3_start;
479
480         for (; va < VM_MAX_KERNEL_ADDRESS; l2_slot++, va += L2_SIZE) {
481                 KASSERT(l2_slot < Ln_ENTRIES, ("Invalid L2 index"));
482
483                 pa = pmap_early_vtophys(l1pt, l3pt);
484                 pn = (pa / PAGE_SIZE);
485                 entry = (PTE_V);
486                 entry |= (pn << PTE_PPN0_S);
487                 pmap_store(&l2[l2_slot], entry);
488                 l3pt += PAGE_SIZE;
489         }
490
491
492         /* Clean the L2 page table */
493         memset((void *)l3_start, 0, l3pt - l3_start);
494
495         return (l3pt);
496 }
497
498 /*
499  *      Bootstrap the system enough to run with virtual memory.
500  */
501 void
502 pmap_bootstrap(vm_offset_t l1pt, vm_paddr_t kernstart, vm_size_t kernlen)
503 {
504         u_int l1_slot, l2_slot, avail_slot, map_slot;
505         vm_offset_t freemempos;
506         vm_offset_t dpcpu, msgbufpv;
507         vm_paddr_t end, max_pa, min_pa, pa, start;
508         int i;
509
510         printf("pmap_bootstrap %lx %lx %lx\n", l1pt, kernstart, kernlen);
511         printf("%lx\n", l1pt);
512         printf("%lx\n", (KERNBASE >> L1_SHIFT) & Ln_ADDR_MASK);
513
514         /* Set this early so we can use the pagetable walking functions */
515         kernel_pmap_store.pm_l1 = (pd_entry_t *)l1pt;
516         PMAP_LOCK_INIT(kernel_pmap);
517
518         rw_init(&pvh_global_lock, "pmap pv global");
519
520         /* Assume the address we were loaded to is a valid physical address. */
521         min_pa = max_pa = kernstart;
522
523         /*
524          * Find the minimum physical address. physmap is sorted,
525          * but may contain empty ranges.
526          */
527         for (i = 0; i < physmap_idx * 2; i += 2) {
528                 if (physmap[i] == physmap[i + 1])
529                         continue;
530                 if (physmap[i] <= min_pa)
531                         min_pa = physmap[i];
532                 if (physmap[i + 1] > max_pa)
533                         max_pa = physmap[i + 1];
534         }
535         printf("physmap_idx %lx\n", physmap_idx);
536         printf("min_pa %lx\n", min_pa);
537         printf("max_pa %lx\n", max_pa);
538
539         /* Create a direct map region early so we can use it for pa -> va */
540         pmap_bootstrap_dmap(l1pt, min_pa, max_pa);
541
542         /*
543          * Read the page table to find out what is already mapped.
544          * This assumes we have mapped a block of memory from KERNBASE
545          * using a single L1 entry.
546          */
547         (void)pmap_early_page_idx(l1pt, KERNBASE, &l1_slot, &l2_slot);
548
549         /* Sanity check the index, KERNBASE should be the first VA */
550         KASSERT(l2_slot == 0, ("The L2 index is non-zero"));
551
552         freemempos = roundup2(KERNBASE + kernlen, PAGE_SIZE);
553
554         /* Create the l3 tables for the early devmap */
555         freemempos = pmap_bootstrap_l3(l1pt,
556             VM_MAX_KERNEL_ADDRESS - L2_SIZE, freemempos);
557
558         sfence_vma();
559
560 #define alloc_pages(var, np)                                            \
561         (var) = freemempos;                                             \
562         freemempos += (np * PAGE_SIZE);                                 \
563         memset((char *)(var), 0, ((np) * PAGE_SIZE));
564
565         /* Allocate dynamic per-cpu area. */
566         alloc_pages(dpcpu, DPCPU_SIZE / PAGE_SIZE);
567         dpcpu_init((void *)dpcpu, 0);
568
569         /* Allocate memory for the msgbuf, e.g. for /sbin/dmesg */
570         alloc_pages(msgbufpv, round_page(msgbufsize) / PAGE_SIZE);
571         msgbufp = (void *)msgbufpv;
572
573         virtual_avail = roundup2(freemempos, L2_SIZE);
574         virtual_end = VM_MAX_KERNEL_ADDRESS - L2_SIZE;
575         kernel_vm_end = virtual_avail;
576         
577         pa = pmap_early_vtophys(l1pt, freemempos);
578
579         /* Initialize phys_avail. */
580         for (avail_slot = map_slot = physmem = 0; map_slot < physmap_idx * 2;
581             map_slot += 2) {
582                 start = physmap[map_slot];
583                 end = physmap[map_slot + 1];
584
585                 if (start == end)
586                         continue;
587                 if (start >= kernstart && end <= pa)
588                         continue;
589
590                 if (start < kernstart && end > kernstart)
591                         end = kernstart;
592                 else if (start < pa && end > pa)
593                         start = pa;
594                 phys_avail[avail_slot] = start;
595                 phys_avail[avail_slot + 1] = end;
596                 physmem += (end - start) >> PAGE_SHIFT;
597                 avail_slot += 2;
598
599                 if (end != physmap[map_slot + 1] && end > pa) {
600                         phys_avail[avail_slot] = pa;
601                         phys_avail[avail_slot + 1] = physmap[map_slot + 1];
602                         physmem += (physmap[map_slot + 1] - pa) >> PAGE_SHIFT;
603                         avail_slot += 2;
604                 }
605         }
606         phys_avail[avail_slot] = 0;
607         phys_avail[avail_slot + 1] = 0;
608
609         /*
610          * Maxmem isn't the "maximum memory", it's one larger than the
611          * highest page of the physical address space.  It should be
612          * called something like "Maxphyspage".
613          */
614         Maxmem = atop(phys_avail[avail_slot - 1]);
615 }
616
617 /*
618  *      Initialize a vm_page's machine-dependent fields.
619  */
620 void
621 pmap_page_init(vm_page_t m)
622 {
623
624         TAILQ_INIT(&m->md.pv_list);
625         m->md.pv_memattr = VM_MEMATTR_WRITE_BACK;
626 }
627
628 /*
629  *      Initialize the pmap module.
630  *      Called by vm_init, to initialize any structures that the pmap
631  *      system needs to map virtual memory.
632  */
633 void
634 pmap_init(void)
635 {
636         int i;
637
638         /*
639          * Initialize the pv chunk list mutex.
640          */
641         mtx_init(&pv_chunks_mutex, "pmap pv chunk list", NULL, MTX_DEF);
642
643         /*
644          * Initialize the pool of pv list locks.
645          */
646         for (i = 0; i < NPV_LIST_LOCKS; i++)
647                 rw_init(&pv_list_locks[i], "pmap pv list");
648 }
649
650 #ifdef SMP
651 /*
652  * For SMP, these functions have to use IPIs for coherence.
653  *
654  * In general, the calling thread uses a plain fence to order the
655  * writes to the page tables before invoking an SBI callback to invoke
656  * sfence_vma() on remote CPUs.
657  *
658  * Since the riscv pmap does not yet have a pm_active field, IPIs are
659  * sent to all CPUs in the system.
660  */
661 static void
662 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
663 {
664         cpuset_t mask;
665
666         sched_pin();
667         mask = all_cpus;
668         CPU_CLR(PCPU_GET(cpuid), &mask);
669         fence();
670         sbi_remote_sfence_vma(mask.__bits, va, 1);
671         sfence_vma_page(va);
672         sched_unpin();
673 }
674
675 static void
676 pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
677 {
678         cpuset_t mask;
679
680         sched_pin();
681         mask = all_cpus;
682         CPU_CLR(PCPU_GET(cpuid), &mask);
683         fence();
684         sbi_remote_sfence_vma(mask.__bits, sva, eva - sva + 1);
685
686         /*
687          * Might consider a loop of sfence_vma_page() for a small
688          * number of pages in the future.
689          */
690         sfence_vma();
691         sched_unpin();
692 }
693
694 static void
695 pmap_invalidate_all(pmap_t pmap)
696 {
697         cpuset_t mask;
698
699         sched_pin();
700         mask = all_cpus;
701         CPU_CLR(PCPU_GET(cpuid), &mask);
702         fence();
703
704         /*
705          * XXX: The SBI doc doesn't detail how to specify x0 as the
706          * address to perform a global fence.  BBL currently treats
707          * all sfence_vma requests as global however.
708          */
709         sbi_remote_sfence_vma(mask.__bits, 0, 0);
710         sfence_vma();
711         sched_unpin();
712 }
713 #else
714 /*
715  * Normal, non-SMP, invalidation functions.
716  * We inline these within pmap.c for speed.
717  */
718 static __inline void
719 pmap_invalidate_page(pmap_t pmap, vm_offset_t va)
720 {
721
722         sfence_vma_page(va);
723 }
724
725 static __inline void
726 pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
727 {
728
729         /*
730          * Might consider a loop of sfence_vma_page() for a small
731          * number of pages in the future.
732          */
733         sfence_vma();
734 }
735
736 static __inline void
737 pmap_invalidate_all(pmap_t pmap)
738 {
739
740         sfence_vma();
741 }
742 #endif
743
744 /*
745  *      Routine:        pmap_extract
746  *      Function:
747  *              Extract the physical page address associated
748  *              with the given map/virtual_address pair.
749  */
750 vm_paddr_t 
751 pmap_extract(pmap_t pmap, vm_offset_t va)
752 {
753         pd_entry_t *l2p, l2;
754         pt_entry_t *l3p, l3;
755         vm_paddr_t pa;
756
757         pa = 0;
758         PMAP_LOCK(pmap);
759         /*
760          * Start with the l2 tabel. We are unable to allocate
761          * pages in the l1 table.
762          */
763         l2p = pmap_l2(pmap, va);
764         if (l2p != NULL) {
765                 l2 = pmap_load(l2p);
766                 if ((l2 & PTE_RX) == 0) {
767                         l3p = pmap_l2_to_l3(l2p, va);
768                         if (l3p != NULL) {
769                                 l3 = pmap_load(l3p);
770                                 pa = PTE_TO_PHYS(l3);
771                                 pa |= (va & L3_OFFSET);
772                         }
773                 } else {
774                         /* L2 is superpages */
775                         pa = (l2 >> PTE_PPN1_S) << L2_SHIFT;
776                         pa |= (va & L2_OFFSET);
777                 }
778         }
779         PMAP_UNLOCK(pmap);
780         return (pa);
781 }
782
783 /*
784  *      Routine:        pmap_extract_and_hold
785  *      Function:
786  *              Atomically extract and hold the physical page
787  *              with the given pmap and virtual address pair
788  *              if that mapping permits the given protection.
789  */
790 vm_page_t
791 pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
792 {
793         pt_entry_t *l3p, l3;
794         vm_paddr_t phys;
795         vm_paddr_t pa;
796         vm_page_t m;
797
798         pa = 0;
799         m = NULL;
800         PMAP_LOCK(pmap);
801 retry:
802         l3p = pmap_l3(pmap, va);
803         if (l3p != NULL && (l3 = pmap_load(l3p)) != 0) {
804                 if ((l3 & PTE_W) != 0 || (prot & VM_PROT_WRITE) == 0) {
805                         phys = PTE_TO_PHYS(l3);
806                         if (vm_page_pa_tryrelock(pmap, phys, &pa))
807                                 goto retry;
808                         m = PHYS_TO_VM_PAGE(phys);
809                         vm_page_hold(m);
810                 }
811         }
812         PA_UNLOCK_COND(pa);
813         PMAP_UNLOCK(pmap);
814         return (m);
815 }
816
817 vm_paddr_t
818 pmap_kextract(vm_offset_t va)
819 {
820         pd_entry_t *l2;
821         pt_entry_t *l3;
822         vm_paddr_t pa;
823
824         if (va >= DMAP_MIN_ADDRESS && va < DMAP_MAX_ADDRESS) {
825                 pa = DMAP_TO_PHYS(va);
826         } else {
827                 l2 = pmap_l2(kernel_pmap, va);
828                 if (l2 == NULL)
829                         panic("pmap_kextract: No l2");
830                 if ((pmap_load(l2) & PTE_RX) != 0) {
831                         /* superpages */
832                         pa = (pmap_load(l2) >> PTE_PPN1_S) << L2_SHIFT;
833                         pa |= (va & L2_OFFSET);
834                         return (pa);
835                 }
836
837                 l3 = pmap_l2_to_l3(l2, va);
838                 if (l3 == NULL)
839                         panic("pmap_kextract: No l3...");
840                 pa = PTE_TO_PHYS(pmap_load(l3));
841                 pa |= (va & PAGE_MASK);
842         }
843         return (pa);
844 }
845
846 /***************************************************
847  * Low level mapping routines.....
848  ***************************************************/
849
850 void
851 pmap_kenter_device(vm_offset_t sva, vm_size_t size, vm_paddr_t pa)
852 {
853         pt_entry_t entry;
854         pt_entry_t *l3;
855         vm_offset_t va;
856         pn_t pn;
857
858         KASSERT((pa & L3_OFFSET) == 0,
859            ("pmap_kenter_device: Invalid physical address"));
860         KASSERT((sva & L3_OFFSET) == 0,
861            ("pmap_kenter_device: Invalid virtual address"));
862         KASSERT((size & PAGE_MASK) == 0,
863             ("pmap_kenter_device: Mapping is not page-sized"));
864
865         va = sva;
866         while (size != 0) {
867                 l3 = pmap_l3(kernel_pmap, va);
868                 KASSERT(l3 != NULL, ("Invalid page table, va: 0x%lx", va));
869
870                 pn = (pa / PAGE_SIZE);
871                 entry = PTE_KERN;
872                 entry |= (pn << PTE_PPN0_S);
873                 pmap_store(l3, entry);
874
875                 va += PAGE_SIZE;
876                 pa += PAGE_SIZE;
877                 size -= PAGE_SIZE;
878         }
879         pmap_invalidate_range(kernel_pmap, sva, va);
880 }
881
882 /*
883  * Remove a page from the kernel pagetables.
884  * Note: not SMP coherent.
885  */
886 PMAP_INLINE void
887 pmap_kremove(vm_offset_t va)
888 {
889         pt_entry_t *l3;
890
891         l3 = pmap_l3(kernel_pmap, va);
892         KASSERT(l3 != NULL, ("pmap_kremove: Invalid address"));
893
894         pmap_clear(l3);
895         sfence_vma();
896 }
897
898 void
899 pmap_kremove_device(vm_offset_t sva, vm_size_t size)
900 {
901         pt_entry_t *l3;
902         vm_offset_t va;
903
904         KASSERT((sva & L3_OFFSET) == 0,
905            ("pmap_kremove_device: Invalid virtual address"));
906         KASSERT((size & PAGE_MASK) == 0,
907             ("pmap_kremove_device: Mapping is not page-sized"));
908
909         va = sva;
910         while (size != 0) {
911                 l3 = pmap_l3(kernel_pmap, va);
912                 KASSERT(l3 != NULL, ("Invalid page table, va: 0x%lx", va));
913                 pmap_clear(l3);
914
915                 va += PAGE_SIZE;
916                 size -= PAGE_SIZE;
917         }
918
919         pmap_invalidate_range(kernel_pmap, sva, va);
920 }
921
922 /*
923  *      Used to map a range of physical addresses into kernel
924  *      virtual address space.
925  *
926  *      The value passed in '*virt' is a suggested virtual address for
927  *      the mapping. Architectures which can support a direct-mapped
928  *      physical to virtual region can return the appropriate address
929  *      within that region, leaving '*virt' unchanged. Other
930  *      architectures should map the pages starting at '*virt' and
931  *      update '*virt' with the first usable address after the mapped
932  *      region.
933  */
934 vm_offset_t
935 pmap_map(vm_offset_t *virt, vm_paddr_t start, vm_paddr_t end, int prot)
936 {
937
938         return PHYS_TO_DMAP(start);
939 }
940
941
942 /*
943  * Add a list of wired pages to the kva
944  * this routine is only used for temporary
945  * kernel mappings that do not need to have
946  * page modification or references recorded.
947  * Note that old mappings are simply written
948  * over.  The page *must* be wired.
949  * Note: SMP coherent.  Uses a ranged shootdown IPI.
950  */
951 void
952 pmap_qenter(vm_offset_t sva, vm_page_t *ma, int count)
953 {
954         pt_entry_t *l3, pa;
955         vm_offset_t va;
956         vm_page_t m;
957         pt_entry_t entry;
958         pn_t pn;
959         int i;
960
961         va = sva;
962         for (i = 0; i < count; i++) {
963                 m = ma[i];
964                 pa = VM_PAGE_TO_PHYS(m);
965                 pn = (pa / PAGE_SIZE);
966                 l3 = pmap_l3(kernel_pmap, va);
967
968                 entry = PTE_KERN;
969                 entry |= (pn << PTE_PPN0_S);
970                 pmap_store(l3, entry);
971
972                 va += L3_SIZE;
973         }
974         pmap_invalidate_range(kernel_pmap, sva, va);
975 }
976
977 /*
978  * This routine tears out page mappings from the
979  * kernel -- it is meant only for temporary mappings.
980  * Note: SMP coherent.  Uses a ranged shootdown IPI.
981  */
982 void
983 pmap_qremove(vm_offset_t sva, int count)
984 {
985         pt_entry_t *l3;
986         vm_offset_t va;
987
988         KASSERT(sva >= VM_MIN_KERNEL_ADDRESS, ("usermode va %lx", sva));
989
990         for (va = sva; count-- > 0; va += PAGE_SIZE) {
991                 l3 = pmap_l3(kernel_pmap, va);
992                 KASSERT(l3 != NULL, ("pmap_kremove: Invalid address"));
993                 pmap_clear(l3);
994         }
995         pmap_invalidate_range(kernel_pmap, sva, va);
996 }
997
998 /***************************************************
999  * Page table page management routines.....
1000  ***************************************************/
1001 /*
1002  * Schedule the specified unused page table page to be freed.  Specifically,
1003  * add the page to the specified list of pages that will be released to the
1004  * physical memory manager after the TLB has been updated.
1005  */
1006 static __inline void
1007 pmap_add_delayed_free_list(vm_page_t m, struct spglist *free,
1008     boolean_t set_PG_ZERO)
1009 {
1010
1011         if (set_PG_ZERO)
1012                 m->flags |= PG_ZERO;
1013         else
1014                 m->flags &= ~PG_ZERO;
1015         SLIST_INSERT_HEAD(free, m, plinks.s.ss);
1016 }
1017         
1018 /*
1019  * Decrements a page table page's wire count, which is used to record the
1020  * number of valid page table entries within the page.  If the wire count
1021  * drops to zero, then the page table page is unmapped.  Returns TRUE if the
1022  * page table page was unmapped and FALSE otherwise.
1023  */
1024 static inline boolean_t
1025 pmap_unwire_l3(pmap_t pmap, vm_offset_t va, vm_page_t m, struct spglist *free)
1026 {
1027
1028         --m->wire_count;
1029         if (m->wire_count == 0) {
1030                 _pmap_unwire_l3(pmap, va, m, free);
1031                 return (TRUE);
1032         } else {
1033                 return (FALSE);
1034         }
1035 }
1036
1037 static void
1038 _pmap_unwire_l3(pmap_t pmap, vm_offset_t va, vm_page_t m, struct spglist *free)
1039 {
1040         vm_paddr_t phys;
1041
1042         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1043         /*
1044          * unmap the page table page
1045          */
1046         if (m->pindex >= NUPDE) {
1047                 /* PD page */
1048                 pd_entry_t *l1;
1049                 l1 = pmap_l1(pmap, va);
1050                 pmap_clear(l1);
1051                 pmap_distribute_l1(pmap, pmap_l1_index(va), 0);
1052         } else {
1053                 /* PTE page */
1054                 pd_entry_t *l2;
1055                 l2 = pmap_l2(pmap, va);
1056                 pmap_clear(l2);
1057         }
1058         pmap_resident_count_dec(pmap, 1);
1059         if (m->pindex < NUPDE) {
1060                 pd_entry_t *l1;
1061                 /* We just released a PT, unhold the matching PD */
1062                 vm_page_t pdpg;
1063
1064                 l1 = pmap_l1(pmap, va);
1065                 phys = PTE_TO_PHYS(pmap_load(l1));
1066                 pdpg = PHYS_TO_VM_PAGE(phys);
1067                 pmap_unwire_l3(pmap, va, pdpg, free);
1068         }
1069         pmap_invalidate_page(pmap, va);
1070
1071         vm_wire_sub(1);
1072
1073         /* 
1074          * Put page on a list so that it is released after
1075          * *ALL* TLB shootdown is done
1076          */
1077         pmap_add_delayed_free_list(m, free, TRUE);
1078 }
1079
1080 /*
1081  * After removing an l3 entry, this routine is used to
1082  * conditionally free the page, and manage the hold/wire counts.
1083  */
1084 static int
1085 pmap_unuse_l3(pmap_t pmap, vm_offset_t va, pd_entry_t ptepde,
1086     struct spglist *free)
1087 {
1088         vm_paddr_t phys;
1089         vm_page_t mpte;
1090
1091         if (va >= VM_MAXUSER_ADDRESS)
1092                 return (0);
1093         KASSERT(ptepde != 0, ("pmap_unuse_pt: ptepde != 0"));
1094
1095         phys = PTE_TO_PHYS(ptepde);
1096
1097         mpte = PHYS_TO_VM_PAGE(phys);
1098         return (pmap_unwire_l3(pmap, va, mpte, free));
1099 }
1100
1101 void
1102 pmap_pinit0(pmap_t pmap)
1103 {
1104
1105         PMAP_LOCK_INIT(pmap);
1106         bzero(&pmap->pm_stats, sizeof(pmap->pm_stats));
1107         pmap->pm_l1 = kernel_pmap->pm_l1;
1108 }
1109
1110 int
1111 pmap_pinit(pmap_t pmap)
1112 {
1113         vm_paddr_t l1phys;
1114         vm_page_t l1pt;
1115
1116         /*
1117          * allocate the l1 page
1118          */
1119         while ((l1pt = vm_page_alloc(NULL, 0xdeadbeef, VM_ALLOC_NORMAL |
1120             VM_ALLOC_NOOBJ | VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL)
1121                 vm_wait(NULL);
1122
1123         l1phys = VM_PAGE_TO_PHYS(l1pt);
1124         pmap->pm_l1 = (pd_entry_t *)PHYS_TO_DMAP(l1phys);
1125
1126         if ((l1pt->flags & PG_ZERO) == 0)
1127                 pagezero(pmap->pm_l1);
1128
1129         bzero(&pmap->pm_stats, sizeof(pmap->pm_stats));
1130
1131         /* Install kernel pagetables */
1132         memcpy(pmap->pm_l1, kernel_pmap->pm_l1, PAGE_SIZE);
1133
1134         /* Add to the list of all user pmaps */
1135         LIST_INSERT_HEAD(&allpmaps, pmap, pm_list);
1136
1137         return (1);
1138 }
1139
1140 /*
1141  * This routine is called if the desired page table page does not exist.
1142  *
1143  * If page table page allocation fails, this routine may sleep before
1144  * returning NULL.  It sleeps only if a lock pointer was given.
1145  *
1146  * Note: If a page allocation fails at page table level two or three,
1147  * one or two pages may be held during the wait, only to be released
1148  * afterwards.  This conservative approach is easily argued to avoid
1149  * race conditions.
1150  */
1151 static vm_page_t
1152 _pmap_alloc_l3(pmap_t pmap, vm_pindex_t ptepindex, struct rwlock **lockp)
1153 {
1154         vm_page_t m, /*pdppg, */pdpg;
1155         pt_entry_t entry;
1156         vm_paddr_t phys;
1157         pn_t pn;
1158
1159         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1160
1161         /*
1162          * Allocate a page table page.
1163          */
1164         if ((m = vm_page_alloc(NULL, ptepindex, VM_ALLOC_NOOBJ |
1165             VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL) {
1166                 if (lockp != NULL) {
1167                         RELEASE_PV_LIST_LOCK(lockp);
1168                         PMAP_UNLOCK(pmap);
1169                         rw_runlock(&pvh_global_lock);
1170                         vm_wait(NULL);
1171                         rw_rlock(&pvh_global_lock);
1172                         PMAP_LOCK(pmap);
1173                 }
1174
1175                 /*
1176                  * Indicate the need to retry.  While waiting, the page table
1177                  * page may have been allocated.
1178                  */
1179                 return (NULL);
1180         }
1181
1182         if ((m->flags & PG_ZERO) == 0)
1183                 pmap_zero_page(m);
1184
1185         /*
1186          * Map the pagetable page into the process address space, if
1187          * it isn't already there.
1188          */
1189
1190         if (ptepindex >= NUPDE) {
1191                 pd_entry_t *l1;
1192                 vm_pindex_t l1index;
1193
1194                 l1index = ptepindex - NUPDE;
1195                 l1 = &pmap->pm_l1[l1index];
1196
1197                 pn = (VM_PAGE_TO_PHYS(m) / PAGE_SIZE);
1198                 entry = (PTE_V);
1199                 entry |= (pn << PTE_PPN0_S);
1200                 pmap_store(l1, entry);
1201                 pmap_distribute_l1(pmap, l1index, entry);
1202         } else {
1203                 vm_pindex_t l1index;
1204                 pd_entry_t *l1, *l2;
1205
1206                 l1index = ptepindex >> (L1_SHIFT - L2_SHIFT);
1207                 l1 = &pmap->pm_l1[l1index];
1208                 if (pmap_load(l1) == 0) {
1209                         /* recurse for allocating page dir */
1210                         if (_pmap_alloc_l3(pmap, NUPDE + l1index,
1211                             lockp) == NULL) {
1212                                 vm_page_unwire_noq(m);
1213                                 vm_page_free_zero(m);
1214                                 return (NULL);
1215                         }
1216                 } else {
1217                         phys = PTE_TO_PHYS(pmap_load(l1));
1218                         pdpg = PHYS_TO_VM_PAGE(phys);
1219                         pdpg->wire_count++;
1220                 }
1221
1222                 phys = PTE_TO_PHYS(pmap_load(l1));
1223                 l2 = (pd_entry_t *)PHYS_TO_DMAP(phys);
1224                 l2 = &l2[ptepindex & Ln_ADDR_MASK];
1225
1226                 pn = (VM_PAGE_TO_PHYS(m) / PAGE_SIZE);
1227                 entry = (PTE_V);
1228                 entry |= (pn << PTE_PPN0_S);
1229                 pmap_store(l2, entry);
1230         }
1231
1232         pmap_resident_count_inc(pmap, 1);
1233
1234         return (m);
1235 }
1236
1237 static vm_page_t
1238 pmap_alloc_l3(pmap_t pmap, vm_offset_t va, struct rwlock **lockp)
1239 {
1240         vm_pindex_t ptepindex;
1241         pd_entry_t *l2;
1242         vm_paddr_t phys;
1243         vm_page_t m;
1244
1245         /*
1246          * Calculate pagetable page index
1247          */
1248         ptepindex = pmap_l2_pindex(va);
1249 retry:
1250         /*
1251          * Get the page directory entry
1252          */
1253         l2 = pmap_l2(pmap, va);
1254
1255         /*
1256          * If the page table page is mapped, we just increment the
1257          * hold count, and activate it.
1258          */
1259         if (l2 != NULL && pmap_load(l2) != 0) {
1260                 phys = PTE_TO_PHYS(pmap_load(l2));
1261                 m = PHYS_TO_VM_PAGE(phys);
1262                 m->wire_count++;
1263         } else {
1264                 /*
1265                  * Here if the pte page isn't mapped, or if it has been
1266                  * deallocated.
1267                  */
1268                 m = _pmap_alloc_l3(pmap, ptepindex, lockp);
1269                 if (m == NULL && lockp != NULL)
1270                         goto retry;
1271         }
1272         return (m);
1273 }
1274
1275
1276 /***************************************************
1277  * Pmap allocation/deallocation routines.
1278  ***************************************************/
1279
1280 /*
1281  * Release any resources held by the given physical map.
1282  * Called when a pmap initialized by pmap_pinit is being released.
1283  * Should only be called if the map contains no valid mappings.
1284  */
1285 void
1286 pmap_release(pmap_t pmap)
1287 {
1288         vm_page_t m;
1289
1290         KASSERT(pmap->pm_stats.resident_count == 0,
1291             ("pmap_release: pmap resident count %ld != 0",
1292             pmap->pm_stats.resident_count));
1293
1294         m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pmap->pm_l1));
1295         vm_page_unwire_noq(m);
1296         vm_page_free_zero(m);
1297
1298         /* Remove pmap from the allpmaps list */
1299         LIST_REMOVE(pmap, pm_list);
1300
1301         /* Remove kernel pagetables */
1302         bzero(pmap->pm_l1, PAGE_SIZE);
1303 }
1304
1305 #if 0
1306 static int
1307 kvm_size(SYSCTL_HANDLER_ARGS)
1308 {
1309         unsigned long ksize = VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS;
1310
1311         return sysctl_handle_long(oidp, &ksize, 0, req);
1312 }
1313 SYSCTL_PROC(_vm, OID_AUTO, kvm_size, CTLTYPE_LONG|CTLFLAG_RD, 
1314     0, 0, kvm_size, "LU", "Size of KVM");
1315
1316 static int
1317 kvm_free(SYSCTL_HANDLER_ARGS)
1318 {
1319         unsigned long kfree = VM_MAX_KERNEL_ADDRESS - kernel_vm_end;
1320
1321         return sysctl_handle_long(oidp, &kfree, 0, req);
1322 }
1323 SYSCTL_PROC(_vm, OID_AUTO, kvm_free, CTLTYPE_LONG|CTLFLAG_RD, 
1324     0, 0, kvm_free, "LU", "Amount of KVM free");
1325 #endif /* 0 */
1326
1327 /*
1328  * grow the number of kernel page table entries, if needed
1329  */
1330 void
1331 pmap_growkernel(vm_offset_t addr)
1332 {
1333         vm_paddr_t paddr;
1334         vm_page_t nkpg;
1335         pd_entry_t *l1, *l2;
1336         pt_entry_t entry;
1337         pn_t pn;
1338
1339         mtx_assert(&kernel_map->system_mtx, MA_OWNED);
1340
1341         addr = roundup2(addr, L2_SIZE);
1342         if (addr - 1 >= vm_map_max(kernel_map))
1343                 addr = vm_map_max(kernel_map);
1344         while (kernel_vm_end < addr) {
1345                 l1 = pmap_l1(kernel_pmap, kernel_vm_end);
1346                 if (pmap_load(l1) == 0) {
1347                         /* We need a new PDP entry */
1348                         nkpg = vm_page_alloc(NULL, kernel_vm_end >> L1_SHIFT,
1349                             VM_ALLOC_INTERRUPT | VM_ALLOC_NOOBJ |
1350                             VM_ALLOC_WIRED | VM_ALLOC_ZERO);
1351                         if (nkpg == NULL)
1352                                 panic("pmap_growkernel: no memory to grow kernel");
1353                         if ((nkpg->flags & PG_ZERO) == 0)
1354                                 pmap_zero_page(nkpg);
1355                         paddr = VM_PAGE_TO_PHYS(nkpg);
1356
1357                         pn = (paddr / PAGE_SIZE);
1358                         entry = (PTE_V);
1359                         entry |= (pn << PTE_PPN0_S);
1360                         pmap_store(l1, entry);
1361                         pmap_distribute_l1(kernel_pmap,
1362                             pmap_l1_index(kernel_vm_end), entry);
1363                         continue; /* try again */
1364                 }
1365                 l2 = pmap_l1_to_l2(l1, kernel_vm_end);
1366                 if ((pmap_load(l2) & PTE_V) != 0 &&
1367                     (pmap_load(l2) & PTE_RWX) == 0) {
1368                         kernel_vm_end = (kernel_vm_end + L2_SIZE) & ~L2_OFFSET;
1369                         if (kernel_vm_end - 1 >= vm_map_max(kernel_map)) {
1370                                 kernel_vm_end = vm_map_max(kernel_map);
1371                                 break;
1372                         }
1373                         continue;
1374                 }
1375
1376                 nkpg = vm_page_alloc(NULL, kernel_vm_end >> L2_SHIFT,
1377                     VM_ALLOC_INTERRUPT | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED |
1378                     VM_ALLOC_ZERO);
1379                 if (nkpg == NULL)
1380                         panic("pmap_growkernel: no memory to grow kernel");
1381                 if ((nkpg->flags & PG_ZERO) == 0) {
1382                         pmap_zero_page(nkpg);
1383                 }
1384                 paddr = VM_PAGE_TO_PHYS(nkpg);
1385
1386                 pn = (paddr / PAGE_SIZE);
1387                 entry = (PTE_V);
1388                 entry |= (pn << PTE_PPN0_S);
1389                 pmap_store(l2, entry);
1390
1391                 pmap_invalidate_page(kernel_pmap, kernel_vm_end);
1392
1393                 kernel_vm_end = (kernel_vm_end + L2_SIZE) & ~L2_OFFSET;
1394                 if (kernel_vm_end - 1 >= vm_map_max(kernel_map)) {
1395                         kernel_vm_end = vm_map_max(kernel_map);
1396                         break;                       
1397                 }
1398         }
1399 }
1400
1401
1402 /***************************************************
1403  * page management routines.
1404  ***************************************************/
1405
1406 CTASSERT(sizeof(struct pv_chunk) == PAGE_SIZE);
1407 CTASSERT(_NPCM == 3);
1408 CTASSERT(_NPCPV == 168);
1409
1410 static __inline struct pv_chunk *
1411 pv_to_chunk(pv_entry_t pv)
1412 {
1413
1414         return ((struct pv_chunk *)((uintptr_t)pv & ~(uintptr_t)PAGE_MASK));
1415 }
1416
1417 #define PV_PMAP(pv) (pv_to_chunk(pv)->pc_pmap)
1418
1419 #define PC_FREE0        0xfffffffffffffffful
1420 #define PC_FREE1        0xfffffffffffffffful
1421 #define PC_FREE2        0x000000fffffffffful
1422
1423 static const uint64_t pc_freemask[_NPCM] = { PC_FREE0, PC_FREE1, PC_FREE2 };
1424
1425 #if 0
1426 #ifdef PV_STATS
1427 static int pc_chunk_count, pc_chunk_allocs, pc_chunk_frees, pc_chunk_tryfail;
1428
1429 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_count, CTLFLAG_RD, &pc_chunk_count, 0,
1430         "Current number of pv entry chunks");
1431 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_allocs, CTLFLAG_RD, &pc_chunk_allocs, 0,
1432         "Current number of pv entry chunks allocated");
1433 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_frees, CTLFLAG_RD, &pc_chunk_frees, 0,
1434         "Current number of pv entry chunks frees");
1435 SYSCTL_INT(_vm_pmap, OID_AUTO, pc_chunk_tryfail, CTLFLAG_RD, &pc_chunk_tryfail, 0,
1436         "Number of times tried to get a chunk page but failed.");
1437
1438 static long pv_entry_frees, pv_entry_allocs, pv_entry_count;
1439 static int pv_entry_spare;
1440
1441 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_frees, CTLFLAG_RD, &pv_entry_frees, 0,
1442         "Current number of pv entry frees");
1443 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_allocs, CTLFLAG_RD, &pv_entry_allocs, 0,
1444         "Current number of pv entry allocs");
1445 SYSCTL_LONG(_vm_pmap, OID_AUTO, pv_entry_count, CTLFLAG_RD, &pv_entry_count, 0,
1446         "Current number of pv entries");
1447 SYSCTL_INT(_vm_pmap, OID_AUTO, pv_entry_spare, CTLFLAG_RD, &pv_entry_spare, 0,
1448         "Current number of spare pv entries");
1449 #endif
1450 #endif /* 0 */
1451
1452 /*
1453  * We are in a serious low memory condition.  Resort to
1454  * drastic measures to free some pages so we can allocate
1455  * another pv entry chunk.
1456  *
1457  * Returns NULL if PV entries were reclaimed from the specified pmap.
1458  *
1459  * We do not, however, unmap 2mpages because subsequent accesses will
1460  * allocate per-page pv entries until repromotion occurs, thereby
1461  * exacerbating the shortage of free pv entries.
1462  */
1463 static vm_page_t
1464 reclaim_pv_chunk(pmap_t locked_pmap, struct rwlock **lockp)
1465 {
1466
1467         panic("RISCVTODO: reclaim_pv_chunk");
1468 }
1469
1470 /*
1471  * free the pv_entry back to the free list
1472  */
1473 static void
1474 free_pv_entry(pmap_t pmap, pv_entry_t pv)
1475 {
1476         struct pv_chunk *pc;
1477         int idx, field, bit;
1478
1479         rw_assert(&pvh_global_lock, RA_LOCKED);
1480         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1481         PV_STAT(atomic_add_long(&pv_entry_frees, 1));
1482         PV_STAT(atomic_add_int(&pv_entry_spare, 1));
1483         PV_STAT(atomic_subtract_long(&pv_entry_count, 1));
1484         pc = pv_to_chunk(pv);
1485         idx = pv - &pc->pc_pventry[0];
1486         field = idx / 64;
1487         bit = idx % 64;
1488         pc->pc_map[field] |= 1ul << bit;
1489         if (pc->pc_map[0] != PC_FREE0 || pc->pc_map[1] != PC_FREE1 ||
1490             pc->pc_map[2] != PC_FREE2) {
1491                 /* 98% of the time, pc is already at the head of the list. */
1492                 if (__predict_false(pc != TAILQ_FIRST(&pmap->pm_pvchunk))) {
1493                         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
1494                         TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
1495                 }
1496                 return;
1497         }
1498         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
1499         free_pv_chunk(pc);
1500 }
1501
1502 static void
1503 free_pv_chunk(struct pv_chunk *pc)
1504 {
1505         vm_page_t m;
1506
1507         mtx_lock(&pv_chunks_mutex);
1508         TAILQ_REMOVE(&pv_chunks, pc, pc_lru);
1509         mtx_unlock(&pv_chunks_mutex);
1510         PV_STAT(atomic_subtract_int(&pv_entry_spare, _NPCPV));
1511         PV_STAT(atomic_subtract_int(&pc_chunk_count, 1));
1512         PV_STAT(atomic_add_int(&pc_chunk_frees, 1));
1513         /* entire chunk is free, return it */
1514         m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
1515 #if 0 /* TODO: For minidump */
1516         dump_drop_page(m->phys_addr);
1517 #endif
1518         vm_page_unwire(m, PQ_NONE);
1519         vm_page_free(m);
1520 }
1521
1522 /*
1523  * Returns a new PV entry, allocating a new PV chunk from the system when
1524  * needed.  If this PV chunk allocation fails and a PV list lock pointer was
1525  * given, a PV chunk is reclaimed from an arbitrary pmap.  Otherwise, NULL is
1526  * returned.
1527  *
1528  * The given PV list lock may be released.
1529  */
1530 static pv_entry_t
1531 get_pv_entry(pmap_t pmap, struct rwlock **lockp)
1532 {
1533         int bit, field;
1534         pv_entry_t pv;
1535         struct pv_chunk *pc;
1536         vm_page_t m;
1537
1538         rw_assert(&pvh_global_lock, RA_LOCKED);
1539         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1540         PV_STAT(atomic_add_long(&pv_entry_allocs, 1));
1541 retry:
1542         pc = TAILQ_FIRST(&pmap->pm_pvchunk);
1543         if (pc != NULL) {
1544                 for (field = 0; field < _NPCM; field++) {
1545                         if (pc->pc_map[field]) {
1546                                 bit = ffsl(pc->pc_map[field]) - 1;
1547                                 break;
1548                         }
1549                 }
1550                 if (field < _NPCM) {
1551                         pv = &pc->pc_pventry[field * 64 + bit];
1552                         pc->pc_map[field] &= ~(1ul << bit);
1553                         /* If this was the last item, move it to tail */
1554                         if (pc->pc_map[0] == 0 && pc->pc_map[1] == 0 &&
1555                             pc->pc_map[2] == 0) {
1556                                 TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
1557                                 TAILQ_INSERT_TAIL(&pmap->pm_pvchunk, pc,
1558                                     pc_list);
1559                         }
1560                         PV_STAT(atomic_add_long(&pv_entry_count, 1));
1561                         PV_STAT(atomic_subtract_int(&pv_entry_spare, 1));
1562                         return (pv);
1563                 }
1564         }
1565         /* No free items, allocate another chunk */
1566         m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ |
1567             VM_ALLOC_WIRED);
1568         if (m == NULL) {
1569                 if (lockp == NULL) {
1570                         PV_STAT(pc_chunk_tryfail++);
1571                         return (NULL);
1572                 }
1573                 m = reclaim_pv_chunk(pmap, lockp);
1574                 if (m == NULL)
1575                         goto retry;
1576         }
1577         PV_STAT(atomic_add_int(&pc_chunk_count, 1));
1578         PV_STAT(atomic_add_int(&pc_chunk_allocs, 1));
1579 #if 0 /* TODO: This is for minidump */
1580         dump_add_page(m->phys_addr);
1581 #endif
1582         pc = (void *)PHYS_TO_DMAP(m->phys_addr);
1583         pc->pc_pmap = pmap;
1584         pc->pc_map[0] = PC_FREE0 & ~1ul;        /* preallocated bit 0 */
1585         pc->pc_map[1] = PC_FREE1;
1586         pc->pc_map[2] = PC_FREE2;
1587         mtx_lock(&pv_chunks_mutex);
1588         TAILQ_INSERT_TAIL(&pv_chunks, pc, pc_lru);
1589         mtx_unlock(&pv_chunks_mutex);
1590         pv = &pc->pc_pventry[0];
1591         TAILQ_INSERT_HEAD(&pmap->pm_pvchunk, pc, pc_list);
1592         PV_STAT(atomic_add_long(&pv_entry_count, 1));
1593         PV_STAT(atomic_add_int(&pv_entry_spare, _NPCPV - 1));
1594         return (pv);
1595 }
1596
1597 /*
1598  * First find and then remove the pv entry for the specified pmap and virtual
1599  * address from the specified pv list.  Returns the pv entry if found and NULL
1600  * otherwise.  This operation can be performed on pv lists for either 4KB or
1601  * 2MB page mappings.
1602  */
1603 static __inline pv_entry_t
1604 pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
1605 {
1606         pv_entry_t pv;
1607
1608         rw_assert(&pvh_global_lock, RA_LOCKED);
1609         TAILQ_FOREACH(pv, &pvh->pv_list, pv_next) {
1610                 if (pmap == PV_PMAP(pv) && va == pv->pv_va) {
1611                         TAILQ_REMOVE(&pvh->pv_list, pv, pv_next);
1612                         pvh->pv_gen++;
1613                         break;
1614                 }
1615         }
1616         return (pv);
1617 }
1618
1619 /*
1620  * First find and then destroy the pv entry for the specified pmap and virtual
1621  * address.  This operation can be performed on pv lists for either 4KB or 2MB
1622  * page mappings.
1623  */
1624 static void
1625 pmap_pvh_free(struct md_page *pvh, pmap_t pmap, vm_offset_t va)
1626 {
1627         pv_entry_t pv;
1628
1629         pv = pmap_pvh_remove(pvh, pmap, va);
1630
1631         KASSERT(pv != NULL, ("pmap_pvh_free: pv not found"));
1632         free_pv_entry(pmap, pv);
1633 }
1634
1635 /*
1636  * Conditionally create the PV entry for a 4KB page mapping if the required
1637  * memory can be allocated without resorting to reclamation.
1638  */
1639 static boolean_t
1640 pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m,
1641     struct rwlock **lockp)
1642 {
1643         pv_entry_t pv;
1644
1645         rw_assert(&pvh_global_lock, RA_LOCKED);
1646         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1647         /* Pass NULL instead of the lock pointer to disable reclamation. */
1648         if ((pv = get_pv_entry(pmap, NULL)) != NULL) {
1649                 pv->pv_va = va;
1650                 CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m);
1651                 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
1652                 m->md.pv_gen++;
1653                 return (TRUE);
1654         } else
1655                 return (FALSE);
1656 }
1657
1658 /*
1659  * pmap_remove_l3: do the things to unmap a page in a process
1660  */
1661 static int
1662 pmap_remove_l3(pmap_t pmap, pt_entry_t *l3, vm_offset_t va, 
1663     pd_entry_t l2e, struct spglist *free, struct rwlock **lockp)
1664 {
1665         pt_entry_t old_l3;
1666         vm_paddr_t phys;
1667         vm_page_t m;
1668
1669         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
1670         old_l3 = pmap_load_clear(l3);
1671         pmap_invalidate_page(pmap, va);
1672         if (old_l3 & PTE_SW_WIRED)
1673                 pmap->pm_stats.wired_count -= 1;
1674         pmap_resident_count_dec(pmap, 1);
1675         if (old_l3 & PTE_SW_MANAGED) {
1676                 phys = PTE_TO_PHYS(old_l3);
1677                 m = PHYS_TO_VM_PAGE(phys);
1678                 if ((old_l3 & PTE_D) != 0)
1679                         vm_page_dirty(m);
1680                 if (old_l3 & PTE_A)
1681                         vm_page_aflag_set(m, PGA_REFERENCED);
1682                 CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m);
1683                 pmap_pvh_free(&m->md, pmap, va);
1684         }
1685
1686         return (pmap_unuse_l3(pmap, va, l2e, free));
1687 }
1688
1689 /*
1690  *      Remove the given range of addresses from the specified map.
1691  *
1692  *      It is assumed that the start and end are properly
1693  *      rounded to the page size.
1694  */
1695 void
1696 pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
1697 {
1698         struct rwlock *lock;
1699         vm_offset_t va, va_next;
1700         pd_entry_t *l1, *l2;
1701         pt_entry_t l3_pte, *l3;
1702         struct spglist free;
1703
1704         /*
1705          * Perform an unsynchronized read.  This is, however, safe.
1706          */
1707         if (pmap->pm_stats.resident_count == 0)
1708                 return;
1709
1710         SLIST_INIT(&free);
1711
1712         rw_rlock(&pvh_global_lock);
1713         PMAP_LOCK(pmap);
1714
1715         lock = NULL;
1716         for (; sva < eva; sva = va_next) {
1717                 if (pmap->pm_stats.resident_count == 0)
1718                         break;
1719
1720                 l1 = pmap_l1(pmap, sva);
1721                 if (pmap_load(l1) == 0) {
1722                         va_next = (sva + L1_SIZE) & ~L1_OFFSET;
1723                         if (va_next < sva)
1724                                 va_next = eva;
1725                         continue;
1726                 }
1727
1728                 /*
1729                  * Calculate index for next page table.
1730                  */
1731                 va_next = (sva + L2_SIZE) & ~L2_OFFSET;
1732                 if (va_next < sva)
1733                         va_next = eva;
1734
1735                 l2 = pmap_l1_to_l2(l1, sva);
1736                 if (l2 == NULL)
1737                         continue;
1738
1739                 l3_pte = pmap_load(l2);
1740
1741                 /*
1742                  * Weed out invalid mappings.
1743                  */
1744                 if (l3_pte == 0)
1745                         continue;
1746                 if ((pmap_load(l2) & PTE_RX) != 0)
1747                         continue;
1748
1749                 /*
1750                  * Limit our scan to either the end of the va represented
1751                  * by the current page table page, or to the end of the
1752                  * range being removed.
1753                  */
1754                 if (va_next > eva)
1755                         va_next = eva;
1756
1757                 va = va_next;
1758                 for (l3 = pmap_l2_to_l3(l2, sva); sva != va_next; l3++,
1759                     sva += L3_SIZE) {
1760                         if (l3 == NULL)
1761                                 panic("l3 == NULL");
1762                         if (pmap_load(l3) == 0) {
1763                                 if (va != va_next) {
1764                                         pmap_invalidate_range(pmap, va, sva);
1765                                         va = va_next;
1766                                 }
1767                                 continue;
1768                         }
1769                         if (va == va_next)
1770                                 va = sva;
1771                         if (pmap_remove_l3(pmap, l3, sva, l3_pte, &free,
1772                             &lock)) {
1773                                 sva += L3_SIZE;
1774                                 break;
1775                         }
1776                 }
1777                 if (va != va_next)
1778                         pmap_invalidate_range(pmap, va, sva);
1779         }
1780         if (lock != NULL)
1781                 rw_wunlock(lock);
1782         rw_runlock(&pvh_global_lock);   
1783         PMAP_UNLOCK(pmap);
1784         vm_page_free_pages_toq(&free, false);
1785 }
1786
1787 /*
1788  *      Routine:        pmap_remove_all
1789  *      Function:
1790  *              Removes this physical page from
1791  *              all physical maps in which it resides.
1792  *              Reflects back modify bits to the pager.
1793  *
1794  *      Notes:
1795  *              Original versions of this routine were very
1796  *              inefficient because they iteratively called
1797  *              pmap_remove (slow...)
1798  */
1799
1800 void
1801 pmap_remove_all(vm_page_t m)
1802 {
1803         pv_entry_t pv;
1804         pmap_t pmap;
1805         pt_entry_t *l3, tl3;
1806         pd_entry_t *l2, tl2;
1807         struct spglist free;
1808
1809         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
1810             ("pmap_remove_all: page %p is not managed", m));
1811         SLIST_INIT(&free);
1812         rw_wlock(&pvh_global_lock);
1813         while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
1814                 pmap = PV_PMAP(pv);
1815                 PMAP_LOCK(pmap);
1816                 pmap_resident_count_dec(pmap, 1);
1817                 l2 = pmap_l2(pmap, pv->pv_va);
1818                 KASSERT(l2 != NULL, ("pmap_remove_all: no l2 table found"));
1819                 tl2 = pmap_load(l2);
1820
1821                 KASSERT((tl2 & PTE_RX) == 0,
1822                     ("pmap_remove_all: found a table when expecting "
1823                     "a block in %p's pv list", m));
1824
1825                 l3 = pmap_l2_to_l3(l2, pv->pv_va);
1826                 tl3 = pmap_load_clear(l3);
1827                 pmap_invalidate_page(pmap, pv->pv_va);
1828                 if (tl3 & PTE_SW_WIRED)
1829                         pmap->pm_stats.wired_count--;
1830                 if ((tl3 & PTE_A) != 0)
1831                         vm_page_aflag_set(m, PGA_REFERENCED);
1832
1833                 /*
1834                  * Update the vm_page_t clean and reference bits.
1835                  */
1836                 if ((tl3 & PTE_D) != 0)
1837                         vm_page_dirty(m);
1838                 pmap_unuse_l3(pmap, pv->pv_va, pmap_load(l2), &free);
1839                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
1840                 m->md.pv_gen++;
1841                 free_pv_entry(pmap, pv);
1842                 PMAP_UNLOCK(pmap);
1843         }
1844         vm_page_aflag_clear(m, PGA_WRITEABLE);
1845         rw_wunlock(&pvh_global_lock);
1846         vm_page_free_pages_toq(&free, false);
1847 }
1848
1849 /*
1850  *      Set the physical protection on the
1851  *      specified range of this map as requested.
1852  */
1853 void
1854 pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
1855 {
1856         vm_offset_t va_next;
1857         pd_entry_t *l1, *l2;
1858         pt_entry_t *l3p, l3;
1859         pt_entry_t entry;
1860
1861         if ((prot & VM_PROT_READ) == VM_PROT_NONE) {
1862                 pmap_remove(pmap, sva, eva);
1863                 return;
1864         }
1865
1866         if ((prot & VM_PROT_WRITE) == VM_PROT_WRITE)
1867                 return;
1868
1869         PMAP_LOCK(pmap);
1870         for (; sva < eva; sva = va_next) {
1871
1872                 l1 = pmap_l1(pmap, sva);
1873                 if (pmap_load(l1) == 0) {
1874                         va_next = (sva + L1_SIZE) & ~L1_OFFSET;
1875                         if (va_next < sva)
1876                                 va_next = eva;
1877                         continue;
1878                 }
1879
1880                 va_next = (sva + L2_SIZE) & ~L2_OFFSET;
1881                 if (va_next < sva)
1882                         va_next = eva;
1883
1884                 l2 = pmap_l1_to_l2(l1, sva);
1885                 if (l2 == NULL)
1886                         continue;
1887                 if (pmap_load(l2) == 0)
1888                         continue;
1889                 if ((pmap_load(l2) & PTE_RX) != 0)
1890                         continue;
1891
1892                 if (va_next > eva)
1893                         va_next = eva;
1894
1895                 for (l3p = pmap_l2_to_l3(l2, sva); sva != va_next; l3p++,
1896                     sva += L3_SIZE) {
1897                         l3 = pmap_load(l3p);
1898                         if ((l3 & PTE_V) != 0) {
1899                                 entry = pmap_load(l3p);
1900                                 entry &= ~PTE_W;
1901                                 pmap_store(l3p, entry);
1902                                 /* XXX: Use pmap_invalidate_range */
1903                                 pmap_invalidate_page(pmap, sva);
1904                         }
1905                 }
1906         }
1907         PMAP_UNLOCK(pmap);
1908 }
1909
1910 int
1911 pmap_fault_fixup(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
1912 {
1913         pt_entry_t orig_l3;
1914         pt_entry_t new_l3;
1915         pt_entry_t *l3;
1916         int rv;
1917
1918         rv = 0;
1919
1920         PMAP_LOCK(pmap);
1921
1922         l3 = pmap_l3(pmap, va);
1923         if (l3 == NULL)
1924                 goto done;
1925
1926         orig_l3 = pmap_load(l3);
1927         if ((orig_l3 & PTE_V) == 0 ||
1928             ((prot & VM_PROT_WRITE) != 0 && (orig_l3 & PTE_W) == 0) ||
1929             ((prot & VM_PROT_READ) != 0 && (orig_l3 & PTE_R) == 0))
1930                 goto done;
1931
1932         new_l3 = orig_l3 | PTE_A;
1933         if ((prot & VM_PROT_WRITE) != 0)
1934                 new_l3 |= PTE_D;
1935
1936         if (orig_l3 != new_l3) {
1937                 pmap_store(l3, new_l3);
1938                 pmap_invalidate_page(pmap, va);
1939                 rv = 1;
1940                 goto done;
1941         }
1942
1943         /*      
1944          * XXX: This case should never happen since it means
1945          * the PTE shouldn't have resulted in a fault.
1946          */
1947
1948 done:
1949         PMAP_UNLOCK(pmap);
1950
1951         return (rv);
1952 }
1953
1954 /*
1955  *      Insert the given physical page (p) at
1956  *      the specified virtual address (v) in the
1957  *      target physical map with the protection requested.
1958  *
1959  *      If specified, the page will be wired down, meaning
1960  *      that the related pte can not be reclaimed.
1961  *
1962  *      NB:  This is the only routine which MAY NOT lazy-evaluate
1963  *      or lose information.  That is, this routine must actually
1964  *      insert this page into the given map NOW.
1965  */
1966 int
1967 pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
1968     u_int flags, int8_t psind __unused)
1969 {
1970         struct rwlock *lock;
1971         pd_entry_t *l1, *l2;
1972         pt_entry_t new_l3, orig_l3;
1973         pt_entry_t *l3;
1974         pv_entry_t pv;
1975         vm_paddr_t opa, pa, l2_pa, l3_pa;
1976         vm_page_t mpte, om, l2_m, l3_m;
1977         boolean_t nosleep;
1978         pt_entry_t entry;
1979         pn_t l2_pn;
1980         pn_t l3_pn;
1981         pn_t pn;
1982
1983         va = trunc_page(va);
1984         if ((m->oflags & VPO_UNMANAGED) == 0 && !vm_page_xbusied(m))
1985                 VM_OBJECT_ASSERT_LOCKED(m->object);
1986         pa = VM_PAGE_TO_PHYS(m);
1987         pn = (pa / PAGE_SIZE);
1988
1989         new_l3 = PTE_V | PTE_R | PTE_X;
1990         if (prot & VM_PROT_WRITE)
1991                 new_l3 |= PTE_W;
1992         if ((va >> 63) == 0)
1993                 new_l3 |= PTE_U;
1994         else
1995                 new_l3 |= PTE_A | PTE_D;
1996
1997         new_l3 |= (pn << PTE_PPN0_S);
1998         if ((flags & PMAP_ENTER_WIRED) != 0)
1999                 new_l3 |= PTE_SW_WIRED;
2000         if ((m->oflags & VPO_UNMANAGED) == 0)
2001                 new_l3 |= PTE_SW_MANAGED;
2002
2003         CTR2(KTR_PMAP, "pmap_enter: %.16lx -> %.16lx", va, pa);
2004
2005         mpte = NULL;
2006
2007         lock = NULL;
2008         rw_rlock(&pvh_global_lock);
2009         PMAP_LOCK(pmap);
2010
2011         if (va < VM_MAXUSER_ADDRESS) {
2012                 nosleep = (flags & PMAP_ENTER_NOSLEEP) != 0;
2013                 mpte = pmap_alloc_l3(pmap, va, nosleep ? NULL : &lock);
2014                 if (mpte == NULL && nosleep) {
2015                         CTR0(KTR_PMAP, "pmap_enter: mpte == NULL");
2016                         if (lock != NULL)
2017                                 rw_wunlock(lock);
2018                         rw_runlock(&pvh_global_lock);
2019                         PMAP_UNLOCK(pmap);
2020                         return (KERN_RESOURCE_SHORTAGE);
2021                 }
2022                 l3 = pmap_l3(pmap, va);
2023         } else {
2024                 l3 = pmap_l3(pmap, va);
2025                 /* TODO: This is not optimal, but should mostly work */
2026                 if (l3 == NULL) {
2027                         l2 = pmap_l2(pmap, va);
2028                         if (l2 == NULL) {
2029                                 l2_m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL |
2030                                     VM_ALLOC_NOOBJ | VM_ALLOC_WIRED |
2031                                     VM_ALLOC_ZERO);
2032                                 if (l2_m == NULL)
2033                                         panic("pmap_enter: l2 pte_m == NULL");
2034                                 if ((l2_m->flags & PG_ZERO) == 0)
2035                                         pmap_zero_page(l2_m);
2036
2037                                 l2_pa = VM_PAGE_TO_PHYS(l2_m);
2038                                 l2_pn = (l2_pa / PAGE_SIZE);
2039
2040                                 l1 = pmap_l1(pmap, va);
2041                                 entry = (PTE_V);
2042                                 entry |= (l2_pn << PTE_PPN0_S);
2043                                 pmap_store(l1, entry);
2044                                 pmap_distribute_l1(pmap, pmap_l1_index(va), entry);
2045                                 l2 = pmap_l1_to_l2(l1, va);
2046                         }
2047
2048                         KASSERT(l2 != NULL,
2049                             ("No l2 table after allocating one"));
2050
2051                         l3_m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL |
2052                             VM_ALLOC_NOOBJ | VM_ALLOC_WIRED | VM_ALLOC_ZERO);
2053                         if (l3_m == NULL)
2054                                 panic("pmap_enter: l3 pte_m == NULL");
2055                         if ((l3_m->flags & PG_ZERO) == 0)
2056                                 pmap_zero_page(l3_m);
2057
2058                         l3_pa = VM_PAGE_TO_PHYS(l3_m);
2059                         l3_pn = (l3_pa / PAGE_SIZE);
2060                         entry = (PTE_V);
2061                         entry |= (l3_pn << PTE_PPN0_S);
2062                         pmap_store(l2, entry);
2063                         l3 = pmap_l2_to_l3(l2, va);
2064                 }
2065                 pmap_invalidate_page(pmap, va);
2066         }
2067
2068         orig_l3 = pmap_load(l3);
2069         opa = PTE_TO_PHYS(orig_l3);
2070         pv = NULL;
2071
2072         /*
2073          * Is the specified virtual address already mapped?
2074          */
2075         if ((orig_l3 & PTE_V) != 0) {
2076                 /*
2077                  * Wiring change, just update stats. We don't worry about
2078                  * wiring PT pages as they remain resident as long as there
2079                  * are valid mappings in them. Hence, if a user page is wired,
2080                  * the PT page will be also.
2081                  */
2082                 if ((flags & PMAP_ENTER_WIRED) != 0 &&
2083                     (orig_l3 & PTE_SW_WIRED) == 0)
2084                         pmap->pm_stats.wired_count++;
2085                 else if ((flags & PMAP_ENTER_WIRED) == 0 &&
2086                     (orig_l3 & PTE_SW_WIRED) != 0)
2087                         pmap->pm_stats.wired_count--;
2088
2089                 /*
2090                  * Remove the extra PT page reference.
2091                  */
2092                 if (mpte != NULL) {
2093                         mpte->wire_count--;
2094                         KASSERT(mpte->wire_count > 0,
2095                             ("pmap_enter: missing reference to page table page,"
2096                              " va: 0x%lx", va));
2097                 }
2098
2099                 /*
2100                  * Has the physical page changed?
2101                  */
2102                 if (opa == pa) {
2103                         /*
2104                          * No, might be a protection or wiring change.
2105                          */
2106                         if ((orig_l3 & PTE_SW_MANAGED) != 0 &&
2107                             (new_l3 & PTE_W) != 0)
2108                                 vm_page_aflag_set(m, PGA_WRITEABLE);
2109                         goto validate;
2110                 }
2111
2112                 /*
2113                  * The physical page has changed.  Temporarily invalidate
2114                  * the mapping.  This ensures that all threads sharing the
2115                  * pmap keep a consistent view of the mapping, which is
2116                  * necessary for the correct handling of COW faults.  It
2117                  * also permits reuse of the old mapping's PV entry,
2118                  * avoiding an allocation.
2119                  *
2120                  * For consistency, handle unmanaged mappings the same way.
2121                  */
2122                 orig_l3 = pmap_load_clear(l3);
2123                 KASSERT(PTE_TO_PHYS(orig_l3) == opa,
2124                     ("pmap_enter: unexpected pa update for %#lx", va));
2125                 if ((orig_l3 & PTE_SW_MANAGED) != 0) {
2126                         om = PHYS_TO_VM_PAGE(opa);
2127
2128                         /*
2129                          * The pmap lock is sufficient to synchronize with
2130                          * concurrent calls to pmap_page_test_mappings() and
2131                          * pmap_ts_referenced().
2132                          */
2133                         if ((orig_l3 & PTE_D) != 0)
2134                                 vm_page_dirty(om);
2135                         if ((orig_l3 & PTE_A) != 0)
2136                                 vm_page_aflag_set(om, PGA_REFERENCED);
2137                         CHANGE_PV_LIST_LOCK_TO_PHYS(&lock, opa);
2138                         pv = pmap_pvh_remove(&om->md, pmap, va);
2139                         if ((new_l3 & PTE_SW_MANAGED) == 0)
2140                                 free_pv_entry(pmap, pv);
2141                         if ((om->aflags & PGA_WRITEABLE) != 0 &&
2142                             TAILQ_EMPTY(&om->md.pv_list))
2143                                 vm_page_aflag_clear(om, PGA_WRITEABLE);
2144                 }
2145                 pmap_invalidate_page(pmap, va);
2146                 orig_l3 = 0;
2147         } else {
2148                 /*
2149                  * Increment the counters.
2150                  */
2151                 if ((new_l3 & PTE_SW_WIRED) != 0)
2152                         pmap->pm_stats.wired_count++;
2153                 pmap_resident_count_inc(pmap, 1);
2154         }
2155         /*
2156          * Enter on the PV list if part of our managed memory.
2157          */
2158         if ((new_l3 & PTE_SW_MANAGED) != 0) {
2159                 if (pv == NULL) {
2160                         pv = get_pv_entry(pmap, &lock);
2161                         pv->pv_va = va;
2162                 }
2163                 CHANGE_PV_LIST_LOCK_TO_PHYS(&lock, pa);
2164                 TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
2165                 m->md.pv_gen++;
2166                 if ((new_l3 & PTE_W) != 0)
2167                         vm_page_aflag_set(m, PGA_WRITEABLE);
2168         }
2169
2170 validate:
2171         /*
2172          * Sync the i-cache on all harts before updating the PTE
2173          * if the new PTE is executable.
2174          */
2175         if (prot & VM_PROT_EXECUTE)
2176                 pmap_sync_icache(pmap, va, PAGE_SIZE);
2177
2178         /*
2179          * Update the L3 entry.
2180          */
2181         if (orig_l3 != 0) {
2182                 orig_l3 = pmap_load_store(l3, new_l3);
2183                 pmap_invalidate_page(pmap, va);
2184                 KASSERT(PTE_TO_PHYS(orig_l3) == pa,
2185                     ("pmap_enter: invalid update"));
2186                 if ((orig_l3 & (PTE_D | PTE_SW_MANAGED)) ==
2187                     (PTE_D | PTE_SW_MANAGED))
2188                         vm_page_dirty(m);
2189         } else {
2190                 pmap_store(l3, new_l3);
2191         }
2192
2193         if (lock != NULL)
2194                 rw_wunlock(lock);
2195         rw_runlock(&pvh_global_lock);
2196         PMAP_UNLOCK(pmap);
2197         return (KERN_SUCCESS);
2198 }
2199
2200 /*
2201  * Maps a sequence of resident pages belonging to the same object.
2202  * The sequence begins with the given page m_start.  This page is
2203  * mapped at the given virtual address start.  Each subsequent page is
2204  * mapped at a virtual address that is offset from start by the same
2205  * amount as the page is offset from m_start within the object.  The
2206  * last page in the sequence is the page with the largest offset from
2207  * m_start that can be mapped at a virtual address less than the given
2208  * virtual address end.  Not every virtual page between start and end
2209  * is mapped; only those for which a resident page exists with the
2210  * corresponding offset from m_start are mapped.
2211  */
2212 void
2213 pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end,
2214     vm_page_t m_start, vm_prot_t prot)
2215 {
2216         struct rwlock *lock;
2217         vm_offset_t va;
2218         vm_page_t m, mpte;
2219         vm_pindex_t diff, psize;
2220
2221         VM_OBJECT_ASSERT_LOCKED(m_start->object);
2222
2223         psize = atop(end - start);
2224         mpte = NULL;
2225         m = m_start;
2226         lock = NULL;
2227         rw_rlock(&pvh_global_lock);
2228         PMAP_LOCK(pmap);
2229         while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) {
2230                 va = start + ptoa(diff);
2231                 mpte = pmap_enter_quick_locked(pmap, va, m, prot, mpte, &lock);
2232                 m = TAILQ_NEXT(m, listq);
2233         }
2234         if (lock != NULL)
2235                 rw_wunlock(lock);
2236         rw_runlock(&pvh_global_lock);
2237         PMAP_UNLOCK(pmap);
2238 }
2239
2240 /*
2241  * this code makes some *MAJOR* assumptions:
2242  * 1. Current pmap & pmap exists.
2243  * 2. Not wired.
2244  * 3. Read access.
2245  * 4. No page table pages.
2246  * but is *MUCH* faster than pmap_enter...
2247  */
2248
2249 void
2250 pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot)
2251 {
2252         struct rwlock *lock;
2253
2254         lock = NULL;
2255         rw_rlock(&pvh_global_lock);
2256         PMAP_LOCK(pmap);
2257         (void)pmap_enter_quick_locked(pmap, va, m, prot, NULL, &lock);
2258         if (lock != NULL)
2259                 rw_wunlock(lock);
2260         rw_runlock(&pvh_global_lock);
2261         PMAP_UNLOCK(pmap);
2262 }
2263
2264 static vm_page_t
2265 pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m,
2266     vm_prot_t prot, vm_page_t mpte, struct rwlock **lockp)
2267 {
2268         struct spglist free;
2269         vm_paddr_t phys;
2270         pd_entry_t *l2;
2271         pt_entry_t *l3, newl3;
2272
2273         KASSERT(va < kmi.clean_sva || va >= kmi.clean_eva ||
2274             (m->oflags & VPO_UNMANAGED) != 0,
2275             ("pmap_enter_quick_locked: managed mapping within the clean submap"));
2276         rw_assert(&pvh_global_lock, RA_LOCKED);
2277         PMAP_LOCK_ASSERT(pmap, MA_OWNED);
2278
2279         CTR2(KTR_PMAP, "pmap_enter_quick_locked: %p %lx", pmap, va);
2280         /*
2281          * In the case that a page table page is not
2282          * resident, we are creating it here.
2283          */
2284         if (va < VM_MAXUSER_ADDRESS) {
2285                 vm_pindex_t l2pindex;
2286
2287                 /*
2288                  * Calculate pagetable page index
2289                  */
2290                 l2pindex = pmap_l2_pindex(va);
2291                 if (mpte && (mpte->pindex == l2pindex)) {
2292                         mpte->wire_count++;
2293                 } else {
2294                         /*
2295                          * Get the l2 entry
2296                          */
2297                         l2 = pmap_l2(pmap, va);
2298
2299                         /*
2300                          * If the page table page is mapped, we just increment
2301                          * the hold count, and activate it.  Otherwise, we
2302                          * attempt to allocate a page table page.  If this
2303                          * attempt fails, we don't retry.  Instead, we give up.
2304                          */
2305                         if (l2 != NULL && pmap_load(l2) != 0) {
2306                                 phys = PTE_TO_PHYS(pmap_load(l2));
2307                                 mpte = PHYS_TO_VM_PAGE(phys);
2308                                 mpte->wire_count++;
2309                         } else {
2310                                 /*
2311                                  * Pass NULL instead of the PV list lock
2312                                  * pointer, because we don't intend to sleep.
2313                                  */
2314                                 mpte = _pmap_alloc_l3(pmap, l2pindex, NULL);
2315                                 if (mpte == NULL)
2316                                         return (mpte);
2317                         }
2318                 }
2319                 l3 = (pt_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mpte));
2320                 l3 = &l3[pmap_l3_index(va)];
2321         } else {
2322                 mpte = NULL;
2323                 l3 = pmap_l3(kernel_pmap, va);
2324         }
2325         if (l3 == NULL)
2326                 panic("pmap_enter_quick_locked: No l3");
2327         if (pmap_load(l3) != 0) {
2328                 if (mpte != NULL) {
2329                         mpte->wire_count--;
2330                         mpte = NULL;
2331                 }
2332                 return (mpte);
2333         }
2334
2335         /*
2336          * Enter on the PV list if part of our managed memory.
2337          */
2338         if ((m->oflags & VPO_UNMANAGED) == 0 &&
2339             !pmap_try_insert_pv_entry(pmap, va, m, lockp)) {
2340                 if (mpte != NULL) {
2341                         SLIST_INIT(&free);
2342                         if (pmap_unwire_l3(pmap, va, mpte, &free)) {
2343                                 pmap_invalidate_page(pmap, va);
2344                                 vm_page_free_pages_toq(&free, false);
2345                         }
2346                         mpte = NULL;
2347                 }
2348                 return (mpte);
2349         }
2350
2351         /*
2352          * Increment counters
2353          */
2354         pmap_resident_count_inc(pmap, 1);
2355
2356         pa = VM_PAGE_TO_PHYS(m);
2357         pn = (pa / PAGE_SIZE);
2358
2359         entry = (PTE_V | PTE_R | PTE_X);
2360         entry |= (pn << PTE_PPN0_S);
2361
2362         /*
2363          * Now validate mapping with RO protection
2364          */
2365         if ((m->oflags & VPO_UNMANAGED) == 0)
2366                 entry |= PTE_SW_MANAGED;
2367
2368         /*
2369          * Sync the i-cache on all harts before updating the PTE
2370          * if the new PTE is executable.
2371          */
2372         if (prot & VM_PROT_EXECUTE)
2373                 pmap_sync_icache(pmap, va, PAGE_SIZE);
2374
2375         pmap_store(l3, entry);
2376
2377         pmap_invalidate_page(pmap, va);
2378         return (mpte);
2379 }
2380
2381 /*
2382  * This code maps large physical mmap regions into the
2383  * processor address space.  Note that some shortcuts
2384  * are taken, but the code works.
2385  */
2386 void
2387 pmap_object_init_pt(pmap_t pmap, vm_offset_t addr, vm_object_t object,
2388     vm_pindex_t pindex, vm_size_t size)
2389 {
2390
2391         VM_OBJECT_ASSERT_WLOCKED(object);
2392         KASSERT(object->type == OBJT_DEVICE || object->type == OBJT_SG,
2393             ("pmap_object_init_pt: non-device object"));
2394 }
2395
2396 /*
2397  *      Clear the wired attribute from the mappings for the specified range of
2398  *      addresses in the given pmap.  Every valid mapping within that range
2399  *      must have the wired attribute set.  In contrast, invalid mappings
2400  *      cannot have the wired attribute set, so they are ignored.
2401  *
2402  *      The wired attribute of the page table entry is not a hardware feature,
2403  *      so there is no need to invalidate any TLB entries.
2404  */
2405 void
2406 pmap_unwire(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
2407 {
2408         vm_offset_t va_next;
2409         pd_entry_t *l1, *l2;
2410         pt_entry_t *l3;
2411         boolean_t pv_lists_locked;
2412
2413         pv_lists_locked = FALSE;
2414         PMAP_LOCK(pmap);
2415         for (; sva < eva; sva = va_next) {
2416                 l1 = pmap_l1(pmap, sva);
2417                 if (pmap_load(l1) == 0) {
2418                         va_next = (sva + L1_SIZE) & ~L1_OFFSET;
2419                         if (va_next < sva)
2420                                 va_next = eva;
2421                         continue;
2422                 }
2423
2424                 va_next = (sva + L2_SIZE) & ~L2_OFFSET;
2425                 if (va_next < sva)
2426                         va_next = eva;
2427
2428                 l2 = pmap_l1_to_l2(l1, sva);
2429                 if (pmap_load(l2) == 0)
2430                         continue;
2431
2432                 if (va_next > eva)
2433                         va_next = eva;
2434                 for (l3 = pmap_l2_to_l3(l2, sva); sva != va_next; l3++,
2435                     sva += L3_SIZE) {
2436                         if (pmap_load(l3) == 0)
2437                                 continue;
2438                         if ((pmap_load(l3) & PTE_SW_WIRED) == 0)
2439                                 panic("pmap_unwire: l3 %#jx is missing "
2440                                     "PTE_SW_WIRED", (uintmax_t)*l3);
2441
2442                         /*
2443                          * PG_W must be cleared atomically.  Although the pmap
2444                          * lock synchronizes access to PG_W, another processor
2445                          * could be setting PG_M and/or PG_A concurrently.
2446                          */
2447                         atomic_clear_long(l3, PTE_SW_WIRED);
2448                         pmap->pm_stats.wired_count--;
2449                 }
2450         }
2451         if (pv_lists_locked)
2452                 rw_runlock(&pvh_global_lock);
2453         PMAP_UNLOCK(pmap);
2454 }
2455
2456 /*
2457  *      Copy the range specified by src_addr/len
2458  *      from the source map to the range dst_addr/len
2459  *      in the destination map.
2460  *
2461  *      This routine is only advisory and need not do anything.
2462  */
2463
2464 void
2465 pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
2466     vm_offset_t src_addr)
2467 {
2468
2469 }
2470
2471 /*
2472  *      pmap_zero_page zeros the specified hardware page by mapping
2473  *      the page into KVM and using bzero to clear its contents.
2474  */
2475 void
2476 pmap_zero_page(vm_page_t m)
2477 {
2478         vm_offset_t va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
2479
2480         pagezero((void *)va);
2481 }
2482
2483 /*
2484  *      pmap_zero_page_area zeros the specified hardware page by mapping 
2485  *      the page into KVM and using bzero to clear its contents.
2486  *
2487  *      off and size may not cover an area beyond a single hardware page.
2488  */
2489 void
2490 pmap_zero_page_area(vm_page_t m, int off, int size)
2491 {
2492         vm_offset_t va = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m));
2493
2494         if (off == 0 && size == PAGE_SIZE)
2495                 pagezero((void *)va);
2496         else
2497                 bzero((char *)va + off, size);
2498 }
2499
2500 /*
2501  *      pmap_copy_page copies the specified (machine independent)
2502  *      page by mapping the page into virtual memory and using
2503  *      bcopy to copy the page, one machine dependent page at a
2504  *      time.
2505  */
2506 void
2507 pmap_copy_page(vm_page_t msrc, vm_page_t mdst)
2508 {
2509         vm_offset_t src = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(msrc));
2510         vm_offset_t dst = PHYS_TO_DMAP(VM_PAGE_TO_PHYS(mdst));
2511
2512         pagecopy((void *)src, (void *)dst);
2513 }
2514
2515 int unmapped_buf_allowed = 1;
2516
2517 void
2518 pmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[],
2519     vm_offset_t b_offset, int xfersize)
2520 {
2521         void *a_cp, *b_cp;
2522         vm_page_t m_a, m_b;
2523         vm_paddr_t p_a, p_b;
2524         vm_offset_t a_pg_offset, b_pg_offset;
2525         int cnt;
2526
2527         while (xfersize > 0) {
2528                 a_pg_offset = a_offset & PAGE_MASK;
2529                 m_a = ma[a_offset >> PAGE_SHIFT];
2530                 p_a = m_a->phys_addr;
2531                 b_pg_offset = b_offset & PAGE_MASK;
2532                 m_b = mb[b_offset >> PAGE_SHIFT];
2533                 p_b = m_b->phys_addr;
2534                 cnt = min(xfersize, PAGE_SIZE - a_pg_offset);
2535                 cnt = min(cnt, PAGE_SIZE - b_pg_offset);
2536                 if (__predict_false(!PHYS_IN_DMAP(p_a))) {
2537                         panic("!DMAP a %lx", p_a);
2538                 } else {
2539                         a_cp = (char *)PHYS_TO_DMAP(p_a) + a_pg_offset;
2540                 }
2541                 if (__predict_false(!PHYS_IN_DMAP(p_b))) {
2542                         panic("!DMAP b %lx", p_b);
2543                 } else {
2544                         b_cp = (char *)PHYS_TO_DMAP(p_b) + b_pg_offset;
2545                 }
2546                 bcopy(a_cp, b_cp, cnt);
2547                 a_offset += cnt;
2548                 b_offset += cnt;
2549                 xfersize -= cnt;
2550         }
2551 }
2552
2553 vm_offset_t
2554 pmap_quick_enter_page(vm_page_t m)
2555 {
2556
2557         return (PHYS_TO_DMAP(VM_PAGE_TO_PHYS(m)));
2558 }
2559
2560 void
2561 pmap_quick_remove_page(vm_offset_t addr)
2562 {
2563 }
2564
2565 /*
2566  * Returns true if the pmap's pv is one of the first
2567  * 16 pvs linked to from this page.  This count may
2568  * be changed upwards or downwards in the future; it
2569  * is only necessary that true be returned for a small
2570  * subset of pmaps for proper page aging.
2571  */
2572 boolean_t
2573 pmap_page_exists_quick(pmap_t pmap, vm_page_t m)
2574 {
2575         struct rwlock *lock;
2576         pv_entry_t pv;
2577         int loops = 0;
2578         boolean_t rv;
2579
2580         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
2581             ("pmap_page_exists_quick: page %p is not managed", m));
2582         rv = FALSE;
2583         rw_rlock(&pvh_global_lock);
2584         lock = VM_PAGE_TO_PV_LIST_LOCK(m);
2585         rw_rlock(lock);
2586         TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
2587                 if (PV_PMAP(pv) == pmap) {
2588                         rv = TRUE;
2589                         break;
2590                 }
2591                 loops++;
2592                 if (loops >= 16)
2593                         break;
2594         }
2595         rw_runlock(lock);
2596         rw_runlock(&pvh_global_lock);
2597         return (rv);
2598 }
2599
2600 /*
2601  *      pmap_page_wired_mappings:
2602  *
2603  *      Return the number of managed mappings to the given physical page
2604  *      that are wired.
2605  */
2606 int
2607 pmap_page_wired_mappings(vm_page_t m)
2608 {
2609         struct rwlock *lock;
2610         pmap_t pmap;
2611         pt_entry_t *l3;
2612         pv_entry_t pv;
2613         int count, md_gen;
2614
2615         if ((m->oflags & VPO_UNMANAGED) != 0)
2616                 return (0);
2617         rw_rlock(&pvh_global_lock);
2618         lock = VM_PAGE_TO_PV_LIST_LOCK(m);
2619         rw_rlock(lock);
2620 restart:
2621         count = 0;
2622         TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
2623                 pmap = PV_PMAP(pv);
2624                 if (!PMAP_TRYLOCK(pmap)) {
2625                         md_gen = m->md.pv_gen;
2626                         rw_runlock(lock);
2627                         PMAP_LOCK(pmap);
2628                         rw_rlock(lock);
2629                         if (md_gen != m->md.pv_gen) {
2630                                 PMAP_UNLOCK(pmap);
2631                                 goto restart;
2632                         }
2633                 }
2634                 l3 = pmap_l3(pmap, pv->pv_va);
2635                 if (l3 != NULL && (pmap_load(l3) & PTE_SW_WIRED) != 0)
2636                         count++;
2637                 PMAP_UNLOCK(pmap);
2638         }
2639         rw_runlock(lock);
2640         rw_runlock(&pvh_global_lock);
2641         return (count);
2642 }
2643
2644 /*
2645  * Destroy all managed, non-wired mappings in the given user-space
2646  * pmap.  This pmap cannot be active on any processor besides the
2647  * caller.
2648  *
2649  * This function cannot be applied to the kernel pmap.  Moreover, it
2650  * is not intended for general use.  It is only to be used during
2651  * process termination.  Consequently, it can be implemented in ways
2652  * that make it faster than pmap_remove().  First, it can more quickly
2653  * destroy mappings by iterating over the pmap's collection of PV
2654  * entries, rather than searching the page table.  Second, it doesn't
2655  * have to test and clear the page table entries atomically, because
2656  * no processor is currently accessing the user address space.  In
2657  * particular, a page table entry's dirty bit won't change state once
2658  * this function starts.
2659  */
2660 void
2661 pmap_remove_pages(pmap_t pmap)
2662 {
2663         pd_entry_t ptepde, *l2;
2664         pt_entry_t *l3, tl3;
2665         struct spglist free;
2666         vm_page_t m;
2667         pv_entry_t pv;
2668         struct pv_chunk *pc, *npc;
2669         struct rwlock *lock;
2670         int64_t bit;
2671         uint64_t inuse, bitmask;
2672         int allfree, field, freed, idx;
2673         vm_paddr_t pa;
2674
2675         lock = NULL;
2676
2677         SLIST_INIT(&free);
2678         rw_rlock(&pvh_global_lock);
2679         PMAP_LOCK(pmap);
2680         TAILQ_FOREACH_SAFE(pc, &pmap->pm_pvchunk, pc_list, npc) {
2681                 allfree = 1;
2682                 freed = 0;
2683                 for (field = 0; field < _NPCM; field++) {
2684                         inuse = ~pc->pc_map[field] & pc_freemask[field];
2685                         while (inuse != 0) {
2686                                 bit = ffsl(inuse) - 1;
2687                                 bitmask = 1UL << bit;
2688                                 idx = field * 64 + bit;
2689                                 pv = &pc->pc_pventry[idx];
2690                                 inuse &= ~bitmask;
2691
2692                                 l2 = pmap_l2(pmap, pv->pv_va);
2693                                 ptepde = pmap_load(l2);
2694                                 l3 = pmap_l2_to_l3(l2, pv->pv_va);
2695                                 tl3 = pmap_load(l3);
2696
2697                                 /*
2698                                  * We cannot remove wired pages from a
2699                                  * process' mapping at this time.
2700                                  */
2701                                 if (tl3 & PTE_SW_WIRED) {
2702                                         allfree = 0;
2703                                         continue;
2704                                 }
2705
2706                                 pa = PTE_TO_PHYS(tl3);
2707                                 m = PHYS_TO_VM_PAGE(pa);
2708                                 KASSERT(m->phys_addr == pa,
2709                                     ("vm_page_t %p phys_addr mismatch %016jx %016jx",
2710                                     m, (uintmax_t)m->phys_addr,
2711                                     (uintmax_t)tl3));
2712
2713                                 KASSERT((m->flags & PG_FICTITIOUS) != 0 ||
2714                                     m < &vm_page_array[vm_page_array_size],
2715                                     ("pmap_remove_pages: bad l3 %#jx",
2716                                     (uintmax_t)tl3));
2717
2718                                 pmap_clear(l3);
2719
2720                                 /*
2721                                  * Update the vm_page_t clean/reference bits.
2722                                  */
2723                                 if ((tl3 & PTE_D) != 0)
2724                                         vm_page_dirty(m);
2725
2726                                 CHANGE_PV_LIST_LOCK_TO_VM_PAGE(&lock, m);
2727
2728                                 /* Mark free */
2729                                 pc->pc_map[field] |= bitmask;
2730
2731                                 pmap_resident_count_dec(pmap, 1);
2732                                 TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
2733                                 m->md.pv_gen++;
2734
2735                                 pmap_unuse_l3(pmap, pv->pv_va, ptepde, &free);
2736                                 freed++;
2737                         }
2738                 }
2739                 PV_STAT(atomic_add_long(&pv_entry_frees, freed));
2740                 PV_STAT(atomic_add_int(&pv_entry_spare, freed));
2741                 PV_STAT(atomic_subtract_long(&pv_entry_count, freed));
2742                 if (allfree) {
2743                         TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
2744                         free_pv_chunk(pc);
2745                 }
2746         }
2747         if (lock != NULL)
2748                 rw_wunlock(lock);
2749         pmap_invalidate_all(pmap);
2750         rw_runlock(&pvh_global_lock);
2751         PMAP_UNLOCK(pmap);
2752         vm_page_free_pages_toq(&free, false);
2753 }
2754
2755 /*
2756  * This is used to check if a page has been accessed or modified. As we
2757  * don't have a bit to see if it has been modified we have to assume it
2758  * has been if the page is read/write.
2759  */
2760 static boolean_t
2761 pmap_page_test_mappings(vm_page_t m, boolean_t accessed, boolean_t modified)
2762 {
2763         struct rwlock *lock;
2764         pv_entry_t pv;
2765         pt_entry_t *l3, mask, value;
2766         pmap_t pmap;
2767         int md_gen;
2768         boolean_t rv;
2769
2770         rv = FALSE;
2771         rw_rlock(&pvh_global_lock);
2772         lock = VM_PAGE_TO_PV_LIST_LOCK(m);
2773         rw_rlock(lock);
2774 restart:
2775         TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
2776                 pmap = PV_PMAP(pv);
2777                 if (!PMAP_TRYLOCK(pmap)) {
2778                         md_gen = m->md.pv_gen;
2779                         rw_runlock(lock);
2780                         PMAP_LOCK(pmap);
2781                         rw_rlock(lock);
2782                         if (md_gen != m->md.pv_gen) {
2783                                 PMAP_UNLOCK(pmap);
2784                                 goto restart;
2785                         }
2786                 }
2787                 l3 = pmap_l3(pmap, pv->pv_va);
2788                 mask = 0;
2789                 value = 0;
2790                 if (modified) {
2791                         mask |= PTE_D;
2792                         value |= PTE_D;
2793                 }
2794                 if (accessed) {
2795                         mask |= PTE_A;
2796                         value |= PTE_A;
2797                 }
2798
2799 #if 0
2800                 if (modified) {
2801                         mask |= ATTR_AP_RW_BIT;
2802                         value |= ATTR_AP(ATTR_AP_RW);
2803                 }
2804                 if (accessed) {
2805                         mask |= ATTR_AF | ATTR_DESCR_MASK;
2806                         value |= ATTR_AF | L3_PAGE;
2807                 }
2808 #endif
2809
2810                 rv = (pmap_load(l3) & mask) == value;
2811                 PMAP_UNLOCK(pmap);
2812                 if (rv)
2813                         goto out;
2814         }
2815 out:
2816         rw_runlock(lock);
2817         rw_runlock(&pvh_global_lock);
2818         return (rv);
2819 }
2820
2821 /*
2822  *      pmap_is_modified:
2823  *
2824  *      Return whether or not the specified physical page was modified
2825  *      in any physical maps.
2826  */
2827 boolean_t
2828 pmap_is_modified(vm_page_t m)
2829 {
2830
2831         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
2832             ("pmap_is_modified: page %p is not managed", m));
2833
2834         /*
2835          * If the page is not exclusive busied, then PGA_WRITEABLE cannot be
2836          * concurrently set while the object is locked.  Thus, if PGA_WRITEABLE
2837          * is clear, no PTEs can have PG_M set.
2838          */
2839         VM_OBJECT_ASSERT_WLOCKED(m->object);
2840         if (!vm_page_xbusied(m) && (m->aflags & PGA_WRITEABLE) == 0)
2841                 return (FALSE);
2842         return (pmap_page_test_mappings(m, FALSE, TRUE));
2843 }
2844
2845 /*
2846  *      pmap_is_prefaultable:
2847  *
2848  *      Return whether or not the specified virtual address is eligible
2849  *      for prefault.
2850  */
2851 boolean_t
2852 pmap_is_prefaultable(pmap_t pmap, vm_offset_t addr)
2853 {
2854         pt_entry_t *l3;
2855         boolean_t rv;
2856
2857         rv = FALSE;
2858         PMAP_LOCK(pmap);
2859         l3 = pmap_l3(pmap, addr);
2860         if (l3 != NULL && pmap_load(l3) != 0) {
2861                 rv = TRUE;
2862         }
2863         PMAP_UNLOCK(pmap);
2864         return (rv);
2865 }
2866
2867 /*
2868  *      pmap_is_referenced:
2869  *
2870  *      Return whether or not the specified physical page was referenced
2871  *      in any physical maps.
2872  */
2873 boolean_t
2874 pmap_is_referenced(vm_page_t m)
2875 {
2876
2877         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
2878             ("pmap_is_referenced: page %p is not managed", m));
2879         return (pmap_page_test_mappings(m, TRUE, FALSE));
2880 }
2881
2882 /*
2883  * Clear the write and modified bits in each of the given page's mappings.
2884  */
2885 void
2886 pmap_remove_write(vm_page_t m)
2887 {
2888         pmap_t pmap;
2889         struct rwlock *lock;
2890         pv_entry_t pv;
2891         pt_entry_t *l3, oldl3;
2892         pt_entry_t newl3;
2893         int md_gen;
2894
2895         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
2896             ("pmap_remove_write: page %p is not managed", m));
2897
2898         /*
2899          * If the page is not exclusive busied, then PGA_WRITEABLE cannot be
2900          * set by another thread while the object is locked.  Thus,
2901          * if PGA_WRITEABLE is clear, no page table entries need updating.
2902          */
2903         VM_OBJECT_ASSERT_WLOCKED(m->object);
2904         if (!vm_page_xbusied(m) && (m->aflags & PGA_WRITEABLE) == 0)
2905                 return;
2906         rw_rlock(&pvh_global_lock);
2907         lock = VM_PAGE_TO_PV_LIST_LOCK(m);
2908 retry_pv_loop:
2909         rw_wlock(lock);
2910         TAILQ_FOREACH(pv, &m->md.pv_list, pv_next) {
2911                 pmap = PV_PMAP(pv);
2912                 if (!PMAP_TRYLOCK(pmap)) {
2913                         md_gen = m->md.pv_gen;
2914                         rw_wunlock(lock);
2915                         PMAP_LOCK(pmap);
2916                         rw_wlock(lock);
2917                         if (md_gen != m->md.pv_gen) {
2918                                 PMAP_UNLOCK(pmap);
2919                                 rw_wunlock(lock);
2920                                 goto retry_pv_loop;
2921                         }
2922                 }
2923                 l3 = pmap_l3(pmap, pv->pv_va);
2924 retry:
2925                 oldl3 = pmap_load(l3);
2926
2927                 if ((oldl3 & PTE_W) != 0) {
2928                         newl3 = oldl3 & ~PTE_W;
2929                         if (!atomic_cmpset_long(l3, oldl3, newl3))
2930                                 goto retry;
2931                         /* TODO: check for PTE_D? */
2932                         if ((oldl3 & PTE_A) != 0)
2933                                 vm_page_dirty(m);
2934                         pmap_invalidate_page(pmap, pv->pv_va);
2935                 }
2936                 PMAP_UNLOCK(pmap);
2937         }
2938         rw_wunlock(lock);
2939         vm_page_aflag_clear(m, PGA_WRITEABLE);
2940         rw_runlock(&pvh_global_lock);
2941 }
2942
2943 static __inline boolean_t
2944 safe_to_clear_referenced(pmap_t pmap, pt_entry_t pte)
2945 {
2946
2947         return (FALSE);
2948 }
2949
2950 /*
2951  *      pmap_ts_referenced:
2952  *
2953  *      Return a count of reference bits for a page, clearing those bits.
2954  *      It is not necessary for every reference bit to be cleared, but it
2955  *      is necessary that 0 only be returned when there are truly no
2956  *      reference bits set.
2957  *
2958  *      As an optimization, update the page's dirty field if a modified bit is
2959  *      found while counting reference bits.  This opportunistic update can be
2960  *      performed at low cost and can eliminate the need for some future calls
2961  *      to pmap_is_modified().  However, since this function stops after
2962  *      finding PMAP_TS_REFERENCED_MAX reference bits, it may not detect some
2963  *      dirty pages.  Those dirty pages will only be detected by a future call
2964  *      to pmap_is_modified().
2965  */
2966 int
2967 pmap_ts_referenced(vm_page_t m)
2968 {
2969         pv_entry_t pv, pvf;
2970         pmap_t pmap;
2971         struct rwlock *lock;
2972         pd_entry_t *l2;
2973         pt_entry_t *l3, old_l3;
2974         vm_paddr_t pa;
2975         int cleared, md_gen, not_cleared;
2976         struct spglist free;
2977
2978         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
2979             ("pmap_ts_referenced: page %p is not managed", m));
2980         SLIST_INIT(&free);
2981         cleared = 0;
2982         pa = VM_PAGE_TO_PHYS(m);
2983         lock = PHYS_TO_PV_LIST_LOCK(pa);
2984         rw_rlock(&pvh_global_lock);
2985         rw_wlock(lock);
2986 retry:
2987         not_cleared = 0;
2988         if ((pvf = TAILQ_FIRST(&m->md.pv_list)) == NULL)
2989                 goto out;
2990         pv = pvf;
2991         do {
2992                 if (pvf == NULL)
2993                         pvf = pv;
2994                 pmap = PV_PMAP(pv);
2995                 if (!PMAP_TRYLOCK(pmap)) {
2996                         md_gen = m->md.pv_gen;
2997                         rw_wunlock(lock);
2998                         PMAP_LOCK(pmap);
2999                         rw_wlock(lock);
3000                         if (md_gen != m->md.pv_gen) {
3001                                 PMAP_UNLOCK(pmap);
3002                                 goto retry;
3003                         }
3004                 }
3005                 l2 = pmap_l2(pmap, pv->pv_va);
3006
3007                 KASSERT((pmap_load(l2) & PTE_RX) == 0,
3008                     ("pmap_ts_referenced: found an invalid l2 table"));
3009
3010                 l3 = pmap_l2_to_l3(l2, pv->pv_va);
3011                 old_l3 = pmap_load(l3);
3012                 if ((old_l3 & PTE_D) != 0)
3013                         vm_page_dirty(m);
3014                 if ((old_l3 & PTE_A) != 0) {
3015                         if (safe_to_clear_referenced(pmap, old_l3)) {
3016                                 /*
3017                                  * TODO: We don't handle the access flag
3018                                  * at all. We need to be able to set it in
3019                                  * the exception handler.
3020                                  */
3021                                 panic("RISCVTODO: safe_to_clear_referenced\n");
3022                         } else if ((old_l3 & PTE_SW_WIRED) == 0) {
3023                                 /*
3024                                  * Wired pages cannot be paged out so
3025                                  * doing accessed bit emulation for
3026                                  * them is wasted effort. We do the
3027                                  * hard work for unwired pages only.
3028                                  */
3029                                 pmap_remove_l3(pmap, l3, pv->pv_va,
3030                                     pmap_load(l2), &free, &lock);
3031                                 pmap_invalidate_page(pmap, pv->pv_va);
3032                                 cleared++;
3033                                 if (pvf == pv)
3034                                         pvf = NULL;
3035                                 pv = NULL;
3036                                 KASSERT(lock == VM_PAGE_TO_PV_LIST_LOCK(m),
3037                                     ("inconsistent pv lock %p %p for page %p",
3038                                     lock, VM_PAGE_TO_PV_LIST_LOCK(m), m));
3039                         } else
3040                                 not_cleared++;
3041                 }
3042                 PMAP_UNLOCK(pmap);
3043                 /* Rotate the PV list if it has more than one entry. */
3044                 if (pv != NULL && TAILQ_NEXT(pv, pv_next) != NULL) {
3045                         TAILQ_REMOVE(&m->md.pv_list, pv, pv_next);
3046                         TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_next);
3047                         m->md.pv_gen++;
3048                 }
3049         } while ((pv = TAILQ_FIRST(&m->md.pv_list)) != pvf && cleared +
3050             not_cleared < PMAP_TS_REFERENCED_MAX);
3051 out:
3052         rw_wunlock(lock);
3053         rw_runlock(&pvh_global_lock);
3054         vm_page_free_pages_toq(&free, false);
3055         return (cleared + not_cleared);
3056 }
3057
3058 /*
3059  *      Apply the given advice to the specified range of addresses within the
3060  *      given pmap.  Depending on the advice, clear the referenced and/or
3061  *      modified flags in each mapping and set the mapped page's dirty field.
3062  */
3063 void
3064 pmap_advise(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, int advice)
3065 {
3066 }
3067
3068 /*
3069  *      Clear the modify bits on the specified physical page.
3070  */
3071 void
3072 pmap_clear_modify(vm_page_t m)
3073 {
3074
3075         KASSERT((m->oflags & VPO_UNMANAGED) == 0,
3076             ("pmap_clear_modify: page %p is not managed", m));
3077         VM_OBJECT_ASSERT_WLOCKED(m->object);
3078         KASSERT(!vm_page_xbusied(m),
3079             ("pmap_clear_modify: page %p is exclusive busied", m));
3080
3081         /*
3082          * If the page is not PGA_WRITEABLE, then no PTEs can have PG_M set.
3083          * If the object containing the page is locked and the page is not
3084          * exclusive busied, then PGA_WRITEABLE cannot be concurrently set.
3085          */
3086         if ((m->aflags & PGA_WRITEABLE) == 0)
3087                 return;
3088
3089         /* RISCVTODO: We lack support for tracking if a page is modified */
3090 }
3091
3092 void *
3093 pmap_mapbios(vm_paddr_t pa, vm_size_t size)
3094 {
3095
3096         return ((void *)PHYS_TO_DMAP(pa));
3097 }
3098
3099 void
3100 pmap_unmapbios(vm_paddr_t pa, vm_size_t size)
3101 {
3102 }
3103
3104 /*
3105  * Sets the memory attribute for the specified page.
3106  */
3107 void
3108 pmap_page_set_memattr(vm_page_t m, vm_memattr_t ma)
3109 {
3110
3111         m->md.pv_memattr = ma;
3112 }
3113
3114 /*
3115  * perform the pmap work for mincore
3116  */
3117 int
3118 pmap_mincore(pmap_t pmap, vm_offset_t addr, vm_paddr_t *locked_pa)
3119 {
3120         pt_entry_t *l2, *l3, tpte;
3121         vm_paddr_t pa;
3122         int val;
3123         bool managed;
3124
3125         PMAP_LOCK(pmap);
3126 retry:
3127         managed = false;
3128         val = 0;
3129
3130         l2 = pmap_l2(pmap, addr);
3131         if (l2 != NULL && ((tpte = pmap_load(l2)) & PTE_V) != 0) {
3132                 if ((tpte & (PTE_R | PTE_W | PTE_X)) != 0) {
3133                         pa = PTE_TO_PHYS(tpte) | (addr & L2_OFFSET);
3134                         val = MINCORE_INCORE | MINCORE_SUPER;
3135                 } else {
3136                         l3 = pmap_l2_to_l3(l2, addr);
3137                         tpte = pmap_load(l3);
3138                         if ((tpte & PTE_V) == 0)
3139                                 goto done;
3140                         pa = PTE_TO_PHYS(tpte) | (addr & L3_OFFSET);
3141                         val = MINCORE_INCORE;
3142                 }
3143
3144                 if ((tpte & PTE_D) != 0)
3145                         val |= MINCORE_MODIFIED | MINCORE_MODIFIED_OTHER;
3146                 if ((tpte & PTE_A) != 0)
3147                         val |= MINCORE_REFERENCED | MINCORE_REFERENCED_OTHER;
3148                 managed = (tpte & PTE_SW_MANAGED) == PTE_SW_MANAGED;
3149         }
3150
3151 done:
3152         if ((val & (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER)) !=
3153             (MINCORE_MODIFIED_OTHER | MINCORE_REFERENCED_OTHER) && managed) {
3154                 /* Ensure that "PHYS_TO_VM_PAGE(pa)->object" doesn't change. */
3155                 if (vm_page_pa_tryrelock(pmap, pa, locked_pa))
3156                         goto retry;
3157         } else
3158                 PA_UNLOCK_COND(*locked_pa);
3159         PMAP_UNLOCK(pmap);
3160         return (val);
3161 }
3162
3163 void
3164 pmap_activate(struct thread *td)
3165 {
3166         pmap_t pmap;
3167         uint64_t reg;
3168
3169         critical_enter();
3170         pmap = vmspace_pmap(td->td_proc->p_vmspace);
3171         td->td_pcb->pcb_l1addr = vtophys(pmap->pm_l1);
3172
3173         reg = SATP_MODE_SV39;
3174         reg |= (td->td_pcb->pcb_l1addr >> PAGE_SHIFT);
3175         load_satp(reg);
3176
3177         pmap_invalidate_all(pmap);
3178         critical_exit();
3179 }
3180
3181 void
3182 pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz)
3183 {
3184         cpuset_t mask;
3185
3186         /*
3187          * From the RISC-V User-Level ISA V2.2:
3188          *
3189          * "To make a store to instruction memory visible to all
3190          * RISC-V harts, the writing hart has to execute a data FENCE
3191          * before requesting that all remote RISC-V harts execute a
3192          * FENCE.I."
3193          */
3194         sched_pin();
3195         mask = all_cpus;
3196         CPU_CLR(PCPU_GET(cpuid), &mask);
3197         fence();
3198         sbi_remote_fence_i(mask.__bits);
3199         sched_unpin();
3200 }
3201
3202 /*
3203  *      Increase the starting virtual address of the given mapping if a
3204  *      different alignment might result in more superpage mappings.
3205  */
3206 void
3207 pmap_align_superpage(vm_object_t object, vm_ooffset_t offset,
3208     vm_offset_t *addr, vm_size_t size)
3209 {
3210 }
3211
3212 /**
3213  * Get the kernel virtual address of a set of physical pages. If there are
3214  * physical addresses not covered by the DMAP perform a transient mapping
3215  * that will be removed when calling pmap_unmap_io_transient.
3216  *
3217  * \param page        The pages the caller wishes to obtain the virtual
3218  *                    address on the kernel memory map.
3219  * \param vaddr       On return contains the kernel virtual memory address
3220  *                    of the pages passed in the page parameter.
3221  * \param count       Number of pages passed in.
3222  * \param can_fault   TRUE if the thread using the mapped pages can take
3223  *                    page faults, FALSE otherwise.
3224  *
3225  * \returns TRUE if the caller must call pmap_unmap_io_transient when
3226  *          finished or FALSE otherwise.
3227  *
3228  */
3229 boolean_t
3230 pmap_map_io_transient(vm_page_t page[], vm_offset_t vaddr[], int count,
3231     boolean_t can_fault)
3232 {
3233         vm_paddr_t paddr;
3234         boolean_t needs_mapping;
3235         int error, i;
3236
3237         /*
3238          * Allocate any KVA space that we need, this is done in a separate
3239          * loop to prevent calling vmem_alloc while pinned.
3240          */
3241         needs_mapping = FALSE;
3242         for (i = 0; i < count; i++) {
3243                 paddr = VM_PAGE_TO_PHYS(page[i]);
3244                 if (__predict_false(paddr >= DMAP_MAX_PHYSADDR)) {
3245                         error = vmem_alloc(kernel_arena, PAGE_SIZE,
3246                             M_BESTFIT | M_WAITOK, &vaddr[i]);
3247                         KASSERT(error == 0, ("vmem_alloc failed: %d", error));
3248                         needs_mapping = TRUE;
3249                 } else {
3250                         vaddr[i] = PHYS_TO_DMAP(paddr);
3251                 }
3252         }
3253
3254         /* Exit early if everything is covered by the DMAP */
3255         if (!needs_mapping)
3256                 return (FALSE);
3257
3258         if (!can_fault)
3259                 sched_pin();
3260         for (i = 0; i < count; i++) {
3261                 paddr = VM_PAGE_TO_PHYS(page[i]);
3262                 if (paddr >= DMAP_MAX_PHYSADDR) {
3263                         panic(
3264                            "pmap_map_io_transient: TODO: Map out of DMAP data");
3265                 }
3266         }
3267
3268         return (needs_mapping);
3269 }
3270
3271 void
3272 pmap_unmap_io_transient(vm_page_t page[], vm_offset_t vaddr[], int count,
3273     boolean_t can_fault)
3274 {
3275         vm_paddr_t paddr;
3276         int i;
3277
3278         if (!can_fault)
3279                 sched_unpin();
3280         for (i = 0; i < count; i++) {
3281                 paddr = VM_PAGE_TO_PHYS(page[i]);
3282                 if (paddr >= DMAP_MAX_PHYSADDR) {
3283                         panic("RISCVTODO: pmap_unmap_io_transient: Unmap data");
3284                 }
3285         }
3286 }
3287
3288 boolean_t
3289 pmap_is_valid_memattr(pmap_t pmap __unused, vm_memattr_t mode)
3290 {
3291
3292         return (mode >= VM_MEMATTR_DEVICE && mode <= VM_MEMATTR_WRITE_BACK);
3293 }