1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- /* Copyright (C) 2012 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
- 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/>. */
- #include <sysdep.h>
- #include "ucontext_i.h"
- .syntax unified
- .text
- /* int getcontext (ucontext_t *ucp) */
- ENTRY(__getcontext)
- /* No need to save r0-r3, d0-d7, or d16-d31. */
- add r1, r0, #MCONTEXT_ARM_R4
- stmia r1, {r4-r11}
- /* Save R13 separately as Thumb can't STM it. */
- str r13, [r0, #MCONTEXT_ARM_SP]
- str r14, [r0, #MCONTEXT_ARM_LR]
- /* Return to LR */
- str r14, [r0, #MCONTEXT_ARM_PC]
- /* Return zero */
- mov r2, #0
- str r2, [r0, #MCONTEXT_ARM_R0]
- /* Save ucontext_t * across the next call. */
- mov r4, r0
- /* __sigprocmask(SIG_BLOCK, NULL, &(ucontext->uc_sigmask)) */
- mov r0, #SIG_BLOCK
- mov r1, #0
- add r2, r4, #UCONTEXT_SIGMASK
- bl PLTJMP(sigprocmask)
- #if defined __UCLIBC_HAS_FLOATS__ && ! defined __UCLIBC_HAS_SOFT_FLOAT__
- # ifdef __VFP_FP__
- /* Store the VFP registers. */
- /* Following instruction is fstmiax ip!, {d8-d15}. */
- stc p11, cr8, [r0], #64
- /* Store the floating-point status register. */
- /* Following instruction is fmrx r2, fpscr. */
- mrc p10, 7, r1, cr1, cr0, 0
- str r1, [r0], #4
- # endif
- #endif
- #ifdef __IWMMXT__
- /* Save the call-preserved iWMMXt registers. */
- /* Following instructions are wstrd wr10, [r0], #8 (etc.) */
- stcl p1, cr10, [r0], #8
- stcl p1, cr11, [r0], #8
- stcl p1, cr12, [r0], #8
- stcl p1, cr13, [r0], #8
- stcl p1, cr14, [r0], #8
- stcl p1, cr15, [r0], #8
- #endif
- /* Restore the clobbered R4 and LR. */
- ldr r14, [r4, #MCONTEXT_ARM_LR]
- ldr r4, [r4, #MCONTEXT_ARM_R4]
- mov r0, #0
- DO_RET(r14)
- END(__getcontext)
- weak_alias(__getcontext, getcontext)
|