2.9
[glibc/nacl-glibc.git] / sysdeps / unix / sysv / linux / sh / sh4 / getcontext.S
blob68bc235bcfb5362e74bacb0676441969cfc198c7
1 /* Save current context.
2    Copyright (C) 2005 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, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
20 #include <sysdep.h>
22 #include "ucontext_i.h"
24 /*  int __getcontext (ucontext_t *uc);  */
26         .text
27         .align  5
28 ENTRY(__getcontext)
30         /* Return value of getcontext.  R0 is the only register whose
31            value is not preserved.  */
32         mov     #0, r0
33         mov.l   r0, @(oR0,r4)
34         mov.l   r1, @(oR1,r4)
35         mov.l   r2, @(oR2,r4)
36         mov.l   r3, @(oR3,r4)
37         mov.l   r4, @(oR4,r4)
38         mov.l   r5, @(oR5,r4)
39         mov.l   r6, @(oR6,r4)
40         mov.l   r7, @(oR7,r4)
41         mov     r4, r0
42         add     #(oMACL+4), r0
43         sts.l   macl, @-r0
44         sts.l   mach, @-r0
45         stc.l   gbr, @-r0
47         /* Save T flag to SR.  */
48         movt    r1
49         mov.l   r1, @-r0
50         sts.l   pr, @-r0
52         /* The return address of getcontext is the restart pc.  */
53         sts.l   pr, @-r0
55         mov.l   r15, @-r0
56         mov.l   r14, @-r0
57         mov.l   r13, @-r0
58         mov.l   r12, @-r0
59         mov.l   r11, @-r0
60         mov.l   r10, @-r0
61         mov.l   r9, @-r0
62         mov.l   r8, @-r0
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
105         /* sigprocmask (SIG_BLOCK, NULL, &uc->uc_sigmask).  */
106         mov     r4, r6
107         /* We need 2 add instruction because oSIGMASK > 127.  */
108         add     #(oSIGMASK/2), r6
109         add     #(oSIGMASK/2), r6
110         mov     #SIG_BLOCK, r4
111         mov     #0, r5
112         mov     #+SYS_ify(sigprocmask), r3
113         trapa   #0x13
114         mov     r0, r1
115         mov     #-12, r2
116         shad    r2, r1
117         not     r1, r1                  // r1=0 means r0 = -1 to -4095
118         tst     r1, r1                  // i.e. error in linux
119         bf      .Lgetcontext_end
120 .Lsyscall_error:        
121         SYSCALL_ERROR_HANDLER
122 .Lgetcontext_end:
123         /* All done, return 0 for success.  */
124         mov     #0, r0
125 .Lpseudo_end:
126         rts
127          nop
129 PSEUDO_END(__getcontext)
131 weak_alias (__getcontext, getcontext)