svn commit: r205352 - in projects/ppc64/sys/powerpc: aim include
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Sat Mar 20 02:23:58 UTC 2010
Author: nwhitehorn
Date: Sat Mar 20 02:23:58 2010
New Revision: 205352
URL: http://svn.freebsd.org/changeset/base/205352
Log:
Fixes for SMP support for powerpc64. This gets the system booted multiuser
on both threads in the Cell simulator, and adds speculative support for
G5 systems.
Modified:
projects/ppc64/sys/powerpc/aim/mp_cpudep.c
projects/ppc64/sys/powerpc/aim/trap_subr32.S
projects/ppc64/sys/powerpc/aim/trap_subr64.S
projects/ppc64/sys/powerpc/include/smp.h
Modified: projects/ppc64/sys/powerpc/aim/mp_cpudep.c
==============================================================================
--- projects/ppc64/sys/powerpc/aim/mp_cpudep.c Sat Mar 20 01:39:34 2010 (r205351)
+++ projects/ppc64/sys/powerpc/aim/mp_cpudep.c Sat Mar 20 02:23:58 2010 (r205352)
@@ -55,6 +55,31 @@ static register_t bsp_state[8] __aligned
static void cpudep_save_config(void *dummy);
SYSINIT(cpu_save_config, SI_SUB_CPU, SI_ORDER_ANY, cpudep_save_config, NULL);
+void
+cpudep_ap_early_bootstrap(void)
+{
+ register_t reg;
+
+ __asm __volatile("mtsprg 0, %0" :: "r"(ap_pcpu));
+ powerpc_sync();
+
+ switch (mfpvr() >> 16) {
+ case IBM970:
+ case IBM970FX:
+ case IBM970MP:
+ /* Restore HID4 and HID5, which are necessary for the MMU */
+
+ __asm __volatile("ld %0, 16(%2); sync; isync; \
+ mtspr %1, %0; sync; isync;"
+ : "=r"(reg) : "K"(SPR_HID4), "r"(bsp_state));
+ __asm __volatile("ld %0, 24(%2); sync; isync; \
+ mtspr %1, %0; sync; isync;"
+ : "=r"(reg) : "K"(SPR_HID5), "r"(bsp_state));
+ powerpc_sync();
+ break;
+ }
+}
+
uintptr_t
cpudep_ap_bootstrap(void)
{
@@ -64,9 +89,6 @@ cpudep_ap_bootstrap(void)
mtmsr(msr);
isync();
- __asm __volatile("mtsprg 0, %0" :: "r"(ap_pcpu));
- powerpc_sync();
-
pcpup->pc_curthread = pcpup->pc_idlethread;
pcpup->pc_curpcb = pcpup->pc_curthread->td_pcb;
sp = pcpup->pc_curpcb->pcb_sp;
Modified: projects/ppc64/sys/powerpc/aim/trap_subr32.S
==============================================================================
--- projects/ppc64/sys/powerpc/aim/trap_subr32.S Sat Mar 20 01:39:34 2010 (r205351)
+++ projects/ppc64/sys/powerpc/aim/trap_subr32.S Sat Mar 20 02:23:58 2010 (r205352)
@@ -294,6 +294,7 @@ cpu_reset:
addi %r1,%r1,(124-16)@l
lis %r3,1 at l
+ bla CNAME(cpudep_ap_early_bootstrap)
bla CNAME(pmap_cpu_bootstrap)
bla CNAME(cpudep_ap_bootstrap)
mr %r1,%r3
Modified: projects/ppc64/sys/powerpc/aim/trap_subr64.S
==============================================================================
--- projects/ppc64/sys/powerpc/aim/trap_subr64.S Sat Mar 20 01:39:34 2010 (r205351)
+++ projects/ppc64/sys/powerpc/aim/trap_subr64.S Sat Mar 20 02:23:58 2010 (r205352)
@@ -281,12 +281,14 @@ cpu_reset:
lis %r3,tocbase at ha
ld %r2,tocbase at l(%r3)
lis %r3,1 at l
- bl CNAME(.pmap_cpu_bootstrap)
+ bl CNAME(.cpudep_ap_early_bootstrap) /* Set PCPU */
nop
- bl CNAME(.cpudep_ap_bootstrap)
+ bl CNAME(.pmap_cpu_bootstrap) /* Turn on virtual memory */
nop
- mr %r1,%r3
- bl CNAME(.machdep_ap_bootstrap)
+ bl CNAME(.cpudep_ap_bootstrap) /* Set up PCPU and stack */
+ nop
+ mr %r1,%r3 /* Use new stack */
+ bl CNAME(.machdep_ap_bootstrap) /* And away! */
nop
/* Should not be reached */
Modified: projects/ppc64/sys/powerpc/include/smp.h
==============================================================================
--- projects/ppc64/sys/powerpc/include/smp.h Sat Mar 20 01:39:34 2010 (r205351)
+++ projects/ppc64/sys/powerpc/include/smp.h Sat Mar 20 02:23:58 2010 (r205352)
@@ -48,6 +48,7 @@ struct cpuref {
};
void pmap_cpu_bootstrap(int);
+void cpudep_ap_early_bootstrap(void);
uintptr_t cpudep_ap_bootstrap(void);
void cpudep_ap_setup(void);
void machdep_ap_bootstrap(void);
More information about the svn-src-projects
mailing list