powerpc: Call CPU ->restore callback earlier on secondary CPUs
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Tue, 1 Feb 2011 01:13:09 +0000 (12:13 +1100)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 20 Apr 2011 01:03:24 +0000 (11:03 +1000)
We do it before we loop on the PACA start flag. This way, we get a
chance to set critical SPRs on all CPUs before Linux tries to start
them up, which avoids problems when changing some bits such as LPCR
bits that need to be identical on all threads of a core or similar
things like that. Ideally, some of that should also be done before
the MMU is enabled, but that's a separate issue which would require
moving some of the SMP startup code earlier, let's not get there
for now, it works with that change alone.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/kernel/head_64.S

index 39a40400f3f2c73d8d9256517a6a6365c8e50fad..95944278380c44e1b65d018efc6fdae98907aa8a 100644 (file)
@@ -236,17 +236,6 @@ generic_secondary_common_init:
 
        /* From now on, r24 is expected to be logical cpuid */
        mr      r24,r5
-3:     HMT_LOW
-       lbz     r23,PACAPROCSTART(r13)  /* Test if this processor should */
-                                       /* start.                        */
-
-#ifndef CONFIG_SMP
-       b       3b                      /* Never go on non-SMP           */
-#else
-       cmpwi   0,r23,0
-       beq     3b                      /* Loop until told to go         */
-
-       sync                            /* order paca.run and cur_cpu_spec */
 
        /* See if we need to call a cpu state restore handler */
        LOAD_REG_ADDR(r23, cur_cpu_spec)
@@ -258,6 +247,17 @@ generic_secondary_common_init:
        mtctr   r23
        bctrl
 
+3:     HMT_LOW
+       lbz     r23,PACAPROCSTART(r13)  /* Test if this processor should */
+                                       /* start.                        */
+#ifndef CONFIG_SMP
+       b       3b                      /* Never go on non-SMP           */
+#else
+       cmpwi   0,r23,0
+       beq     3b                      /* Loop until told to go         */
+
+       sync                            /* order paca.run and cur_cpu_spec */
+
 4:     /* Create a temp kernel stack for use before relocation is on.  */
        ld      r1,PACAEMERGSP(r13)
        subi    r1,r1,STACK_FRAME_OVERHEAD