blob: 373cc62374a21fbbd64dba55a9df4e70cb52ee67 [file] [log] [blame]
#include "threadimpl.h"
void
makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...)
{
ulong *sp, *tos;
va_list arg;
tos = (ulong*)ucp->uc_stack.ss_sp+ucp->uc_stack.ss_size/sizeof(ulong);
sp = tos - 16;
ucp->label.pc = (long)func;
ucp->label.sp = (long)sp;
va_start(arg, argc);
ucp->label.r3 = va_arg(arg, long);
va_end(arg);
}
void
getcontext(ucontext_t *uc)
{
return __setlabel(uc);
}
int
setcontext(ucontext_t *uc)
{
return __gotolabel(uc);
}
int
swapcontext(ucontext_t *oucp, ucontext_t *ucp)
{
if(getcontext(oucp) == 0)
setcontext(ucp);
return 0;
}