Module Name: src
Committed By: skrll
Date: Sun May 14 11:46:22 UTC 2017
Modified Files:
src/sys/arch/mips/mips: pmap_machdep.c
Log Message:
Handle the maximum number of colors across [di]caches
To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/mips/mips/pmap_machdep.c
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.16 src/sys/arch/mips/mips/pmap_machdep.c:1.17
--- src/sys/arch/mips/mips/pmap_machdep.c:1.16 Fri May 12 06:49:31 2017
+++ src/sys/arch/mips/mips/pmap_machdep.c Sun May 14 11:46:22 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap_machdep.c,v 1.16 2017/05/12 06:49:31 skrll Exp $ */
+/* $NetBSD: pmap_machdep.c,v 1.17 2017/05/14 11:46:22 skrll 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.16 2017/05/12 06:49:31 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap_machdep.c,v 1.17 2017/05/14 11:46:22 skrll Exp $");
/*
* Manages physical address maps.
@@ -165,6 +165,10 @@ PMAP_COUNTER(zeroed_pages, "pages zeroed
PMAP_COUNTER(copied_pages, "pages copied");
extern struct evcnt pmap_evcnt_page_cache_evictions;
+u_int pmap_page_cache_alias_mask;
+
+#define pmap_md_cache_indexof(x) (((vaddr_t)(x)) & pmap_page_cache_alias_mask)
+
static register_t
pmap_md_map_ephemeral_page(struct vm_page *pg, bool locked_p, int prot,
pt_entry_t *old_pte_p)
@@ -196,12 +200,20 @@ pmap_md_map_ephemeral_page(struct vm_pag
*/
kpreempt_disable(); // paired with the one in unmap
struct cpu_info * const ci = curcpu();
- KASSERT(ci->ci_pmap_dstbase != 0);
-
+ if (MIPS_CACHE_VIRTUAL_ALIAS) {
+ KASSERT(ci->ci_pmap_dstbase != 0);
+ KASSERT(ci->ci_pmap_srcbase != 0);
+
+ const u_int __diagused mask = pmap_page_cache_alias_mask;
+ KASSERTMSG((ci->ci_pmap_dstbase & mask) == 0,
+ "%#"PRIxVADDR, ci->ci_pmap_dstbase);
+ KASSERTMSG((ci->ci_pmap_srcbase & mask) == 0,
+ "%#"PRIxVADDR, ci->ci_pmap_srcbase);
+ }
vaddr_t nva = (prot & VM_PROT_WRITE
? ci->ci_pmap_dstbase
: ci->ci_pmap_srcbase)
- + mips_cache_indexof(MIPS_CACHE_VIRTUAL_ALIAS
+ + pmap_md_cache_indexof(MIPS_CACHE_VIRTUAL_ALIAS
? pv->pv_va
: pa);
@@ -330,8 +342,12 @@ pmap_bootstrap(void)
size_t sysmap_size;
pt_entry_t *sysmap;
- if (MIPS_CACHE_VIRTUAL_ALIAS && uvmexp.ncolors)
+ if (MIPS_CACHE_VIRTUAL_ALIAS && uvmexp.ncolors) {
pmap_page_colormask = (uvmexp.ncolors - 1) << PAGE_SHIFT;
+ pmap_page_cache_alias_mask = max(
+ mips_cache_info.mci_cache_alias_mask,
+ mips_cache_info.mci_icache_alias_mask);
+ }
#ifdef MULTIPROCESSOR
pmap_t pm = pmap_kernel();
@@ -509,16 +525,23 @@ pmap_md_alloc_ephemeral_address_space(st
#endif
|| MIPS_CACHE_VIRTUAL_ALIAS
|| MIPS_ICACHE_VIRTUAL_ALIAS) {
- vsize_t size = uvmexp.ncolors * PAGE_SIZE;
- if (MIPS_ICACHE_VIRTUAL_ALIAS
- && mci->mci_picache_way_size > size)
- size = mci->mci_picache_way_size;
- ci->ci_pmap_dstbase = uvm_km_alloc(kernel_map, size, 0,
- UVM_KMF_COLORMATCH | UVM_KMF_VAONLY);
+ vsize_t size = max(mci->mci_pdcache_way_size, mci->mci_picache_way_size);;
+ const u_int __diagused mask = pmap_page_cache_alias_mask;
+
+ ci->ci_pmap_dstbase = uvm_km_alloc(kernel_map, size, size,
+ UVM_KMF_VAONLY);
+
KASSERT(ci->ci_pmap_dstbase);
- ci->ci_pmap_srcbase = uvm_km_alloc(kernel_map, size, 0,
- UVM_KMF_COLORMATCH | UVM_KMF_VAONLY);
+ KASSERT(!pmap_md_direct_mapped_vaddr_p(ci->ci_pmap_dstbase));
+ KASSERTMSG((ci->ci_pmap_dstbase & mask) == 0, "%#"PRIxVADDR,
+ ci->ci_pmap_dstbase);
+
+ ci->ci_pmap_srcbase = uvm_km_alloc(kernel_map, size, size,
+ UVM_KMF_VAONLY);
KASSERT(ci->ci_pmap_srcbase);
+ KASSERT(!pmap_md_direct_mapped_vaddr_p(ci->ci_pmap_srcbase));
+ KASSERTMSG((ci->ci_pmap_srcbase & mask) == 0, "%#"PRIxVADDR,
+ ci->ci_pmap_srcbase);
}
}