blr
 #endif
 
-#if defined(CONFIG_KEXEC) || defined(CONFIG_SMP)
-_GLOBAL(smp_release_cpus)
-       /* All secondary cpus are spinning on a common
-        * spinloop, release them all now so they can start
-        * to spin on their individual paca spinloops.
-        * For non SMP kernels, the secondary cpus never
-        * get out of the common spinloop.
-        * XXX This does nothing useful on iSeries, secondaries are
-        * already waiting on their paca.
-        */
-       li      r3,1
-       LOADADDR(r5,__secondary_hold_spinloop)
-       std     r3,0(r5)
-       sync
-       blr
-#endif /* CONFIG_SMP */
-
-
 /*
  * We put a few things here that have to be page-aligned.
  * This stuff goes at the beginning of the bss, which is page-aligned.
 
 extern void early_init_devtree(void *flat_dt);
 extern void unflatten_device_tree(void);
 
-extern void smp_release_cpus(void);
-
 int have_of = 1;
 int boot_cpuid = 0;
 int boot_cpuid_phys = 0;
 }
 
 
+#if defined(CONFIG_SMP) || defined(CONFIG_KEXEC)
+void smp_release_cpus(void)
+{
+       extern unsigned long __secondary_hold_spinloop;
+
+       DBG(" -> smp_release_cpus()\n");
+
+       /* All secondary cpus are spinning on a common spinloop, release them
+        * all now so they can start to spin on their individual paca
+        * spinloops. For non SMP kernels, the secondary cpus never get out
+        * of the common spinloop.
+        * This is useless but harmless on iSeries, secondaries are already
+        * waiting on their paca spinloops. */
+
+       __secondary_hold_spinloop = 1;
+       mb();
+
+       DBG(" <- smp_release_cpus()\n");
+}
+#endif /* CONFIG_SMP || CONFIG_KEXEC */
+
 /*
  * Initialize some remaining members of the ppc64_caches and systemcfg structures
  * (at least until we get rid of them completely). This is mostly some
 
        blr
 #endif
 
-#if defined(CONFIG_KEXEC) || defined(CONFIG_SMP)
-_GLOBAL(smp_release_cpus)
-       /* All secondary cpus are spinning on a common
-        * spinloop, release them all now so they can start
-        * to spin on their individual paca spinloops.
-        * For non SMP kernels, the secondary cpus never
-        * get out of the common spinloop.
-        * XXX This does nothing useful on iSeries, secondaries are
-        * already waiting on their paca.
-        */
-       li      r3,1
-       LOADADDR(r5,__secondary_hold_spinloop)
-       std     r3,0(r5)
-       sync
-       blr
-#endif /* CONFIG_SMP */
-
-
 /*
  * We put a few things here that have to be page-aligned.
  * This stuff goes at the beginning of the bss, which is page-aligned.
 
 
 static void kexec_prepare_cpus(void)
 {
-       extern void smp_release_cpus(void);
        /*
         * move the secondarys to us so that we can copy
         * the new kernel 0-0x100 safely
 
 extern int smp_mpic_probe(void);
 extern void smp_mpic_setup_cpu(int cpu);
 extern void smp_generic_kick_cpu(int nr);
+extern void smp_release_cpus(void);
 
 extern void smp_generic_give_timebase(void);
 extern void smp_generic_take_timebase(void);