svn commit: r326217 - in head/sys/powerpc: ofw powerpc

Nathan Whitehorn nwhitehorn at FreeBSD.org
Sat Nov 25 23:23:26 UTC 2017


Author: nwhitehorn
Date: Sat Nov 25 23:23:24 2017
New Revision: 326217
URL: https://svnweb.freebsd.org/changeset/base/326217

Log:
  Avoid assumptions about the BSP being CPU 0.
  
  MFC after:	3 weeks

Modified:
  head/sys/powerpc/ofw/ofw_machdep.c
  head/sys/powerpc/powerpc/machdep.c

Modified: head/sys/powerpc/ofw/ofw_machdep.c
==============================================================================
--- head/sys/powerpc/ofw/ofw_machdep.c	Sat Nov 25 22:43:52 2017	(r326216)
+++ head/sys/powerpc/ofw/ofw_machdep.c	Sat Nov 25 23:23:24 2017	(r326217)
@@ -530,11 +530,16 @@ openfirmware(void *args)
 		return (-1);
 
 	#ifdef SMP
-	rv_args.args = args;
-	rv_args.in_progress = 1;
-	smp_rendezvous(smp_no_rendezvous_barrier, ofw_rendezvous_dispatch,
-	    smp_no_rendezvous_barrier, &rv_args);
-	result = rv_args.retval;
+	if (cold) {
+		result = openfirmware_core(args);
+	} else {
+		rv_args.args = args;
+		rv_args.in_progress = 1;
+		smp_rendezvous(smp_no_rendezvous_barrier,
+		    ofw_rendezvous_dispatch, smp_no_rendezvous_barrier,
+		    &rv_args);
+		result = rv_args.retval;
+	}
 	#else
 	result = openfirmware_core(args);
 	#endif

Modified: head/sys/powerpc/powerpc/machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/machdep.c	Sat Nov 25 22:43:52 2017	(r326216)
+++ head/sys/powerpc/powerpc/machdep.c	Sat Nov 25 23:23:24 2017	(r326217)
@@ -235,9 +235,10 @@ uintptr_t
 powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp)
 {
 	struct		pcpu *pc;
+	struct cpuref	bsp;
 	vm_offset_t	startkernel, endkernel;
 	void		*kmdp;
-        char		*env;
+	char		*env;
         bool		ofw_bootargs = false;
 #ifdef DDB
 	vm_offset_t ksym_start;
@@ -311,32 +312,20 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offs
 	 */
 	proc_linkup0(&proc0, &thread0);
 	thread0.td_frame = &frame0;
-
-	/*
-	 * Set up per-cpu data.
-	 */
-	pc = __pcpu;
-	pcpu_init(pc, 0, sizeof(struct pcpu));
-	pc->pc_curthread = &thread0;
 #ifdef __powerpc64__
-	__asm __volatile("mr 13,%0" :: "r"(pc->pc_curthread));
+	__asm __volatile("mr 13,%0" :: "r"(&thread0));
 #else
-	__asm __volatile("mr 2,%0" :: "r"(pc->pc_curthread));
+	__asm __volatile("mr 2,%0" :: "r"(&thread0));
 #endif
-	pc->pc_cpuid = 0;
 
-	__asm __volatile("mtsprg 0, %0" :: "r"(pc));
-
 	/*
 	 * Init mutexes, which we use heavily in PMAP
 	 */
-
 	mutex_init();
 
 	/*
 	 * Install the OF client interface
 	 */
-
 	OF_bootstrap();
 
 	if (ofw_bootargs)
@@ -347,19 +336,6 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offs
 	 */
 	cninit();
 
-	/*
-	 * Complain if there is no metadata.
-	 */
-	if (mdp == NULL || kmdp == NULL) {
-		printf("powerpc_init: no loader metadata.\n");
-	}
-
-	/*
-	 * Init KDB
-	 */
-
-	kdb_init();
-
 #ifdef AIM
 	aim_cpu_init(toc);
 #else /* BOOKE */
@@ -374,6 +350,25 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offs
 	 */
 
 	platform_probe_and_attach();
+
+	/*
+	 * Set up real per-cpu data.
+	 */
+	if (platform_smp_get_bsp(&bsp) != 0)
+		bsp.cr_cpuid = 0;
+	pc = &__pcpu[bsp.cr_cpuid];
+	pcpu_init(pc, bsp.cr_cpuid, sizeof(struct pcpu));
+	pc->pc_curthread = &thread0;
+	thread0.td_oncpu = bsp.cr_cpuid;
+	pc->pc_cpuid = bsp.cr_cpuid;
+	pc->pc_hwref = bsp.cr_hwref;
+	pc->pc_pir = mfspr(SPR_PIR);
+	__asm __volatile("mtsprg 0, %0" :: "r"(pc));
+
+	/*
+	 * Init KDB
+	 */
+	kdb_init();
 
 	/*
 	 * Bring up MMU


More information about the svn-src-all mailing list