Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 20 Mar 2010 02:23:58 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r205352 - in projects/ppc64/sys/powerpc: aim include
Message-ID:  <201003200223.o2K2NwFH037409@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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@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@ha
 	ld	%r2,tocbase@l(%r3)
 	lis	%r3,1@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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201003200223.o2K2NwFH037409>