Update copyright dates with scripts/update-copyrights
[glibc.git] / sysdeps / unix / sysv / linux / mips / getcontext.S
blob4a812676f0a30298b56a40bbefa607723195225a
1 /* Save current context.
2    Copyright (C) 2009-2023 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    <https://www.gnu.org/licenses/>.  */
19 #include <sysdep.h>
20 #include <sys/asm.h>
21 #include <sys/fpregdef.h>
22 #include <sys/regdef.h>
24 #include "ucontext_i.h"
26 /* int getcontext (ucontext_t *ucp) */
28         .text
29         .set    nomips16
30 LOCALSZ = 0
31 MASK = 0x00000000
32 #ifdef __PIC__
33 LOCALSZ = 1                                             /* save gp */
34 # if _MIPS_SIM != _ABIO32
35 MASK = 0x10000000
36 # endif
37 #endif
38 FRAMESZ = ((LOCALSZ * SZREG) + ALSZ) & ALMASK
39 GPOFF = FRAMESZ - (1 * SZREG)
40 MCONTEXT_GREGSZ = 8
41 #if _MIPS_SIM == _ABIO32 && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
42 MCONTEXT_GREGOFF = 4
43 #else
44 MCONTEXT_GREGOFF = 0
45 #endif
47 NESTED (__getcontext, FRAMESZ, ra)
48         .mask   MASK, 0
49         .fmask  0x00000000, 0
51 #ifdef __PIC__
52         SETUP_GP
54         move    a2, sp
55 # define _SP a2
57 # if _MIPS_SIM != _ABIO32
58         move    a3, gp
59 #  define _GP a3
60 # endif
62         PTR_ADDIU sp, -FRAMESZ
63         cfi_adjust_cfa_offset (FRAMESZ)
64         SETUP_GP64_STACK (GPOFF, __getcontext)
65         SAVE_GP (GPOFF)
67 #else  /* ! __PIC__ */
68 # define _SP sp
69 # define _GP gp
71 #endif /* ! __PIC__ */
73 #ifdef PROF
74         .set    noat
75         move    AT, ra
76         jal     _mcount
77         .set    at
78 #endif
80         REG_S   s0, (MCONTEXT_GREGOFF + 16 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
81         REG_S   s1, (MCONTEXT_GREGOFF + 17 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
82         REG_S   s2, (MCONTEXT_GREGOFF + 18 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
83         REG_S   s3, (MCONTEXT_GREGOFF + 19 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
84         REG_S   s4, (MCONTEXT_GREGOFF + 20 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
85         REG_S   s5, (MCONTEXT_GREGOFF + 21 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
86         REG_S   s6, (MCONTEXT_GREGOFF + 22 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
87         REG_S   s7, (MCONTEXT_GREGOFF + 23 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
88 #if ! defined (__PIC__) || _MIPS_SIM != _ABIO32
89         REG_S   _GP, (MCONTEXT_GREGOFF + 28 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
90 #endif
91         REG_S   _SP, (MCONTEXT_GREGOFF + 29 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
92         REG_S   fp, (MCONTEXT_GREGOFF + 30 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
93         REG_S   ra, (MCONTEXT_GREGOFF + 31 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
94         REG_S   ra, (MCONTEXT_GREGOFF + MCONTEXT_PC)(a0)
96 #ifdef __mips_hard_float
97 # if _MIPS_SIM == _ABI64
98         s.d     fs0, (24 * SZREG + MCONTEXT_FPREGS)(a0)
99         s.d     fs1, (25 * SZREG + MCONTEXT_FPREGS)(a0)
100         s.d     fs2, (26 * SZREG + MCONTEXT_FPREGS)(a0)
101         s.d     fs3, (27 * SZREG + MCONTEXT_FPREGS)(a0)
102         s.d     fs4, (28 * SZREG + MCONTEXT_FPREGS)(a0)
103         s.d     fs5, (29 * SZREG + MCONTEXT_FPREGS)(a0)
104         s.d     fs6, (30 * SZREG + MCONTEXT_FPREGS)(a0)
105         s.d     fs7, (31 * SZREG + MCONTEXT_FPREGS)(a0)
107 # else  /* _MIPS_SIM != _ABI64 */
108         s.d     fs0, (20 * SZREG + MCONTEXT_FPREGS)(a0)
109         s.d     fs1, (22 * SZREG + MCONTEXT_FPREGS)(a0)
110         s.d     fs2, (24 * SZREG + MCONTEXT_FPREGS)(a0)
111         s.d     fs3, (26 * SZREG + MCONTEXT_FPREGS)(a0)
112         s.d     fs4, (28 * SZREG + MCONTEXT_FPREGS)(a0)
113         s.d     fs5, (30 * SZREG + MCONTEXT_FPREGS)(a0)
115 # endif /* _MIPS_SIM != _ABI64 */
117         cfc1    v1, fcr31
118         sw      v1, MCONTEXT_FPC_CSR(a0)
119 #endif /* __mips_hard_float */
121 /* rt_sigprocmask (SIG_BLOCK, NULL, &ucp->uc_sigmask, _NSIG8) */
122         li      a3, _NSIG8
123         PTR_ADDU a2, a0, UCONTEXT_SIGMASK
124         move    a1, zero
125         li      a0, SIG_BLOCK
127         li      v0, SYS_ify (rt_sigprocmask)
128         syscall
129         bnez    a3, 99f
130         cfi_remember_state
132 #ifdef __PIC__
133         RESTORE_GP64_STACK
134         PTR_ADDIU sp, FRAMESZ
135         cfi_adjust_cfa_offset (-FRAMESZ)
136 #endif
137         move    v0, zero
138         jr      ra
141         cfi_restore_state
142 #ifdef __PIC__
143         PTR_LA  t9, JUMPTARGET (__syscall_error)
144         RESTORE_GP64_STACK
145         PTR_ADDIU sp, FRAMESZ
146         cfi_adjust_cfa_offset (-FRAMESZ)
147         jr      t9
149 #else  /* ! __PIC__ */
151         j       JUMPTARGET (__syscall_error)
152 #endif /* ! __PIC__ */
153 PSEUDO_END (__getcontext)
155 weak_alias (__getcontext, getcontext)