Module Name: src Committed By: matt Date: Mon Mar 1 19:29:42 UTC 2010
Modified Files: src/sys/arch/mips/include [matt-nb5-mips64]: cpu.h locore.h src/sys/arch/mips/mips [matt-nb5-mips64]: cpu_subr.c genassym.cf locore_mips3.S mipsX_subr.S mips_machdep.c Log Message: Add secondary processor spinup support (cpu_trampoline is in locore_mips3.S). Nuke lse_boot_secondary_processors (not needed). Move cpu_info_store to cpu_subr.C To generate a diff of this commit: cvs rdiff -u -r1.90.16.24 -r1.90.16.25 src/sys/arch/mips/include/cpu.h cvs rdiff -u -r1.78.36.1.2.19 -r1.78.36.1.2.20 \ src/sys/arch/mips/include/locore.h cvs rdiff -u -r1.1.2.1 -r1.1.2.2 src/sys/arch/mips/mips/cpu_subr.c cvs rdiff -u -r1.44.12.20 -r1.44.12.21 src/sys/arch/mips/mips/genassym.cf cvs rdiff -u -r1.93.38.7 -r1.93.38.8 src/sys/arch/mips/mips/locore_mips3.S cvs rdiff -u -r1.26.36.1.2.29 -r1.26.36.1.2.30 \ src/sys/arch/mips/mips/mipsX_subr.S cvs rdiff -u -r1.205.4.1.2.1.2.39 -r1.205.4.1.2.1.2.40 \ src/sys/arch/mips/mips/mips_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/include/cpu.h diff -u src/sys/arch/mips/include/cpu.h:1.90.16.24 src/sys/arch/mips/include/cpu.h:1.90.16.25 --- src/sys/arch/mips/include/cpu.h:1.90.16.24 Sun Feb 28 23:45:07 2010 +++ src/sys/arch/mips/include/cpu.h Mon Mar 1 19:29:41 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.90.16.24 2010/02/28 23:45:07 matt Exp $ */ +/* $NetBSD: cpu.h,v 1.90.16.25 2010/03/01 19:29:41 matt Exp $ */ /*- * Copyright (c) 1992, 1993 @@ -86,11 +86,18 @@ vaddr_t ci_pmap_srcbase; /* starting VA of ephemeral src space */ vaddr_t ci_pmap_dstbase; /* starting VA of ephemeral dst space */ #ifdef MULTIPROCESSOR + volatile u_long ci_flags; uint64_t ci_active_ipis; /* bitmask of IPIs being serviced */ uint32_t ci_ksp_tlb_slot; /* tlb entry for kernel stack */ void *ci_fpsave_si; /* FP sync softint handler */ struct evcnt ci_evcnt_all_ipis; /* aggregated IPI counter */ struct evcnt ci_evcnt_per_ipi[NIPIS]; /* individual IPI counters*/ + +#define CPUF_PRIMARY 0x01 /* CPU is primary CPU */ +#define CPUF_PRESENT 0x02 /* CPU is present */ +#define CPUF_RUNNING 0x04 /* CPU is running */ +#define CPUF_PAUSED 0x08 /* CPU is paused */ +#define CPUF_FPUSAVE 0x10 /* CPU is currently in fpusave_cpu() */ #endif }; @@ -400,11 +407,21 @@ extern int mips_poolpage_vmfreelist; /* freelist to allocate poolpages */ /* cpu_subr.c */ +#ifdef MULTIPROCESSOR +extern volatile u_long cpus_running; +extern volatile u_long cpus_hatched; +extern volatile u_long cpus_halted; +#endif + struct cpu_info * cpu_info_alloc(struct pmap_tlb_info *, u_int); void cpu_attach_common(device_t, struct cpu_info *); void cpu_startup_common(void); -void cpu_trampoline(struct cpu_info *ci); +#ifdef MULTIPROCESSOR +void cpu_hatch(struct cpu_info *ci); +void cpu_trampoline(void); +void cpu_boot_secondary_processors(void); +#endif /* copy.S */ int8_t ufetch_int8(void *); @@ -506,9 +523,6 @@ const struct phys_ram_seg *, size_t, const struct mips_vmfreelist *, size_t); void cpu_identify(device_t); -#ifdef MULTIPROCESSOR -void cpu_boot_secondary_processors(void); -#endif /* locore*.S */ int badaddr(void *, size_t); Index: src/sys/arch/mips/include/locore.h diff -u src/sys/arch/mips/include/locore.h:1.78.36.1.2.19 src/sys/arch/mips/include/locore.h:1.78.36.1.2.20 --- src/sys/arch/mips/include/locore.h:1.78.36.1.2.19 Mon Mar 1 19:26:00 2010 +++ src/sys/arch/mips/include/locore.h Mon Mar 1 19:29:41 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: locore.h,v 1.78.36.1.2.19 2010/03/01 19:26:00 matt Exp $ */ +/* $NetBSD: locore.h,v 1.78.36.1.2.20 2010/03/01 19:29:41 matt Exp $ */ /* * This file should not be included by MI code!!! @@ -347,7 +347,6 @@ uintptr_t lsw_lwp_trampoline; void (*lsw_cpu_idle)(void); uintptr_t lsw_setfunc_trampoline; - void (*lsw_boot_secondary_processors)(void); int (*lsw_send_ipi)(struct cpu_info *, int); void (*lsw_cpu_offline_md)(void); }; Index: src/sys/arch/mips/mips/cpu_subr.c diff -u src/sys/arch/mips/mips/cpu_subr.c:1.1.2.1 src/sys/arch/mips/mips/cpu_subr.c:1.1.2.2 --- src/sys/arch/mips/mips/cpu_subr.c:1.1.2.1 Sun Feb 28 23:45:06 2010 +++ src/sys/arch/mips/mips/cpu_subr.c Mon Mar 1 19:29:41 2010 @@ -32,7 +32,7 @@ #include "opt_multiprocessor.h" #include "opt_sa.h" -__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.1.2.1 2010/02/28 23:45:06 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.1.2.2 2010/03/01 19:29:41 matt Exp $"); #include <sys/param.h> #include <sys/cpu.h> @@ -42,6 +42,8 @@ #include <sys/proc.h> #include <sys/user.h> #include <sys/ras.h> +#include <sys/bitops.h> +#include <sys/idle.h> #ifdef KERN_SA #include <sys/sa.h> #include <sys/savar.h> @@ -51,11 +53,36 @@ #include <mips/locore.h> #include <mips/regnum.h> +#include <mips/cache.h> #include <mips/frame.h> #include <mips/userret.h> +#include <mips/pte.h> + +struct cpu_info cpu_info_store +#ifdef MULTIPROCESSOR + __section(".data1") + __aligned(1LU << ilog2((2*sizeof(struct cpu_info)-1))) +#endif + = { + .ci_curlwp = &lwp0, +#ifndef NOFPU + .ci_fpcurlwp = &lwp0, +#endif + .ci_tlb_info = &pmap_tlb0_info, + .ci_pmap_segbase = (void *)(MIPS_KSEG2_START + 0x1eadbeef), + .ci_cpl = IPL_HIGH, + .ci_tlb_slot = -1, +#ifdef MULTIPROCESSOR + .ci_flags = CPUF_PRIMARY|CPUF_PRESENT|CPUF_RUNNING, +#endif +}; #ifdef MULTIPROCESSOR +volatile u_long cpus_running = 1; +volatile u_long cpus_hatched = 1; +volatile u_long cpus_paused = 0; + static struct cpu_info *cpu_info_last = &cpu_info_store; struct cpu_info * @@ -103,16 +130,13 @@ ci->ci_divisor_recip = cpu_info_store.ci_divisor_recip; /* - * Tail insert this onto the list of cpu_info's. - */ - KASSERT(ci->ci_next == NULL); - KASSERT(cpu_info_last->ci_next == NULL); - cpu_info_last->ci_next = ci; - cpu_info_last = ci; - - /* - * Attach its TLB + * Attach its TLB info (which must be direct-mapped) */ +#ifdef _LP64 + KASSERT(MIPS_KSEG0_P(ti) || MIPS_XKPHYS_P(ti)); +#else + KASSERT(MIPS_KSEG0_P(ti)); +#endif pmap_tlb_info_attach(ti, ci); #ifndef _LP64 @@ -133,6 +157,12 @@ mi_cpu_attach(ci); + /* + * Switch the idle lwp to a direct mapped stack since we use its + * stack and we won't have a TLB entry for it. + */ + cpu_uarea_remap(ci->ci_data.cpu_idlelwp); + return ci; } #endif /* MULTIPROCESSOR */ @@ -147,6 +177,19 @@ self->dv_private = ci; #ifdef MULTIPROCESSOR + if (ci != &cpu_info_store) { + /* + * Tail insert this onto the list of cpu_info's. + */ + KASSERT(ci->ci_next == NULL); + KASSERT(cpu_info_last->ci_next == NULL); + cpu_info_last->ci_next = ci; + cpu_info_last = ci; + } + + /* + * Initialize IPI framework for this cpu instance + */ ipi_init(ci); #endif @@ -527,12 +570,77 @@ } void +cpu_hatch(struct cpu_info *ci) +{ + struct pmap_tlb_info * const ti = ci->ci_tlb_info; + const u_long cpu_mask = 1L << cpu_index(ci); + + /* + * Invalidate all the TLB enties (even wired ones) and then reserve + * space for the wired TLB entries. + */ + mips3_cp0_wired_write(0); + tlb_invalidate_all(); + mips3_cp0_wired_write(ti->ti_wired); + + /* + * If we are using register zero relative addressing to access cpu_info + * in the exception vectors, enter that mapping into TLB now. + */ + if (ci->ci_tlb_slot >= 0) { + const uint32_t tlb_lo = MIPS3_PG_G|MIPS3_PG_V + | mips3_paddr_to_tlbpfn((vaddr_t)ci); + + tlb_enter(ci->ci_tlb_slot, -PAGE_SIZE, tlb_lo); + } + + /* + * Flush the icache just be sure. + */ + mips_icache_sync_all(); + + /* + * Announce we are hatched + */ + atomic_or_ulong(&cpus_hatched, cpu_mask); + + /* + * Now wait to be set free! + */ + while ((cpus_running & cpu_mask) == 0) { + /* spin, spin, spin */ + } + + /* + * Now turn on interrupts. + */ + spl0(); + + /* + * And do a tail call to idle_loop + */ + idle_loop(NULL); +} + +void cpu_boot_secondary_processors(void) { - if (pmap_tlb0_info.ti_wired != MIPS3_TLB_WIRED_UPAGES) - mips3_cp0_wired_write(pmap_tlb0_info.ti_wired); + for (struct cpu_info *ci = cpu_info_store.ci_next; + ci != NULL; + ci = ci->ci_next) { + const u_long cpu_mask = 1L << cpu_index(ci); + KASSERT(!CPU_IS_PRIMARY(ci)); + KASSERT(ci->ci_data.cpu_idlelwp); + + /* + * Skip this CPU if it didn't sucessfully hatch. + */ + if ((cpus_hatched & cpu_mask) == 0) + continue; - (*mips_locoresw.lsw_boot_secondary_processors)(); + atomic_or_ulong(&ci->ci_flags, CPUF_RUNNING); + atomic_or_ulong(&cpus_running, cpu_mask); + } } #endif /* MULTIPROCESSOR */ Index: src/sys/arch/mips/mips/genassym.cf diff -u src/sys/arch/mips/mips/genassym.cf:1.44.12.20 src/sys/arch/mips/mips/genassym.cf:1.44.12.21 --- src/sys/arch/mips/mips/genassym.cf:1.44.12.20 Sun Feb 28 23:45:06 2010 +++ src/sys/arch/mips/mips/genassym.cf Mon Mar 1 19:29:41 2010 @@ -1,4 +1,4 @@ -# $NetBSD: genassym.cf,v 1.44.12.20 2010/02/28 23:45:06 matt Exp $ +# $NetBSD: genassym.cf,v 1.44.12.21 2010/03/01 19:29:41 matt Exp $ # # Copyright (c) 1992, 1993 # The Regents of the University of California. All rights reserved. @@ -284,6 +284,7 @@ define CPU_INFO_CPL offsetof(struct cpu_info, ci_cpl) define CPU_INFO_IDEPTH offsetof(struct cpu_info, ci_idepth) define CPU_INFO_CURLWP offsetof(struct cpu_info, ci_curlwp) +define CPU_INFO_IDLELWP offsetof(struct cpu_info, ci_data.cpu_idlelwp) ifndef NOFPU define CPU_INFO_FPCURLWP offsetof(struct cpu_info, ci_fpcurlwp) endif Index: src/sys/arch/mips/mips/locore_mips3.S diff -u src/sys/arch/mips/mips/locore_mips3.S:1.93.38.7 src/sys/arch/mips/mips/locore_mips3.S:1.93.38.8 --- src/sys/arch/mips/mips/locore_mips3.S:1.93.38.7 Thu Feb 25 05:45:12 2010 +++ src/sys/arch/mips/mips/locore_mips3.S Mon Mar 1 19:29:41 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: locore_mips3.S,v 1.93.38.7 2010/02/25 05:45:12 matt Exp $ */ +/* $NetBSD: locore_mips3.S,v 1.93.38.8 2010/03/01 19:29:41 matt Exp $ */ /* * Copyright (c) 1997 Jonathan Stone (hereinafter referred to as the author) @@ -83,6 +83,7 @@ #include "opt_cputype.h" #include "opt_ddb.h" #include "opt_lockdebug.h" +#include "opt_multiprocessor.h" #include "opt_kgdb.h" #include <sys/cdefs.h> @@ -572,3 +573,51 @@ j ra nop END(mips3_cp0_tlb_page_mask_probe) + +#ifdef MULTIPROCESSOR +/* + * The presence of this routine here will causes MIPS1 MULTIPROCESSOR kernels + * to fail, as they should since we won't support much abominations. + * + * MD code calls/jumps to with the pointer to this CPU's cpu_info in a1, + * sp set to ci->ci_data.cpu_idlwp->l_md.md_utf. gp will be overridden so + * 0 can be supplied if needed. (This happens to match what CFE wants) + */ +NESTED_NOPROFILE(cpu_trampoline, 0, ra) + /* + * We act as the idle lwp so make it CURLWP. When know + * that the cpu_info is a KSEG0 address. + */ + move a0, a1 + PTR_L MIPS_CURLWP, CPU_INFO_IDLELWP(a0) + nop + PTR_S MIPS_CURLWP, CPU_INFO_CURLWP(a0) + +#ifdef _LP64 + li v0, MIPS_SR_KX # allow 64bit addressing +#else + li v0, 0 +#endif + mtc0 v0, MIPS_COP_0_STATUS # reset to known state + COP0_SYNC + + /* + * Indicate that no one has called us. + */ + move ra, zero + REG_S ra, CALLFRAME_RA(sp) + +#ifdef __GP_SUPPORT__ + /* + * New execution constant needs GP to be loaded. + */ + PTR_LA gp, _C_LABEL(_gp) +#endif + + /* + * and off we go. + */ + j _C_LABEL(cpu_hatch) # does everything + nop +END(cpu_trampoline) +#endif /* MULTIPROCESSOR */ Index: src/sys/arch/mips/mips/mipsX_subr.S diff -u src/sys/arch/mips/mips/mipsX_subr.S:1.26.36.1.2.29 src/sys/arch/mips/mips/mipsX_subr.S:1.26.36.1.2.30 --- src/sys/arch/mips/mips/mipsX_subr.S:1.26.36.1.2.29 Sun Feb 28 03:28:54 2010 +++ src/sys/arch/mips/mips/mipsX_subr.S Mon Mar 1 19:29:41 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: mipsX_subr.S,v 1.26.36.1.2.29 2010/02/28 03:28:54 matt Exp $ */ +/* $NetBSD: mipsX_subr.S,v 1.26.36.1.2.30 2010/03/01 19:29:41 matt Exp $ */ /* * Copyright 2002 Wasabi Systems, Inc. @@ -2708,8 +2708,8 @@ PTR_WORD _C_LABEL(MIPSX(lwp_trampoline)) PTR_WORD _C_LABEL(nullop) # cpu_idle PTR_WORD _C_LABEL(MIPSX(setfunc_trampoline)) - PTR_WORD _C_LABEL(nullop) # boot secondary processors PTR_WORD _C_LABEL(nullop) # send ipi + PTR_WORD _C_LABEL(nullop) # cpu_offline_md PTR_WORD _C_LABEL(nullop) # spare PTR_WORD _C_LABEL(nullop) # spare Index: src/sys/arch/mips/mips/mips_machdep.c diff -u src/sys/arch/mips/mips/mips_machdep.c:1.205.4.1.2.1.2.39 src/sys/arch/mips/mips/mips_machdep.c:1.205.4.1.2.1.2.40 --- src/sys/arch/mips/mips/mips_machdep.c:1.205.4.1.2.1.2.39 Sun Feb 28 23:45:06 2010 +++ src/sys/arch/mips/mips/mips_machdep.c Mon Mar 1 19:29:41 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: mips_machdep.c,v 1.205.4.1.2.1.2.39 2010/02/28 23:45:06 matt Exp $ */ +/* $NetBSD: mips_machdep.c,v 1.205.4.1.2.1.2.40 2010/03/01 19:29:41 matt Exp $ */ /* * Copyright 2002 Wasabi Systems, Inc. @@ -112,7 +112,7 @@ #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ -__KERNEL_RCSID(0, "$NetBSD: mips_machdep.c,v 1.205.4.1.2.1.2.39 2010/02/28 23:45:06 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mips_machdep.c,v 1.205.4.1.2.1.2.40 2010/03/01 19:29:41 matt Exp $"); #define __INTR_PRIVATE @@ -175,11 +175,6 @@ u_long cpu_dump_mempagecnt(void); int cpu_dump(void); -#ifndef NOFPU -kmutex_t fp_lock __aligned(32); -kcondvar_t fp_cv __aligned(32); -#endif - #if defined(MIPS3_PLUS) uint32_t mips3_cp0_tlb_page_mask_probe(void); uint64_t mips3_cp0_tlb_entry_hi_probe(void); @@ -229,22 +224,6 @@ .mips_fpu_id = 0xffffffff, }; -struct cpu_info cpu_info_store -#ifdef MULTIPROCESSOR - __section(".data1") - __aligned(1LU << ilog2((2*sizeof(struct cpu_info)-1))) -#endif - = { - .ci_curlwp = &lwp0, -#ifndef NOFPU - .ci_fpcurlwp = &lwp0, -#endif - .ci_tlb_info = &pmap_tlb0_info, - .ci_pmap_segbase = (void *)(MIPS_KSEG2_START + 0x1eadbeef), - .ci_cpl = IPL_HIGH, - .ci_tlb_slot = -1, -}; - struct user *proc0paddr; void * msgbufaddr;