/* Set current context. Copyright (C) 2009-2014 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 . */ #include #include "ucontext_i.h" #include "ucontext-internal.h" /* int setcontext (const ucontext_t *ucp) */ .text ENTRY(__setcontext) /* Create a signal frame on the stack: fp lr ... sp-> rt_sigframe */ stp x29, x30, [sp, -16]! cfi_adjust_cfa_offset (16) cfi_rel_offset (x29, 0) cfi_rel_offset (x30, 8) mov x29, sp cfi_def_cfa_register (x29) /* Allocate space for the sigcontext. */ mov w3, #((RT_SIGFRAME_SIZE + SP_ALIGN_SIZE) & SP_ALIGN_MASK) sub sp, sp, x3 /* Compute the base address of the ucontext structure. */ add x1, sp, #RT_SIGFRAME_UCONTEXT /* Only ucontext is required in the frame, *copy* it in. */ #if UCONTEXT_SIZE % 16 #error The implementation of setcontext.S assumes sizeof(ucontext_t) % 16 == 0 #endif mov x2, #UCONTEXT_SIZE / 16 0: ldp x3, x4, [x0], #16 stp x3, x4, [x1], #16 sub x2, x2, 1 cbnz x2, 0b /* rt_sigreturn () -- no arguments, sp points to struct rt_sigframe. */ mov x8, SYS_ify (rt_sigreturn) svc 0 /* Ooops we failed. Recover the stack */ mov sp, x29 cfi_def_cfa_register (sp) ldp x29, x30, [sp], 16 cfi_adjust_cfa_offset (16) cfi_restore (x29) cfi_restore (x30) b C_SYMBOL_NAME(__syscall_error) PSEUDO_END (__setcontext) weak_alias (__setcontext, setcontext) ENTRY(__startcontext) mov x0, x19 cbnz x0, __setcontext 1: b HIDDEN_JUMPTARGET(_exit) END(__startcontext)