/* * 31-bit switch cpu code * * Copyright IBM Corp. 2009 * */ #include #include # smp_switch_to_cpu switches to destination cpu and executes the passed function # Parameter: %r2 - function to call # %r3 - function parameter # %r4 - stack poiner # %r5 - current cpu # %r6 - destination cpu .section .text .align 4 .globl smp_switch_to_cpu smp_switch_to_cpu: stm %r6,%r15,__SF_GPRS(%r15) lr %r1,%r15 ahi %r15,-STACK_FRAME_OVERHEAD st %r1,__SF_BACKCHAIN(%r15) basr %r13,0 0: la %r1,.gprregs_addr-0b(%r13) l %r1,0(%r1) stm %r0,%r15,0(%r1) 1: sigp %r0,%r6,__SIGP_RESTART /* start destination CPU */ brc 2,1b /* busy, try again */ 2: sigp %r0,%r5,__SIGP_STOP /* stop current CPU */ brc 2,2b /* busy, try again */ 3: j 3b .globl smp_restart_cpu smp_restart_cpu: basr %r13,0 0: la %r1,.gprregs_addr-0b(%r13) l %r1,0(%r1) lm %r0,%r15,0(%r1) 1: sigp %r0,%r5,__SIGP_SENSE /* Wait for calling CPU */ brc 10,1b /* busy, accepted (status 0), running */ tmll %r0,0x40 /* Test if calling CPU is stopped */ jz 1b ltr %r4,%r4 /* New stack ? */ jz 1f lr %r15,%r4 1: basr %r14,%r2 .gprregs_addr: .long .gprregs .section .data,"aw",@progbits .gprregs: .rept 16 .long 0 .endr