]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/unix/sysv/linux/mips/getcontext.S
Prefer https to http for gnu.org and fsf.org URLs
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / mips / getcontext.S
index c4ad081b0f30a0669f34c6d8f4f2fb3b395e1b5d..365ffa8e9ecd3acb8f676f56381c96bd9205a7cc 100644 (file)
@@ -1,5 +1,5 @@
 /* Save current context.
-   Copyright (C) 2009 Free Software Foundation, Inc.
+   Copyright (C) 2009-2019 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Maciej W. Rozycki <macro@codesourcery.com>.
 
@@ -15,7 +15,7 @@
 
    You should have received a copy of the GNU Lesser General Public
    License along with the GNU C Library.  If not, see
-   <http://www.gnu.org/licenses/>.  */
+   <https://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
 #include <sys/asm.h>
@@ -27,6 +27,7 @@
 /* int getcontext (ucontext_t *ucp) */
 
        .text
+       .set    nomips16
 LOCALSZ = 0
 MASK = 0x00000000
 #ifdef __PIC__
@@ -37,6 +38,12 @@ MASK = 0x10000000
 #endif
 FRAMESZ = ((LOCALSZ * SZREG) + ALSZ) & ALMASK
 GPOFF = FRAMESZ - (1 * SZREG)
+MCONTEXT_GREGSZ = 8
+#if _MIPS_SIM == _ABIO32 && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+MCONTEXT_GREGOFF = 4
+#else
+MCONTEXT_GREGOFF = 0
+#endif
 
 NESTED (__getcontext, FRAMESZ, ra)
        .mask   MASK, 0
@@ -54,7 +61,8 @@ NESTED (__getcontext, FRAMESZ, ra)
 # endif
 
        PTR_ADDIU sp, -FRAMESZ
-       SETUP_GP64 (GPOFF, __getcontext)
+       cfi_adjust_cfa_offset (FRAMESZ)
+       SETUP_GP64_STACK (GPOFF, __getcontext)
        SAVE_GP (GPOFF)
 
 #else  /* ! __PIC__ */
@@ -70,25 +78,21 @@ NESTED (__getcontext, FRAMESZ, ra)
        .set    at
 #endif
 
-       /* Store a magic flag.  */
-       li      v1, 1
-       REG_S   v1, (0 * SZREG + MCONTEXT_GREGS)(a0)    /* zero */
-
-       REG_S   s0, (16 * SZREG + MCONTEXT_GREGS)(a0)
-       REG_S   s1, (17 * SZREG + MCONTEXT_GREGS)(a0)
-       REG_S   s2, (18 * SZREG + MCONTEXT_GREGS)(a0)
-       REG_S   s3, (19 * SZREG + MCONTEXT_GREGS)(a0)
-       REG_S   s4, (20 * SZREG + MCONTEXT_GREGS)(a0)
-       REG_S   s5, (21 * SZREG + MCONTEXT_GREGS)(a0)
-       REG_S   s6, (22 * SZREG + MCONTEXT_GREGS)(a0)
-       REG_S   s7, (23 * SZREG + MCONTEXT_GREGS)(a0)
+       REG_S   s0, (MCONTEXT_GREGOFF + 16 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
+       REG_S   s1, (MCONTEXT_GREGOFF + 17 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
+       REG_S   s2, (MCONTEXT_GREGOFF + 18 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
+       REG_S   s3, (MCONTEXT_GREGOFF + 19 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
+       REG_S   s4, (MCONTEXT_GREGOFF + 20 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
+       REG_S   s5, (MCONTEXT_GREGOFF + 21 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
+       REG_S   s6, (MCONTEXT_GREGOFF + 22 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
+       REG_S   s7, (MCONTEXT_GREGOFF + 23 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
 #if ! defined (__PIC__) || _MIPS_SIM != _ABIO32
-       REG_S   _GP, (28 * SZREG + MCONTEXT_GREGS)(a0)
+       REG_S   _GP, (MCONTEXT_GREGOFF + 28 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
 #endif
-       REG_S   _SP, (29 * SZREG + MCONTEXT_GREGS)(a0)
-       REG_S   fp, (30 * SZREG + MCONTEXT_GREGS)(a0)
-       REG_S   ra, (31 * SZREG + MCONTEXT_GREGS)(a0)
-       REG_S   ra, MCONTEXT_PC(a0)
+       REG_S   _SP, (MCONTEXT_GREGOFF + 29 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
+       REG_S   fp, (MCONTEXT_GREGOFF + 30 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
+       REG_S   ra, (MCONTEXT_GREGOFF + 31 * MCONTEXT_GREGSZ + MCONTEXT_GREGS)(a0)
+       REG_S   ra, (MCONTEXT_GREGOFF + MCONTEXT_PC)(a0)
 
 #ifdef __mips_hard_float
 # if _MIPS_SIM == _ABI64
@@ -124,19 +128,23 @@ NESTED (__getcontext, FRAMESZ, ra)
        li      v0, SYS_ify (rt_sigprocmask)
        syscall
        bnez    a3, 99f
+       cfi_remember_state
 
 #ifdef __PIC__
-       RESTORE_GP64
+       RESTORE_GP64_STACK
        PTR_ADDIU sp, FRAMESZ
+       cfi_adjust_cfa_offset (-FRAMESZ)
 #endif
        move    v0, zero
        jr      ra
 
 99:
+       cfi_restore_state
 #ifdef __PIC__
        PTR_LA  t9, JUMPTARGET (__syscall_error)
-       RESTORE_GP64
+       RESTORE_GP64_STACK
        PTR_ADDIU sp, FRAMESZ
+       cfi_adjust_cfa_offset (-FRAMESZ)
        jr      t9
 
 #else  /* ! __PIC__ */