Back to index

glibc  2.9
Functions
makecontext.c File Reference
#include <sysdep.h>
#include <stdarg.h>
#include <stdint.h>
#include <ucontext.h>

Go to the source code of this file.

Functions

void __makecontext (ucontext_t *ucp, void(*func)(void), int argc,...)

Function Documentation

void __makecontext ( ucontext_t ucp,
void(*)(void)  func,
int  argc,
  ... 
)

Definition at line 52 of file makecontext.c.

{
  extern void __start_context (void);
  unsigned long int *sp;
  va_list ap;
  int i;

  sp = (unsigned long int *) (ucp->uc_stack.ss_sp + ucp->uc_stack.ss_size);
  sp -= 16 + 7 + argc;
  sp = (unsigned long int *) (((uintptr_t) sp) & ~(8 - 1));

  for (i = 0; i < 8; i++)
    sp[i + 8] = ucp->uc_mcontext.gregs[REG_O0 + i];

  /* The struct return pointer is essentially unused, so we can
     place the link there.  */
  sp[16] = (unsigned long int) ucp->uc_link;

  va_start (ap, argc);

  /* Fill in outgoing arguments, including those which will
     end up being passed on the stack.  */
  for (i = 0; i < argc; i++)
    {
      unsigned long int arg = va_arg (ap, unsigned long int);
      if (i < 6)
       ucp->uc_mcontext.gregs[REG_O0 + i] = arg;
      else
       sp[i + 23] = arg;
    }

  va_end (ap);

  ucp->uc_mcontext.gregs[REG_O6] = (unsigned long int) sp;

  ucp->uc_mcontext.gregs[REG_O7] = ((unsigned long int) __start_context) - 8;

  ucp->uc_mcontext.gregs[REG_PC] = (unsigned long int) func;
  ucp->uc_mcontext.gregs[REG_nPC] = ucp->uc_mcontext.gregs[REG_PC] + 4;
}