Merge branch 'stable/bug-fixes-rc2' of git://git.kernel.org/pub/scm/linux/kernel...
[pandora-kernel.git] / arch / s390 / kernel / switch_cpu.S
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/ptrace.h>
10
11 # smp_switch_to_cpu switches to destination cpu and executes the passed function
12 # Parameter: %r2 - function to call
13 #            %r3 - function parameter
14 #            %r4 - stack poiner
15 #            %r5 - current cpu
16 #            %r6 - destination cpu
17
18         .section .text
19         .align 4
20         .globl smp_switch_to_cpu
21 smp_switch_to_cpu:
22         stm     %r6,%r15,__SF_GPRS(%r15)
23         lr      %r1,%r15
24         ahi     %r15,-STACK_FRAME_OVERHEAD
25         st      %r1,__SF_BACKCHAIN(%r15)
26         basr    %r13,0
27 0:      la      %r1,.gprregs_addr-0b(%r13)
28         l       %r1,0(%r1)
29         stm     %r0,%r15,0(%r1)
30 1:      sigp    %r0,%r6,__SIGP_RESTART  /* start destination CPU */
31         brc     2,1b                    /* busy, try again */
32 2:      sigp    %r0,%r5,__SIGP_STOP     /* stop current CPU */
33         brc     2,2b                    /* busy, try again */
34 3:      j       3b
35
36         .globl  smp_restart_cpu
37 smp_restart_cpu:
38         basr    %r13,0
39 0:      la      %r1,.gprregs_addr-0b(%r13)
40         l       %r1,0(%r1)
41         lm      %r0,%r15,0(%r1)
42 1:      sigp    %r0,%r5,__SIGP_SENSE    /* Wait for calling CPU */
43         brc     10,1b                   /* busy, accepted (status 0), running */
44         tmll    %r0,0x40                /* Test if calling CPU is stopped */
45         jz      1b
46         ltr     %r4,%r4                 /* New stack ? */
47         jz      1f
48         lr      %r15,%r4
49 1:      lr      %r14,%r2                /* r14: Function to call */
50         lr      %r2,%r3                 /* r2 : Parameter for function*/
51         basr    %r14,%r14               /* Call function */
52
53 .gprregs_addr:
54         .long   .gprregs
55
56         .section .data,"aw",@progbits
57 .gprregs:
58         .rept   16
59         .long   0
60         .endr