Home | History | Annotate | Line # | Download | only in gen
_lwp.c revision 1.1.2.1
      1 /*	$NetBSD: _lwp.c,v 1.1.2.1 2002/01/24 02:35:31 petrov Exp $ */
      2 
      3 #include <sys/types.h>
      4 #include <ucontext.h>
      5 #include <lwp.h>
      6 #include <stdlib.h>
      7 
      8 
      9 void _lwp_makecontext(ucontext_t *u, void (*start)(void *),
     10 		      void *arg, void *private,
     11 		      caddr_t stack_base, size_t stack_size)
     12 {
     13 	__greg_t *gr;
     14 	unsigned long *sp;
     15 
     16 	getcontext(u);
     17 	gr = u->uc_mcontext.__gregs;
     18 
     19 	u->uc_link = NULL;
     20 
     21 	u->uc_stack.ss_sp = stack_base;
     22 	u->uc_stack.ss_size = stack_size;
     23 
     24 	sp = (ulong *)(stack_base + stack_size);
     25 	sp = (ulong *)((ulong)sp & ~0x0f);
     26 
     27 	sp -= 8 + 8 + 6;
     28 
     29 	sp[8]  = (ulong) arg;
     30 	sp[14] = (ulong)((caddr_t)sp - 2047);
     31 	sp[15] = (ulong)(_lwp_exit - 8);
     32 
     33 	sp = (ulong *)((caddr_t)sp - 2047);
     34 
     35 	gr[_REG_PC] = (ulong) start;
     36 	gr[_REG_nPC] = (ulong) start + 4;
     37 
     38 	gr[_REG_O0] = (ulong) arg;
     39 	gr[_REG_O6] = (ulong) sp;
     40 	gr[_REG_O7] = (ulong) _lwp_exit - 8;
     41 }
     42