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