Module Name: src Committed By: matt Date: Tue Jul 2 09:35:48 UTC 2013
Modified Files: src/sys/uvm/pmap: pmap.h pmap_synci.c pmap_tlb.c Added Files: src/sys/uvm/pmap: pmap_tlb.h Log Message: Split tlb related stuff into pmap_tlb.h so that can be used for ASID mgmt for non-soft TLB pmaps. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/uvm/pmap/pmap.h \ src/sys/uvm/pmap/pmap_synci.c src/sys/uvm/pmap/pmap_tlb.c cvs rdiff -u -r0 -r1.1 src/sys/uvm/pmap/pmap_tlb.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/uvm/pmap/pmap.h diff -u src/sys/uvm/pmap/pmap.h:1.1 src/sys/uvm/pmap/pmap.h:1.2 --- src/sys/uvm/pmap/pmap.h:1.1 Wed Oct 3 00:51:46 2012 +++ src/sys/uvm/pmap/pmap.h Tue Jul 2 09:35:48 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.h,v 1.1 2012/10/03 00:51:46 christos Exp $ */ +/* $NetBSD: pmap.h,v 1.2 2013/07/02 09:35:48 matt Exp $ */ /* * Copyright (c) 1992, 1993 @@ -113,21 +113,7 @@ void pmap_segtab_destroy(struct pmap *, extern kmutex_t pmap_segtab_lock; #endif /* _KERNEL */ -/* - * Per TLB (normally same as CPU) asid info - */ -struct pmap_asid_info { - LIST_ENTRY(pmap_asid_info) pai_link; - uint32_t pai_asid; /* TLB address space tag */ -}; - -#define TLBINFO_LOCK(ti) mutex_spin_enter((ti)->ti_lock) -#define TLBINFO_UNLOCK(ti) mutex_spin_exit((ti)->ti_lock) -#define PMAP_PAI_ASIDVALID_P(pai, ti) ((pai)->pai_asid != 0) -#define PMAP_PAI(pmap, ti) (&(pmap)->pm_pai[tlbinfo_index(ti)]) -#define PAI_PMAP(pai, ti) \ - ((pmap_t)((intptr_t)(pai) \ - - offsetof(struct pmap, pm_pai[tlbinfo_index(ti)]))) +#include <uvm/pmap/pmap_tlb.h> /* * Machine dependent pmap structure. @@ -148,45 +134,7 @@ struct pmap { struct pmap_asid_info pm_pai[1]; }; -enum tlb_invalidate_op { - TLBINV_NOBODY=0, - TLBINV_ONE=1, - TLBINV_ALLUSER=2, - TLBINV_ALLKERNEL=3, - TLBINV_ALL=4 -}; - -struct pmap_tlb_info { - char ti_name[8]; - uint32_t ti_asid_hint; /* probable next ASID to use */ - uint32_t ti_asids_free; /* # of ASIDs free */ -#define tlbinfo_noasids_p(ti) ((ti)->ti_asids_free == 0) - kmutex_t *ti_lock; - u_int ti_wired; /* # of wired TLB entries */ - uint32_t ti_asid_max; - LIST_HEAD(, pmap_asid_info) ti_pais; /* list of active ASIDs */ -#ifdef MULTIPROCESSOR - pmap_t ti_victim; - uint32_t ti_synci_page_bitmap; /* page indices needing a syncicache */ - __cpuset_t ti_cpu_mask; /* bitmask of CPUs sharing this TLB */ - enum tlb_invalidate_op ti_tlbinvop; - u_int ti_index; -#define tlbinfo_index(ti) ((ti)->ti_index) - struct evcnt ti_evcnt_synci_asts; - struct evcnt ti_evcnt_synci_all; - struct evcnt ti_evcnt_synci_pages; - struct evcnt ti_evcnt_synci_deferred; - struct evcnt ti_evcnt_synci_desired; - struct evcnt ti_evcnt_synci_duplicate; -#else -#define tlbinfo_index(ti) (0) -#endif - struct evcnt ti_evcnt_asid_reinits; - u_long ti_asid_bitmap[256 / (sizeof(u_long) * 8)]; -}; - #ifdef _KERNEL - struct pmap_kernel { struct pmap kernel_pmap; #ifdef MULTIPROCESSOR @@ -208,11 +156,6 @@ extern struct pool pmap_pv_pool; extern struct pool_allocator pmap_pv_page_allocator; extern struct pmap_kernel kernel_pmap_store; -extern struct pmap_tlb_info pmap_tlb0_info; -#ifdef MULTIPROCESSOR -extern struct pmap_tlb_info *pmap_tlbs[MAXCPUS]; -extern u_int pmap_ntlbs; -#endif extern struct pmap_limits pmap_limits; #define pmap_wired_count(pmap) ((pmap)->pm_stats.wired_count) @@ -231,27 +174,6 @@ void pmap_pvlist_lock_init(size_t); #define PMAP_WBINV 1 #define PMAP_INV 2 -#ifdef MULTIPROCESSOR -void pmap_tlb_shootdown_process(void); -bool pmap_tlb_shootdown_bystanders(pmap_t pmap); -void pmap_tlb_info_attach(struct pmap_tlb_info *, struct cpu_info *); -void pmap_md_tlb_info_attach(struct pmap_tlb_info *, struct cpu_info *); -void pmap_syncicache_ast(struct cpu_info *); -void pmap_syncicache_wanted(struct cpu_info *); -void pmap_syncicache(vaddr_t, uint32_t); -#endif -void pmap_tlb_info_init(struct pmap_tlb_info *); -void pmap_tlb_info_evcnt_attach(struct pmap_tlb_info *); -void pmap_tlb_asid_acquire(pmap_t, struct lwp *l); -void pmap_tlb_asid_deactivate(pmap_t); -void pmap_tlb_asid_release_all(pmap_t); -int pmap_tlb_update_addr(pmap_t, vaddr_t, uint32_t, u_int); -#define PMAP_TLB_NEED_IPI 0x01 -#define PMAP_TLB_INSERT 0x02 -void pmap_tlb_invalidate_addr(pmap_t, vaddr_t); -void pmap_tlb_check(pmap_t, bool (*)(void *, vaddr_t, tlb_asid_t, pt_entry_t)); -void pmap_tlb_asid_check(void); - uint16_t pmap_pvlist_lock(struct vm_page_md *, bool); #define PMAP_STEAL_MEMORY /* enable pmap_steal_memory() */ Index: src/sys/uvm/pmap/pmap_synci.c diff -u src/sys/uvm/pmap/pmap_synci.c:1.1 src/sys/uvm/pmap/pmap_synci.c:1.2 --- src/sys/uvm/pmap/pmap_synci.c:1.1 Wed Oct 3 00:51:46 2012 +++ src/sys/uvm/pmap/pmap_synci.c Tue Jul 2 09:35:48 2013 @@ -29,7 +29,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap_synci.c,v 1.1 2012/10/03 00:51:46 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_synci.c,v 1.2 2013/07/02 09:35:48 matt Exp $"); #define __PMAP_PRIVATE @@ -47,7 +47,7 @@ __KERNEL_RCSID(0, "$NetBSD: pmap_synci.c void pmap_syncicache_ast(struct cpu_info *ci) { - struct pmap_tlb_info * const ti = ci->ci_tlb_info; + struct pmap_tlb_info * const ti = cpu_tlb_info(ci); KASSERT(kpreempt_disabled()); @@ -176,7 +176,7 @@ pmap_tlb_syncicache(vaddr_t va, uint32_t void pmap_tlb_syncicache_wanted(struct cpu_info *ci) { - struct pmap_tlb_info * const ti = ci->ci_tlb_info; + struct pmap_tlb_info * const ti = cpu_tlb_info(ci); KASSERT(cpu_intr_p()); Index: src/sys/uvm/pmap/pmap_tlb.c diff -u src/sys/uvm/pmap/pmap_tlb.c:1.1 src/sys/uvm/pmap/pmap_tlb.c:1.2 --- src/sys/uvm/pmap/pmap_tlb.c:1.1 Wed Oct 3 00:51:47 2012 +++ src/sys/uvm/pmap/pmap_tlb.c Tue Jul 2 09:35:48 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_tlb.c,v 1.1 2012/10/03 00:51:47 christos Exp $ */ +/* $NetBSD: pmap_tlb.c,v 1.2 2013/07/02 09:35:48 matt Exp $ */ /*- * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap_tlb.c,v 1.1 2012/10/03 00:51:47 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_tlb.c,v 1.2 2013/07/02 09:35:48 matt Exp $"); /* * Manages address spaces in a TLB. @@ -302,7 +302,7 @@ pmap_tlb_info_attach(struct pmap_tlb_inf TLBINFO_LOCK(ti); const __cpuset_t cpu_mask = CPUSET_SINGLE(cpu_index(ci)); CPUSET_ADDSET(ti->ti_cpu_mask, cpu_mask); - ci->ci_tlb_info = ti; + cpu_set_tlb_info(ci, ti); /* * Do any MD tlb info init. @@ -444,7 +444,7 @@ void pmap_tlb_shootdown_process(void) { struct cpu_info * const ci = curcpu(); - struct pmap_tlb_info * const ti = ci->ci_tlb_info; + struct pmap_tlb_info * const ti = cpu_tlb_info(ci); #ifdef DIAGNOSTIC struct pmap * const pm = curlwp->l_proc->p_vmspace->vm_map.pmap; #endif @@ -547,7 +547,7 @@ pmap_tlb_shootdown_bystanders(pmap_t pm) * We don't need to deal our own TLB. */ __cpuset_t pm_active = - CPUSET_EXCLUDE(pm->pm_active, curcpu()->ci_tlb_info->ti_cpu_mask); + CPUSET_EXCLUDE(pm->pm_active, cpu_tlb_info(curcpu())->ti_cpu_mask); const bool kernel_p = (pm == pmap_kernel()); bool ipi_sent = false; @@ -626,10 +626,11 @@ pmap_tlb_shootdown_bystanders(pmap_t pm) } #endif /* MULTIPROCESSOR && PMAP_NEED_TLB_SHOOTDOWN */ +#ifndef PMAP_TLB_HWPAGEWALKER int pmap_tlb_update_addr(pmap_t pm, vaddr_t va, pt_entry_t pt_entry, u_int flags) { - struct pmap_tlb_info * const ti = curcpu()->ci_tlb_info; + struct pmap_tlb_info * const ti = cpu_tlb_info(curcpu()); struct pmap_asid_info * const pai = PMAP_PAI(pm, ti); int rv = -1; @@ -649,11 +650,12 @@ pmap_tlb_update_addr(pmap_t pm, vaddr_t return rv; } +#endif /* !PMAP_TLB_HWPAGEWALKER */ void pmap_tlb_invalidate_addr(pmap_t pm, vaddr_t va) { - struct pmap_tlb_info * const ti = curcpu()->ci_tlb_info; + struct pmap_tlb_info * const ti = cpu_tlb_info(curcpu()); struct pmap_asid_info * const pai = PMAP_PAI(pm, ti); KASSERT(kpreempt_disabled()); @@ -753,7 +755,7 @@ void pmap_tlb_asid_acquire(pmap_t pm, struct lwp *l) { struct cpu_info * const ci = l->l_cpu; - struct pmap_tlb_info * const ti = ci->ci_tlb_info; + struct pmap_tlb_info * const ti = cpu_tlb_info(ci); struct pmap_asid_info * const pai = PMAP_PAI(pm, ti); KASSERT(kpreempt_disabled()); @@ -881,7 +883,7 @@ pmap_tlb_asid_check(void) void pmap_tlb_check(pmap_t pm, bool (*func)(void *, vaddr_t, tlb_asid_t, pt_entry_t)) { - struct pmap_tlb_info * const ti = curcpu()->ci_tlb_info; + struct pmap_tlb_info * const ti = cpu_tlb_info(curcpu()); struct pmap_asid_info * const pai = PMAP_PAI(pm, ti); TLBINFO_LOCK(ti); if (pm == pmap_kernel() || pai->pai_asid > KERNEL_PID) Added files: Index: src/sys/uvm/pmap/pmap_tlb.h diff -u /dev/null src/sys/uvm/pmap/pmap_tlb.h:1.1 --- /dev/null Tue Jul 2 09:35:48 2013 +++ src/sys/uvm/pmap/pmap_tlb.h Tue Jul 2 09:35:48 2013 @@ -0,0 +1,163 @@ +/* $NetBSD: pmap_tlb.h,v 1.1 2013/07/02 09:35:48 matt Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Ralph Campbell. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)pmap.h 8.1 (Berkeley) 6/10/93 + */ + +/* + * Copyright (c) 1987 Carnegie-Mellon University + * + * This code is derived from software contributed to Berkeley by + * Ralph Campbell. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)pmap.h 8.1 (Berkeley) 6/10/93 + */ + +#ifndef _COMMON_PMAP_TLB_H_ +#define _COMMON_PMAP_TLB_H_ + +/* + * Per TLB (normally same as CPU) asid info + */ +struct pmap_asid_info { + LIST_ENTRY(pmap_asid_info) pai_link; + uint32_t pai_asid; /* TLB address space tag */ +}; + +#define TLBINFO_LOCK(ti) mutex_spin_enter((ti)->ti_lock) +#define TLBINFO_UNLOCK(ti) mutex_spin_exit((ti)->ti_lock) +#define PMAP_PAI_ASIDVALID_P(pai, ti) ((pai)->pai_asid != 0) +#define PMAP_PAI(pmap, ti) (&(pmap)->pm_pai[tlbinfo_index(ti)]) +#define PAI_PMAP(pai, ti) \ + ((pmap_t)((intptr_t)(pai) \ + - offsetof(struct pmap, pm_pai[tlbinfo_index(ti)]))) + +enum tlb_invalidate_op { + TLBINV_NOBODY=0, + TLBINV_ONE=1, + TLBINV_ALLUSER=2, + TLBINV_ALLKERNEL=3, + TLBINV_ALL=4 +}; + +struct pmap_tlb_info { + char ti_name[8]; + uint32_t ti_asids_free; /* # of ASIDs free */ +#define tlbinfo_noasids_p(ti) ((ti)->ti_asids_free == 0) + kmutex_t *ti_lock; + u_int ti_wired; /* # of wired TLB entries */ + tlb_asid_t ti_asid_hint; /* probable next ASID to use */ + tlb_asid_t ti_asid_max; + LIST_HEAD(, pmap_asid_info) ti_pais; /* list of active ASIDs */ +#ifdef MULTIPROCESSOR + pmap_t ti_victim; + uint32_t ti_synci_page_bitmap; /* page indices needing a syncicache */ + __cpuset_t ti_cpu_mask; /* bitmask of CPUs sharing this TLB */ + enum tlb_invalidate_op ti_tlbinvop; + u_int ti_index; +#define tlbinfo_index(ti) ((ti)->ti_index) + struct evcnt ti_evcnt_synci_asts; + struct evcnt ti_evcnt_synci_all; + struct evcnt ti_evcnt_synci_pages; + struct evcnt ti_evcnt_synci_deferred; + struct evcnt ti_evcnt_synci_desired; + struct evcnt ti_evcnt_synci_duplicate; +#else +#define tlbinfo_index(ti) (0) +#endif + struct evcnt ti_evcnt_asid_reinits; + u_long ti_asid_bitmap[256 / (sizeof(u_long) * 8)]; +}; + +#ifdef _KERNEL +extern struct pmap_tlb_info pmap_tlb0_info; +#ifdef MULTIPROCESSOR +extern struct pmap_tlb_info *pmap_tlbs[MAXCPUS]; +extern u_int pmap_ntlbs; +#endif + +#ifndef cpu_set_tlb_info +#define cpu_set_tlb_info(ci, ti) ((void)((ci)->ci_tlb_info = (ti))) +#endif +#ifndef cpu_tlb_info +#define cpu_tlb_info(ci) ((ci)->ci_tlb_info) +#endif + +#ifdef MULTIPROCESSOR +void pmap_tlb_shootdown_process(void); +bool pmap_tlb_shootdown_bystanders(pmap_t pmap); +void pmap_tlb_info_attach(struct pmap_tlb_info *, struct cpu_info *); +void pmap_md_tlb_info_attach(struct pmap_tlb_info *, struct cpu_info *); +#endif +void pmap_tlb_info_init(struct pmap_tlb_info *); +void pmap_tlb_info_evcnt_attach(struct pmap_tlb_info *); +void pmap_tlb_asid_acquire(pmap_t, struct lwp *l); +void pmap_tlb_asid_deactivate(pmap_t); +void pmap_tlb_asid_release_all(pmap_t); +int pmap_tlb_update_addr(pmap_t, vaddr_t, uint32_t, u_int); +#define PMAP_TLB_NEED_IPI 0x01 +#define PMAP_TLB_INSERT 0x02 +void pmap_tlb_invalidate_addr(pmap_t, vaddr_t); +void pmap_tlb_check(pmap_t, bool (*)(void *, vaddr_t, tlb_asid_t, pt_entry_t)); +void pmap_tlb_asid_check(void); + +#endif /* _KERNEL */ +#endif /* _COMMON_PMAP_TLB_H_ */