mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-30 22:43:12 +03:00
2.5-18.1
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/* Create new context.
|
||||
Copyright (C) 2002, 2004 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Andreas Jaeger <aj@suse.de>, 2002.
|
||||
|
||||
@ -20,6 +20,7 @@
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdint.h>
|
||||
#include <ucontext.h>
|
||||
|
||||
#include "ucontext_i.h"
|
||||
@ -52,28 +53,29 @@ void
|
||||
__makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
|
||||
{
|
||||
extern void __start_context (void);
|
||||
unsigned long *sp, idx_uc_link;
|
||||
unsigned long int *sp, idx_uc_link;
|
||||
va_list ap;
|
||||
int i;
|
||||
|
||||
/* Generate room on stack for parameter if needed and uc_link. */
|
||||
sp = (long *) ((long) ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size);
|
||||
sp = (unsigned long int *) ((uintptr_t) ucp->uc_stack.ss_sp
|
||||
+ ucp->uc_stack.ss_size);
|
||||
sp -= (argc > 6 ? argc - 6 : 0) + 1;
|
||||
/* Align stack and make space for trampoline address. */
|
||||
sp = (long *) ((((long) sp) & -16L) - 8);
|
||||
sp = (unsigned long int *) ((((uintptr_t) sp) & -16L) - 8);
|
||||
|
||||
idx_uc_link = (argc > 6 ? argc - 6 : 0) + 1;
|
||||
|
||||
/* Setup context ucp. */
|
||||
/* Address to jump to. */
|
||||
ucp->uc_mcontext.gregs[REG_RIP] = (long) func;
|
||||
ucp->uc_mcontext.gregs[REG_RIP] = (long int) func;
|
||||
/* Setup rbx.*/
|
||||
ucp->uc_mcontext.gregs[REG_RBX] = (long) &sp[idx_uc_link];
|
||||
ucp->uc_mcontext.gregs[REG_RSP] = (long) sp;
|
||||
ucp->uc_mcontext.gregs[REG_RBX] = (long int) &sp[idx_uc_link];
|
||||
ucp->uc_mcontext.gregs[REG_RSP] = (long int) sp;
|
||||
|
||||
/* Setup stack. */
|
||||
sp[0] = (long) &__start_context;
|
||||
sp[idx_uc_link] = (long) ucp->uc_link;
|
||||
sp[0] = (unsigned long int) &__start_context;
|
||||
sp[idx_uc_link] = (unsigned long int) ucp->uc_link;
|
||||
|
||||
va_start (ap, argc);
|
||||
/* Handle arguments. */
|
||||
@ -108,4 +110,4 @@ __makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
|
||||
}
|
||||
|
||||
|
||||
weak_alias(__makecontext, makecontext)
|
||||
weak_alias (__makecontext, makecontext)
|
||||
|
Reference in New Issue
Block a user