1 /* $NetBSD: _lwp.c,v 1.1.2.3 2002/09/10 01:13:10 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)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