Module Name: src Committed By: mrg Date: Wed Feb 24 09:49:36 UTC 2010
Modified Files: src/sys/arch/sparc64/sparc64: cache.h ipifuncs.c locore.s pmap.c Log Message: when handing back page table pages to UVM, flush them from the dcache on all CPUs. idea from skrll@, and makes my disk-based SB2000 stable. tested on U60, SB2000 and SB2500. To generate a diff of this commit: cvs rdiff -u -r1.14 -r1.15 src/sys/arch/sparc64/sparc64/cache.h cvs rdiff -u -r1.33 -r1.34 src/sys/arch/sparc64/sparc64/ipifuncs.c cvs rdiff -u -r1.320 -r1.321 src/sys/arch/sparc64/sparc64/locore.s cvs rdiff -u -r1.252 -r1.253 src/sys/arch/sparc64/sparc64/pmap.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/sparc64/sparc64/cache.h diff -u src/sys/arch/sparc64/sparc64/cache.h:1.14 src/sys/arch/sparc64/sparc64/cache.h:1.15 --- src/sys/arch/sparc64/sparc64/cache.h:1.14 Wed Feb 24 06:05:35 2010 +++ src/sys/arch/sparc64/sparc64/cache.h Wed Feb 24 09:49:36 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: cache.h,v 1.14 2010/02/24 06:05:35 mrg Exp $ */ +/* $NetBSD: cache.h,v 1.15 2010/02/24 09:49:36 mrg Exp $ */ /* * Copyright (c) 1996 @@ -138,8 +138,11 @@ #ifdef MULTIPROCESSOR void smp_tlb_flush_pte(vaddr_t, struct pmap *); #define tlb_flush_pte(va,pm) smp_tlb_flush_pte(va, pm) +void smp_dcache_flush_page_all(paddr_t pa); +#define dcache_flush_page_all(pa) smp_dcache_flush_page_all(pa) #else #define tlb_flush_pte(va,pm) sp_tlb_flush_pte(va, (pm)->pm_ctx) +#define dcache_flush_page_all(pa) dcache_flush_page(pa) #endif /* Various cache size/line sizes */ Index: src/sys/arch/sparc64/sparc64/ipifuncs.c diff -u src/sys/arch/sparc64/sparc64/ipifuncs.c:1.33 src/sys/arch/sparc64/sparc64/ipifuncs.c:1.34 --- src/sys/arch/sparc64/sparc64/ipifuncs.c:1.33 Wed Feb 24 06:05:35 2010 +++ src/sys/arch/sparc64/sparc64/ipifuncs.c Wed Feb 24 09:49:36 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: ipifuncs.c,v 1.33 2010/02/24 06:05:35 mrg Exp $ */ +/* $NetBSD: ipifuncs.c,v 1.34 2010/02/24 09:49:36 mrg Exp $ */ /*- * Copyright (c) 2004 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.33 2010/02/24 06:05:35 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.34 2010/02/24 09:49:36 mrg Exp $"); #include "opt_ddb.h" @@ -71,6 +71,8 @@ void sparc64_ipi_pause(void *); void sparc64_ipi_flush_pte_us(void *); void sparc64_ipi_flush_pte_usiii(void *); +void sparc64_ipi_dcache_flush_page_us(void *); +void sparc64_ipi_dcache_flush_page_usiii(void *); /* * Process cpu stop-self event. @@ -409,6 +411,23 @@ } /* + * Make sure this page is flushed from all CPUs. + */ +void +smp_dcache_flush_page_all(paddr_t pa) +{ + ipifunc_t func; + + if (CPU_IS_USIII_UP()) + func = sparc64_ipi_dcache_flush_page_usiii; + else + func = sparc64_ipi_dcache_flush_page_us; + + sparc64_broadcast_ipi(func, pa, dcache_line_size); + dcache_flush_page(pa); +} + +/* * Print an error message. */ void Index: src/sys/arch/sparc64/sparc64/locore.s diff -u src/sys/arch/sparc64/sparc64/locore.s:1.320 src/sys/arch/sparc64/sparc64/locore.s:1.321 --- src/sys/arch/sparc64/sparc64/locore.s:1.320 Wed Feb 24 01:58:53 2010 +++ src/sys/arch/sparc64/sparc64/locore.s Wed Feb 24 09:49:36 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.s,v 1.320 2010/02/24 01:58:53 mrg Exp $ */ +/* $NetBSD: locore.s,v 1.321 2010/02/24 09:49:36 mrg Exp $ */ /* * Copyright (c) 1996-2002 Eduardo Horvath @@ -9047,6 +9047,65 @@ IPIEVC_INC(IPI_EVCNT_FPU_FLUSH,%g2,%g3) ba,a ret_from_intr_vector nop + +/* + * IPI handler to drop the current FPU state. + * void sparc64_ipi_dcache_flush_page_usiii(paddr_t pa, int line_size) + * void sparc64_ipi_dcache_flush_page_us(paddr_t pa, int line_size) + * + * On entry: + * %g2 = pa + * %g3 = line_size + */ +ENTRY(sparc64_ipi_dcache_flush_page_usiii) + set NBPG, %g1 + add %g2, %g1, %g1 ! end address + +1: + stxa %g0, [%g2] ASI_DCACHE_INVALIDATE + add %g2, %g3, %g2 + cmp %g2, %g1 + bl,pt %xcc, 1b + nop + + sethi %hi(KERNBASE), %g5 + flush %g5 + membar #Sync + ba,a ret_from_intr_vector + nop + +ENTRY(sparc64_ipi_dcache_flush_page_us) + mov -1, %g1 ! Generate mask for tag: bits [29..2] + srlx %g2, 13-2, %g5 ! Tag is PA bits <40:13> in bits <29:2> + clr %g4 + srl %g1, 2, %g1 ! Now we have bits <29:0> set + set (2*NBPG), %g7 + ba,pt %icc, 1f + andn %g1, 3, %g1 ! Now we have bits <29:2> set + + .align 8 +1: + ldxa [%g4] ASI_DCACHE_TAG, %g6 + mov %g4, %g2 + deccc 32, %g7 + bl,pn %icc, 2f + inc 32, %g4 + + xor %g6, %g5, %g6 + andcc %g6, %g1, %g0 + bne,pt %xcc, 1b + membar #LoadStore + + stxa %g0, [%g2] ASI_DCACHE_TAG + ba,pt %icc, 1b + membar #StoreLoad +2: + + sethi %hi(KERNBASE), %g5 + flush %g5 + membar #Sync + ba,a ret_from_intr_vector + nop #endif /* Index: src/sys/arch/sparc64/sparc64/pmap.c diff -u src/sys/arch/sparc64/sparc64/pmap.c:1.252 src/sys/arch/sparc64/sparc64/pmap.c:1.253 --- src/sys/arch/sparc64/sparc64/pmap.c:1.252 Wed Feb 24 01:58:53 2010 +++ src/sys/arch/sparc64/sparc64/pmap.c Wed Feb 24 09:49:36 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.252 2010/02/24 01:58:53 mrg Exp $ */ +/* $NetBSD: pmap.c,v 1.253 2010/02/24 09:49:36 mrg Exp $ */ /* * * Copyright (C) 1996-1999 Eduardo Horvath. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.252 2010/02/24 01:58:53 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.253 2010/02/24 09:49:36 mrg Exp $"); #undef NO_VCACHE /* Don't forget the locked TLB in dostart */ #define HWREF @@ -1405,6 +1405,7 @@ nextpg = TAILQ_NEXT(pg, listq.queue); TAILQ_REMOVE(&pm->pm_obj.memq, pg, listq.queue); KASSERT(pg->mdpage.mdpg_pvh.pv_pmap == NULL); + dcache_flush_page_all(VM_PAGE_TO_PHYS(pg)); uvm_pagefree(pg); } pmap_free_page((paddr_t)(u_long)pm->pm_segs); @@ -3385,6 +3386,7 @@ { struct vm_page *pg = PHYS_TO_VM_PAGE(pa); + dcache_flush_page_all(pa); uvm_pagefree(pg); }