Module Name: src Committed By: thorpej Date: Wed Mar 11 13:30:31 UTC 2020
Modified Files: src/sys/arch/mips/mips: pmap_machdep.c src/sys/arch/powerpc/booke: booke_pmap.c src/sys/arch/powerpc/include/booke: pmap.h src/sys/arch/riscv/include: pmap.h src/sys/arch/riscv/riscv: pmap_machdep.c riscv_machdep.c src/sys/uvm/pmap: pmap.c pmap.h Log Message: With DEBUG defined, it's possible to execute a TLB-vs-segmap consistency check from a (soft) interrupt handler. But if a platform does not otherwise require the pmap_tlb_miss_lock, then where will be a brief window of inconsistency that, while harmless, will still fire an assertion in the consistency check. Fix this with the following changes: 1- Refactor the pmap_tlb_miss_lock into MI code and rename it from pmap_tlb_miss_lock_{enter,exit}() to pmap_tlb_miss_lock_{enter,exit}(). MD code can still define the "md" hooks as necessary, and if so, will override the common implementation. 2- Provde a pmap_bootstrap_common() function to perform common pmap bootstrap operations, namely initializing the pmap_tlb_miss_lock if it's needed. If MD code overrides the implementation, it's responsible for initializing its own lock. 3- Call pmap_bootstrap_common() from the mips, powerpc booke, and riscv pmap_bootstrap() routines. (This required adding one for riscv.) 4- Switch powerpc booke to the common pmap_tlb_miss_lock. 5- Enable pmap_tlb_miss_lock if DEBUG is defined, even if it's not otherwise required. PR port-mips/55062 (Failed assertion in pmap_md_tlb_check_entry()) To generate a diff of this commit: cvs rdiff -u -r1.26 -r1.27 src/sys/arch/mips/mips/pmap_machdep.c cvs rdiff -u -r1.26 -r1.27 src/sys/arch/powerpc/booke/booke_pmap.c cvs rdiff -u -r1.18 -r1.19 src/sys/arch/powerpc/include/booke/pmap.h cvs rdiff -u -r1.3 -r1.4 src/sys/arch/riscv/include/pmap.h cvs rdiff -u -r1.4 -r1.5 src/sys/arch/riscv/riscv/pmap_machdep.c cvs rdiff -u -r1.8 -r1.9 src/sys/arch/riscv/riscv/riscv_machdep.c cvs rdiff -u -r1.45 -r1.46 src/sys/uvm/pmap/pmap.c cvs rdiff -u -r1.12 -r1.13 src/sys/uvm/pmap/pmap.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/mips/mips/pmap_machdep.c diff -u src/sys/arch/mips/mips/pmap_machdep.c:1.26 src/sys/arch/mips/mips/pmap_machdep.c:1.27 --- src/sys/arch/mips/mips/pmap_machdep.c:1.26 Sun Oct 20 08:29:38 2019 +++ src/sys/arch/mips/mips/pmap_machdep.c Wed Mar 11 13:30:31 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_machdep.c,v 1.26 2019/10/20 08:29:38 skrll Exp $ */ +/* $NetBSD: pmap_machdep.c,v 1.27 2020/03/11 13:30:31 thorpej Exp $ */ /*- * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc. @@ -67,7 +67,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap_machdep.c,v 1.26 2019/10/20 08:29:38 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_machdep.c,v 1.27 2020/03/11 13:30:31 thorpej Exp $"); /* * Manages physical address maps. @@ -358,6 +358,9 @@ pmap_bootstrap(void) kcpuset_set(pm->pm_onproc, cpu_number()); kcpuset_set(pm->pm_active, cpu_number()); #endif + + pmap_bootstrap_common(); + pmap_tlb_info_init(&pmap_tlb0_info); /* init the lock */ /* Index: src/sys/arch/powerpc/booke/booke_pmap.c diff -u src/sys/arch/powerpc/booke/booke_pmap.c:1.26 src/sys/arch/powerpc/booke/booke_pmap.c:1.27 --- src/sys/arch/powerpc/booke/booke_pmap.c:1.26 Mon Sep 3 16:29:26 2018 +++ src/sys/arch/powerpc/booke/booke_pmap.c Wed Mar 11 13:30:31 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: booke_pmap.c,v 1.26 2018/09/03 16:29:26 riastradh Exp $ */ +/* $NetBSD: booke_pmap.c,v 1.27 2020/03/11 13:30:31 thorpej Exp $ */ /*- * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc. * All rights reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: booke_pmap.c,v 1.26 2018/09/03 16:29:26 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: booke_pmap.c,v 1.27 2020/03/11 13:30:31 thorpej Exp $"); #include <sys/param.h> #include <sys/kcore.h> @@ -49,10 +49,6 @@ __KERNEL_RCSID(0, "$NetBSD: booke_pmap.c #include <machine/pmap.h> -#if defined(MULTIPROCESSOR) -kmutex_t pmap_tlb_miss_lock; -#endif - PMAP_COUNTER(zeroed_pages, "pages zeroed"); PMAP_COUNTER(copied_pages, "pages copied"); @@ -154,13 +150,12 @@ pmap_bootstrap(vaddr_t startkernel, vadd KASSERT(endkernel == trunc_page(endkernel)); + /* common initialization */ + pmap_bootstrap_common(); + /* init the lock */ pmap_tlb_info_init(&pmap_tlb0_info); -#if defined(MULTIPROCESSOR) - mutex_init(&pmap_tlb_miss_lock, MUTEX_SPIN, IPL_HIGH); -#endif - /* * Compute the number of pages kmem_arena will have. */ @@ -422,18 +417,4 @@ pmap_md_tlb_info_attach(struct pmap_tlb_ { /* nothing */ } - -void -pmap_md_tlb_miss_lock_enter(void) -{ - - mutex_spin_enter(&pmap_tlb_miss_lock); -} - -void -pmap_md_tlb_miss_lock_exit(void) -{ - - mutex_spin_exit(&pmap_tlb_miss_lock); -} #endif /* MULTIPROCESSOR */ Index: src/sys/arch/powerpc/include/booke/pmap.h diff -u src/sys/arch/powerpc/include/booke/pmap.h:1.18 src/sys/arch/powerpc/include/booke/pmap.h:1.19 --- src/sys/arch/powerpc/include/booke/pmap.h:1.18 Thu Apr 19 21:50:07 2018 +++ src/sys/arch/powerpc/include/booke/pmap.h Wed Mar 11 13:30:31 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.h,v 1.18 2018/04/19 21:50:07 christos Exp $ */ +/* $NetBSD: pmap.h,v 1.19 2020/03/11 13:30:31 thorpej Exp $ */ /*- * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc. * All rights reserved. @@ -94,9 +94,7 @@ void pmap_md_init(void); bool pmap_md_tlb_check_entry(void *, vaddr_t, tlb_asid_t, pt_entry_t); #ifdef MULTIPROCESSOR -#define PMAP_MD_NEED_TLB_MISS_LOCK -void pmap_md_tlb_miss_lock_enter(void); -void pmap_md_tlb_miss_lock_exit(void); +#define PMAP_NEED_TLB_MISS_LOCK #endif /* MULTIPROCESSOR */ #ifdef PMAP_MINIMALTLB Index: src/sys/arch/riscv/include/pmap.h diff -u src/sys/arch/riscv/include/pmap.h:1.3 src/sys/arch/riscv/include/pmap.h:1.4 --- src/sys/arch/riscv/include/pmap.h:1.3 Sun Jun 16 07:42:52 2019 +++ src/sys/arch/riscv/include/pmap.h Wed Mar 11 13:30:31 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.h,v 1.3 2019/06/16 07:42:52 maxv Exp $ */ +/* $NetBSD: pmap.h,v 1.4 2020/03/11 13:30:31 thorpej Exp $ */ /* * Copyright (c) 2014, 2019 The NetBSD Foundation, Inc. @@ -108,6 +108,8 @@ struct pmap_md { pd_entry_t *md_pdetab; }; +void pmap_bootstrap(void); + struct vm_page * pmap_md_alloc_poolpage(int flags); vaddr_t pmap_md_map_poolpage(paddr_t, vsize_t); Index: src/sys/arch/riscv/riscv/pmap_machdep.c diff -u src/sys/arch/riscv/riscv/pmap_machdep.c:1.4 src/sys/arch/riscv/riscv/pmap_machdep.c:1.5 --- src/sys/arch/riscv/riscv/pmap_machdep.c:1.4 Sun Jun 16 07:42:52 2019 +++ src/sys/arch/riscv/riscv/pmap_machdep.c Wed Mar 11 13:30:31 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_machdep.c,v 1.4 2019/06/16 07:42:52 maxv Exp $ */ +/* $NetBSD: pmap_machdep.c,v 1.5 2020/03/11 13:30:31 thorpej Exp $ */ /* * Copyright (c) 2014, 2019 The NetBSD Foundation, Inc. @@ -33,7 +33,7 @@ #include <sys/cdefs.h> -__RCSID("$NetBSD: pmap_machdep.c,v 1.4 2019/06/16 07:42:52 maxv Exp $"); +__RCSID("$NetBSD: pmap_machdep.c,v 1.5 2020/03/11 13:30:31 thorpej Exp $"); #include <sys/param.h> @@ -47,6 +47,13 @@ vaddr_t pmap_direct_base __read_mostly; vaddr_t pmap_direct_end __read_mostly; void +pmap_bootstrap(void) +{ + + pmap_bootstrap_common(); +} + +void pmap_zero_page(paddr_t pa) { #ifdef PMAP_DIRECT_MAP Index: src/sys/arch/riscv/riscv/riscv_machdep.c diff -u src/sys/arch/riscv/riscv/riscv_machdep.c:1.8 src/sys/arch/riscv/riscv/riscv_machdep.c:1.9 --- src/sys/arch/riscv/riscv/riscv_machdep.c:1.8 Tue Dec 31 13:07:12 2019 +++ src/sys/arch/riscv/riscv/riscv_machdep.c Wed Mar 11 13:30:31 2020 @@ -31,7 +31,7 @@ #include "opt_modular.h" -__RCSID("$NetBSD: riscv_machdep.c,v 1.8 2019/12/31 13:07:12 ad Exp $"); +__RCSID("$NetBSD: riscv_machdep.c,v 1.9 2020/03/11 13:30:31 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -333,4 +333,7 @@ cpu_startup(void) void init_riscv(vaddr_t kernstart, vaddr_t kernend) { + + /* Early VM bootstrap. */ + pmap_bootstrap(); } Index: src/sys/uvm/pmap/pmap.c diff -u src/sys/uvm/pmap/pmap.c:1.45 src/sys/uvm/pmap/pmap.c:1.46 --- src/sys/uvm/pmap/pmap.c:1.45 Wed Dec 18 10:55:50 2019 +++ src/sys/uvm/pmap/pmap.c Wed Mar 11 13:30:31 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.45 2019/12/18 10:55:50 skrll Exp $ */ +/* $NetBSD: pmap.c,v 1.46 2020/03/11 13:30:31 thorpej Exp $ */ /*- * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc. @@ -67,7 +67,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.45 2019/12/18 10:55:50 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.46 2020/03/11 13:30:31 thorpej Exp $"); /* * Manages physical address maps. @@ -262,10 +262,49 @@ struct pool_allocator pmap_pv_page_alloc #define pmap_pv_alloc() pool_get(&pmap_pv_pool, PR_NOWAIT) #define pmap_pv_free(pv) pool_put(&pmap_pv_pool, (pv)) -#if !defined(MULTIPROCESSOR) || !defined(PMAP_MD_NEED_TLB_MISS_LOCK) -#define pmap_md_tlb_miss_lock_enter() do { } while(/*CONSTCOND*/0) -#define pmap_md_tlb_miss_lock_exit() do { } while(/*CONSTCOND*/0) -#endif /* !MULTIPROCESSOR || !PMAP_MD_NEED_TLB_MISS_LOCK */ +#ifndef PMAP_NEED_TLB_MISS_LOCK + +#if defined(PMAP_MD_NEED_TLB_MISS_LOCK) || defined(DEBUG) +#define PMAP_NEED_TLB_MISS_LOCK +#endif /* PMAP_MD_NEED_TLB_MISS_LOCK || DEBUG */ + +#endif /* PMAP_NEED_TLB_MISS_LOCK */ + +#ifdef PMAP_NEED_TLB_MISS_LOCK + +#ifdef PMAP_MD_NEED_TLB_MISS_LOCK +#define pmap_tlb_miss_lock_init() __nothing /* MD code deals with this */ +#define pmap_tlb_miss_lock_enter() pmap_md_tlb_miss_lock_enter() +#define pmap_tlb_miss_lock_exit() pmap_md_tlb_miss_lock_exit() +#else +static kmutex_t pmap_tlb_miss_lock __cacheline_aligned; + +static void +pmap_tlb_miss_lock_init(void) +{ + mutex_init(&pmap_tlb_miss_lock, MUTEX_SPIN, IPL_HIGH); +} + +static inline void +pmap_tlb_miss_lock_enter(void) +{ + mutex_spin_enter(&pmap_tlb_miss_lock); +} + +static inline void +pmap_tlb_miss_lock_exit(void) +{ + mutex_spin_exit(&pmap_tlb_miss_lock); +} +#endif /* PMAP_MD_NEED_TLB_MISS_LOCK */ + +#else + +#define pmap_tlb_miss_lock_init() __nothing +#define pmap_tlb_miss_lock_enter() __nothing +#define pmap_tlb_miss_lock_exit() __nothing + +#endif /* PMAP_NEED_TLB_MISS_LOCK */ #ifndef MULTIPROCESSOR kmutex_t pmap_pvlist_mutex __cacheline_aligned; @@ -522,6 +561,16 @@ pmap_steal_memory(vsize_t size, vaddr_t } /* + * Bootstrap the system enough to run with virtual memory. + * (Common routine called by machine-dependent bootstrap code.) + */ +void +pmap_bootstrap_common(void) +{ + pmap_tlb_miss_lock_init(); +} + +/* * Initialize the pmap module. * Called by vm_init, to initialize any structures that the pmap * system needs to map virtual memory. @@ -621,10 +670,10 @@ pmap_destroy(pmap_t pmap) PMAP_COUNT(destroy); KASSERT(pmap->pm_count == 0); kpreempt_disable(); - pmap_md_tlb_miss_lock_enter(); + pmap_tlb_miss_lock_enter(); pmap_tlb_asid_release_all(pmap); pmap_segtab_destroy(pmap, NULL, 0); - pmap_md_tlb_miss_lock_exit(); + pmap_tlb_miss_lock_exit(); #ifdef MULTIPROCESSOR kcpuset_destroy(pmap->pm_active); @@ -670,12 +719,12 @@ pmap_activate(struct lwp *l) PMAP_COUNT(activate); kpreempt_disable(); - pmap_md_tlb_miss_lock_enter(); + pmap_tlb_miss_lock_enter(); pmap_tlb_asid_acquire(pmap, l); if (l == curlwp) { pmap_segtab_activate(pmap, l); } - pmap_md_tlb_miss_lock_exit(); + pmap_tlb_miss_lock_exit(); kpreempt_enable(); UVMHIST_LOG(pmaphist, " <-- done (%ju:%ju)", l->l_proc->p_pid, @@ -772,7 +821,7 @@ pmap_page_remove(struct vm_page *pg) pmap->pm_stats.wired_count--; pmap->pm_stats.resident_count--; - pmap_md_tlb_miss_lock_enter(); + pmap_tlb_miss_lock_enter(); const pt_entry_t npte = pte_nv_entry(is_kernel_pmap_p); pte_set(ptep, npte); if (__predict_true(!(pmap->pm_flags & PMAP_DEFERRED_ACTIVATE))) { @@ -781,7 +830,7 @@ pmap_page_remove(struct vm_page *pg) */ pmap_tlb_invalidate_addr(pmap, va); } - pmap_md_tlb_miss_lock_exit(); + pmap_tlb_miss_lock_exit(); /* * non-null means this is a non-pvh_first pv, so we should @@ -820,13 +869,13 @@ pmap_deactivate(struct lwp *l) kpreempt_disable(); KASSERT(l == curlwp || l->l_cpu == curlwp->l_cpu); - pmap_md_tlb_miss_lock_enter(); + pmap_tlb_miss_lock_enter(); curcpu()->ci_pmap_user_segtab = PMAP_INVALID_SEGTAB_ADDRESS; #ifdef _LP64 curcpu()->ci_pmap_user_seg0tab = NULL; #endif pmap_tlb_asid_deactivate(pmap); - pmap_md_tlb_miss_lock_exit(); + pmap_tlb_miss_lock_exit(); kpreempt_enable(); UVMHIST_LOG(pmaphist, " <-- done (%ju:%ju)", l->l_proc->p_pid, @@ -846,7 +895,7 @@ pmap_update(struct pmap *pmap) if (pending && pmap_tlb_shootdown_bystanders(pmap)) PMAP_COUNT(shootdown_ipis); #endif - pmap_md_tlb_miss_lock_enter(); + pmap_tlb_miss_lock_enter(); #if defined(DEBUG) && !defined(MULTIPROCESSOR) pmap_tlb_check(pmap, pmap_md_tlb_check_entry); #endif /* DEBUG */ @@ -860,7 +909,7 @@ pmap_update(struct pmap *pmap) pmap_tlb_asid_acquire(pmap, curlwp); pmap_segtab_activate(pmap, curlwp); } - pmap_md_tlb_miss_lock_exit(); + pmap_tlb_miss_lock_exit(); kpreempt_enable(); UVMHIST_LOG(pmaphist, " <-- done (kernel=%#jx)", @@ -905,7 +954,7 @@ pmap_pte_remove(pmap_t pmap, vaddr_t sva if (__predict_true(pg != NULL)) { pmap_remove_pv(pmap, sva, pg, pte_modified_p(pte)); } - pmap_md_tlb_miss_lock_enter(); + pmap_tlb_miss_lock_enter(); pte_set(ptep, npte); if (__predict_true(!(pmap->pm_flags & PMAP_DEFERRED_ACTIVATE))) { @@ -914,7 +963,7 @@ pmap_pte_remove(pmap_t pmap, vaddr_t sva */ pmap_tlb_invalidate_addr(pmap, sva); } - pmap_md_tlb_miss_lock_exit(); + pmap_tlb_miss_lock_exit(); } UVMHIST_LOG(pmaphist, " <-- done", 0, 0, 0, 0); @@ -1061,13 +1110,13 @@ pmap_pte_protect(pmap_t pmap, vaddr_t sv } pte = pte_prot_downgrade(pte, prot); if (*ptep != pte) { - pmap_md_tlb_miss_lock_enter(); + pmap_tlb_miss_lock_enter(); pte_set(ptep, pte); /* * Update the TLB if needed. */ pmap_tlb_update_addr(pmap, sva, pte, PMAP_TLB_NEED_IPI); - pmap_md_tlb_miss_lock_exit(); + pmap_tlb_miss_lock_exit(); } } @@ -1143,10 +1192,10 @@ pmap_page_cache(struct vm_page *pg, bool pt_entry_t pte = *ptep; if (pte_valid_p(pte)) { pte = pte_cached_change(pte, cached); - pmap_md_tlb_miss_lock_enter(); + pmap_tlb_miss_lock_enter(); pte_set(ptep, pte); pmap_tlb_update_addr(pmap, va, pte, PMAP_TLB_NEED_IPI); - pmap_md_tlb_miss_lock_exit(); + pmap_tlb_miss_lock_exit(); } } @@ -1277,10 +1326,10 @@ pmap_enter(pmap_t pmap, vaddr_t va, padd KASSERT(pte_valid_p(npte)); - pmap_md_tlb_miss_lock_enter(); + pmap_tlb_miss_lock_enter(); pte_set(ptep, npte); pmap_tlb_update_addr(pmap, va, npte, update_flags); - pmap_md_tlb_miss_lock_exit(); + pmap_tlb_miss_lock_exit(); kpreempt_enable(); if (pg != NULL && (prot == (VM_PROT_READ | VM_PROT_EXECUTE))) { @@ -1362,10 +1411,10 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, v * We have the option to force this mapping into the TLB but we * don't. Instead let the next reference to the page do it. */ - pmap_md_tlb_miss_lock_enter(); + pmap_tlb_miss_lock_enter(); pte_set(ptep, npte); pmap_tlb_update_addr(pmap_kernel(), va, npte, 0); - pmap_md_tlb_miss_lock_exit(); + pmap_tlb_miss_lock_exit(); kpreempt_enable(); #if DEBUG > 1 for (u_int i = 0; i < PAGE_SIZE / sizeof(long); i++) { @@ -1413,10 +1462,10 @@ pmap_pte_kremove(pmap_t pmap, vaddr_t sv } #endif - pmap_md_tlb_miss_lock_enter(); + pmap_tlb_miss_lock_enter(); pte_set(ptep, new_pte); pmap_tlb_invalidate_addr(pmap, sva); - pmap_md_tlb_miss_lock_exit(); + pmap_tlb_miss_lock_exit(); } UVMHIST_LOG(pmaphist, " <-- done", 0, 0, 0, 0); @@ -1453,7 +1502,7 @@ pmap_remove_all(struct pmap *pmap) * Free all of our ASIDs which means we can skip doing all the * tlb_invalidate_addrs(). */ - pmap_md_tlb_miss_lock_enter(); + pmap_tlb_miss_lock_enter(); #ifdef MULTIPROCESSOR // This should be the last CPU with this pmap onproc KASSERT(!kcpuset_isotherset(pmap->pm_onproc, cpu_index(curcpu()))); @@ -1464,7 +1513,7 @@ pmap_remove_all(struct pmap *pmap) KASSERT(kcpuset_iszero(pmap->pm_onproc)); #endif pmap_tlb_asid_release_all(pmap); - pmap_md_tlb_miss_lock_exit(); + pmap_tlb_miss_lock_exit(); pmap->pm_flags |= PMAP_DEFERRED_ACTIVATE; #ifdef PMAP_FAULTINFO @@ -1506,9 +1555,9 @@ pmap_unwire(pmap_t pmap, vaddr_t va) pmap, va, pte_value(pte), ptep); if (pte_wired_p(pte)) { - pmap_md_tlb_miss_lock_enter(); + pmap_tlb_miss_lock_enter(); pte_set(ptep, pte_unwire_entry(pte)); - pmap_md_tlb_miss_lock_exit(); + pmap_tlb_miss_lock_exit(); pmap->pm_stats.wired_count--; } #ifdef DIAGNOSTIC @@ -1672,10 +1721,10 @@ pmap_clear_modify(struct vm_page *pg) } KASSERT(pte_valid_p(pte)); const uintptr_t gen = VM_PAGEMD_PVLIST_UNLOCK(mdpg); - pmap_md_tlb_miss_lock_enter(); + pmap_tlb_miss_lock_enter(); pte_set(ptep, pte); pmap_tlb_invalidate_addr(pmap, va); - pmap_md_tlb_miss_lock_exit(); + pmap_tlb_miss_lock_exit(); pmap_update(pmap); if (__predict_false(gen != VM_PAGEMD_PVLIST_READLOCK(mdpg))) { /* Index: src/sys/uvm/pmap/pmap.h diff -u src/sys/uvm/pmap/pmap.h:1.12 src/sys/uvm/pmap/pmap.h:1.13 --- src/sys/uvm/pmap/pmap.h:1.12 Sat Jun 1 12:42:28 2019 +++ src/sys/uvm/pmap/pmap.h Wed Mar 11 13:30:31 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.h,v 1.12 2019/06/01 12:42:28 maxv Exp $ */ +/* $NetBSD: pmap.h,v 1.13 2020/03/11 13:30:31 thorpej Exp $ */ /* * Copyright (c) 1992, 1993 @@ -103,6 +103,7 @@ typedef union pmap_segtab { struct pmap; typedef bool (*pte_callback_t)(struct pmap *, vaddr_t, vaddr_t, pt_entry_t *, uintptr_t); +void pmap_bootstrap_common(void); pt_entry_t *pmap_pte_lookup(struct pmap *, vaddr_t); pt_entry_t *pmap_pte_reserve(struct pmap *, vaddr_t, int); void pmap_pte_process(struct pmap *, vaddr_t, vaddr_t, pte_callback_t,