Home | History | Annotate | Line # | Download | only in gen
_lwp.c revision 1.1.2.3
      1  1.1.2.3   skrll /*	$NetBSD: _lwp.c,v 1.1.2.3 2002/12/18 17:39:59 skrll Exp $ */
      2  1.1.2.1  martin 
      3  1.1.2.1  martin #include <sys/types.h>
      4  1.1.2.1  martin #include <ucontext.h>
      5  1.1.2.1  martin #include <lwp.h>
      6  1.1.2.1  martin #include <stdlib.h>
      7  1.1.2.1  martin 
      8  1.1.2.1  martin 
      9  1.1.2.2     uwe void
     10  1.1.2.2     uwe _lwp_makecontext(ucontext_t *u, void (*start)(void *), void *arg,
     11  1.1.2.2     uwe 		 void *private, caddr_t stack_base, size_t stack_size)
     12  1.1.2.1  martin {
     13  1.1.2.1  martin 	__greg_t *gr;
     14  1.1.2.1  martin 	unsigned long *sp;
     15  1.1.2.1  martin 
     16  1.1.2.1  martin 	getcontext(u);
     17  1.1.2.3   skrll 	gr = u->uc_mcontext.__gregs;
     18  1.1.2.1  martin 
     19  1.1.2.1  martin 	u->uc_link = NULL;
     20  1.1.2.1  martin 
     21  1.1.2.1  martin 	u->uc_stack.ss_sp = stack_base;
     22  1.1.2.1  martin 	u->uc_stack.ss_size = stack_size;
     23  1.1.2.1  martin 
     24  1.1.2.1  martin 
     25  1.1.2.2     uwe 	sp = (ulong *)(stack_base + stack_size);
     26  1.1.2.2     uwe 	sp = (ulong *)((ulong)sp & ~0x07);
     27  1.1.2.1  martin 
     28  1.1.2.2     uwe 	/* Make room for the fake caller stack frame (CCFSZ, only in words) */
     29  1.1.2.2     uwe 	sp -= 8 + 8 + 1 + 6 + 1;
     30  1.1.2.1  martin 
     31  1.1.2.2     uwe 	/* Entering (*start)(arg), return is to _lwp_exit */
     32  1.1.2.1  martin 	gr[_REG_PC] = (ulong) start;
     33  1.1.2.1  martin 	gr[_REG_nPC] = (ulong) start + 4;
     34  1.1.2.2     uwe 	gr[_REG_O0] = (ulong)arg;
     35  1.1.2.2     uwe 	gr[_REG_O6] = (ulong)sp;
     36  1.1.2.1  martin 	gr[_REG_O7] = (ulong)_lwp_exit - 8;
     37  1.1.2.2     uwe 
     38  1.1.2.2     uwe 	/* XXX: uwe: why do we need this? */
     39  1.1.2.2     uwe 	/* create loopback in the window save area on the stack? */
     40  1.1.2.2     uwe 	sp[8+6] = (ulong)sp;		/* %i6 */
     41  1.1.2.2     uwe 	sp[8+7] = (ulong)_lwp_exit - 8;	/* %i7 */
     42  1.1.2.1  martin }
     43