|
@@ -59,8 +59,33 @@ system_reset_iSeries:
|
|
|
andc r4,r4,r5
|
|
|
mtspr SPRN_CTRLT,r4
|
|
|
|
|
|
+/* Spin on __secondary_hold_spinloop until it is updated by the boot cpu. */
|
|
|
+/* In the UP case we'll yeild() later, and we will not access the paca anyway */
|
|
|
+#ifdef CONFIG_SMP
|
|
|
1:
|
|
|
HMT_LOW
|
|
|
+ LOAD_REG_IMMEDIATE(r23, __secondary_hold_spinloop)
|
|
|
+ ld r23,0(r23)
|
|
|
+ sync
|
|
|
+ LOAD_REG_IMMEDIATE(r3,current_set)
|
|
|
+ sldi r28,r24,3 /* get current_set[cpu#] */
|
|
|
+ ldx r3,r3,r28
|
|
|
+ addi r1,r3,THREAD_SIZE
|
|
|
+ subi r1,r1,STACK_FRAME_OVERHEAD
|
|
|
+
|
|
|
+ cmpwi 0,r23,0 /* Keep poking the Hypervisor until */
|
|
|
+ bne 2f /* we're released */
|
|
|
+ /* Let the Hypervisor know we are alive */
|
|
|
+ /* 8002 is a call to HvCallCfg::getLps, a harmless Hypervisor function */
|
|
|
+ lis r3,0x8002
|
|
|
+ rldicr r3,r3,32,15 /* r0 = (r3 << 32) & 0xffff000000000000 */
|
|
|
+ li r0,-1 /* r0=-1 indicates a Hypervisor call */
|
|
|
+ sc /* Invoke the hypervisor via a system call */
|
|
|
+ b 1b
|
|
|
+#endif
|
|
|
+
|
|
|
+2:
|
|
|
+ HMT_LOW
|
|
|
#ifdef CONFIG_SMP
|
|
|
lbz r23,PACAPROCSTART(r13) /* Test if this processor
|
|
|
* should start */
|
|
@@ -91,7 +116,7 @@ iSeries_secondary_smp_loop:
|
|
|
li r0,-1 /* r0=-1 indicates a Hypervisor call */
|
|
|
sc /* Invoke the hypervisor via a system call */
|
|
|
mfspr r13,SPRN_SPRG3 /* Put r13 back ???? */
|
|
|
- b 1b /* If SMP not configured, secondaries
|
|
|
+ b 2b /* If SMP not configured, secondaries
|
|
|
* loop forever */
|
|
|
|
|
|
/*** ISeries-LPAR interrupt handlers ***/
|