]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/unix/sysv/linux/sparc/sparc64/makecontext.c
Prefer https to http for gnu.org and fsf.org URLs
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / sparc / sparc64 / makecontext.c
index 52406dcce90ca90b9b3efed1b8520e53fa328a58..b41751678cfb257f67f45835bed47d42b1b585c9 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001 Free Software Foundation, Inc.
+/* Copyright (C) 2001-2019 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Jakub Jelinek <jakub@redhat.com>.
 
    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, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
 
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <ucontext.h>
 
+extern void __start_context (ucontext_t *ucp);
+
 void
 __makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
 {
@@ -30,15 +31,15 @@ __makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
   va_list ap;
   int i;
 
-  sp = (long *) ((long) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size);
+  sp = (unsigned long *) ((long) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size);
   sp -= (argc > 6 ? argc : 6) + 32;
-  sp = (long *) (((long) sp) & -16L);
+  sp = (unsigned long *) (((long) sp) & -16L);
   topsp = sp + (argc > 6 ? argc : 6) + 16;
 
   ucp->uc_mcontext.mc_gregs[MC_PC] = (long) func;
   ucp->uc_mcontext.mc_gregs[MC_NPC] = ((long) func) + 4;
   ucp->uc_mcontext.mc_gregs[MC_O6] = ((long) sp) - 0x7ff;
-  ucp->uc_mcontext.mc_gregs[MC_O7] = ((long) __makecontext_ret) - 8;
+  ucp->uc_mcontext.mc_gregs[MC_O7] = ((long) __start_context) - 8;
   ucp->uc_mcontext.mc_fp = ((long) topsp) - 0x7ff;
   ucp->uc_mcontext.mc_i7 = 0;
   topsp[14] = 0;
@@ -53,15 +54,4 @@ __makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
   va_end (ap);
 }
 
-asm ("                                                 \n\
-       .text                                           \n\
-       .type   __makecontext_ret, #function            \n\
-__makecontext_ret:                                     \n\
-       mov     1, %o1                                  \n\
-       call    __setcontext                            \n\
-        mov    %i0, %o0                                \n\
-       unimp   0                                       \n\
-       .size   __makecontext_ret, .-__makecontext_ret  \n\
-     ");
-
 weak_alias (__makecontext, makecontext)