Merge remote-tracking branch 's5p/for-next'
[linux-2.6/next.git] / arch / s390 / kernel / switch_cpu.S
blobbfe070bc76594065530cc27aa722aa7ee7308160
1 /*
2  * 31-bit switch cpu code
3  *
4  * Copyright IBM Corp. 2009
5  *
6  */
8 #include <linux/linkage.h>
9 #include <asm/asm-offsets.h>
10 #include <asm/ptrace.h>
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
19         .section .text
20 ENTRY(smp_switch_to_cpu)
21         stm     %r6,%r15,__SF_GPRS(%r15)
22         lr      %r1,%r15
23         ahi     %r15,-STACK_FRAME_OVERHEAD
24         st      %r1,__SF_BACKCHAIN(%r15)
25         basr    %r13,0
26 0:      la      %r1,.gprregs_addr-0b(%r13)
27         l       %r1,0(%r1)
28         stm     %r0,%r15,0(%r1)
29 1:      sigp    %r0,%r6,__SIGP_RESTART  /* start destination CPU */
30         brc     2,1b                    /* busy, try again */
31 2:      sigp    %r0,%r5,__SIGP_STOP     /* stop current CPU */
32         brc     2,2b                    /* busy, try again */
33 3:      j       3b
35 ENTRY(smp_restart_cpu)
36         basr    %r13,0
37 0:      la      %r1,.gprregs_addr-0b(%r13)
38         l       %r1,0(%r1)
39         lm      %r0,%r15,0(%r1)
40 1:      sigp    %r0,%r5,__SIGP_SENSE    /* Wait for calling CPU */
41         brc     10,1b                   /* busy, accepted (status 0), running */
42         tmll    %r0,0x40                /* Test if calling CPU is stopped */
43         jz      1b
44         ltr     %r4,%r4                 /* New stack ? */
45         jz      1f
46         lr      %r15,%r4
47 1:      lr      %r14,%r2                /* r14: Function to call */
48         lr      %r2,%r3                 /* r2 : Parameter for function*/
49         basr    %r14,%r14               /* Call function */
51 .gprregs_addr:
52         .long   .gprregs
54         .section .data,"aw",@progbits
55 .gprregs:
56         .rept   16
57         .long   0
58         .endr