#define setcontext(u) libthread_setmcontext(&(u)->mc) #define getcontext(u) libthread_getmcontext(&(u)->mc) typedef struct mcontext mcontext_t; typedef struct ucontext ucontext_t; struct mcontext { uintptr ax; uintptr bx; uintptr cx; uintptr dx; uintptr si; uintptr di; uintptr bp; uintptr sp; uintptr r8; uintptr r9; uintptr r10; uintptr r11; uintptr r12; uintptr r13; uintptr r14; uintptr r15; /* // XXX: currently do not save vector registers or floating-point state */ }; struct ucontext { struct { void *ss_sp; uint ss_size; } uc_stack; sigset_t uc_sigmask; mcontext_t mc; }; void makecontext(ucontext_t*, void(*)(void), int, ...); int swapcontext(ucontext_t*, ucontext_t*); int libthread_getmcontext(mcontext_t*); void libthread_setmcontext(mcontext_t*);