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
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to