1 1.1.2.1 martin /* $NetBSD: _lwp.c,v 1.1.2.1 2002/11/23 13:55:16 martin 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.1 martin void _lwp_makecontext(ucontext_t *u, void (*start)(void *), 10 1.1.2.1 martin void *arg, void *private, 11 1.1.2.1 martin 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 sp = (ulong *)(stack_base + stack_size); 25 1.1.2.1 martin sp = (ulong *)((ulong)sp & ~0x0f); 26 1.1.2.1 martin 27 1.1.2.1 martin sp -= 8 + 8 + 6; 28 1.1.2.1 martin 29 1.1.2.1 martin sp[4] = (ulong)arg; 30 1.1.2.1 martin sp[14] = (ulong)sp; 31 1.1.2.1 martin sp[15] = (ulong)_lwp_exit - 8; 32 1.1.2.1 martin 33 1.1.2.1 martin sp = (ulong *)((caddr_t)sp); 34 1.1.2.1 martin 35 1.1.2.1 martin gr[_REG_PC] = (ulong) start; 36 1.1.2.1 martin gr[_REG_nPC] = (ulong) start + 4; 37 1.1.2.1 martin 38 1.1.2.1 martin gr[_REG_O0] = (ulong) arg; 39 1.1.2.1 martin gr[_REG_O6] = (ulong) sp; 40 1.1.2.1 martin gr[_REG_O7] = (ulong)_lwp_exit - 8; 41 1.1.2.1 martin } 42