aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/kernel/switch_cpu.S
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2010-02-26 16:37:34 -0500
committerMartin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com>2010-02-26 16:37:30 -0500
commit2c2df118a6440748e6fd71a510a66ee708c31494 (patch)
tree4e19684886c0c1e7261a1d68de9885302c0565f1 /arch/s390/kernel/switch_cpu.S
parentabd1ecf209b30a0ed43f0aae50f8b8ce1be2c3d1 (diff)
[S390] smp: always reboot on cpu 0
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>
Diffstat (limited to 'arch/s390/kernel/switch_cpu.S')
-rw-r--r--arch/s390/kernel/switch_cpu.S59
1 files changed, 59 insertions, 0 deletions
diff --git a/arch/s390/kernel/switch_cpu.S b/arch/s390/kernel/switch_cpu.S
new file mode 100644
index 000000000000..c05ee6c221d8
--- /dev/null
+++ b/arch/s390/kernel/switch_cpu.S
@@ -0,0 +1,59 @@
1/*
2 * 31-bit switch cpu code
3 *
4 * Copyright IBM Corp. 2009
5 *
6 */
7
8#include <asm/asm-offsets.h>
9#include <asm/lowcore.h>
10#include <asm/ptrace.h>
11
12# smp_switch_to_cpu switches to destination cpu and executes the passed function
13# Parameter: %r2 - function to call
14# %r3 - function parameter
15# %r4 - stack poiner
16# %r5 - current cpu
17# %r6 - destination cpu
18
19 .section .text
20 .align 4
21 .globl smp_switch_to_cpu
22smp_switch_to_cpu:
23 stm %r6,%r15,__SF_GPRS(%r15)
24 lr %r1,%r15
25 ahi %r15,-STACK_FRAME_OVERHEAD
26 st %r1,__SF_BACKCHAIN(%r15)
27 basr %r13,0
280: la %r1,.gprregs_addr-0b(%r13)
29 l %r1,0(%r1)
30 stm %r0,%r15,0(%r1)
311: sigp %r0,%r6,__SIGP_RESTART /* start destination CPU */
32 brc 2,1b /* busy, try again */
332: sigp %r0,%r5,__SIGP_STOP /* stop current CPU */
34 brc 2,2b /* busy, try again */
353: j 3b
36
37 .globl smp_restart_cpu
38smp_restart_cpu:
39 basr %r13,0
400: la %r1,.gprregs_addr-0b(%r13)
41 l %r1,0(%r1)
42 lm %r0,%r15,0(%r1)
431: sigp %r0,%r5,__SIGP_SENSE /* Wait for calling CPU */
44 brc 10,1b /* busy, accepted (status 0), running */
45 tmll %r0,0x40 /* Test if calling CPU is stopped */
46 jz 1b
47 ltr %r4,%r4 /* New stack ? */
48 jz 1f
49 lr %r15,%r4
501: basr %r14,%r2
51
52.gprregs_addr:
53 .long .gprregs
54
55 .section .data,"aw",@progbits
56.gprregs:
57 .rept 16
58 .long 0
59 .endr