Module Name: src Committed By: martin Date: Sun Nov 9 16:05:26 UTC 2014
Modified Files: src/sys/arch/arm/arm [netbsd-7]: arm_machdep.c cpufunc_asm_arm11.S cpufunc_asm_armv7.S cpufunc_asm_pj4b.S undefined.c src/sys/arch/arm/arm32 [netbsd-7]: arm32_boot.c arm32_kvminit.c arm32_machdep.c arm32_tlb.c db_interface.c db_machdep.c pmap.c src/sys/arch/arm/cortex [netbsd-7]: a9_mpsubr.S gic.c src/sys/arch/arm/include [netbsd-7]: armreg.h src/sys/arch/arm/include/arm32 [netbsd-7]: pmap.h src/sys/arch/arm/mainbus [netbsd-7]: cpu_mainbus.c src/sys/arch/arm/pic [netbsd-7]: pic.c picvar.h src/sys/arch/evbarm/conf [netbsd-7]: BPI CUBIETRUCK src/sys/uvm/pmap [netbsd-7]: pmap_tlb.c Log Message: Pull up following revision(s) (requested by skrll in ticket #188): sys/arch/arm/include/arm32/pmap.h: revision 1.136 sys/arch/arm/include/armreg.h: revision 1.100 sys/arch/arm/cortex/gic.c: revision 1.11 sys/arch/arm/arm32/db_interface.c: revision 1.54 sys/arch/arm/include/armreg.h: revision 1.101 sys/arch/arm/cortex/gic.c: revision 1.12 sys/arch/arm/arm32/arm32_machdep.c: revision 1.107 sys/arch/arm/arm/cpufunc_asm_armv7.S: revision 1.19 sys/arch/arm/cortex/a9_mpsubr.S: revision 1.20 sys/arch/evbarm/conf/BPI: revision 1.5 sys/arch/arm/cortex/a9_mpsubr.S: revision 1.21 sys/arch/arm/arm32/pmap.c: revision 1.306 sys/arch/arm/arm32/db_machdep.c: revision 1.22 sys/arch/arm/arm32/arm32_tlb.c: revision 1.3 sys/arch/arm/arm/undefined.c: revision 1.55 sys/arch/arm/cortex/a9_mpsubr.S: revision 1.22 sys/arch/arm/arm32/pmap.c: revision 1.307 sys/arch/arm/arm32/arm32_tlb.c: revision 1.4 sys/arch/arm/cortex/a9_mpsubr.S: revision 1.23 sys/arch/arm/arm32/arm32_tlb.c: revision 1.5 sys/arch/evbarm/conf/BPI: revision 1.8 sys/arch/arm/cortex/a9_mpsubr.S: revision 1.24 sys/arch/arm/arm32/arm32_tlb.c: revision 1.6 sys/arch/arm/arm32/arm32_tlb.c: revision 1.7 sys/arch/evbarm/conf/CUBIETRUCK: revision 1.5 sys/arch/arm/pic/pic.c: revision 1.23 sys/arch/arm/pic/pic.c: revision 1.24 sys/arch/arm/pic/picvar.h: revision 1.11 sys/arch/arm/arm/cpufunc_asm_armv7.S: revision 1.20 sys/arch/arm/mainbus/cpu_mainbus.c: revision 1.16 sys/arch/arm/arm32/pmap.c: revision 1.298 sys/arch/arm/arm/cpufunc_asm_arm11.S: revision 1.17 sys/arch/arm/arm/cpufunc_asm_pj4b.S: revision 1.5 sys/arch/arm/arm32/pmap.c: revision 1.310 sys/arch/arm/arm32/pmap.c: revision 1.311 sys/arch/arm/arm32/arm32_kvminit.c: revision 1.32 sys/arch/arm/cortex/a9_mpsubr.S: revision 1.19 sys/arch/arm/arm32/arm32_boot.c: revision 1.10 sys/arch/arm/arm/ast.c: revision 1.25 sys/arch/arm/include/armreg.h: revision 1.98 sys/uvm/pmap/pmap_tlb.c: revision 1.10 sys/arch/arm/arm32/arm32_boot.c: revision 1.8 sys/arch/arm/arm32/arm32_boot.c: revision 1.9 sys/arch/arm/arm/arm_machdep.c: revision 1.43 Various ARM MP fixes. To generate a diff of this commit: cvs rdiff -u -r1.42 -r1.42.2.1 src/sys/arch/arm/arm/arm_machdep.c cvs rdiff -u -r1.15 -r1.15.2.1 src/sys/arch/arm/arm/cpufunc_asm_arm11.S cvs rdiff -u -r1.18 -r1.18.2.1 src/sys/arch/arm/arm/cpufunc_asm_armv7.S cvs rdiff -u -r1.4 -r1.4.6.1 src/sys/arch/arm/arm/cpufunc_asm_pj4b.S cvs rdiff -u -r1.54 -r1.54.4.1 src/sys/arch/arm/arm/undefined.c cvs rdiff -u -r1.7 -r1.7.4.1 src/sys/arch/arm/arm32/arm32_boot.c cvs rdiff -u -r1.30 -r1.30.2.1 src/sys/arch/arm/arm32/arm32_kvminit.c cvs rdiff -u -r1.105 -r1.105.2.1 src/sys/arch/arm/arm32/arm32_machdep.c cvs rdiff -u -r1.2 -r1.2.6.1 src/sys/arch/arm/arm32/arm32_tlb.c cvs rdiff -u -r1.52 -r1.52.4.1 src/sys/arch/arm/arm32/db_interface.c cvs rdiff -u -r1.21 -r1.21.4.1 src/sys/arch/arm/arm32/db_machdep.c cvs rdiff -u -r1.295.2.1 -r1.295.2.2 src/sys/arch/arm/arm32/pmap.c cvs rdiff -u -r1.18 -r1.18.2.1 src/sys/arch/arm/cortex/a9_mpsubr.S cvs rdiff -u -r1.10 -r1.10.2.1 src/sys/arch/arm/cortex/gic.c cvs rdiff -u -r1.97 -r1.97.2.1 src/sys/arch/arm/include/armreg.h cvs rdiff -u -r1.135 -r1.135.2.1 src/sys/arch/arm/include/arm32/pmap.h cvs rdiff -u -r1.15 -r1.15.2.1 src/sys/arch/arm/mainbus/cpu_mainbus.c cvs rdiff -u -r1.22 -r1.22.2.1 src/sys/arch/arm/pic/pic.c cvs rdiff -u -r1.10 -r1.10.2.1 src/sys/arch/arm/pic/picvar.h cvs rdiff -u -r1.2.2.2 -r1.2.2.3 src/sys/arch/evbarm/conf/BPI cvs rdiff -u -r1.2.4.1 -r1.2.4.2 src/sys/arch/evbarm/conf/CUBIETRUCK cvs rdiff -u -r1.8 -r1.8.4.1 src/sys/uvm/pmap/pmap_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/arm/arm/arm_machdep.c diff -u src/sys/arch/arm/arm/arm_machdep.c:1.42 src/sys/arch/arm/arm/arm_machdep.c:1.42.2.1 --- src/sys/arch/arm/arm/arm_machdep.c:1.42 Sat Jun 14 09:13:30 2014 +++ src/sys/arch/arm/arm/arm_machdep.c Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: arm_machdep.c,v 1.42 2014/06/14 09:13:30 ozaki-r Exp $ */ +/* $NetBSD: arm_machdep.c,v 1.42.2.1 2014/11/09 16:05:25 martin Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -75,10 +75,11 @@ #include "opt_cpuoptions.h" #include "opt_cputypes.h" #include "opt_arm_debug.h" +#include "opt_multiprocessor.h" #include <sys/param.h> -__KERNEL_RCSID(0, "$NetBSD: arm_machdep.c,v 1.42 2014/06/14 09:13:30 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: arm_machdep.c,v 1.42.2.1 2014/11/09 16:05:25 martin Exp $"); #include <sys/exec.h> #include <sys/proc.h> Index: src/sys/arch/arm/arm/cpufunc_asm_arm11.S diff -u src/sys/arch/arm/arm/cpufunc_asm_arm11.S:1.15 src/sys/arch/arm/arm/cpufunc_asm_arm11.S:1.15.2.1 --- src/sys/arch/arm/arm/cpufunc_asm_arm11.S:1.15 Thu Jul 31 10:44:58 2014 +++ src/sys/arch/arm/arm/cpufunc_asm_arm11.S Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: cpufunc_asm_arm11.S,v 1.15 2014/07/31 10:44:58 skrll Exp $ */ +/* $NetBSD: cpufunc_asm_arm11.S,v 1.15.2.1 2014/11/09 16:05:25 martin Exp $ */ /* * Copyright (c) 2002, 2005 ARM Limited @@ -99,7 +99,8 @@ END(arm11_tlb_flushI) ENTRY(arm11_tlb_flushI_SE) #ifdef ARM_MMU_EXTENDED - orr r0, r0, r1 /* insert ASID into MVA */ + bic r0, r0, #0xff + bic r0, r0, #0xf00 /* Always KERNEL_PID, i.e. 0 */ #endif mcr p15, 0, r0, c8, c5, 1 /* flush I tlb single entry */ #if PAGE_SIZE == 2 * L2_S_SIZE @@ -121,7 +122,8 @@ END(arm11_tlb_flushD) ENTRY(arm11_tlb_flushD_SE) #ifdef ARM_MMU_EXTENDED - orr r0, r0, r1 /* insert ASID into MVA */ + bic r0, r0, #0xff + bic r0, r0, #0xf00 /* Always KERNEL_PID, i.e. 0 */ #endif mcr p15, 0, r0, c8, c6, 1 /* flush D tlb single entry */ #if PAGE_SIZE == 2 * L2_S_SIZE @@ -142,7 +144,8 @@ END(arm11_tlb_flushID) ENTRY(arm11_tlb_flushID_SE) #ifdef ARM_MMU_EXTENDED - orr r0, r0, r1 /* insert ASID into MVA */ + bic r0, r0, #0xff + bic r0, r0, #0xf00 /* Always KERNEL_PID, i.e. 0 */ #endif mcr p15, 0, r0, c8, c7, 1 /* flush I+D tlb single entry */ #if PAGE_SIZE == 2 * L2_S_SIZE Index: src/sys/arch/arm/arm/cpufunc_asm_armv7.S diff -u src/sys/arch/arm/arm/cpufunc_asm_armv7.S:1.18 src/sys/arch/arm/arm/cpufunc_asm_armv7.S:1.18.2.1 --- src/sys/arch/arm/arm/cpufunc_asm_armv7.S:1.18 Thu Jul 31 06:26:06 2014 +++ src/sys/arch/arm/arm/cpufunc_asm_armv7.S Sun Nov 9 16:05:25 2014 @@ -78,10 +78,7 @@ END(armv7_tlb_flushID_ASID) STRONG_ALIAS(armv7_tlb_flushD_SE, armv7_tlb_flushID_SE) STRONG_ALIAS(armv7_tlb_flushI_SE, armv7_tlb_flushID_SE) ENTRY(armv7_tlb_flushID_SE) - bfc r0, #0, #12 @ clear ASID -#ifdef ARM_MMU_EXTENDED - bfi r0, r1, #0, #8 @ insert ASID into MVA -#endif + bfc r0, #0, #12 @ Always KERNEL_PID, i.e. 0 #ifdef MULTIPROCESSOR mcr p15, 0, r0, c8, c3, 1 @ flush I+D tlb single entry #if PAGE_SIZE == 2*L2_S_SIZE @@ -380,6 +377,7 @@ ENTRY_NP(armv7_dcache_inv_all) b 1b .Lnext_level_inv: + dsb mrc p15, 1, r0, c0, c0, 1 @ read CLIDR ubfx ip, r0, #24, #3 @ narrow to LoC add r3, r3, #2 @ go to next level @@ -440,6 +438,7 @@ ENTRY_NP(armv7_dcache_wbinv_all) b 1b .Lnext_level_wbinv: + dsb mrc p15, 1, r0, c0, c0, 1 @ read CLIDR ubfx ip, r0, #24, #3 @ narrow to LoC add r3, r3, #2 @ go to next level Index: src/sys/arch/arm/arm/cpufunc_asm_pj4b.S diff -u src/sys/arch/arm/arm/cpufunc_asm_pj4b.S:1.4 src/sys/arch/arm/arm/cpufunc_asm_pj4b.S:1.4.6.1 --- src/sys/arch/arm/arm/cpufunc_asm_pj4b.S:1.4 Sun Mar 30 01:15:03 2014 +++ src/sys/arch/arm/arm/cpufunc_asm_pj4b.S Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: cpufunc_asm_pj4b.S,v 1.4 2014/03/30 01:15:03 matt Exp $ */ +/* $NetBSD: cpufunc_asm_pj4b.S,v 1.4.6.1 2014/11/09 16:05:25 martin Exp $ */ /******************************************************************************* Copyright (C) Marvell International Ltd. and its affiliates @@ -78,6 +78,7 @@ ENTRY(pj4b_tlb_flushID) END(pj4b_tlb_flushID) ENTRY(pj4b_tlb_flushID_SE) + bfc r0, #0, #12 @ always KERNEL_PID (i.e. 0) mcr p15, 0, r0, c8, c7, 1 @flush I+D tlb single entry #if PAGE_SIZE == 2 * L2_S_SIZE add r0, r0, L2_S_SIZE Index: src/sys/arch/arm/arm/undefined.c diff -u src/sys/arch/arm/arm/undefined.c:1.54 src/sys/arch/arm/arm/undefined.c:1.54.4.1 --- src/sys/arch/arm/arm/undefined.c:1.54 Fri Mar 28 21:44:35 2014 +++ src/sys/arch/arm/arm/undefined.c Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: undefined.c,v 1.54 2014/03/28 21:44:35 matt Exp $ */ +/* $NetBSD: undefined.c,v 1.54.4.1 2014/11/09 16:05:25 martin Exp $ */ /* * Copyright (c) 2001 Ben Harris. @@ -55,7 +55,7 @@ #include <sys/kgdb.h> #endif -__KERNEL_RCSID(0, "$NetBSD: undefined.c,v 1.54 2014/03/28 21:44:35 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: undefined.c,v 1.54.4.1 2014/11/09 16:05:25 martin Exp $"); #include <sys/kmem.h> #include <sys/queue.h> @@ -102,7 +102,8 @@ install_coproc_handler(int coproc, undef KASSERT(coproc >= 0 && coproc < NUM_UNKNOWN_HANDLERS); KASSERT(handler != NULL); /* Used to be legal. */ - uh = kmem_alloc(sizeof(*uh), KM_SLEEP); + uh = kmem_alloc(sizeof(*uh), KM_NOSLEEP); + KASSERT(uh != NULL); uh->uh_handler = handler; install_coproc_handler_static(coproc, uh); return uh; Index: src/sys/arch/arm/arm32/arm32_boot.c diff -u src/sys/arch/arm/arm32/arm32_boot.c:1.7 src/sys/arch/arm/arm32/arm32_boot.c:1.7.4.1 --- src/sys/arch/arm/arm32/arm32_boot.c:1.7 Fri Mar 28 21:39:09 2014 +++ src/sys/arch/arm/arm32/arm32_boot.c Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: arm32_boot.c,v 1.7 2014/03/28 21:39:09 matt Exp $ */ +/* $NetBSD: arm32_boot.c,v 1.7.4.1 2014/11/09 16:05:25 martin Exp $ */ /* * Copyright (c) 2002, 2003, 2005 Genetec Corporation. All rights reserved. @@ -123,10 +123,11 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: arm32_boot.c,v 1.7 2014/03/28 21:39:09 matt Exp $"); +__KERNEL_RCSID(1, "$NetBSD: arm32_boot.c,v 1.7.4.1 2014/11/09 16:05:25 martin Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" +#include "opt_multiprocessor.h" #include <sys/param.h> #include <sys/reboot.h> @@ -351,13 +352,13 @@ cpu_hatch(struct cpu_info *ci, cpuid_t c printf(" stacks"); #endif set_stackptr(PSR_FIQ32_MODE, - fiqstack.pv_va + cpu_index(ci) * FIQ_STACK_SIZE * PAGE_SIZE); + fiqstack.pv_va + (cpu_index(ci) + 1) * FIQ_STACK_SIZE * PAGE_SIZE); set_stackptr(PSR_IRQ32_MODE, - irqstack.pv_va + cpu_index(ci) * IRQ_STACK_SIZE * PAGE_SIZE); + irqstack.pv_va + (cpu_index(ci) + 1) * IRQ_STACK_SIZE * PAGE_SIZE); set_stackptr(PSR_ABT32_MODE, - abtstack.pv_va + cpu_index(ci) * ABT_STACK_SIZE * PAGE_SIZE); + abtstack.pv_va + (cpu_index(ci) + 1) * ABT_STACK_SIZE * PAGE_SIZE); set_stackptr(PSR_UND32_MODE, - undstack.pv_va + cpu_index(ci) * UND_STACK_SIZE * PAGE_SIZE); + undstack.pv_va + (cpu_index(ci) + 1) * UND_STACK_SIZE * PAGE_SIZE); ci->ci_lastlwp = NULL; ci->ci_pmap_lastuser = NULL; @@ -408,6 +409,7 @@ cpu_hatch(struct cpu_info *ci, cpuid_t c printf(" done!\n"); #endif atomic_and_32(&arm_cpu_mbox, ~(1 << cpuid)); + membar_producer(); __asm __volatile("sev; sev; sev"); } #endif /* MULTIPROCESSOR */ Index: src/sys/arch/arm/arm32/arm32_kvminit.c diff -u src/sys/arch/arm/arm32/arm32_kvminit.c:1.30 src/sys/arch/arm/arm32/arm32_kvminit.c:1.30.2.1 --- src/sys/arch/arm/arm32/arm32_kvminit.c:1.30 Fri May 23 13:24:15 2014 +++ src/sys/arch/arm/arm32/arm32_kvminit.c Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: arm32_kvminit.c,v 1.30 2014/05/23 13:24:15 kiyohara Exp $ */ +/* $NetBSD: arm32_kvminit.c,v 1.30.2.1 2014/11/09 16:05:25 martin Exp $ */ /* * Copyright (c) 2002, 2003, 2005 Genetec Corporation. All rights reserved. @@ -121,8 +121,10 @@ * SUCH DAMAGE. */ +#include "opt_multiprocessor.h" + #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: arm32_kvminit.c,v 1.30 2014/05/23 13:24:15 kiyohara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: arm32_kvminit.c,v 1.30.2.1 2014/11/09 16:05:25 martin Exp $"); #include <sys/param.h> #include <sys/device.h> Index: src/sys/arch/arm/arm32/arm32_machdep.c diff -u src/sys/arch/arm/arm32/arm32_machdep.c:1.105 src/sys/arch/arm/arm32/arm32_machdep.c:1.105.2.1 --- src/sys/arch/arm/arm32/arm32_machdep.c:1.105 Mon May 19 22:47:53 2014 +++ src/sys/arch/arm/arm32/arm32_machdep.c Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: arm32_machdep.c,v 1.105 2014/05/19 22:47:53 rmind Exp $ */ +/* $NetBSD: arm32_machdep.c,v 1.105.2.1 2014/11/09 16:05:25 martin Exp $ */ /* * Copyright (c) 1994-1998 Mark Brinicombe. @@ -42,11 +42,12 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: arm32_machdep.c,v 1.105 2014/05/19 22:47:53 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: arm32_machdep.c,v 1.105.2.1 2014/11/09 16:05:25 martin Exp $"); #include "opt_modular.h" #include "opt_md.h" #include "opt_pmap_debug.h" +#include "opt_multiprocessor.h" #include <sys/param.h> #include <sys/systm.h> Index: src/sys/arch/arm/arm32/arm32_tlb.c diff -u src/sys/arch/arm/arm32/arm32_tlb.c:1.2 src/sys/arch/arm/arm32/arm32_tlb.c:1.2.6.1 --- src/sys/arch/arm/arm32/arm32_tlb.c:1.2 Fri Apr 11 02:39:03 2014 +++ src/sys/arch/arm/arm32/arm32_tlb.c Sun Nov 9 16:05:25 2014 @@ -26,8 +26,11 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ + +#include "opt_multiprocessor.h" + #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: arm32_tlb.c,v 1.2 2014/04/11 02:39:03 matt Exp $"); +__KERNEL_RCSID(1, "$NetBSD: arm32_tlb.c,v 1.2.6.1 2014/11/09 16:05:25 martin Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -48,8 +51,9 @@ void tlb_set_asid(tlb_asid_t asid) { arm_dsb(); - if (asid == 0) { + if (asid == KERNEL_PID) { armreg_ttbcr_write(armreg_ttbcr_read() | TTBCR_S_PD0); + arm_isb(); } armreg_contextidr_write(asid); arm_isb(); @@ -60,7 +64,11 @@ tlb_invalidate_all(void) { const bool vivt_icache_p = arm_pcache.icache_type == CACHE_TYPE_VIVT; arm_dsb(); +#ifdef MULTIPROCESSOR + armreg_tlbiallis_write(0); +#else armreg_tlbiall_write(0); +#endif arm_isb(); if (__predict_false(vivt_icache_p)) { if (arm_has_tlbiasid_p) { @@ -85,7 +93,7 @@ tlb_invalidate_asids(tlb_asid_t lo, tlb_ arm_dsb(); if (arm_has_tlbiasid_p) { for (; lo <= hi; lo++) { - armreg_tlbiasid_write(lo); + armreg_tlbiasidis_write(lo); } arm_isb(); if (__predict_false(vivt_icache_p)) { @@ -107,7 +115,11 @@ tlb_invalidate_addr(vaddr_t va, tlb_asid arm_dsb(); va = trunc_page(va) | asid; for (vaddr_t eva = va + PAGE_SIZE; va < eva; va += L2_S_SIZE) { +#ifdef MULTIPROCESSOR + armreg_tlbimvais_write(va); +#else armreg_tlbimva_write(va); +#endif //armreg_tlbiall_write(asid); } arm_isb(); Index: src/sys/arch/arm/arm32/db_interface.c diff -u src/sys/arch/arm/arm32/db_interface.c:1.52 src/sys/arch/arm/arm32/db_interface.c:1.52.4.1 --- src/sys/arch/arm/arm32/db_interface.c:1.52 Sun Mar 30 08:00:34 2014 +++ src/sys/arch/arm/arm32/db_interface.c Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: db_interface.c,v 1.52 2014/03/30 08:00:34 skrll Exp $ */ +/* $NetBSD: db_interface.c,v 1.52.4.1 2014/11/09 16:05:25 martin Exp $ */ /* * Copyright (c) 1996 Scott K. Stevens @@ -35,10 +35,11 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.52 2014/03/30 08:00:34 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.52.4.1 2014/11/09 16:05:25 martin Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" +#include "opt_multiprocessor.h" #include <sys/param.h> #include <sys/proc.h> Index: src/sys/arch/arm/arm32/db_machdep.c diff -u src/sys/arch/arm/arm32/db_machdep.c:1.21 src/sys/arch/arm/arm32/db_machdep.c:1.21.4.1 --- src/sys/arch/arm/arm32/db_machdep.c:1.21 Sun Mar 30 08:00:34 2014 +++ src/sys/arch/arm/arm32/db_machdep.c Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: db_machdep.c,v 1.21 2014/03/30 08:00:34 skrll Exp $ */ +/* $NetBSD: db_machdep.c,v 1.21.4.1 2014/11/09 16:05:25 martin Exp $ */ /* * Copyright (c) 1996 Mark Brinicombe @@ -33,7 +33,7 @@ #endif #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: db_machdep.c,v 1.21 2014/03/30 08:00:34 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: db_machdep.c,v 1.21.4.1 2014/11/09 16:05:25 martin Exp $"); #include <sys/param.h> #include <sys/cpu.h> @@ -337,7 +337,7 @@ tlb_print_cortex_a7_entry(size_t way, si const u_int sh = __SHIFTOUT(d2, ARM_A7_TLBDATA2_SH); static const char is_types[3][3] = { "NC", "WB", "WT" }; static const char os_types[4][6] = { "NC", "WB+WA", "WT", "WB" }; - static const char sh_types[4][3] = { "NC", "na", "OS", "IS" }; + static const char sh_types[4][3] = { "NS", "na", "OS", "IS" }; db_printf(" %2s %5s %2s\n", is_types[is], os_types[os], sh_types[sh]); } Index: src/sys/arch/arm/arm32/pmap.c diff -u src/sys/arch/arm/arm32/pmap.c:1.295.2.1 src/sys/arch/arm/arm32/pmap.c:1.295.2.2 --- src/sys/arch/arm/arm32/pmap.c:1.295.2.1 Thu Oct 30 12:14:36 2014 +++ src/sys/arch/arm/arm32/pmap.c Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.295.2.1 2014/10/30 12:14:36 martin Exp $ */ +/* $NetBSD: pmap.c,v 1.295.2.2 2014/11/09 16:05:25 martin Exp $ */ /* * Copyright 2003 Wasabi Systems, Inc. @@ -216,7 +216,7 @@ #include <arm/locore.h> //#include <arm/arm32/katelib.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.295.2.1 2014/10/30 12:14:36 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.295.2.2 2014/11/09 16:05:25 martin Exp $"); //#define PMAP_DEBUG #ifdef PMAP_DEBUG @@ -1312,7 +1312,7 @@ pmap_alloc_l1(pmap_t pm) KASSERTMSG(kernel_map != NULL, "pm %p", pm); vaddr_t va = uvm_km_alloc(kernel_map, PAGE_SIZE, 0, UVM_KMF_WIRED|UVM_KMF_ZERO); - KASSERT(!va); + KASSERT(va); pmap_extract(pmap_kernel(), va, &pm->pm_l1_pa); #endif pm->pm_l1 = (pd_entry_t *)va; @@ -2506,11 +2506,14 @@ pmap_clearbit(struct vm_page_md *md, pad } if (npte != opte) { - l2pte_set(ptep, npte, opte); + l2pte_reset(ptep); PTE_SYNC(ptep); /* Flush the TLB entry if a current pmap. */ pmap_tlb_flush_SE(pm, va, oflags); + + l2pte_set(ptep, npte, 0); + PTE_SYNC(ptep); } pmap_release_pmap_lock(pm); @@ -2665,6 +2668,9 @@ pmap_syncicache_page(struct vm_page_md * for (size_t i = 0, j = 0; i < way_size; i += PAGE_SIZE, j += PAGE_SIZE / L2_S_SIZE) { + l2pte_reset(ptep + j); + PTE_SYNC(ptep + j); + pmap_tlb_flush_SE(kpm, dstp + i, PVF_REF | PVF_EXEC); /* * Set up a PTE with to flush these cache lines. @@ -2893,10 +2899,6 @@ pmap_page_remove(struct vm_page_md *md, pmap_release_page_lock(md); pmap_acquire_pmap_lock(pm); -#ifdef ARM_MMU_EXTENDED - pmap_tlb_invalidate_addr(pm, pv->pv_va); -#endif - l2b = pmap_get_l2_bucket(pm, pv->pv_va); KASSERTMSG(l2b != NULL, "%#lx", pv->pv_va); @@ -2918,7 +2920,14 @@ pmap_page_remove(struct vm_page_md *md, */ l2pte_reset(ptep); PTE_SYNC_CURRENT(pm, ptep); + +#ifdef ARM_MMU_EXTENDED + /* XXXNH pmap_tlb_flush_SE()? */ + pmap_tlb_invalidate_addr(pm, pv->pv_va); +#endif + pmap_free_l2_bucket(pm, l2b, PAGE_SIZE / L2_S_SIZE); + pmap_release_pmap_lock(pm); pool_put(&pmap_pv_pool, pv); @@ -3317,8 +3326,12 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_ * identical, so there's no need to update the page table. */ if (npte != opte) { - - l2pte_set(ptep, npte, opte); + l2pte_reset(ptep); + PTE_SYNC(ptep); + if (l2pte_valid_p(opte)) { + pmap_tlb_flush_SE(pm, va, oflags); + } + l2pte_set(ptep, npte, 0); PTE_SYNC(ptep); #ifndef ARM_MMU_EXTENDED bool is_cached = pmap_is_cached(pm); @@ -3346,8 +3359,6 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_ } #endif /* !ARMM_MMU_EXTENDED */ - pmap_tlb_flush_SE(pm, va, oflags); - #ifndef ARM_MMU_EXTENDED UVMHIST_LOG(maphist, " is_cached %d cs 0x%08x\n", is_cached, pm->pm_cstate.cs_all, 0, 0); @@ -3491,6 +3502,7 @@ pmap_remove(pmap_t pm, vaddr_t sva, vadd */ l2pte_reset(ptep); PTE_SYNC_CURRENT(pm, ptep); + pmap_tlb_flush_SE(pm, sva, flags); continue; } @@ -3498,7 +3510,7 @@ pmap_remove(pmap_t pm, vaddr_t sva, vadd if (pm == pmap_kernel()) { l2pte_reset(ptep); PTE_SYNC(ptep); - pmap_tlb_flush_SE(pm, sva, flags); + pmap_tlb_flush_SE(pm, sva, flags); continue; } #endif @@ -3541,6 +3553,8 @@ pmap_remove(pmap_t pm, vaddr_t sva, vadd if (cleanlist_idx <= PMAP_REMOVE_CLEAN_LIST_SIZE) { total += cleanlist_idx; for (cnt = 0; cnt < cleanlist_idx; cnt++) { + l2pte_reset(cleanlist[cnt].ptep); + PTE_SYNC_CURRENT(pm, cleanlist[cnt].ptep); #ifdef ARM_MMU_EXTENDED vaddr_t clva = cleanlist[cnt].va; pmap_tlb_flush_SE(pm, clva, PVF_REF); @@ -3557,8 +3571,6 @@ pmap_remove(pmap_t pm, vaddr_t sva, vadd PVF_REF | flags); } #endif /* ARM_MMU_EXTENDED */ - l2pte_reset(cleanlist[cnt].ptep); - PTE_SYNC_CURRENT(pm, cleanlist[cnt].ptep); } /* @@ -3692,6 +3704,8 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, v } #endif if (l2pte_valid_p(opte)) { + l2pte_reset(ptep); + PTE_SYNC(ptep); #ifdef PMAP_CACHE_VIVT cpu_dcache_wbinv_range(va, PAGE_SIZE); #endif @@ -3709,7 +3723,7 @@ pmap_kenter_pa(vaddr_t va, paddr_t pa, v if (prot & VM_PROT_EXECUTE) npte &= ~L2_XS_XN; #endif - l2pte_set(ptep, npte, opte); + l2pte_set(ptep, npte, 0); PTE_SYNC(ptep); if (pg) { @@ -3798,7 +3812,8 @@ pmap_kremove(vaddr_t va, vsize_t len) if (next_bucket > eva) next_bucket = eva; - struct l2_bucket * const l2b = pmap_get_l2_bucket(pmap_kernel(), va); + pmap_t kpm = pmap_kernel(); + struct l2_bucket * const l2b = pmap_get_l2_bucket(kpm, va); KDASSERT(l2b != NULL); pt_entry_t * const sptep = &l2b->l2b_kva[l2pte_index(va)]; @@ -3833,13 +3848,13 @@ pmap_kremove(vaddr_t va, vsize_t len) } } if (l2pte_valid_p(opte)) { + l2pte_reset(ptep); + PTE_SYNC(ptep); #ifdef PMAP_CACHE_VIVT cpu_dcache_wbinv_range(va, PAGE_SIZE); #endif cpu_tlb_flushD_SE(va); - } - if (opte) { - l2pte_reset(ptep); + mappings += PAGE_SIZE / L2_S_SIZE; } va += PAGE_SIZE; @@ -3848,7 +3863,7 @@ pmap_kremove(vaddr_t va, vsize_t len) KDASSERTMSG(mappings <= l2b->l2b_occupancy, "%u %u", mappings, l2b->l2b_occupancy); l2b->l2b_occupancy -= mappings; - PTE_SYNC_RANGE(sptep, (u_int)(ptep - sptep)); + //PTE_SYNC_RANGE(sptep, (u_int)(ptep - sptep)); #ifdef UVMHIST total_mappings += mappings; #endif @@ -3947,9 +3962,11 @@ pmap_protect(pmap_t pm, vaddr_t sva, vad pmap_acquire_pmap_lock(pm); +#ifndef ARM_MMU_EXTENDED const bool flush = eva - sva >= PAGE_SIZE * 4; - u_int clr_mask = PVF_WRITE | ((prot & VM_PROT_EXECUTE) ? 0 : PVF_EXEC); u_int flags = 0; +#endif + u_int clr_mask = PVF_WRITE | ((prot & VM_PROT_EXECUTE) ? 0 : PVF_EXEC); while (sva < eva) { next_bucket = L2_NEXT_BUCKET_VA(sva); @@ -3968,7 +3985,9 @@ pmap_protect(pmap_t pm, vaddr_t sva, vad const pt_entry_t opte = *ptep; if (l2pte_valid_p(opte) && l2pte_writable_p(opte)) { struct vm_page *pg; +#ifndef ARM_MMU_EXTENDED u_int f; +#endif #ifdef PMAP_CACHE_VIVT /* @@ -3982,7 +4001,12 @@ pmap_protect(pmap_t pm, vaddr_t sva, vad pg = PHYS_TO_VM_PAGE(l2pte_pa(opte)); pt_entry_t npte = l2pte_set_readonly(opte); - l2pte_set(ptep, npte, opte); + l2pte_reset(ptep); + PTE_SYNC(ptep); +#ifdef ARM_MMU_EXTENDED + pmap_tlb_flush_SE(pm, sva, PVF_REF); +#endif + l2pte_set(ptep, npte, 0); PTE_SYNC(ptep); if (pg != NULL) { @@ -3990,10 +4014,14 @@ pmap_protect(pmap_t pm, vaddr_t sva, vad paddr_t pa = VM_PAGE_TO_PHYS(pg); pmap_acquire_page_lock(md); - f = pmap_modify_pv(md, pa, pm, sva, - clr_mask, 0); +#ifndef ARM_MMU_EXTENDED + f = +#endif + pmap_modify_pv(md, pa, pm, sva, + clr_mask, 0); pmap_vac_me_harder(md, pa, pm, sva); pmap_release_page_lock(md); +#ifndef ARM_MMU_EXTENDED } else { f = PVF_REF | PVF_EXEC; } @@ -4002,6 +4030,7 @@ pmap_protect(pmap_t pm, vaddr_t sva, vad flags |= f; } else { pmap_tlb_flush_SE(pm, sva, f); +#endif } } @@ -4010,6 +4039,7 @@ pmap_protect(pmap_t pm, vaddr_t sva, vad } } +#ifndef ARM_MMU_EXTENDED if (flush) { if (PV_BEEN_EXECD(flags)) { pmap_tlb_flushID(pm); @@ -4017,6 +4047,7 @@ pmap_protect(pmap_t pm, vaddr_t sva, vad pmap_tlb_flushD(pm); } } +#endif pmap_release_pmap_lock(pm); } @@ -4215,12 +4246,15 @@ pmap_prefetchabt_fixup(void *v) KASSERT(pv != NULL); if (PV_IS_EXEC_P(pv->pv_flags)) { + l2pte_reset(ptep); + PTE_SYNC(ptep); + pmap_tlb_flush_SE(pm, va, PVF_EXEC | PVF_REF); if (!PV_IS_EXEC_P(md->pvh_attrs)) { pmap_syncicache_page(md, pa); } rv = ABORT_FIXUP_RETURN; - l2pte_set(ptep, opte & ~L2_XS_XN, opte); - pmap_tlb_flush_SE(pm, va, PVF_EXEC | PVF_REF); + l2pte_set(ptep, opte & ~L2_XS_XN, 0); + PTE_SYNC(ptep); } pmap_release_page_lock(md); @@ -4366,7 +4400,11 @@ pmap_fault_fixup(pmap_t pm, vaddr_t va, | (pm != pmap_kernel() ? L2_XS_nG : 0) #endif | 0; - l2pte_set(ptep, npte, opte); + l2pte_reset(ptep); + PTE_SYNC(ptep); + pmap_tlb_flush_SE(pm, va, + (ftype & VM_PROT_EXECUTE) ? PVF_EXEC | PVF_REF : PVF_REF); + l2pte_set(ptep, npte, 0); PTE_SYNC(ptep); PMAPCOUNT(fixup_mod); rv = 1; @@ -4433,7 +4471,11 @@ pmap_fault_fixup(pmap_t pm, vaddr_t va, } #endif /* ARM_MMU_EXTENDED */ pmap_release_page_lock(md); - l2pte_set(ptep, npte, opte); + l2pte_reset(ptep); + PTE_SYNC(ptep); + pmap_tlb_flush_SE(pm, va, + (ftype & VM_PROT_EXECUTE) ? PVF_EXEC | PVF_REF : PVF_REF); + l2pte_set(ptep, npte, 0); PTE_SYNC(ptep); PMAPCOUNT(fixup_ref); rv = 1; @@ -4471,7 +4513,10 @@ pmap_fault_fixup(pmap_t pm, vaddr_t va, * Turn off no-execute. */ KASSERT(opte & L2_XS_nG); - l2pte_set(ptep, opte & ~L2_XS_XN, opte); + l2pte_reset(ptep); + PTE_SYNC(ptep); + pmap_tlb_flush_SE(pm, va, PVF_EXEC | PVF_REF); + l2pte_set(ptep, opte & ~L2_XS_XN, 0); PTE_SYNC(ptep); rv = 1; PMAPCOUNT(fixup_exec); @@ -4539,6 +4584,7 @@ pmap_fault_fixup(pmap_t pm, vaddr_t va, } #endif +#ifndef MULTIPROCESSOR #if defined(DEBUG) || 1 /* * If 'rv == 0' at this point, it generally indicates that there is a @@ -4618,9 +4664,7 @@ pmap_fault_fixup(pmap_t pm, vaddr_t va, #endif } #endif - - pmap_tlb_flush_SE(pm, va, - (ftype & VM_PROT_EXECUTE) ? PVF_EXEC | PVF_REF : PVF_REF); +#endif rv = 1; @@ -4880,7 +4924,6 @@ pmap_deactivate(struct lwp *l) #ifdef ARM_MMU_EXTENDED kpreempt_disable(); struct cpu_info * const ci = curcpu(); - struct pmap_asid_info * const pai = PMAP_PAI(pm, cpu_tlb_info(ci)); /* * Disable translation table walks from TTBR0 while no pmap has been * activated. @@ -4889,7 +4932,7 @@ pmap_deactivate(struct lwp *l) armreg_ttbcr_write(old_ttbcr | TTBCR_S_PD0); arm_isb(); pmap_tlb_asid_deactivate(pm); - cpu_setttb(pmap_kernel()->pm_l1_pa, pai->pai_asid); + cpu_setttb(pmap_kernel()->pm_l1_pa, KERNEL_PID); ci->ci_pmap_cur = pmap_kernel(); kpreempt_enable(); #else @@ -4929,6 +4972,11 @@ pmap_update(pmap_t pm) } #ifdef ARM_MMU_EXTENDED +#if defined(MULTIPROCESSOR) + armreg_bpiallis_write(0); +#else + armreg_bpiall_write(0); +#endif #if defined(MULTIPROCESSOR) && PMAP_MAX_TLB > 1 u_int pending = atomic_swap_uint(&pmap->pm_shootdown_pending, 0); Index: src/sys/arch/arm/cortex/a9_mpsubr.S diff -u src/sys/arch/arm/cortex/a9_mpsubr.S:1.18 src/sys/arch/arm/cortex/a9_mpsubr.S:1.18.2.1 --- src/sys/arch/arm/cortex/a9_mpsubr.S:1.18 Wed May 21 01:02:45 2014 +++ src/sys/arch/arm/cortex/a9_mpsubr.S Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: a9_mpsubr.S,v 1.18 2014/05/21 01:02:45 ozaki-r Exp $ */ +/* $NetBSD: a9_mpsubr.S,v 1.18.2.1 2014/11/09 16:05:25 martin Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. * All rights reserved. @@ -343,8 +343,8 @@ cortex_init: bxne r10 // return if set #endif -#if defined(CPU_CORTEXA7) mrc p15, 0, r4, c1, c0, 0 // SCTLR read +#if defined(CPU_CORTEXA7) // // Before turning on SMP, turn off the caches and the MMU. // @@ -369,9 +369,9 @@ cortex_init: #ifdef __ARMEB__ setend le #endif - ldr r0, [r3, #SCU_CFG] // read scu config - and r0, r0, #7 // get cpu max - add r0, r0, #2 // adjust to cpu num shift + mrc p15, 0, r0, c0, c0, 5 // MPIDR get + and r0, r0, #3 // get our cpu numder + lsl r0, r0, #2 // adjust to cpu num shift mov r1, #0xf // select all ways lsl r1, r1, r0 // shift into place str r1, [r3, #SCU_INV_ALL_REG] // write scu invalidate all @@ -443,26 +443,37 @@ cortex_init: mcr p15, 0, r1, c8, c7, 0 // TLBIALL (just this core) #endif + // For the A7, SMP must be on ldrex/strex to work. + // +#if defined(MULTIPROCESSOR) || defined(CPU_CORTEXA7) || defined(CPU_CORTEXA9) +#if defined(CPU_CORTEXA5) || defined(CPU_CORTEXA7) || defined(CPU_CORTEXA9) // - // Step 4b, set ACTLR.SMP=1 + // Step 4a, set ACTLR.SMP=1 // mrc p15, 0, r0, c1, c0, 1 // ACTLR read orr r0, r0, #CORTEXA9_AUXCTL_SMP // enable SMP - mcr p15, 0, r0, c1, c0, 1 // ACTLR write - isb -#if defined(MULTIPROCESSOR) && (defined(CPU_CORTEXA5) || defined(CPU_CORTEXA7) || defined(CPU_CORTEXA9)) +#if defined(CPU_CORTEXA5) || defined(CPU_CORTEXA9) // - // Step 4b (continued on A5/A9), ACTRL.FW=1) + // Step 4a (continued on A5/A9), ACTLR.FW=1) // orr r0, r0, #CORTEXA9_AUXCTL_FW // enable cache/tlb/coherency - mcr p15, 0, r0, c1, c0, 1 // ACTRL write +#endif /* A5 || A9 */ +#if defined(CPU_CORTEXA9) + // + // Step 4b (continued on A9), ACTLR.L2PE=1) + // + orr r0, r0, #CORTEXA9_AUXCTL_L2PE // enable L2 cache prefetch +#endif + + mcr p15, 0, r0, c1, c0, 1 // ACTLR write isb dsb -#endif +#endif /* A5 || A7 || A9 */ +#endif /* MULTIPROCESSOR */ // - // Step 4a, resoter SCTRL (enable the data cache) + // Step 4b, restore SCTRL (enable the data cache) // orr r4, r4, #CPU_CONTROL_IC_ENABLE // enable icache orr r4, r4, #CPU_CONTROL_DC_ENABLE // enable dcache @@ -509,7 +520,7 @@ cortex_mpstart: #if 0 mrc p15, 0, r0, c1, c1, 2 // NSACR read - // Allow non-secure access to ACTRL[SMP] + // Allow non-secure access to ACTLR[SMP] orr r0, r0, #NSACR_SMP #ifdef FPU_VFP // Allow non-secure access to VFP/Neon Index: src/sys/arch/arm/cortex/gic.c diff -u src/sys/arch/arm/cortex/gic.c:1.10 src/sys/arch/arm/cortex/gic.c:1.10.2.1 --- src/sys/arch/arm/cortex/gic.c:1.10 Mon May 19 22:47:53 2014 +++ src/sys/arch/arm/cortex/gic.c Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: gic.c,v 1.10 2014/05/19 22:47:53 rmind Exp $ */ +/* $NetBSD: gic.c,v 1.10.2.1 2014/11/09 16:05:25 martin Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. * All rights reserved. @@ -29,11 +29,12 @@ */ #include "opt_ddb.h" +#include "opt_multiprocessor.h" #define _INTR_PRIVATE #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: gic.c,v 1.10 2014/05/19 22:47:53 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: gic.c,v 1.10.2.1 2014/11/09 16:05:25 martin Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -349,11 +350,13 @@ armgic_establish_irq(struct pic_softc *p * to the primary cpu. */ targets &= ~(0xff << byte_shift); +#if 0 #ifdef MULTIPROCESSOR if (is->is_mpsafe) { - targets |= sc->sc_mptargets; + targets |= sc->sc_mptargets << byte_shift; } else #endif +#endif targets |= 1 << byte_shift; gicd_write(sc, targets_reg, targets); @@ -442,7 +445,7 @@ armgic_cpu_init_targets(struct armgic_so struct intrsource * const is = sc->sc_pic.pic_sources[irq]; const bus_size_t targets_reg = GICD_ITARGETSRn(irq / 4); if (is != NULL && is->is_mpsafe) { - const u_int byte_shift = 0xff << (8 * (irq & 3)); + const u_int byte_shift = 8 * (irq & 3); uint32_t targets = gicd_read(sc, targets_reg); targets |= sc->sc_mptargets << byte_shift; gicd_write(sc, targets_reg, targets); Index: src/sys/arch/arm/include/armreg.h diff -u src/sys/arch/arm/include/armreg.h:1.97 src/sys/arch/arm/include/armreg.h:1.97.2.1 --- src/sys/arch/arm/include/armreg.h:1.97 Mon Apr 14 20:50:47 2014 +++ src/sys/arch/arm/include/armreg.h Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: armreg.h,v 1.97 2014/04/14 20:50:47 matt Exp $ */ +/* $NetBSD: armreg.h,v 1.97.2.1 2014/11/09 16:05:25 martin Exp $ */ /* * Copyright (c) 1998, 2001 Ben Harris @@ -417,16 +417,6 @@ #define ARM1176_AUXCTL_FSD 0x40000000 /* force speculative ops disable */ #define ARM1176_AUXCTL_FIO 0x80000000 /* low intr latency override */ -/* Cortex-A9 Auxiliary Control Register (CP15 register 1, opcode2 1) */ -#define CORTEXA9_AUXCTL_PARITY 0x00000200 /* Enable parity */ -#define CORTEXA9_AUXCTL_1WAY 0x00000100 /* Alloc in one way only */ -#define CORTEXA9_AUXCTL_EXCL 0x00000080 /* Exclusive cache */ -#define CORTEXA9_AUXCTL_SMP 0x00000040 /* CPU is in SMP mode */ -#define CORTEXA9_AUXCTL_WRZERO 0x00000008 /* Write full line of zeroes */ -#define CORTEXA9_AUXCTL_L1PLD 0x00000004 /* L1 Dside prefetch */ -#define CORTEXA9_AUXCTL_L2PLD 0x00000002 /* L2 Dside prefetch */ -#define CORTEXA9_AUXCTL_FW 0x00000001 /* Forward Cache/TLB ops */ - /* XScale Auxiliary Control Register (CP15 register 1, opcode2 1) */ #define XSCALE_AUXCTL_K 0x00000001 /* dis. write buffer coalescing */ #define XSCALE_AUXCTL_P 0x00000002 /* ECC protect page table access */ @@ -448,8 +438,8 @@ /* Cortex-A9 Auxiliary Control Register (CP15 register 1, opcode 1) */ #define CORTEXA9_AUXCTL_FW 0x00000001 /* Cache and TLB updates broadcast */ -#define CORTEXA9_AUXCTL_L2_PLD 0x00000002 /* Prefetch hint enable */ -#define CORTEXA9_AUXCTL_L1_PLD 0x00000004 /* Data prefetch hint enable */ +#define CORTEXA9_AUXCTL_L2PE 0x00000002 /* Prefetch hint enable */ +#define CORTEXA9_AUXCTL_L1PE 0x00000004 /* Data prefetch hint enable */ #define CORTEXA9_AUXCTL_WR_ZERO 0x00000008 /* Ena. write full line of 0s mode */ #define CORTEXA9_AUXCTL_SMP 0x00000040 /* Coherency is active */ #define CORTEXA9_AUXCTL_EXCL 0x00000080 /* Exclusive cache bit */ @@ -922,12 +912,13 @@ ARMREG_READ_INLINE(dfar, "p15,0,%0,c6,c0 ARMREG_READ_INLINE(ifar, "p15,0,%0,c6,c0,2") /* Instruction Fault Address Register */ /* cp15 c7 registers */ ARMREG_WRITE_INLINE(icialluis, "p15,0,%0,c7,c1,0") /* Instruction Inv All (IS) */ -ARMREG_WRITE_INLINE(bpiallis, "p15,0,%0,c7,c1,6") /* Branch Invalidate All (IS) */ +ARMREG_WRITE_INLINE(bpiallis, "p15,0,%0,c7,c1,6") /* Branch Predictor Invalidate All (IS) */ ARMREG_READ_INLINE(par, "p15,0,%0,c7,c4,0") /* Physical Address Register */ ARMREG_WRITE_INLINE(iciallu, "p15,0,%0,c7,c5,0") /* Instruction Invalidate All */ ARMREG_WRITE_INLINE(icimvau, "p15,0,%0,c7,c5,1") /* Instruction Invalidate MVA */ ARMREG_WRITE_INLINE(isb, "p15,0,%0,c7,c5,4") /* Instruction Synchronization Barrier */ -ARMREG_WRITE_INLINE(bpiall, "p15,0,%0,c5,c1,6") /* Breakpoint Invalidate All */ +ARMREG_WRITE_INLINE(bpiall, "p15,0,%0,c7,c5,6") /* Branch Predictor Invalidate All */ +ARMREG_WRITE_INLINE(bpimva, "p15,0,%0,c7,c5,7") /* Branch Predictor invalidate by MVA */ ARMREG_WRITE_INLINE(dcimvac, "p15,0,%0,c7,c6,1") /* Data Invalidate MVA to PoC */ ARMREG_WRITE_INLINE(dcisw, "p15,0,%0,c7,c6,2") /* Data Invalidate Set/Way */ ARMREG_WRITE_INLINE(ats1cpr, "p15,0,%0,c7,c8,0") /* AddrTrans CurState PL1 Read */ @@ -938,7 +929,7 @@ ARMREG_WRITE_INLINE(dccmvac, "p15,0,%0,c ARMREG_WRITE_INLINE(dccsw, "p15,0,%0,c7,c10,2") /* Data Clean Set/Way */ ARMREG_WRITE_INLINE(dsb, "p15,0,%0,c7,c10,4") /* Data Synchronization Barrier */ ARMREG_WRITE_INLINE(dmb, "p15,0,%0,c7,c10,5") /* Data Memory Barrier */ -ARMREG_WRITE_INLINE(dccmvau, "p15,0,%0,c7,c14,1") /* Data Clean MVA to PoU */ +ARMREG_WRITE_INLINE(dccmvau, "p15,0,%0,c7,c11,1") /* Data Clean MVA to PoU */ ARMREG_WRITE_INLINE(dccimvac, "p15,0,%0,c7,c14,1") /* Data Clean&Inv MVA to PoC */ ARMREG_WRITE_INLINE(dccisw, "p15,0,%0,c7,c14,2") /* Data Clean&Inv Set/Way */ /* cp15 c8 registers */ Index: src/sys/arch/arm/include/arm32/pmap.h diff -u src/sys/arch/arm/include/arm32/pmap.h:1.135 src/sys/arch/arm/include/arm32/pmap.h:1.135.2.1 --- src/sys/arch/arm/include/arm32/pmap.h:1.135 Thu Jul 31 08:04:57 2014 +++ src/sys/arch/arm/include/arm32/pmap.h Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.h,v 1.135 2014/07/31 08:04:57 skrll Exp $ */ +/* $NetBSD: pmap.h,v 1.135.2.1 2014/11/09 16:05:25 martin Exp $ */ /* * Copyright (c) 2002, 2003 Wasabi Systems, Inc. @@ -75,6 +75,7 @@ #ifndef _LOCORE #if defined(_KERNEL_OPT) #include "opt_arm32_pmap.h" +#include "opt_multiprocessor.h" #endif #include <arm/cpufunc.h> #include <uvm/uvm_object.h> Index: src/sys/arch/arm/mainbus/cpu_mainbus.c diff -u src/sys/arch/arm/mainbus/cpu_mainbus.c:1.15 src/sys/arch/arm/mainbus/cpu_mainbus.c:1.15.2.1 --- src/sys/arch/arm/mainbus/cpu_mainbus.c:1.15 Thu Jun 5 03:46:26 2014 +++ src/sys/arch/arm/mainbus/cpu_mainbus.c Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu_mainbus.c,v 1.15 2014/06/05 03:46:26 matt Exp $ */ +/* $NetBSD: cpu_mainbus.c,v 1.15.2.1 2014/11/09 16:05:25 martin Exp $ */ /* * Copyright (c) 1995 Mark Brinicombe. @@ -42,9 +42,10 @@ */ #include "locators.h" +#include "opt_multiprocessor.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cpu_mainbus.c,v 1.15 2014/06/05 03:46:26 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpu_mainbus.c,v 1.15.2.1 2014/11/09 16:05:25 martin Exp $"); #include <sys/param.h> #include <sys/systm.h> Index: src/sys/arch/arm/pic/pic.c diff -u src/sys/arch/arm/pic/pic.c:1.22 src/sys/arch/arm/pic/pic.c:1.22.2.1 --- src/sys/arch/arm/pic/pic.c:1.22 Mon May 19 22:47:53 2014 +++ src/sys/arch/arm/pic/pic.c Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: pic.c,v 1.22 2014/05/19 22:47:53 rmind Exp $ */ +/* $NetBSD: pic.c,v 1.22.2.1 2014/11/09 16:05:25 martin Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. @@ -32,7 +32,7 @@ #include "opt_ddb.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.22 2014/05/19 22:47:53 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.22.2.1 2014/11/09 16:05:25 martin Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -119,7 +119,7 @@ pic_ipi_generic(void *arg) int pic_ipi_ddb(void *arg) { - printf("%s: %s: tf=%p\n", __func__, curcpu()->ci_cpuname, arg); +// printf("%s: %s: tf=%p\n", __func__, curcpu()->ci_cpuname, arg); kdb_trap(-1, arg); return 1; } @@ -646,7 +646,7 @@ pic_establish_intr(struct pic_softc *pic is->is_func = func; is->is_arg = arg; #ifdef MULTIPROCESSOR - is->is_mpsafe = (type & IST_MPSAFE); + is->is_mpsafe = (type & IST_MPSAFE) || ipl != IPL_VM; #endif if (pic->pic_ops->pic_source_name) Index: src/sys/arch/arm/pic/picvar.h diff -u src/sys/arch/arm/pic/picvar.h:1.10 src/sys/arch/arm/pic/picvar.h:1.10.2.1 --- src/sys/arch/arm/pic/picvar.h:1.10 Mon May 19 22:47:53 2014 +++ src/sys/arch/arm/pic/picvar.h Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: picvar.h,v 1.10 2014/05/19 22:47:53 rmind Exp $ */ +/* $NetBSD: picvar.h,v 1.10.2.1 2014/11/09 16:05:25 martin Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. * All rights reserved. @@ -30,6 +30,8 @@ #ifndef _ARM_PIC_PICVAR_H_ #define _ARM_PIC_PICVAR_H_ +#include "opt_multiprocessor.h" + #ifdef MULTIPROCESSOR #include <sys/kcpuset.h> #endif Index: src/sys/arch/evbarm/conf/BPI diff -u src/sys/arch/evbarm/conf/BPI:1.2.2.2 src/sys/arch/evbarm/conf/BPI:1.2.2.3 --- src/sys/arch/evbarm/conf/BPI:1.2.2.2 Wed Sep 10 09:37:51 2014 +++ src/sys/arch/evbarm/conf/BPI Sun Nov 9 16:05:25 2014 @@ -1,5 +1,5 @@ # -# $NetBSD: BPI,v 1.2.2.2 2014/09/10 09:37:51 martin Exp $ +# $NetBSD: BPI,v 1.2.2.3 2014/11/09 16:05:25 martin Exp $ # # BPI -- Banana Pi - an Allwinner A20 Eval Board Kernel # @@ -20,12 +20,11 @@ options RTC_OFFSET=0 # hardware clock i no makeoptions BOARDTYPE makeoptions BOARDTYPE="bpi" #options UVMHIST,UVMHIST_PRINT -options CPU_CORTEXA8 options CPU_CORTEXA7 -options ALLWINNER_A10 options ALLWINNER_A20 options PMAPCOUNTERS options AWIN_CONSOLE_EARLY +options MULTIPROCESSOR # Architecture options Index: src/sys/arch/evbarm/conf/CUBIETRUCK diff -u src/sys/arch/evbarm/conf/CUBIETRUCK:1.2.4.1 src/sys/arch/evbarm/conf/CUBIETRUCK:1.2.4.2 --- src/sys/arch/evbarm/conf/CUBIETRUCK:1.2.4.1 Wed Sep 10 09:37:51 2014 +++ src/sys/arch/evbarm/conf/CUBIETRUCK Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -# $NetBSD: CUBIETRUCK,v 1.2.4.1 2014/09/10 09:37:51 martin Exp $ +# $NetBSD: CUBIETRUCK,v 1.2.4.2 2014/11/09 16:05:25 martin Exp $ # # CUBIETRUCK - Cubieboard3 (mostly cubieboard2 with 2GB) # @@ -20,9 +20,6 @@ makeoptions BOARDTYPE="cubietruck" # options PMAP_NEED_ALLOC_POOLPAGE -# -# not fully working yet -# -# options MULTIPROCESSOR -# cpu* at mainbus? -# options VERBOSE_INIT_ARM # verbose bootstraping messages +options MULTIPROCESSOR +cpu* at mainbus? +#options VERBOSE_INIT_ARM # verbose bootstraping messages Index: src/sys/uvm/pmap/pmap_tlb.c diff -u src/sys/uvm/pmap/pmap_tlb.c:1.8 src/sys/uvm/pmap/pmap_tlb.c:1.8.4.1 --- src/sys/uvm/pmap/pmap_tlb.c:1.8 Thu Apr 3 14:46:25 2014 +++ src/sys/uvm/pmap/pmap_tlb.c Sun Nov 9 16:05:25 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_tlb.c,v 1.8 2014/04/03 14:46:25 matt Exp $ */ +/* $NetBSD: pmap_tlb.c,v 1.8.4.1 2014/11/09 16:05:25 martin 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.8 2014/04/03 14:46:25 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_tlb.c,v 1.8.4.1 2014/11/09 16:05:25 martin Exp $"); /* * Manages address spaces in a TLB. @@ -935,7 +935,7 @@ pmap_tlb_asid_deactivate(pmap_t pm) #endif curcpu()->ci_pmap_asid_cur = 0; UVMHIST_LOG(maphist, " <-- done (pm=%#x)", pm, 0, 0, 0); - tlb_set_asid(0); + tlb_set_asid(KERNEL_PID); #if defined(DEBUG) pmap_tlb_asid_check(); #endif