#endif
        /* Grab our physical cpu number */
        mr      r24,r3
+       /* stash r4 for book3e */
+       mr      r25,r4
 
        /* Tell the master cpu we're here */
        /* Relocation is off & we are located at an address less */
        std     r24,__secondary_hold_acknowledge-_stext(0)
        sync
 
+       li      r26,0
+#ifdef CONFIG_PPC_BOOK3E
+       tovirt(r26,r26)
+#endif
        /* All secondary cpus wait here until told to start. */
-100:   ld      r4,__secondary_hold_spinloop-_stext(0)
+100:   ld      r4,__secondary_hold_spinloop-_stext(r26)
        cmpdi   0,r4,0
        beq     100b
 
 #if defined(CONFIG_SMP) || defined(CONFIG_KEXEC)
+#ifdef CONFIG_PPC_BOOK3E
+       tovirt(r4,r4)
+#endif
        ld      r4,0(r4)                /* deref function descriptor */
        mtctr   r4
        mr      r3,r24
+       /*
+        * it may be the case that other platforms have r4 right to
+        * begin with, this gives us some safety in case it is not
+        */
+#ifdef CONFIG_PPC_BOOK3E
+       mr      r4,r25
+#else
        li      r4,0
+#endif
        /* Make sure that patched code is visible */
        isync
        bctr