PERFORCE change 137679 for review
Marcel Moolenaar
marcel at FreeBSD.org
Fri Mar 14 04:12:55 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=137679
Change 137679 by marcel at marcel_xcllnt on 2008/03/14 04:12:39
Make the soft reset of the AP work. We actually get to
the EXC_RST vector on the second CPU:
Waking up CPU 1 (dev=ff880bc8)
XXX: 48000015 00000000 00000000 00000000 00000000 7c6802a6
XXX: 48000015 00000104 00043010 0000c000 00001000 7c6802a6
Most importantly: MSR=PSL_ME
Affected files ...
.. //depot/projects/powerpc/sys/powerpc/aim/mp_cpudep.c#2 edit
Differences ...
==== //depot/projects/powerpc/sys/powerpc/aim/mp_cpudep.c#2 (text+ko) ====
@@ -38,10 +38,13 @@
#include <machine/cpu.h>
#include <machine/intr_machdep.h>
#include <machine/smp.h>
+#include <machine/trap_aim.h>
#include <dev/ofw/openfirm.h>
#include <machine/ofw_machdep.h>
+extern void *rstcode;
+
static int
powerpc_smp_fill_cpuref(struct cpuref *cpuref, phandle_t cpu)
{
@@ -127,10 +130,25 @@
return (powerpc_smp_fill_cpuref(cpuref, bsp));
}
+static void
+dump_rstvec(void)
+{
+ uint32_t buf[6];
+
+ mtmsr(mfmsr() & ~(PSL_IR | PSL_DR));
+ isync();
+ bcopy((void *)EXC_RST, buf, sizeof(buf));
+ mtmsr(mfmsr() | PSL_IR | PSL_DR);
+
+ printf("XXX: %08x %08x %08x %08x %08x %08x\n", buf[0], buf[1], buf[2],
+ buf[3], buf[4], buf[5]);
+}
+
int
powerpc_smp_start_cpu(struct pcpu *pc)
{
phandle_t cpu;
+ volatile uint8_t *rstvec;
int res, reset;
cpu = pc->pc_hwref;
@@ -138,8 +156,19 @@
if (res < 0)
return (ENXIO);
- printf("XXX: reset=%d\n", reset);
- *(u_char *)(0x80000000 + reset) = 4;
- *(u_char *)(0x80000000 + reset) = 5;
+ dump_rstvec();
+
+ rstvec = (uint8_t *)(0x80000000 + reset);
+
+ *rstvec = 4;
+ __asm __volatile("sync");
+ DELAY(1);
+ *rstvec = 0;
+ __asm __volatile("sync");
+
+ DELAY(1000);
+
+ dump_rstvec();
+
return (0);
}
More information about the p4-projects
mailing list