forked from Minki/linux
2c2df118a6
Always reboot on logical cpu 0. This makes sure that the IPL cpu is always the same and usually avoids strange numbering schemes between physical and logical cpus. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
53 lines
1.1 KiB
ArmAsm
53 lines
1.1 KiB
ArmAsm
/*
|
|
* 64-bit switch cpu code
|
|
*
|
|
* Copyright IBM Corp. 2009
|
|
*
|
|
*/
|
|
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/lowcore.h>
|
|
#include <asm/ptrace.h>
|
|
|
|
# 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:
|
|
stmg %r6,%r15,__SF_GPRS(%r15)
|
|
lgr %r1,%r15
|
|
aghi %r15,-STACK_FRAME_OVERHEAD
|
|
stg %r1,__SF_BACKCHAIN(%r15)
|
|
larl %r1,.gprregs
|
|
stmg %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:
|
|
larl %r1,.gprregs
|
|
lmg %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
|
|
ltgr %r4,%r4 /* New stack ? */
|
|
jz 1f
|
|
lgr %r15,%r4
|
|
1: basr %r14,%r2
|
|
|
|
.section .data,"aw",@progbits
|
|
.gprregs:
|
|
.rept 16
|
|
.quad 0
|
|
.endr
|