svn commit: r206674 - in user/jmallett/octeon/sys/mips: cavium
include mips
Juli Mallett
jmallett at FreeBSD.org
Thu Apr 15 18:30:21 UTC 2010
Author: jmallett
Date: Thu Apr 15 18:30:21 2010
New Revision: 206674
URL: http://svn.freebsd.org/changeset/base/206674
Log:
o) Set the exception base on Octeon to the right thing on each AP.
o) Do a sync before accessing (and after setting) variables set for the AP
by the bootstrap processor. Otherwise we sometimes see a NULL dpcpu in
smp_init_secondary().
XXX All of the shared variables here really ought to be manipulated via
atomic operations.
o) Clear BEV on APs, too.
Modified:
user/jmallett/octeon/sys/mips/cavium/octeon_mp.c
user/jmallett/octeon/sys/mips/include/cpufunc.h
user/jmallett/octeon/sys/mips/mips/mp_machdep.c
user/jmallett/octeon/sys/mips/mips/mpboot.S
Modified: user/jmallett/octeon/sys/mips/cavium/octeon_mp.c
==============================================================================
--- user/jmallett/octeon/sys/mips/cavium/octeon_mp.c Thu Apr 15 17:46:51 2010 (r206673)
+++ user/jmallett/octeon/sys/mips/cavium/octeon_mp.c Thu Apr 15 18:30:21 2010 (r206674)
@@ -61,6 +61,12 @@ platform_ipi_intrnum(void)
void
platform_init_ap(int cpuid)
{
+ /*
+ * Set the exception base.
+ *
+ * XXX Low bits seem to be used for cpuid?
+ */
+ mips_wr_prid1(0x80000000);
}
int
Modified: user/jmallett/octeon/sys/mips/include/cpufunc.h
==============================================================================
--- user/jmallett/octeon/sys/mips/include/cpufunc.h Thu Apr 15 17:46:51 2010 (r206673)
+++ user/jmallett/octeon/sys/mips/include/cpufunc.h Thu Apr 15 18:30:21 2010 (r206674)
@@ -218,6 +218,8 @@ MIPS_RDRW32_COP0(entryhi, MIPS_COP_0_TLB
MIPS_RDRW32_COP0(pagemask, MIPS_COP_0_TLB_PG_MASK);
#endif
MIPS_RDRW32_COP0(prid, MIPS_COP_0_PRID);
+/* XXX 64-bit? */
+MIPS_RDRW32_COP0_SEL(prid, MIPS_COP_0_PRID, 1);
MIPS_RDRW32_COP0(watchlo, MIPS_COP_0_WATCH_LO);
MIPS_RDRW32_COP0_SEL(watchlo, MIPS_COP_0_WATCH_LO, 1);
MIPS_RDRW32_COP0_SEL(watchlo, MIPS_COP_0_WATCH_LO, 2);
@@ -232,7 +234,6 @@ MIPS_RDRW32_COP0_SEL(perfcnt, MIPS_COP_0
MIPS_RDRW32_COP0_SEL(perfcnt, MIPS_COP_0_PERFCNT, 2);
MIPS_RDRW32_COP0_SEL(perfcnt, MIPS_COP_0_PERFCNT, 3);
-
#undef MIPS_RDRW32_COP0
static __inline register_t
Modified: user/jmallett/octeon/sys/mips/mips/mp_machdep.c
==============================================================================
--- user/jmallett/octeon/sys/mips/mips/mp_machdep.c Thu Apr 15 17:46:51 2010 (r206673)
+++ user/jmallett/octeon/sys/mips/mips/mp_machdep.c Thu Apr 15 18:30:21 2010 (r206674)
@@ -157,6 +157,8 @@ start_ap(int cpuid)
cpus = mp_naps;
dpcpu = (void *)kmem_alloc(kernel_map, DPCPU_SIZE);
+ mips_sync();
+
if (platform_start_ap(cpuid) != 0)
return (-1); /* could not start AP */
@@ -246,6 +248,8 @@ smp_init_secondary(u_int32_t cpuid)
mips_dcache_wbinv_all();
mips_icache_sync_all();
+ mips_sync();
+
mips_wr_entryhi(0);
pcpu_init(PCPU_ADDR(cpuid), cpuid, sizeof(struct pcpu));
Modified: user/jmallett/octeon/sys/mips/mips/mpboot.S
==============================================================================
--- user/jmallett/octeon/sys/mips/mips/mpboot.S Thu Apr 15 17:46:51 2010 (r206673)
+++ user/jmallett/octeon/sys/mips/mips/mpboot.S Thu Apr 15 18:30:21 2010 (r206674)
@@ -41,7 +41,7 @@
mfc0 a0, COP_0_STATUS_REG ;\
li a2, (MIPS_SR_KX | MIPS_SR_SX | MIPS_SR_UX) ; \
or a0, a0, a2 ; \
- li a2, ~(MIPS_SR_INT_IE | MIPS_SR_EXL | SR_KSU_USER) ; \
+ li a2, ~(MIPS_SR_INT_IE | MIPS_SR_EXL | SR_KSU_USER | MIPS_SR_BEV) ; \
and a0, a0, a2 ; \
mtc0 a0, COP_0_STATUS_REG
#else
More information about the svn-src-user
mailing list