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