Update copyright dates with scripts/update-copyrights.
[glibc.git] / sysdeps / unix / sysv / linux / sh / sh4 / swapcontext.S
blob9eea1257eee7c9e75b6773ebdb6c780d5fd25d49
1 /* Save current context and install the given one.
2    Copyright (C) 2005-2015 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <http://www.gnu.org/licenses/>.  */
19 #include <sysdep.h>
21 #include "ucontext_i.h"
23 /*  int __swapcontext (ucontext_t *ouc, const ucontext_t *uc);  */
25         .text
26         .align  5
27 ENTRY(__swapcontext)
29         /* Return value of getcontext.  R0 is the only register whose
30            value is not preserved.  */
31         mov     #0, r0
32         mov.l   r0, @(oR0,r4)
33         mov.l   r1, @(oR1,r4)
34         mov.l   r2, @(oR2,r4)
35         mov.l   r3, @(oR3,r4)
36         mov.l   r4, @(oR4,r4)
37         mov.l   r5, @(oR5,r4)
38         mov.l   r6, @(oR6,r4)
39         mov.l   r7, @(oR7,r4)
40         mov     r4, r0
41         add     #(oMACL+4), r0
42         sts.l   macl, @-r0
43         sts.l   mach, @-r0
44         stc.l   gbr, @-r0
46         /* Save T flag to SR.  */
47         movt    r1
48         mov.l   r1, @-r0
49         sts.l   pr, @-r0
51         /* The return address of getcontext is the restart pc.  */
52         sts.l   pr, @-r0
54         mov.l   r15, @-r0
55         mov.l   r14, @-r0
56         mov.l   r13, @-r0
57         mov.l   r12, @-r0
58         mov.l   r11, @-r0
59         mov.l   r10, @-r0
60         mov.l   r9, @-r0
61         mov.l   r8, @-r0
63 #ifdef __SH_FPU_ANY__
64         mov     r4, r0
65         /* We need 2 add instruction because oFPUL+4 >= 127.  */
66         add     #124,r0
67         add     #(oFPUL+4-124),r0
68         sts.l   fpul, @-r0
69         sts.l   fpscr, @-r0
70         frchg
71         fmov.s  fr15, @-r0
72         fmov.s  fr14, @-r0
73         fmov.s  fr13, @-r0
74         fmov.s  fr12, @-r0
75         fmov.s  fr11, @-r0
76         fmov.s  fr10, @-r0
77         fmov.s  fr9, @-r0
78         fmov.s  fr8, @-r0
79         fmov.s  fr7, @-r0
80         fmov.s  fr6, @-r0
81         fmov.s  fr5, @-r0
82         fmov.s  fr4, @-r0
83         fmov.s  fr3, @-r0
84         fmov.s  fr2, @-r0
85         fmov.s  fr1, @-r0
86         fmov.s  fr0, @-r0
87         frchg
88         fmov.s  fr15, @-r0
89         fmov.s  fr14, @-r0
90         fmov.s  fr13, @-r0
91         fmov.s  fr12, @-r0
92         fmov.s  fr11, @-r0
93         fmov.s  fr10, @-r0
94         fmov.s  fr9, @-r0
95         fmov.s  fr8, @-r0
96         fmov.s  fr7, @-r0
97         fmov.s  fr6, @-r0
98         fmov.s  fr5, @-r0
99         fmov.s  fr4, @-r0
100         fmov.s  fr3, @-r0
101         fmov.s  fr2, @-r0
102         fmov.s  fr1, @-r0
103         fmov.s  fr0, @-r0
104 #endif /* __SH_FPU_ANY__ */
106         mov     r5, r8
108         /* sigprocmask (SIG_SETMASK, &uc->uc_sigmask, &ouc->uc_sigmask).  */
109         mov     #oSIGMASK, r1
110         extu.b  r1, r1
111         add     r1, r5
112         mov     r4, r6
113         add     r1, r6
114         mov     #SIG_SETMASK, r4
115         mov     #+SYS_ify(sigprocmask), r3
116         trapa   #0x13
117         mov     r0, r1
118         mov     #-12, r2
119         shad    r2, r1
120         not     r1, r1                  // r1=0 means r0 = -1 to -4095
121         tst     r1, r1                  // i.e. error in linux
122         bf      .Lswapcontext_restore
123 .Lsyscall_error:
124         SYSCALL_ERROR_HANDLER
125 .Lpseudo_end:
126         rts
127          nop
128 .Lswapcontext_restore:
129 #ifdef __SH_FPU_ANY__
130         mov     r8, r0
131         add     #(oFR0),r0
132         fmov.s  @r0+, fr0
133         fmov.s  @r0+, fr1
134         fmov.s  @r0+, fr2
135         fmov.s  @r0+, fr3
136         fmov.s  @r0+, fr4
137         fmov.s  @r0+, fr5
138         fmov.s  @r0+, fr6
139         fmov.s  @r0+, fr7
140         fmov.s  @r0+, fr8
141         fmov.s  @r0+, fr9
142         fmov.s  @r0+, fr10
143         fmov.s  @r0+, fr11
144         fmov.s  @r0+, fr12
145         fmov.s  @r0+, fr13
146         fmov.s  @r0+, fr14
147         fmov.s  @r0+, fr15
148         frchg
149         fmov.s  @r0+, fr0
150         fmov.s  @r0+, fr1
151         fmov.s  @r0+, fr2
152         fmov.s  @r0+, fr3
153         fmov.s  @r0+, fr4
154         fmov.s  @r0+, fr5
155         fmov.s  @r0+, fr6
156         fmov.s  @r0+, fr7
157         fmov.s  @r0+, fr8
158         fmov.s  @r0+, fr9
159         fmov.s  @r0+, fr10
160         fmov.s  @r0+, fr11
161         fmov.s  @r0+, fr12
162         fmov.s  @r0+, fr13
163         fmov.s  @r0+, fr14
164         fmov.s  @r0+, fr15
165         frchg
166         lds.l   @r0+, fpscr
167         lds.l   @r0+, fpul
168 #endif /* __SH_FPU_ANY__ */
170         mov     r8, r0
171         add     #(oPC), r0
172         mov.l   @r0+, r2
173         lds.l   @r0+, pr
175         /* Restore T frag.  */
176         mov.l   @r0+, r1
177         shlr    r1
178         /* Skip GBR which is used for thread pointer.  */
179         add     #4, r0
181         lds.l   @r0+, mach
182         lds.l   @r0+, macl
184         mov     r8, r0
185         add     #(oR9), r0
186         mov.l   @r0+, r9
187         mov.l   @r0+, r10
188         mov.l   @r0+, r11
189         mov.l   @r0+, r12
190         mov.l   @r0+, r13
191         mov.l   @r0+, r14
192         mov.l   @r0+, r15
194         mov     r8, r0
195         mov.l   @(oR0,r0), r1
196         mov.l   r1, @-r15
197         cfi_adjust_cfa_offset(4)
198         cfi_rel_offset (r1, 0)
199         mov.l   r2, @-r15
200         cfi_adjust_cfa_offset(4)
201         cfi_rel_offset (r2, 0)
203         mov.l   @(oR1,r0), r1
204         mov.l   @(oR2,r0), r2
205         mov.l   @(oR3,r0), r3
206         mov.l   @(oR4,r0), r4
207         mov.l   @(oR5,r0), r5
208         mov.l   @(oR6,r0), r6
209         mov.l   @(oR7,r0), r7
210         mov.l   @(oR8,r0), r8
211         mov.l   @r15+, r0
212         cfi_adjust_cfa_offset(-4)
213         jmp     @r0
214          mov.l  @r15+, r0
216 PSEUDO_END(__swapcontext)
218 weak_alias (__swapcontext, swapcontext)