Module Name: src Committed By: nonaka Date: Fri Jan 23 06:52:55 UTC 2015
Modified Files: src/sys/arch/powerpc/booke: e500_tlb.c Log Message: - Use tlbivax instruction for TLB update/invalidate when MULTIPROCESSOR is defined. Because TLB entry operation is not notified to another CPU. - When TLB1 is updated, send IPI_TLB1SYNC to another CPU. To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 src/sys/arch/powerpc/booke/e500_tlb.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/powerpc/booke/e500_tlb.c diff -u src/sys/arch/powerpc/booke/e500_tlb.c:1.15 src/sys/arch/powerpc/booke/e500_tlb.c:1.16 --- src/sys/arch/powerpc/booke/e500_tlb.c:1.15 Sun Dec 28 14:13:56 2014 +++ src/sys/arch/powerpc/booke/e500_tlb.c Fri Jan 23 06:52:55 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: e500_tlb.c,v 1.15 2014/12/28 14:13:56 nonaka Exp $ */ +/* $NetBSD: e500_tlb.c,v 1.16 2015/01/23 06:52:55 nonaka Exp $ */ /*- * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc. * All rights reserved. @@ -40,7 +40,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: e500_tlb.c,v 1.15 2014/12/28 14:13:56 nonaka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: e500_tlb.c,v 1.16 2015/01/23 06:52:55 nonaka Exp $"); #include <sys/param.h> @@ -372,6 +372,9 @@ e500_tlb_invalidate_all(void) static void e500_tlb_invalidate_globals(void) { +#if defined(MULTIPROCESSOR) + e500_tlb_invalidate_all(); +#else /* !MULTIPROCESSOR */ const size_t tlbassoc = TLBCFG_ASSOC(mftlb0cfg()); const size_t tlbentries = TLBCFG_NENTRY(mftlb0cfg()); const size_t max_epn = (tlbentries / tlbassoc) << PAGE_SHIFT; @@ -416,11 +419,15 @@ e500_tlb_invalidate_globals(void) } __asm volatile("isync\n\tsync"); wrtee(msr); +#endif /* MULTIPROCESSOR */ } static void e500_tlb_invalidate_asids(tlb_asid_t asid_lo, tlb_asid_t asid_hi) { +#if defined(MULTIPROCESSOR) + e500_tlb_invalidate_all(); +#else /* !MULTIPROCESSOR */ const size_t tlbassoc = TLBCFG_ASSOC(mftlb0cfg()); const size_t tlbentries = TLBCFG_NENTRY(mftlb0cfg()); const size_t max_epn = (tlbentries / tlbassoc) << PAGE_SHIFT; @@ -454,6 +461,7 @@ e500_tlb_invalidate_asids(tlb_asid_t asi } __asm volatile("isync\n\tsync"); wrtee(msr); +#endif /* MULTIPROCESSOR */ } static u_int @@ -525,6 +533,10 @@ e500_tlb_invalidate_addr(vaddr_t va, tlb static bool e500_tlb_update_addr(vaddr_t va, tlb_asid_t asid, pt_entry_t pte, bool insert) { +#if defined(MULTIPROCESSOR) + e500_tlb_invalidate_addr(va, asid); + return true; +#else /* !MULTIPROCESSOR */ struct e500_hwtlb hwtlb = tlb_to_hwtlb( (struct e500_tlb){ .tlb_va = va, .tlb_asid = asid, .tlb_size = PAGE_SIZE, .tlb_pte = pte,}); @@ -558,6 +570,7 @@ e500_tlb_update_addr(vaddr_t va, tlb_asi hwtlb.hwtlb_mas1, hwtlb.hwtlb_mas2, hwtlb.hwtlb_mas3); #endif return (mas1 & MAS1_V) != 0; +#endif /* MULTIPROCESSOR */ } static void @@ -788,6 +801,11 @@ e500_tlb_ioreserve(vaddr_t va, vsize_t l xtlb->e_hwtlb = tlb_to_hwtlb(xtlb->e_tlb); xtlb->e_hwtlb.hwtlb_mas0 |= __SHIFTIN(slot, MAS0_ESEL); hwtlb_write(xtlb->e_hwtlb, true); + +#if defined(MULTIPROCESSOR) + cpu_send_ipi(IPI_DST_NOTME, IPI_TLB1SYNC); +#endif + return 0; } @@ -805,6 +823,10 @@ e500_tlb_iorelease(vaddr_t va) e500_free_tlb1_entry(xtlb, slot, true); +#if defined(MULTIPROCESSOR) + cpu_send_ipi(IPI_DST_NOTME, IPI_TLB1SYNC); +#endif + return 0; } @@ -841,6 +863,10 @@ e500_tlbmemmap(paddr_t memstart, psize_t } } +#if defined(MULTIPROCESSOR) + cpu_send_ipi(IPI_DST_NOTME, IPI_TLB1SYNC); +#endif + return nextslot; }