Merge remote-tracking branch 's5p/for-next'
[linux-2.6/next.git] / arch / s390 / kernel / switch_cpu64.S
blobfcc42d799e410a4cceb25c03669f1e386a0b6651
1 /*
2  * 64-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         stmg    %r6,%r15,__SF_GPRS(%r15)
22         lgr     %r1,%r15
23         aghi    %r15,-STACK_FRAME_OVERHEAD
24         stg     %r1,__SF_BACKCHAIN(%r15)
25         larl    %r1,.gprregs
26         stmg    %r0,%r15,0(%r1)
27 1:      sigp    %r0,%r6,__SIGP_RESTART  /* start destination CPU */
28         brc     2,1b                    /* busy, try again */
29 2:      sigp    %r0,%r5,__SIGP_STOP     /* stop current CPU */
30         brc     2,2b                    /* busy, try again */
31 3:      j       3b
33 ENTRY(smp_restart_cpu)
34         larl    %r1,.gprregs
35         lmg     %r0,%r15,0(%r1)
36 1:      sigp    %r0,%r5,__SIGP_SENSE    /* Wait for calling CPU */
37         brc     10,1b                   /* busy, accepted (status 0), running */
38         tmll    %r0,0x40                /* Test if calling CPU is stopped */
39         jz      1b
40         ltgr    %r4,%r4                 /* New stack ? */
41         jz      1f
42         lgr     %r15,%r4
43 1:      lgr     %r14,%r2                /* r14: Function to call */
44         lgr     %r2,%r3                 /* r2 : Parameter for function*/
45         basr    %r14,%r14               /* Call function */
47         .section .data,"aw",@progbits
48 .gprregs:
49         .rept   16
50         .quad   0
51         .endr