1/* Save current context. C-SKY ABIV2 version. 2 Copyright (C) 2018-2021 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 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. 9 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. 14 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/>. */ 18 19#include <sysdep.h> 20 21#include "ucontext_i.h" 22 23/* int getcontext (ucontext_t *ucp) */ 24 25ENTRY (__getcontext) 26 /* No need to save r2-r7 or a0-a3. */ 27 mov t0, a0 28 29 addi a0, MCONTEXT_CSKY_R4 30 31 stm r4-r13, (a0) /* Save r4-r13. */ 32 stw sp, (t0, MCONTEXT_CSKY_SP) /* Save sp. */ 33 stw r15, (t0, MCONTEXT_CSKY_LR) /* Save lr. */ 34 stw r15, (t0, MCONTEXT_CSKY_PC) /* Return to PC. */ 35 addi a0, t0, MCONTEXT_CSKY_R16 36 stm r16-r31, (a0) /* Save r16-r31. */ 37 movi a0, 0 38 stw a0, (t0, MCONTEXT_CSKY_A0) /* Return zero. */ 39 40 subi sp, 8 41 stw t0, (sp, 0) /* Save t0 after "save sp". */ 42 43 /* __sigprocmask (SIG_BLOCK, NULL, &(ucontext->uc_sigmask)) */ 44 movi a0, SIG_BLOCK 45 movi a1, 0 46 addi a2, t0, UCONTEXT_SIGMASK 47 48 /* Do sigprocmask syscall. */ 49#ifdef __PIC__ 50 subi sp, 8 51 stw gb, (sp, 0) 52 grs gb, .Lgetpc 53.Lgetpc: 54 lrw a3, .Lgetpc@GOTPC 55 addu gb, gb, a3 56 lrw a3, __sigprocmask@PLT 57 ldr.w a3, (gb, a3 << 0) 58 jsr a3 59 ldw gb, (sp, 0) 60 addi sp, 8 61#else 62 jsri __sigprocmask 63#endif 64 65 ldw t0, (sp, 0) 66 addi sp, 8 67 /* Restore r15 for sigprocmask changes. */ 68 ldw r15, (t0, MCONTEXT_CSKY_LR) 69 movi a0, 0 /* Return 0. */ 70 jmp r15 71END (__getcontext) 72 73weak_alias (__getcontext, getcontext) 74