1 1.1.2.2 uwe /* $NetBSD: _lwp.c,v 1.1.2.2 2002/11/29 15:40:50 uwe 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.1 martin gr = u->uc_mcontext.__greg; 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